/**
* Block editor UUID synchronization for supported block types.
*
* Reads:
* wp.blocks.isUnmodifiedDefaultBlock - identifies Gutenberg's transient default block
* wp.data - block-editor store selectors, dispatch, and subscription
* wp.hooks.addFilter - block-type attribute registration
* window.mwpSfeEditorData.pristineDefaultBlocks - schema-declared transient default block types
*
* Exposes: SFE.BlockEditorUuid
*/
(function() {
'use strict';
window.MWP = window.MWP || {};
window.MWP.SFE = window.MWP.SFE || {};
const SFE = window.MWP.SFE;
SFE.ManagerData = SFE.ManagerData || {};
// Get data from PHP.
const { supportedMap, pristineDefaultBlocks, currentPostId } = window.mwpSfeEditorData || {};
if (!supportedMap || !pristineDefaultBlocks || !currentPostId) {
console.error('FrontEdit Manager: Missing editor data');
return;
}
const supportedBlocks = Object.keys(supportedMap);
const uuidAttr = { type: 'string', default: '' };
const { addFilter } = wp.hooks;
// --- A. Attribute Registration ---
/**
* Register the UUID attrs on supported block types.
*
* @param {Object} settings Gutenberg block settings.
* @param {string} name Block name.
* @returns {Object} Updated block settings.
*/
function addUuidAttribute(settings, name) {
if (supportedBlocks.includes(name)) {
// Hoist UUID attrs to the front of the schema object.
const { mwpSfeUuid: existingUuid, mwpSfeUuidShadow: existingShadow, ...restAttrs } =
settings.attributes || {};
const uuid = existingShadow !== undefined ? existingShadow :
existingUuid !== undefined ? existingUuid :
uuidAttr;
settings.attributes = {
mwpSfeUuid: uuid,
mwpSfeUuidShadow: uuid,
...restAttrs,
};
}
return settings;
}
addFilter('blocks.registerBlockType', 'mwp-sfe/add-uuid-attribute', addUuidAttribute);
// --- B. UUID Management (Strict Format Enforcement) ---
if (!SFE.blockEditorUuidRegistry) { SFE.blockEditorUuidRegistry = {}; }
if (!SFE.blockEditorListOwnershipRegistry) { SFE.blockEditorListOwnershipRegistry = {}; }
/**
* Return the block-editor selector when it is available.
*
* @returns {Object|null} Block editor selector, or null when unavailable.
*/
function getBlockEditorSelect() {
if (!wp?.data?.select) {
return null;
}
return wp.data.select('core/block-editor');
}
/**
* Return the current top-level editor blocks when the store is available.
*
* @returns {Array} Top-level block list.
*/
function getEditorBlocks() {
const select = getBlockEditorSelect();
if (!select || typeof select.getBlocks !== 'function') {
return [];
}
return select.getBlocks() || [];
}
/**
* Return the live client ID registered to a UUID, pruning stale entries.
*
* @param {string} uuid Candidate UUID.
* @returns {string} Live owning client ID, or an empty string.
*/
function getRegisteredClient(uuid) {
const candidate = typeof uuid === 'string' ? uuid.trim() : '';
if (!candidate) {
return '';
}
const registeredClient = SFE.blockEditorUuidRegistry[candidate];
if (!registeredClient) {
return '';
}
const select = getBlockEditorSelect();
if (!select || typeof select.getBlock !== 'function') {
return registeredClient;
}
if (select.getBlock(registeredClient)) {
return registeredClient;
}
delete SFE.blockEditorUuidRegistry[candidate];
return '';
}
/**
* Release a UUID registry entry only when it still belongs to this client.
*
* @param {string} uuid Candidate UUID to release.
* @param {string} clientId Gutenberg client ID expected to own the UUID.
* @returns {void}
*/
function releaseUuidOwnership(uuid, clientId) {
const candidate = typeof uuid === 'string' ? uuid.trim() : '';
if (!candidate) {
return;
}
if (SFE.blockEditorUuidRegistry[candidate] === clientId) {
delete SFE.blockEditorUuidRegistry[candidate];
}
}
/**
* Return true when a block is a nested core/list living under a list item.
*
* @param {string} clientId Gutenberg client ID for the current block.
* @param {string} name Block name.
* @returns {boolean} True when the block must remain non-owning.
*/
function isNonOwningNestedListBlock(clientId, name) {
if (name !== 'core/list') {
return false;
}
const select = getBlockEditorSelect();
if (!select || typeof select.getBlockParents !== 'function' || typeof select.getBlock !== 'function') {
return false;
}
const parentIds = select.getBlockParents(clientId) || [];
return parentIds.some(parentId => select.getBlock(parentId)?.name === 'core/list-item');
}
/**
* Remember the canonical owner UUID associated with a list client ID.
*
* @param {string} clientId Gutenberg client ID.
* @param {string} uuid Canonical owner UUID, or empty to clear.
* @returns {void}
*/
function rememberListOwner(clientId, uuid) {
const ownerUuid = typeof uuid === 'string' ? uuid.trim() : '';
if (!ownerUuid) {
delete SFE.blockEditorListOwnershipRegistry[clientId];
return;
}
SFE.blockEditorListOwnershipRegistry[clientId] = ownerUuid;
}
/**
* Find the owning root list UUID for a nested list block.
*
* @param {string} clientId Gutenberg client ID for the nested list block.
* @returns {string} Root list UUID for adoption, or empty.
*/
function getInheritedListOwnerUuid(clientId) {
const select = getBlockEditorSelect();
if (!select || typeof select.getBlockParents !== 'function' || typeof select.getBlock !== 'function') {
return SFE.blockEditorListOwnershipRegistry[clientId] || '';
}
const parentIds = select.getBlockParents(clientId) || [];
for (const parentId of parentIds) {
const parentBlock = select.getBlock(parentId);
if (!parentBlock || parentBlock.name !== 'core/list') {
continue;
}
const parentAttrs = parentBlock.attributes || {};
const ownerUuid = String(
parentAttrs.mwpSfeUuid
|| parentAttrs.mwpSfeUuidShadow
|| SFE.blockEditorListOwnershipRegistry[parentId]
|| ''
).trim();
if (ownerUuid) {
return ownerUuid;
}
}
return SFE.blockEditorListOwnershipRegistry[clientId] || '';
}
/**
* Return a previously inherited owner UUID when a nested list becomes root.
*
* @param {string} clientId Gutenberg client ID for the current block.
* @param {string} name Block name.
* @returns {string} Adoptable UUID, or empty.
*/
function getPromotedListOwnerUuid(clientId, name) {
if (name !== 'core/list' || isNonOwningNestedListBlock(clientId, name)) {
return '';
}
const ownerUuid = String(SFE.blockEditorListOwnershipRegistry[clientId] || '').trim();
if (!ownerUuid) {
return '';
}
const registeredClient = getRegisteredClient(ownerUuid);
if (registeredClient && registeredClient !== clientId) {
return '';
}
return ownerUuid;
}
/**
* Generate a UUID matching the PHP-side format exactly.
*
* @param {string} elementCode Handler element type code.
* @returns {string} Fresh UUID.
*/
function generateStrictUuid(elementCode) {
const chars = '0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ';
let random = '';
for (let i = 0; i < 16; i++) {
random += chars.charAt(Math.floor(Math.random() * 62));
}
return currentPostId + '-' + elementCode + '-' + random;
}
/**
* Return whether one schema-declared block is Gutenberg's unmodified default
* block and must remain transient until the author changes it.
*
* Gutenberg reuses its unmodified default block as the bottom-of-canvas
* writing surface. Adding a persisted UUID attribute makes that block real
* content, causing the editor to create another default block below it on
* every subsequent click. The eligible block type comes from its PHP schema;
* Gutenberg's generic predicate determines its current state.
*
* @param {Object} block Candidate editor block.
* @returns {boolean} True when UUID assignment must wait for a real edit.
*/
function shouldDeferDefaultBlockUuidAssignment(block) {
const attrs = block?.attributes || {};
return (
Object.prototype.hasOwnProperty.call(pristineDefaultBlocks, block?.name) &&
!String(attrs.mwpSfeUuid || '').trim() &&
!String(attrs.mwpSfeUuidShadow || '').trim() &&
wp.blocks.isUnmodifiedDefaultBlock(block)
);
}
/**
* Queue one attribute update only when the target values actually change.
*
* @param {Object} pendingUpdates Accumulator keyed by client ID.
* @param {Object} block Current block object.
* @param {Object} patch Partial attrs to apply.
* @returns {void}
*/
function queueAttributeUpdate(pendingUpdates, block, patch) {
if (!block?.clientId || !patch || typeof patch !== 'object') {
return;
}
const attrs = block.attributes || {};
const next = pendingUpdates[block.clientId] ? { ...pendingUpdates[block.clientId] } : {};
let changed = false;
Object.keys(patch).forEach(key => {
if (attrs[key] !== patch[key] || next[key] !== patch[key]) {
next[key] = patch[key];
changed = true;
}
});
if (changed) {
pendingUpdates[block.clientId] = next;
}
}
/**
* Apply queued block-attribute updates through the editor store.
*
* @param {Object} pendingUpdates Attr patches keyed by client ID.
* @returns {boolean} True when any update was dispatched.
*/
function applyPendingUpdates(pendingUpdates) {
const clientIds = Object.keys(pendingUpdates);
if (!clientIds.length || !wp?.data?.dispatch) {
return false;
}
const dispatcher = wp.data.dispatch('core/block-editor');
if (!dispatcher || typeof dispatcher.updateBlockAttributes !== 'function') {
return false;
}
clientIds.forEach(clientId => {
// UUID repair must not create its own undo level. The duplicate action
// should be the only persistent history entry; otherwise undo restores
// stale duplicate UUIDs and this reconciler keeps generating new ones.
if (typeof dispatcher.__unstableMarkNextChangeAsNotPersistent === 'function') {
dispatcher.__unstableMarkNextChangeAsNotPersistent();
}
dispatcher.updateBlockAttributes(clientId, pendingUpdates[clientId]);
});
return true;
}
/**
* Reconcile one block and its descendants against the canonical UUID rules.
*
* @param {Object} block Gutenberg block object.
* @param {Object} context Traversal context.
* @param {Object} context.pendingUpdates Pending attr patches keyed by client ID.
* @param {Object} context.seenUuids UUIDs already claimed in this pass.
* @param {Object} context.nextUuidRegistry Registry snapshot being rebuilt.
* @param {Object} context.nextListOwnerRegistry List-owner snapshot being rebuilt.
* @param {string} context.inheritedListOwnerUuid Canonical root-list UUID for descendants.
* @returns {string} Final UUID that descendants should inherit.
*/
function reconcileBlockTreeNode(block, context) {
if (!block || !block.clientId || !block.name) {
return context.inheritedListOwnerUuid || '';
}
const {
pendingUpdates,
seenUuids,
nextUuidRegistry,
nextListOwnerRegistry,
inheritedListOwnerUuid
} = context;
const attrs = block.attributes || {};
const currentUuid = typeof attrs.mwpSfeUuid === 'string' ? attrs.mwpSfeUuid.trim() : '';
const shadowUuid = typeof attrs.mwpSfeUuidShadow === 'string' ? attrs.mwpSfeUuidShadow.trim() : '';
const isSupported = supportedBlocks.includes(block.name);
let resolvedListOwnerUuid = inheritedListOwnerUuid || '';
if (!isSupported) {
(block.innerBlocks || []).forEach(innerBlock => {
reconcileBlockTreeNode(innerBlock, {
pendingUpdates,
seenUuids,
nextUuidRegistry,
nextListOwnerRegistry,
inheritedListOwnerUuid: resolvedListOwnerUuid
});
});
return resolvedListOwnerUuid;
}
const elementCode = supportedMap[block.name];
const expectedPrefix = currentPostId + '-' + elementCode + '-';
const deferDefaultBlockUuidAssignment = shouldDeferDefaultBlockUuidAssignment(block);
let effectiveUuid = currentUuid;
let effectiveShadowUuid = shadowUuid;
if (isNonOwningNestedListBlock(block.clientId, block.name)) {
const inheritedOwner = resolvedListOwnerUuid || getInheritedListOwnerUuid(block.clientId);
if (inheritedOwner) {
rememberListOwner(block.clientId, inheritedOwner);
nextListOwnerRegistry[block.clientId] = inheritedOwner;
}
if (currentUuid || shadowUuid) {
queueAttributeUpdate(pendingUpdates, block, {
mwpSfeUuid: '',
mwpSfeUuidShadow: ''
});
}
(block.innerBlocks || []).forEach(innerBlock => {
reconcileBlockTreeNode(innerBlock, {
pendingUpdates,
seenUuids,
nextUuidRegistry,
nextListOwnerRegistry,
inheritedListOwnerUuid: inheritedOwner
});
});
return inheritedOwner;
}
const promotedListOwnerUuid = getPromotedListOwnerUuid(block.clientId, block.name);
if (!effectiveUuid && !effectiveShadowUuid && promotedListOwnerUuid) {
effectiveUuid = promotedListOwnerUuid;
effectiveShadowUuid = promotedListOwnerUuid;
} else if (!effectiveUuid && !effectiveShadowUuid && !deferDefaultBlockUuidAssignment) {
effectiveUuid = generateStrictUuid(elementCode);
effectiveShadowUuid = effectiveUuid;
} else if (!effectiveUuid && effectiveShadowUuid) {
effectiveUuid = effectiveShadowUuid;
}
if (effectiveUuid && !effectiveUuid.startsWith(expectedPrefix)) {
releaseUuidOwnership(effectiveUuid, block.clientId);
effectiveUuid = generateStrictUuid(elementCode);
effectiveShadowUuid = effectiveUuid;
}
const existingOwnerClientId = effectiveUuid ? (seenUuids[effectiveUuid] || '') : '';
if (effectiveUuid && existingOwnerClientId && existingOwnerClientId !== block.clientId) {
effectiveUuid = generateStrictUuid(elementCode);
effectiveShadowUuid = effectiveUuid;
}
if (effectiveUuid && effectiveShadowUuid !== effectiveUuid) {
effectiveShadowUuid = effectiveUuid;
}
if (effectiveUuid) {
seenUuids[effectiveUuid] = block.clientId;
nextUuidRegistry[effectiveUuid] = block.clientId;
if (block.name === 'core/list') {
resolvedListOwnerUuid = effectiveUuid;
}
}
if (block.name === 'core/list' && resolvedListOwnerUuid) {
rememberListOwner(block.clientId, resolvedListOwnerUuid);
nextListOwnerRegistry[block.clientId] = resolvedListOwnerUuid;
}
if (effectiveUuid !== currentUuid || effectiveShadowUuid !== shadowUuid) {
queueAttributeUpdate(pendingUpdates, block, {
mwpSfeUuid: effectiveUuid,
mwpSfeUuidShadow: effectiveShadowUuid
});
}
(block.innerBlocks || []).forEach(innerBlock => {
reconcileBlockTreeNode(innerBlock, {
pendingUpdates,
seenUuids,
nextUuidRegistry,
nextListOwnerRegistry,
inheritedListOwnerUuid: resolvedListOwnerUuid
});
});
return resolvedListOwnerUuid;
}
/**
* Rebuild UUID ownership from the live editor tree and repair invalid attrs.
*
* @returns {boolean} True when any block attrs were updated.
*/
function reconcileEditorBlockTree() {
const blocks = getEditorBlocks();
if (!blocks.length) {
SFE.blockEditorUuidRegistry = {};
SFE.blockEditorListOwnershipRegistry = {};
return false;
}
const pendingUpdates = {};
const seenUuids = {};
const nextUuidRegistry = {};
const nextListOwnerRegistry = {};
blocks.forEach(block => {
reconcileBlockTreeNode(block, {
pendingUpdates,
seenUuids,
nextUuidRegistry,
nextListOwnerRegistry,
inheritedListOwnerUuid: ''
});
});
SFE.blockEditorUuidRegistry = nextUuidRegistry;
SFE.blockEditorListOwnershipRegistry = nextListOwnerRegistry;
return applyPendingUpdates(pendingUpdates);
}
/**
* Build one lightweight signature for UUID-relevant editor state.
*
* @param {Array} blocks Top-level editor blocks.
* @returns {string} Stable signature string.
*/
function buildUuidStateSignature(blocks) {
const parts = [];
(function walk(nodes) {
(nodes || []).forEach(block => {
if (!block?.clientId || !block?.name) {
return;
}
const attrs = block.attributes || {};
parts.push([
block.clientId,
block.name,
attrs.mwpSfeUuid || '',
attrs.mwpSfeUuidShadow || '',
shouldDeferDefaultBlockUuidAssignment(block) ? 'deferred-default' : ''
].join('|'));
if (block.innerBlocks?.length) {
walk(block.innerBlocks);
}
});
})(blocks);
return parts.join('||');
}
/**
* Start one shared store subscriber for UUID reconciliation.
*
* @returns {void}
*/
function bootUuidReconciler() {
if (!wp?.data?.subscribe) {
return;
}
let isReconciling = false;
let isReconcileScheduled = false;
let lastObservedSignature = '';
/**
* Execute one reconciliation pass against the live editor tree.
*
* @returns {void}
*/
function runReconcile() {
if (isReconciling) {
return;
}
isReconciling = true;
try {
reconcileEditorBlockTree();
lastObservedSignature = buildUuidStateSignature(getEditorBlocks());
} finally {
isReconciling = false;
}
}
/**
* Coalesce rapid store changes into one scheduled reconciliation pass.
*
* @returns {void}
*/
function scheduleReconcile() {
if (isReconcileScheduled) {
return;
}
isReconcileScheduled = true;
window.setTimeout(() => {
isReconcileScheduled = false;
runReconcile();
}, 0);
}
runReconcile();
wp.data.subscribe(() => {
if (isReconciling) {
return;
}
const nextSignature = buildUuidStateSignature(getEditorBlocks());
if (nextSignature === lastObservedSignature) {
return;
}
lastObservedSignature = nextSignature;
scheduleReconcile();
});
}
bootUuidReconciler();
SFE.BlockEditorUuid = {
supportedBlocks,
reconcileEditorBlockTree
};
})();
It seems we can’t find what you’re looking for. Perhaps searching can help.
/*! elementor-pro - v4.2.0 - 19-08-2026 */
.elementor-widget-loop-carousel{--swiper-pagination-size:0;--swiper-pagination-spacing:10px;--swiper-slides-gap:10px;--swiper-offset-size:0;height:-moz-fit-content;height:fit-content;--swiper-padding-bottom:calc(var(--swiper-pagination-size) + var(--swiper-pagination-spacing))}.elementor-widget-loop-carousel.elementor-pagination-type-bullets{--swiper-pagination-size:6px}.elementor-widget-loop-carousel.elementor-pagination-type-fraction{--swiper-pagination-size:16px}.elementor-widget-loop-carousel.elementor-pagination-type-progressbar{--swiper-pagination-size:4px}.elementor-widget-loop-carousel .elementor-loop-container>.swiper-wrapper>.swiper-slide-active.elementor-edit-area-active{overflow:initial}.elementor-widget-loop-carousel .elementor-loop-container.offset-left{padding-inline-start:var(--swiper-offset-size,0)}.elementor-widget-loop-carousel .elementor-loop-container.offset-right{padding-inline-end:var(--swiper-offset-size,0)}.elementor-widget-loop-carousel .elementor-loop-container.offset-both{padding-inline-end:var(--swiper-offset-size,0);padding-inline-start:var(--swiper-offset-size,0)}.elementor-widget-loop-carousel .swiper-container:not(.swiper-container-initialized)>.swiper-wrapper,.elementor-widget-loop-carousel .swiper:not(.swiper-initialized)>.swiper-wrapper{gap:var(--swiper-slides-gap);overflow:hidden}.elementor-widget-loop-carousel .swiper-container:not(.swiper-container-initialized)>.swiper-wrapper>.swiper--slide,.elementor-widget-loop-carousel .swiper:not(.swiper-initialized)>.swiper-wrapper>.swiper--slide{--number-of-gaps:max(calc(var(--swiper-slides-to-display) - 1),0);--gaps-width-total:calc(var(--number-of-gaps) * var(--swiper-slides-gap));max-width:calc((100% - var(--gaps-width-total)) / var(--swiper-slides-to-display, 1))}.elementor-widget-loop-carousel .e-loop-first-edit{margin-block-start:23px;min-width:33%}.elementor-widget-loop-carousel .swiper-wrapper .swiper-slide a.e-con{display:var(--display)}.elementor-widget-loop-carousel{--arrow-prev-top-align:50%;--arrow-prev-top-position:0px;--arrow-prev-caption-spacing:15px;--arrow-next-top-align:50%;--arrow-next-top-position:0px;--arrow-next-caption-spacing:15px;--arrow-prev-left-align:0px;--arrow-prev-left-position:0px;--arrow-next-right-align:0px;--arrow-next-right-position:0px;--arrow-next-translate-x:0px;--arrow-next-translate-y:0px;--arrow-prev-translate-x:0px;--arrow-prev-translate-y:0px}.elementor-widget-loop-carousel .elementor-swiper-button.elementor-swiper-button-next,.elementor-widget-loop-carousel .elementor-swiper-button.elementor-swiper-button-prev{border-style:var(--arrow-normal-border-type);color:var(--arrow-normal-color,hsla(0,0%,93.3%,.9));font-size:var(--arrow-size,25px);transition-duration:.25s;z-index:2}.elementor-widget-loop-carousel .elementor-swiper-button.elementor-swiper-button-next svg,.elementor-widget-loop-carousel .elementor-swiper-button.elementor-swiper-button-prev svg{fill:var(--arrow-normal-color,hsla(0,0%,93.3%,.9))}.elementor-widget-loop-carousel .elementor-swiper-button.elementor-swiper-button-next:hover,.elementor-widget-loop-carousel .elementor-swiper-button.elementor-swiper-button-prev:hover{border-style:var(--arrow-hover-border-type);color:var(--arrow-hover-color,hsla(0,0%,93.3%,.9))}.elementor-widget-loop-carousel .elementor-swiper-button.elementor-swiper-button-next:hover svg,.elementor-widget-loop-carousel .elementor-swiper-button.elementor-swiper-button-prev:hover svg{fill:var(--arrow-hover-color,hsla(0,0%,93.3%,.9))}.elementor-widget-loop-carousel.elementor-element :is(.swiper,.swiper-container)~.elementor-swiper-button-next{right:calc(var(--arrow-next-right-align) + var(--arrow-next-right-position));top:calc(var(--arrow-next-top-align) + var(--arrow-next-top-position) - var(--arrow-next-caption-spacing));transform:translate(var(--arrow-next-translate-x),var(--arrow-next-translate-y))}.elementor-widget-loop-carousel.elementor-element :is(.swiper,.swiper-container)~.elementor-swiper-button-prev{left:calc(var(--arrow-prev-left-align) + var(--arrow-prev-left-position));top:calc(var(--arrow-prev-top-align) + var(--arrow-prev-top-position) - var(--arrow-prev-caption-spacing));transform:translate(var(--arrow-prev-translate-x),var(--arrow-prev-translate-y))}.elementor-widget-loop-carousel .swiper-container-horizontal~.swiper-pagination-progressbar,.elementor-widget-loop-carousel .swiper-horizontal~.swiper-pagination-progressbar{height:var(--swiper-pagination-size)}.elementor-widget-loop-carousel .swiper-pagination-progressbar .swiper-pagination-progressbar-fill{background:var(--progressbar-normal-color,#000)}.elementor-widget-loop-carousel .swiper-pagination-progressbar .swiper-pagination-progressbar-fill:hover{background:var(--progressbar-hover-color,#000)}.elementor-widget-loop-carousel .swiper-pagination-fraction{color:var(--fraction-color,#000)}.elementor-widget-loop-carousel .swiper-pagination-bullet{background:var(--dots-normal-color,#000);height:var(--swiper-pagination-size);width:var(--swiper-pagination-size)}.elementor-widget-loop-carousel .swiper-pagination-bullet:hover{background:var(--dots-hover-color,#000);opacity:1}.elementor-widget-loop-carousel.elementor-in-place-template-editable .elementor-loop-container{overflow:visible;overflow-x:clip}.elementor-widget-loop-carousel .swiper-horizontal>.swiper-pagination-bullets,.elementor-widget-loop-carousel .swiper-pagination,.elementor-widget-loop-carousel .swiper-pagination-bullets.swiper-pagination-horizontal,.elementor-widget-loop-carousel .swiper-pagination-custom,.elementor-widget-loop-carousel .swiper-pagination-fraction{font-size:var(--swiper-pagination-size);line-height:var(--swiper-pagination-size)}.elementor-widget-loop-carousel.elementor-pagination-position-outside:not(:has(>.elementor-widget-container))>.swiper,.elementor-widget-loop-carousel.elementor-pagination-position-outside:not(:has(>.elementor-widget-container))>.swiper-container,.elementor-widget-loop-carousel.elementor-pagination-position-outside>.elementor-widget-container>.swiper,.elementor-widget-loop-carousel.elementor-pagination-position-outside>.elementor-widget-container>.swiper-container{padding-bottom:var(--swiper-padding-bottom)}.elementor-widget-loop-carousel.elementor-pagination-position-outside:not(:has(>.elementor-widget-container))>.swiper .elementor-background-slideshow,.elementor-widget-loop-carousel.elementor-pagination-position-outside:not(:has(>.elementor-widget-container))>.swiper-container .elementor-background-slideshow,.elementor-widget-loop-carousel.elementor-pagination-position-outside>.elementor-widget-container>.swiper .elementor-background-slideshow,.elementor-widget-loop-carousel.elementor-pagination-position-outside>.elementor-widget-container>.swiper-container .elementor-background-slideshow{padding-bottom:0}.elementor-widget-loop-carousel.elementor-pagination-position-outside:not(:has(>.elementor-widget-container)) .swiper-pagination-bullet,.elementor-widget-loop-carousel.elementor-pagination-position-outside>.elementor-widget-container .swiper-pagination-bullet{vertical-align:top}.elementor-widget-loop-carousel{--dots-vertical-position:100%;--dots-vertical-offset:0px;--dots-horizontal-position:50%;--dots-horizontal-offset:0px;--dots-horizontal-transform:-50%;--dots-vertical-transform:-100%;--fraction-vertical-position:100%;--fraction-vertical-offset:0px;--fraction-horizontal-position:50%;--fraction-horizontal-offset:0px;--fraction-horizontal-transform:-50%;--fraction-vertical-transform:-100%}.elementor-widget-loop-carousel .swiper-pagination-bullets{height:-moz-max-content;height:max-content;inset-inline-start:calc(var(--dots-horizontal-position) + var(--dots-horizontal-offset));top:calc(var(--dots-vertical-position) + var(--dots-vertical-offset));transform:translate(calc(var(--dots-horizontal-transform) * var(--direction-multiplier, 1)),var(--dots-vertical-transform));width:-moz-max-content;width:max-content;z-index:3}.elementor-widget-loop-carousel .swiper-pagination-fraction{height:-moz-max-content;height:max-content;inset-inline-start:calc(var(--fraction-horizontal-position) + var(--fraction-horizontal-offset));top:calc(var(--fraction-vertical-position) + var(--fraction-vertical-offset));transform:translate(calc(var(--fraction-horizontal-transform) * var(--direction-multiplier, 1)),var(--fraction-vertical-transform));width:-moz-max-content;width:max-content;z-index:3}
Simplify Your Tax Filing with A2G Solutions’ Expert Tax Return Preparation Services - a2gsolutions.com
Skip to content
Introduction
Navigating the complexities of tax filing can be daunting for both individuals and businesses. A2G Solutions offers comprehensive tax return preparation services designed to simplify the process, ensuring compliance and maximizing tax efficiency. Whether you’re filing as an individual or managing a business, our expert team is here to assist you every step of the way.
Personal Tax Return Services
Our personal tax return services cater to a wide range of individual tax situations. We handle all aspects of personal taxation, from basic returns to more complex scenarios, ensuring accuracy and compliance.
Services include:
Self-Assessment Tax Returns: Comprehensive services covering income tax calculations, capital gains tax assessment, rental income declarations, self-employed income reporting, and tax relief claims.
Capital Gains Tax Assessment: Expert assistance in reporting and calculating capital gains to ensure accurate tax filings.
Rental Income Declarations: Guidance on declaring rental income, including allowable expenses and deductions.
Self-Employed Income Reporting: Support for freelancers and contractors in reporting self-employed income and claiming relevant expenses.
Tax Relief Claims: Assistance in identifying and claiming eligible tax reliefs to reduce your tax liability.
Business Tax Services
For businesses, we provide a full suite of tax services to ensure compliance and optimize tax positions.
Services include:
Corporation Tax Returns: Preparation and filing of corporation tax returns, ensuring adherence to current tax laws.
VAT Returns Preparation: Assistance in preparing and submitting VAT returns, including guidance on VAT registration and compliance.
Partnership Tax Returns: Support for partnerships in preparing and filing tax returns, ensuring all income and expenses are accurately reported.
Company Tax Planning: Strategic tax planning services to help businesses minimize tax liabilities and plan for future growth.
Tax Efficiency Review: Comprehensive reviews to identify opportunities for tax savings and efficiency improvements.
VAT Return Preparation
Understanding and managing VAT obligations can be complex. Our team provides expert assistance in preparing and submitting VAT returns, ensuring compliance with HMRC regulations and identifying potential savings opportunities.
Tax Planning and Advisory
Effective tax planning is essential for both individuals and businesses. Our advisory services include:
Tax Efficiency Strategies: Developing strategies to minimize tax liabilities and maximize savings.
Tax Relief Identification: Identifying available tax reliefs and allowances to reduce tax burdens.
Long-Term Tax Planning: Assisting in planning for future tax obligations, including retirement planning and succession planning.
Why Choose A2G Solutions?
Expertise: Our team comprises experienced tax professionals with in-depth knowledge of current tax laws and regulations.
Comprehensive Services: We offer a full range of tax services, from personal returns to complex business tax planning.
Personalized Approach: We tailor our services to meet the unique needs of each client, ensuring optimal outcomes.
Timely Filing: We ensure all tax returns are prepared and filed promptly, avoiding penalties and interest.
Client-Centric Service: Our commitment to client satisfaction drives us to provide exceptional service and support.
Contact Us
Ready to simplify your tax filing process? Contact A2G Solutions today to schedule a consultation and learn how our expert tax return preparation services can benefit you.
📞 24/7 Support: +1-718-577-2718 📧 Email: info@a2gsolutions.com 🌐 Website: https://a2gsolutions.com/contact/