From 442acb1f8d54a66d15d3c4896bd38ab23597b6dc Mon Sep 17 00:00:00 2001 From: komkida91 Date: Tue, 10 Mar 2026 20:41:18 +0100 Subject: [PATCH] fix(menu): add glass preset and save logging --- elementor/routes.py | 23 ++++++++++++++++++++- elementor/templates/elementor_builder.html | 24 +++++++++++++++++----- 2 files changed, 41 insertions(+), 6 deletions(-) diff --git a/elementor/routes.py b/elementor/routes.py index bca05ef..2853fb2 100644 --- a/elementor/routes.py +++ b/elementor/routes.py @@ -1,5 +1,7 @@ -from flask import Blueprint, render_template, session, request, jsonify, make_response +from flask import Blueprint, render_template, session, request, jsonify, make_response import json +from pathlib import Path +from datetime import datetime from db import get_db from utils.theme_engine import get_theme_config @@ -113,6 +115,25 @@ def save_elementor(): merged = dict(current_content) merged.update(content) + # Debug trace para capturar presets/menus que llegan del front + try: + log_dir = Path('logs') + log_dir.mkdir(exist_ok=True) + log_path = log_dir / 'elementor_save.log' + snapshot = { + "ts": datetime.utcnow().isoformat() + "Z", + "site_id": site_id, + "keys": list(content.keys()) if isinstance(content, dict) else [], + "menu_preset": content.get('menu_preset') if isinstance(content, dict) else None, + "menu_icon_style": content.get('menu_icon_style') if isinstance(content, dict) else None, + "menu_card_bg": content.get('menu_card_bg') if isinstance(content, dict) else None, + "social_preset": content.get('social_preset') if isinstance(content, dict) else None, + } + with log_path.open('a', encoding='utf-8') as f: + f.write(json.dumps(snapshot, ensure_ascii=False) + "\n") + except Exception: + pass + if publish: c.execute('UPDATE sites SET content_json = ?, status = ? WHERE id = ?', (json.dumps(merged), 'published', site_id)) else: diff --git a/elementor/templates/elementor_builder.html b/elementor/templates/elementor_builder.html index 3d5095c..6762deb 100644 --- a/elementor/templates/elementor_builder.html +++ b/elementor/templates/elementor_builder.html @@ -176,14 +176,14 @@ .contact-send{display:inline-flex;align-items:center;justify-content:center;gap:8px;border:0;border-radius:10px;padding:10px 14px;background:var(--site-primary);color:#0b0f16;font-weight:700;cursor:pointer} .contact-send i{font-size:12px} @media (max-width:860px){.contact-pro{grid-template-columns:1fr}} - .site-nav{display:flex;align-items:center;justify-content:space-between;gap:var(--space-3);padding:10px 12px;border:1px solid var(--site-nav-border,#dde4ef);border-radius:var(--site-nav-radius,var(--radius-md));background:var(--site-nav-bg,#ffffff)} + .site-nav{display:flex;align-items:center;justify-content:space-between;gap:var(--space-3);padding:10px 12px;border:1px solid var(--site-nav-border,#dde4ef);border-radius:var(--site-nav-radius,var(--radius-md));background:var(--site-nav-bg,#ffffff);backdrop-filter:var(--site-nav-blur,none);box-shadow:var(--site-nav-shadow,none)} .site-brand{display:flex;align-items:center;gap:10px;font-weight:800;letter-spacing:.2px;min-width:120px;max-width:320px;flex:0 1 auto} .site-brand img{height:28px;width:auto;border-radius:8px;border:1px solid #dbe3ee} .site-brand-badge{height:28px;min-width:28px;padding:0 8px;border-radius:8px;background:var(--site-primary);display:inline-flex;align-items:center;justify-content:center;color:#0b0f16;font-weight:800;font-size:12px} .site-brand span{white-space:nowrap;overflow:hidden;text-overflow:ellipsis} .site-nav-links{display:flex;align-items:center;gap:8px;flex-wrap:wrap;justify-content:flex-end;flex:1 1 auto} .site-nav-link{display:inline-flex;align-items:center;height:32px;padding:0 12px;border-radius:999px;border:1px solid transparent;text-decoration:none;font-size:13px;color:var(--site-text);transition:background .2s ease,border-color .2s ease,transform .2s ease} - .site-nav-link:hover{background:#f1f5f9;border-color:#dbe3ee;transform:translateY(-1px)} + .site-nav-link:hover{background:var(--site-nav-hover,#f1f5f9);border-color:var(--site-nav-border,#dbe3ee);transform:translateY(-1px)} .site-nav-cta{display:inline-flex;align-items:center;justify-content:center;padding:9px 14px;border-radius:999px;background:var(--site-primary);color:#0b0f16;text-decoration:none;font-weight:700;white-space:nowrap} .menu-empty{font-size:12px;color:var(--site-muted)} .menu-inline{display:flex;align-items:center;gap:10px;flex-wrap:wrap} @@ -574,6 +574,7 @@ registered_brand: "", developer_brand: "GKACHELE™", business_rubro: "restaurante", + global_preset: "default", global_block_preset: "clean-landing", global_block_motion: "flow", global_block_motion_speed: "normal" @@ -662,7 +663,7 @@ educacion: { settings: { primary_color: '#0a4dcf', bg_color: '#f4f7ff', text_color: '#0b1733', muted_color: '#4f6286', font_body: 'IBM Plex Sans', font_heading: 'Space Grotesk', bg_gradient: true, bg_color2: '#dbe8ff' }, blocks: [ - { id: makeId(), type: 'menu', data: { title: 'Academia', items: ['Inicio','Programas','Admisiones','Campus','Contacto'], menu_mode: 'both', menu_mobile_style: 'accordion', width: 100 } }, + { id: makeId(), type: 'menu', data: { title: 'Academia', items: ['Inicio','Programas','Admisiones','Campus','Contacto'], menu_mode: 'both', menu_mobile_style: 'accordion', menu_preset: 'default', width: 100 } }, { id: makeId(), type: 'hero', data: { title: 'Formacion academica con enfoque profesional', subtitle: 'Desarrolla competencias reales con docentes expertos, laboratorios modernos y acompanamiento continuo.', button_text: 'Iniciar admision', button_url: '#contacto', image_url: '' } }, { id: makeId(), type: 'cards', data: { title: 'Programas destacados', items: ['Pregrado|Carreras con plan curricular actualizado y enfoque en empleabilidad.','Diplomados|Especializacion intensiva para perfiles tecnicos y profesionales.','Educacion continua|Trayectos cortos para actualizar habilidades de alto impacto.'] } }, { id: makeId(), type: 'iconlist', data: { title: 'Ruta de admision', items: ['Postula online|Completa tu solicitud y adjunta documentos en minutos.','Entrevista academica|Recibe orientacion personalizada segun tu perfil.','Matricula guiada|Formaliza tu ingreso con soporte del equipo academico.'] } }, @@ -768,7 +769,7 @@ const state = { } function defaultData(type){ switch(type){ - case "menu": return { title:"Menu", items:["Inicio","Productos","Blog","La Empresa","Contacto"], menu_mode:"both", menu_mobile_style:"accordion", width:100 }; + case "menu": return { title:"Menu", items:["Inicio","Productos","Blog","La Empresa","Contacto"], menu_mode:"both", menu_mobile_style:"accordion", menu_preset:"default", width:100 }; case "hero": return { title:"Tu propuesta de valor", subtitle:"Explica en una frase por que elegirte.", kicker:"", button_text:"Contactar", button_url:"#contacto", button_secondary_text:"Ver mas", button_secondary_url:"#", image_url:"", align:"left", layout:"media-right", width:60, visual_preset:"inherit", bg_motion_style:"inherit", bg_motion_speed:"inherit" }; case "text": return { text:"Describe tu negocio aqui.", width:60, visual_preset:"inherit", bg_motion_style:"inherit", bg_motion_speed:"inherit" }; case "image": return { url:"", alt:"", caption:"", fit:"cover", overlay_text:"", width:60, visual_preset:"inherit", bg_motion_style:"inherit", bg_motion_speed:"inherit" }; @@ -1185,7 +1186,15 @@ const state = { const showDrawer = showAccordion && mobileStyle === "drawer"; const menuDrawerId = `drawer_${block.id}`; const menuOverlayId = `drawer_overlay_${block.id}`; - return `