From 0787c7bc4638db76539921bb396b9970c0987723 Mon Sep 17 00:00:00 2001 From: komkida91 Date: Sun, 1 Mar 2026 14:17:19 +0100 Subject: [PATCH] fix(builder): evitar solape en free-drag y auto-reparar posiciones duplicadas --- elementor/templates/elementor_builder.html | 26 ++++++++++++++++++---- 1 file changed, 22 insertions(+), 4 deletions(-) diff --git a/elementor/templates/elementor_builder.html b/elementor/templates/elementor_builder.html index 5b83d2a..9e73c8f 100644 --- a/elementor/templates/elementor_builder.html +++ b/elementor/templates/elementor_builder.html @@ -742,10 +742,11 @@ const state = { if (key === "fast") return "12s"; return "18s"; } - function getDefaultPos(){ + function getDefaultPos(seedIndex){ const base = 20; const gap = 120; - const i = state.blocks.length; + const raw = Number(seedIndex); + const i = Number.isFinite(raw) && raw >= 0 ? Math.floor(raw) : state.blocks.length; return { x: base + (i % 2) * 220, y: base + Math.floor(i / 2) * gap }; } function defaultData(type){ @@ -1548,7 +1549,7 @@ const state = { return; } const visibleBlocks = state.blocks.filter(isBlockVisibleInCanvas); - visibleBlocks.forEach((block)=>{ + visibleBlocks.forEach((block, idx)=>{ const el = document.createElement("div"); el.className = "block"; if (!state.settings.free_drag){ el.removeAttribute("draggable"); } @@ -1556,7 +1557,7 @@ const state = { el.dataset.blockType = block.type; el.id = block.id; if (state.settings.free_drag){ - const pos = block.pos || getDefaultPos(); + const pos = block.pos || getDefaultPos(idx); block.pos = pos; el.style.position = "absolute"; el.style.left = "0px"; @@ -2949,6 +2950,20 @@ const state = { }); return positioned.length >= Math.max(2, Math.ceil(nonMenu.length * 0.5)); } + function normalizeDuplicatedFreeDragPositions(blocks){ + const list = Array.isArray(blocks) ? blocks : []; + const positioned = list.filter((b)=>b && b.pos && Number.isFinite(Number(b.pos.x)) && Number.isFinite(Number(b.pos.y))); + if (positioned.length < 3) return false; + const unique = new Set(positioned.map((b)=>`${Math.round(Number(b.pos.x))}:${Math.round(Number(b.pos.y))}`)); + if (unique.size >= Math.max(3, Math.ceil(positioned.length * 0.6))) return false; + let seq = 0; + list.forEach((b)=>{ + if (!b || b.type === "menu") return; + b.pos = getDefaultPos(seq); + seq += 1; + }); + return true; + } async function saveContent(){ if (isSaving) return; isSaving = true; @@ -3030,6 +3045,9 @@ const state = { // reales, volvemos a flujo normal para evitar superposicion de bloques. state.settings.free_drag = hasMeaningfulFreeDragPositions(state.blocks); } + if (state.settings.free_drag){ + normalizeDuplicatedFreeDragPositions(state.blocks); + } } selectedBlockId = null; wireSidebar();