4 Commits

2 changed files with 57 additions and 14 deletions

View File

@@ -66,3 +66,9 @@
- Objetivo: quitar texto en barra Apple, limpiar menu vacio, preview local funcional sin salir de builder, ancho desktop al 100%, control de ancho por bloque y descripcion en bloque video. - Objetivo: quitar texto en barra Apple, limpiar menu vacio, preview local funcional sin salir de builder, ancho desktop al 100%, control de ancho por bloque y descripcion en bloque video.
- Revert: - Revert:
- `git revert 7c5f671` - `git revert 7c5f671`
### Ajustes Builder (preview limpio + menu modos)
- Commit: `dd98e9d`
- Objetivo: mejorar vista previa (forzar modo limpio y restaurar estado), eliminar precarga automatica de bloques, y agregar modo de menu (horizontal/acordeon/ambos).
- Revert:
- `git revert dd98e9d`

View File

@@ -36,7 +36,7 @@
body.ub24 #btnAlign, body.ub24 #btnBack{display:none} body.ub24 #btnAlign, body.ub24 #btnBack{display:none}
body.ub24 .topbar .top-meta{display:none} body.ub24 .topbar .top-meta{display:none}
body.ub24 .block-item{display:flex;align-items:center;gap:8px} body.ub24 .block-item{display:flex;align-items:center;gap:8px}
body.ub24 .block-item:before{content:"â–£";color:#6b7280;font-size:12px} body.ub24 .block-item:before{content:"*";color:#6b7280;font-size:12px}
body.ub24 .inspector .section-title{margin-top:0} body.ub24 .inspector .section-title{margin-top:0}
body.ub24 .inspector .acc{background:#f9fafb;border-color:#e5e7eb} body.ub24 .inspector .acc{background:#f9fafb;border-color:#e5e7eb}
body.ub24 .inspector label{color:#6b7280} body.ub24 .inspector label{color:#6b7280}
@@ -136,7 +136,7 @@
.menu-accordion summary{list-style:none;cursor:pointer;font-weight:600} .menu-accordion summary{list-style:none;cursor:pointer;font-weight:600}
.menu-accordion summary::-webkit-details-marker{display:none} .menu-accordion summary::-webkit-details-marker{display:none}
.menu-links{display:flex;flex-direction:column;gap:8px;margin-top:8px} .menu-links{display:flex;flex-direction:column;gap:8px;margin-top:8px}
.menu-accordion summary::after{content:"â–¾";float:right;color:var(--site-muted)} .menu-accordion summary::after{content:"v";float:right;color:var(--site-muted)}
.float-whatsapp{position:fixed;right:22px;bottom:22px;width:52px;height:52px;border-radius:999px;background:#25d366;color:#fff;display:flex;align-items:center;justify-content:center;box-shadow:0 14px 30px rgba(0,0,0,.22);z-index:999;text-decoration:none} .float-whatsapp{position:fixed;right:22px;bottom:22px;width:52px;height:52px;border-radius:999px;background:#25d366;color:#fff;display:flex;align-items:center;justify-content:center;box-shadow:0 14px 30px rgba(0,0,0,.22);z-index:999;text-decoration:none}
.float-whatsapp:hover{transform:translateY(-2px)} .float-whatsapp:hover{transform:translateY(-2px)}
@media (max-width:980px){ @media (max-width:980px){
@@ -178,8 +178,8 @@
details.acc{border:1px solid var(--border);border-radius:12px;padding:8px 10px;margin-bottom:10px;background:#0f172a} details.acc{border:1px solid var(--border);border-radius:12px;padding:8px 10px;margin-bottom:10px;background:#0f172a}
details.acc summary{list-style:none;cursor:pointer;font-weight:600} details.acc summary{list-style:none;cursor:pointer;font-weight:600}
details.acc summary::-webkit-details-marker{display:none} details.acc summary::-webkit-details-marker{display:none}
details.acc summary:after{content:"â–¾";float:right;color:var(--muted)} details.acc summary:after{content:"v";float:right;color:var(--muted)}
details.acc[open] summary:after{content:"â–´"} details.acc[open] summary:after{content:"^"}
.acc-body{margin-top:8px} .acc-body{margin-top:8px}
.danger{background:transparent;border:1px solid #f87171;color:#f87171;padding:8px;border-radius:999px;width:100%;cursor:pointer} .danger{background:transparent;border:1px solid #f87171;color:#f87171;padding:8px;border-radius:999px;width:100%;cursor:pointer}
@media (max-width:1100px){.app{grid-template-columns:220px 1fr}.inspector{display:none}} @media (max-width:1100px){.app{grid-template-columns:220px 1fr}.inspector{display:none}}
@@ -219,7 +219,7 @@
<div class="block-item" draggable="true" data-type="button" data-multi="true">Boton</div> <div class="block-item" draggable="true" data-type="button" data-multi="true">Boton</div>
<div class="block-item" draggable="true" data-type="video" data-multi="true">Video</div> <div class="block-item" draggable="true" data-type="video" data-multi="true">Video</div>
<div class="block-item" draggable="true" data-type="social" data-multi="false">Redes</div> <div class="block-item" draggable="true" data-type="social" data-multi="false">Redes</div>
<div class="block-item" draggable="true" data-type="review" data-multi="true">Reseña</div> <div class="block-item" draggable="true" data-type="review" data-multi="true">Resena</div>
<div class="block-item" draggable="true" data-type="calendar" data-multi="false">Calendario</div> <div class="block-item" draggable="true" data-type="calendar" data-multi="false">Calendario</div>
</div> </div>
</aside> </aside>
@@ -446,6 +446,7 @@ const state = {
let resizeRaf = 0; let resizeRaf = 0;
let pendingMove = null; let pendingMove = null;
let pendingResize = null; let pendingResize = null;
let previewStateBefore = null;
function makeId(){ return "block_" + Date.now() + "_" + Math.floor(Math.random()*1000); } function makeId(){ return "block_" + Date.now() + "_" + Math.floor(Math.random()*1000); }
function getDefaultPos(){ function getDefaultPos(){
@@ -456,7 +457,7 @@ const state = {
} }
function defaultData(type){ function defaultData(type){
switch(type){ switch(type){
case "menu": return { title:"Menu", items:[] }; case "menu": return { title:"Menu", items:[], menu_mode:"both" };
case "hero": return { title:"Tu propuesta de valor", subtitle:"Explica en una frase por que elegirte.", button_text:"Contactar", button_url:"#contacto", image_url:"" }; case "hero": return { title:"Tu propuesta de valor", subtitle:"Explica en una frase por que elegirte.", button_text:"Contactar", button_url:"#contacto", image_url:"" };
case "text": return { text:"Describe tu negocio aqui." }; case "text": return { text:"Describe tu negocio aqui." };
case "image": return { url:"", alt:"", caption:"", fit:"cover", overlay_text:"" }; case "image": return { url:"", alt:"", caption:"", fit:"cover", overlay_text:"" };
@@ -669,11 +670,13 @@ const state = {
const links = items.map(it=>`<a class="site-nav-link" href="#${it.id}">${escapeHtml(it.label)}</a>`).join(""); const links = items.map(it=>`<a class="site-nav-link" href="#${it.id}">${escapeHtml(it.label)}</a>`).join("");
const mobileLinks = items.map(it=>`<a class="site-nav-link" href="#${it.id}">${escapeHtml(it.label)}</a>`).join(""); const mobileLinks = items.map(it=>`<a class="site-nav-link" href="#${it.id}">${escapeHtml(it.label)}</a>`).join("");
const logo = state.settings.logo_url ? `<img src="${escapeHtml(state.settings.logo_url)}" alt="Logo" />` : ""; const logo = state.settings.logo_url ? `<img src="${escapeHtml(state.settings.logo_url)}" alt="Logo" />` : "";
const mode = (block.data?.menu_mode || "both").toLowerCase();
const showInline = mode === "both" || mode === "inline";
const showAccordion = mode === "both" || mode === "accordion";
return `<div class="site-nav"> return `<div class="site-nav">
<div class="site-brand">${logo}<span>${escapeHtml(state.settings.site_name||"GKACHELE")}</span></div> <div class="site-brand">${logo}<span>${escapeHtml(state.settings.site_name||"GKACHELE")}</span></div>
<div class="menu-inline site-nav-links">${links}</div> <div class="menu-inline site-nav-links" style="${showInline ? "" : "display:none"}">${links}</div>
<a href="#contacto" class="site-nav-cta">Contactar</a> <details class="menu-accordion" style="${showAccordion ? "" : "display:none"}">
<details class="menu-accordion">
<summary>Menu</summary> <summary>Menu</summary>
<div class="menu-links">${mobileLinks}</div> <div class="menu-links">${mobileLinks}</div>
</details> </details>
@@ -1087,6 +1090,8 @@ const state = {
html += `<div class="row"><label>Ancho bloque (%)</label><input id="blockWidth" type="range" min="30" max="100" value="${widthVal}"><div id="blockWidthValue" style="margin-top:4px;color:var(--muted);font-size:12px">${widthVal}%</div></div>`; html += `<div class="row"><label>Ancho bloque (%)</label><input id="blockWidth" type="range" min="30" max="100" value="${widthVal}"><div id="blockWidthValue" style="margin-top:4px;color:var(--muted);font-size:12px">${widthVal}%</div></div>`;
if (block.type==="menu"){ if (block.type==="menu"){
html+=input("Titulo","menuTitle",data.title); html+=input("Titulo","menuTitle",data.title);
const mm = escapeHtml(data.menu_mode || "both");
html+=`<div class="row"><label>Modo menu</label><select id="menuMode"><option value="both" ${mm==="both"?"selected":""}>Ambos</option><option value="inline" ${mm==="inline"?"selected":""}>Horizontal</option><option value="accordion" ${mm==="accordion"?"selected":""}>Acordeon</option></select></div>`;
} else if (block.type==="hero"){ } else if (block.type==="hero"){
html+=input("Titulo","heroTitle",data.title); html+=input("Titulo","heroTitle",data.title);
html+=input("Subtitulo","heroSubtitle",data.subtitle); html+=input("Subtitulo","heroSubtitle",data.subtitle);
@@ -1207,7 +1212,11 @@ const state = {
if (widthEl){ if (widthEl){
block.data.width = Math.max(30, Math.min(100, Number(widthEl.value || 100))); block.data.width = Math.max(30, Math.min(100, Number(widthEl.value || 100)));
} }
if (block.type==="menu"){ block.data.title=document.getElementById("menuTitle").value; } if (block.type==="menu"){
block.data.title=document.getElementById("menuTitle").value;
const mm = document.getElementById("menuMode");
if (mm){ block.data.menu_mode = mm.value || "both"; }
}
else if (block.type==="hero"){ else if (block.type==="hero"){
block.data.title=document.getElementById("heroTitle").value; block.data.title=document.getElementById("heroTitle").value;
block.data.subtitle=document.getElementById("heroSubtitle").value; block.data.subtitle=document.getElementById("heroSubtitle").value;
@@ -1660,7 +1669,8 @@ const state = {
if (BUILDER_MODE === "ub24"){ if (BUILDER_MODE === "ub24"){
state.settings.free_drag = false; state.settings.free_drag = false;
} }
if (!state.blocks.length){ state.blocks=[ {id:makeId(),type:"hero",data:defaultData("hero")},{id:makeId(),type:"features",data:defaultData("features")},{id:makeId(),type:"gallery",data:defaultData("gallery")},{id:makeId(),type:"contact",data:defaultData("contact")} ]; } state.blocks = [];
selectedBlockId = null;
wireSidebar(); wirePreviewDrop(); wireInlineEditing(); wireSettings(); wireFreeDragToggle(); wireJumpSelect(); wirePreviewSize(); wireThemeToggle(); wireSidebar(); wirePreviewDrop(); wireInlineEditing(); wireSettings(); wireFreeDragToggle(); wireJumpSelect(); wirePreviewSize(); wireThemeToggle();
const backBtn = document.getElementById("btnBack"); const backBtn = document.getElementById("btnBack");
if (backBtn){ backBtn.addEventListener("click",()=>{ window.history.back(); }); } if (backBtn){ backBtn.addEventListener("click",()=>{ window.history.back(); }); }
@@ -1672,13 +1682,40 @@ const state = {
const sidebar = document.querySelector(".sidebar"); const sidebar = document.querySelector(".sidebar");
const inspector = document.querySelector(".inspector"); const inspector = document.querySelector(".inspector");
const main = document.querySelector(".main"); const main = document.querySelector(".main");
const shell = document.querySelector(".preview-shell");
const activeSizeBtn = document.querySelector("#btnSizePhone.active, #btnSizeTablet.active, #btnSizeDesktop.active");
const activeSizeId = activeSizeBtn ? activeSizeBtn.id : "btnSizeDesktop";
if (isPreview && shell){
previewStateBefore = {
maxWidth: shell.style.maxWidth || "",
margin: shell.style.margin || "",
activeSizeId
};
}
if (sidebar) sidebar.style.display = isPreview ? "none" : ""; if (sidebar) sidebar.style.display = isPreview ? "none" : "";
if (inspector) inspector.style.display = isPreview ? "none" : ""; if (inspector) inspector.style.display = isPreview ? "none" : "";
if (main) main.style.padding = isPreview ? "8px" : ""; if (main) main.style.padding = isPreview ? "8px" : "";
const shell = document.querySelector(".preview-shell");
if (shell){ if (shell){
shell.style.maxWidth = isPreview ? "100%" : ""; if (isPreview){
shell.style.margin = isPreview ? "8px auto" : ""; shell.style.maxWidth = "100%";
shell.style.margin = "8px auto";
shell.classList.remove("size-phone","size-tablet","size-desktop");
shell.classList.add("size-desktop");
["btnSizePhone","btnSizeTablet","btnSizeDesktop"].forEach(id=>{
const b=document.getElementById(id);
if (b) b.classList.toggle("active", id==="btnSizeDesktop");
});
} else if (previewStateBefore){
shell.style.maxWidth = previewStateBefore.maxWidth;
shell.style.margin = previewStateBefore.margin;
shell.classList.remove("size-phone","size-tablet","size-desktop");
const map = { btnSizePhone: "size-phone", btnSizeTablet: "size-tablet", btnSizeDesktop: "size-desktop" };
shell.classList.add(map[previewStateBefore.activeSizeId] || "size-desktop");
["btnSizePhone","btnSizeTablet","btnSizeDesktop"].forEach(id=>{
const b=document.getElementById(id);
if (b) b.classList.toggle("active", id===previewStateBefore.activeSizeId);
});
}
} }
window.scrollTo({ top: 0, behavior: "smooth" }); window.scrollTo({ top: 0, behavior: "smooth" });
return; return;