fix(builder): reparar texto, habilitar modo libre y forzar full preview

This commit is contained in:
komkida91
2026-02-14 20:40:32 +01:00
parent 400a8230b5
commit f363eefdca

View File

@@ -277,7 +277,7 @@
<button class="btn secondary icon" id="btnSizePhone" title="Movil"><i class="fa-solid fa-mobile-screen-button"></i></button>
<button class="btn secondary icon" id="btnSizeTablet" title="Tablet"><i class="fa-solid fa-tablet-screen-button"></i></button>
<button class="btn secondary icon active" id="btnSizeDesktop" title="Web"><i class="fa-solid fa-display"></i></button>
<button class="btn secondary" id="btnFreeDrag" style="display:none">Modo libre</button>
<button class="btn secondary" id="btnFreeDrag">Modo libre</button>
<button class="btn secondary" id="btnAlign">Alinear</button>
<button class="btn" id="btnSave">Publicar</button>
<div class="save-status" id="saveStatus">Listo</div>
@@ -503,7 +503,15 @@ const state = {
default: return {};
}
}
function escapeHtml(str){return String(str||"").replace(/&/g,"&amp;").replace(/</g,"&lt;").replace(/>/g,"&gt;").replace(/\"/g,"&quot;").replace(/'/g,"&#039;");}
function repairMojibake(text){
const raw = String(text || "");
if (!/[ÃÂ]/.test(raw)) return raw;
try { return decodeURIComponent(escape(raw)); } catch(_e) { return raw; }
}
function escapeHtml(str){
const safe = repairMojibake(str);
return String(safe).replace(/&/g,"&amp;").replace(/</g,"&lt;").replace(/>/g,"&gt;").replace(/\"/g,"&quot;").replace(/'/g,"&#039;");
}
function editable(tag, field, text, placeholder, multiline, style){
const ph = placeholder ? ` data-placeholder="${escapeHtml(placeholder)}"` : ` data-placeholder=""`;
const ml = multiline ? ` data-multiline="true"` : "";
@@ -1086,7 +1094,7 @@ const state = {
const rect = container.getBoundingClientRect();
if (!rect || !rect.width) return null;
const ratio = (clientX - rect.left) / rect.width;
return ratio > 0.38 && ratio < 0.62;
return ratio > 0.33 && ratio < 0.67;
}
function getDropIndex(container,y){
const blocks=[...container.querySelectorAll(".block")];
@@ -1625,7 +1633,25 @@ const state = {
bindDrop(logoDrop, logoFile, (data)=>{ s.logo_url = data; }, "Logo cargado");
bindDrop(bgDrop, bgFile, (data)=>{ s.bg_image_url = data; }, "Fondo cargado");
}
function wireFreeDragToggle(){ return; }
function wireFreeDragToggle(){
const btn = document.getElementById("btnFreeDrag");
if (!btn) return;
const applyLabel = ()=>{
btn.textContent = state.settings.free_drag ? "Modo libre: ON" : "Modo libre";
btn.classList.toggle("active", !!state.settings.free_drag);
};
btn.addEventListener("click", ()=>{
state.settings.free_drag = !state.settings.free_drag;
if (state.settings.free_drag){
state.blocks.forEach((b)=>{
if (!b.pos) b.pos = getDefaultPos();
});
}
applyLabel();
renderPreview();
});
applyLabel();
}
function wirePreviewSize(){
const shell=document.querySelector(".preview-shell");
if (!shell) return;
@@ -1828,8 +1854,17 @@ const state = {
window.location.href = url;
});
}
if (FULL_PAGE_MODE && previewBtn && !document.body.classList.contains("preview-mode")){
previewBtn.click();
if (FULL_PAGE_MODE && !document.body.classList.contains("preview-mode")){
document.body.classList.add("preview-mode");
const shell = document.querySelector(".preview-shell");
const main = document.querySelector(".main");
if (main) main.style.padding = "0";
if (shell){
shell.style.maxWidth = "100%";
shell.style.margin = "0";
shell.classList.remove("size-phone","size-tablet","size-desktop");
shell.classList.add("size-desktop");
}
}
const pageSelect = document.getElementById("pageSelect");
if (pageSelect){