32 Commits

Author SHA1 Message Date
komkida91
93d046a24c fix(builder): improve menu anchor targeting and free-drop placement 2026-02-24 16:21:25 +01:00
komkida91
b37d2d4bec chore(versioning): add blocking checklist for execution workflow 2026-02-22 17:57:21 +01:00
komkida91
a15e3e17af chore(versioning): memorize working method and refresh session state 2026-02-22 17:52:37 +01:00
komkida91
d5f2b819bf fix(builder): use stable canvas container for drop/reorder positioning 2026-02-22 17:52:24 +01:00
komkida91
b3bb7d57aa docs(builder): memorize restaurant status and next QA pass for menu icons 2026-02-21 17:24:13 +01:00
komkida91
e83e915584 fix(builder): stabilize drawer reset flow and restore editable restaurant theme 2026-02-21 17:22:31 +01:00
komkida91
e3a1c9d17f chore(versioning): profesionalizar VERSIONADO_IA y limpiar protocolo 2026-02-19 23:54:18 +01:00
komkida91
8ae0017533 chore(versioning): registrar commit educacion v2 y regla token 2026-02-18 07:16:05 +01:00
komkida91
8ac360b69d feat(builder): educacion v2 + navegacion por anclas y regla token 2026-02-18 07:15:30 +01:00
komkida91
6f143089b4 fix(builder): unificar layout y estabilizar redimension en canvas 2026-02-16 20:33:44 +01:00
komkida91
685659c0f1 chore(versioning): registrar hash del fix final del dia 2026-02-14 20:40:49 +01:00
komkida91
f363eefdca fix(builder): reparar texto, habilitar modo libre y forzar full preview 2026-02-14 20:40:32 +01:00
komkida91
400a8230b5 chore(versioning): registrar hash de fix layout sin toggle global 2026-02-14 20:34:32 +01:00
komkida91
f9f7d23b8d fix(layout): quitar dos columnas global y usar solo drag por bloque 2026-02-14 20:34:16 +01:00
komkida91
f2fbc6eedd chore(versioning): registrar hash de drag inteligente y preview completo 2026-02-14 20:26:08 +01:00
komkida91
a6089ee341 feat(builder): decidir 1 o 2 columnas moviendo bloques y preview completo 2026-02-14 20:25:54 +01:00
komkida91
f8935e7c00 chore(versioning): registrar hash de full width y dos columnas 2026-02-14 20:18:07 +01:00
komkida91
e5df6de8fc feat(layout): ancho total y dos columnas con control por bloque 2026-02-14 20:17:54 +01:00
komkida91
df641372fa chore(versioning): registrar hash de fix preview full-page 2026-02-14 19:52:53 +01:00
komkida91
e20f0867fe fix(preview): pantalla completa y layout por secciones estable 2026-02-14 19:52:41 +01:00
komkida91
22fcd505f4 chore(versioning): registrar hashes de api y pulido de builder 2026-02-14 19:47:22 +01:00
komkida91
c2ee81d202 fix(builder): conservar bloques cargados y mejorar estado de publicar 2026-02-14 19:47:10 +01:00
komkida91
b6fb4dadff feat(elementor): agregar api propia de guardado y publicacion 2026-02-14 19:47:04 +01:00
komkida91
7dddbc4764 docs(ops): estandarizar arranque UB24 y registrar hashes 2026-02-14 19:37:53 +01:00
komkida91
f6d8ab13c0 fix(db): evitar conversiones SQL invalidas en SQLite 2026-02-14 19:37:42 +01:00
komkida91
1a5778be2e feat(app): unificar arranque y registrar blueprint de elementor 2026-02-14 19:37:36 +01:00
komkida91
53aa755c39 docs(builder): documentar arranque rapido UB24 en local 2026-02-14 19:30:37 +01:00
komkida91
075dad6f1a chore(versioning): unificar documentacion y protocolo de sincronizacion 2026-02-14 19:14:48 +01:00
komkida91
6d696c4c5d fix(builder): corregir caracteres rotos y limpiar menu superior 2026-02-12 20:09:38 +01:00
komkida91
e409f25ab4 fix(builder): iniciar elementor limpio sin bloques precargados 2026-02-12 20:03:54 +01:00
komkida91
1fa4b166e5 chore(versioning): registrar hash de preview limpio y menu modos 2026-02-12 19:59:31 +01:00
komkida91
dd98e9d9f0 fix(builder): limpiar preview, quitar precarga y menu con modos 2026-02-12 19:59:13 +01:00
9 changed files with 1994 additions and 397 deletions

View File

@@ -0,0 +1,40 @@
# Arranque Rapido UB24 (Local Windows)
## URL canonica
- `http://127.0.0.1:5001/elementor/1`
## Inicio en 1 comando
Desde `c:\word`:
```powershell
python -m demo.app
```
## Verificar que quedo arriba
En otra terminal:
```powershell
Invoke-WebRequest http://127.0.0.1:5001/elementor/1 -UseBasicParsing
```
Si responde `StatusCode: 200`, esta listo.
## Tiempo de arranque esperado
- Primer arranque: puede tardar ~40-50 segundos por inicializacion de DB.
- Arranques siguientes: normalmente mas rapido.
## Levantar en background
Desde `c:\word`:
```powershell
Start-Process -FilePath python -ArgumentList @('-m','demo.app') -WorkingDirectory 'c:\word'
```
## Parar servidor
```powershell
Get-CimInstance Win32_Process | Where-Object { $_.Name -eq 'python.exe' -and $_.CommandLine -match 'demo.app' } | ForEach-Object { Stop-Process -Id $_.ProcessId -Force }
```
## Logs
- `c:\word\logs_demo_app.txt`
- `c:\word\logs_demo_app.err`

279
codex/HISTORIAL_CAMBIOS.md Normal file
View File

@@ -0,0 +1,279 @@
# 📝 Historial de Cambios - GKACHELE™
**© 2025 GKACHELE™. Todos los derechos reservados.**
## 🔄 Historial de Versiones
### Hash: `gkachele-elementor-restaurante-20260221-v22`
**Fecha:** 21 Febrero 2026
**Estado:** OK funcional (mejorable)
#### Cambios:
- OK Drawer Pro estabilizado: apertura/cierre, overlay, z-index, lock scroll, Escape/foco y sync por viewport.
- OK Reset de builder corrige limpieza de bloques + settings.
- OK Se evita autoload de plantilla cuando ya hay estado guardado.
- OK Tema restaurante sin colores duros por bloque; vuelve a depender de variables editables.
- OK Se restaura comportamiento de ancho/contenedor para no romper bloques al 100%.
- Pendiente: QA manual de cada icono del menu en preview final (plan siguiente lote).
---
### Hash: `gkachele-elementor-apple-20260209-v14`
**Fecha:** 09 Febrero 2026
**Estado:** OK Fase 1
#### Cambios:
- OK Modo libre unico activo
- OK Drag/resize con handles 8 puntos + Shift
- OK Guías de snap
- OK Touch (capacitivos)
- OK Auto-height del canvas
- OK Menu superior movible y redimensionable
- OK Boton Alinear
---
### Hash: `gkachele-elementor-apple-20260209-v13`
**Fecha:** 09 Febrero 2026
**Estado:** OK UX Builder
#### Cambios:
- OK Sidebar: solo drag (sin agregar por click)
- OK Menu: acordeon responsive por tamanos de preview
- OK Media: captions + fit (cover/contain) en imagen/galeria
- OK Video: drag & drop (dataURL) o URL
- OK Delete inline en bloques (icono en preview)
- OK Free drag: links no bloquean movimiento
- OK Boton atras (history.back)
---
### Hash: `gkachele-elementor-apple-20260209-v12`
**Fecha:** 09 Febrero 2026
**Estado:** OK Responsive + fondos
#### Cambios:
- OK Menu responsive con acordeon en movil
- OK Fondo: animacion de gradiente + GIF de fondo
- OK Boton: estilos (primario/outline/ghost) y tamanos
- OK Boton flotante WhatsApp (si hay numero)
- OK Transiciones premium (botones/iconos/hover)
- OK Modo libre: sin etiqueta ON, estado visual
---
### Hash: `gkachele-elementor-apple-20260209-v11`
**Fecha:** 09 Febrero 2026
**Estado:** OK Mejoras UX/UI
#### Cambios:
- OK Mas tipografias en el inspector
- OK Redes: estilos premium (pill/circulo/outline/minimal/solid) + iconos extra
- OK Drag & drop de imagenes desde el preview (imagen y galeria)
- OK Mapa: embed corregido (google.com/maps)
- OK Contacto: mailto/tel
- OK Calendario: vista tipo calendario (si no hay embed)
- OK Resenas: estilos (card/quote/compacto)
- OK Resize activo en ambos modos
- OK Modo libre con tamanos mas controlados
- OK Transiciones y hover premium en iconos
---
### Hash: `gkachele-elementor-apple-20260209-v10`
**Fecha:** 09 Febrero 2026
**Estado:** OK Pendientes anotados
#### Cambios:
- OK Memoria actualizada para adaptacion a SaaS
- OK Pendientes: color de texto, transiciones, colores de iconos
- OK Pendientes: resize en modo libre, mapa direccion
- OK Pendientes: tarjetas con 3 opciones y menu movil acordeon
---
### Hash: `gkachele-elementor-apple-20260209-v9`
**Fecha:** 09 Febrero 2026
**Estado:** OK Ajustado
#### Cambios:
- OK Iconos de preview (movil/tablet/web)
- OK Redes con iconos y tamano ajustable
- OK Mapa sin API y boton scroll
- OK Carga de logo/fondo por arrastre
---
### Hash: `gkachele-elementor-apple-20260209-v8`
**Fecha:** 09 Febrero 2026
**Estado:** OK Ajustado
#### Cambios:
- OK Menu superior detecta secciones
- OK Layout 2 columnas basico
- OK Contador ilimitado en topbar
- OK Botones de tamano preview
---
### Hash: `gkachele-elementor-apple-20260209-v7`
**Fecha:** 09 Febrero 2026
**Estado:** OK Ajustado
#### Cambios:
- OK Fondos con gradiente y controles visibles
- OK Tama?o de bloques por porcentaje
- OK Topbar con contador y salto a bloques
- OK Animaciones configurables
---
### Hash: `gkachele-elementor-apple-20260209-v6`
**Fecha:** 09 Febrero 2026
**Estado:** OK Ajustado
#### Cambios:
- OK Modo libre (drag X/Y) con snapping
- OK Boton de activacion en topbar
- OK Posiciones guardadas por bloque
---
### Hash: `gkachele-elementor-apple-20260209-v5`
**Fecha:** 09 Febrero 2026
**Estado:** OK Ajustado
#### Cambios:
- OK Componentes nuevos: tarjetas e iconos
- OK Sidebar e inspector con configuracion de items
- OK Render en preview y tema apple-pro
---
### Hash: `gkachele-elementor-apple-20260209-v4`
**Fecha:** 09 Febrero 2026
**Estado:** OK Ajustado
#### Cambios:
- OK Editor de tipografias (texto y titulos) en el inspector
- OK Paleta de colores (fondo, texto, secundario)
- OK Preview con variables de estilo aplicadas
- OK Animaciones sutiles en bloques (hover + entrada)
---
### Hash: `gkachele-builder-apple-20260208-v2`
**Fecha:** 08 Febrero 2026
**Estado:** ✅ Ajustado
#### Cambios:
- ✅ Restaurado template del builder en `elementor/templates/elementor_builder.html`
- ✅ Drag & drop funcional (agregar y reordenar en preview)
- ✅ Inspector estable para editar bloques y ajustes del sitio
---
### Hash: `gkachele-elementor-apple-20260208-v3`
**Fecha:** 08 Febrero 2026
**Estado:** ✅ Base de trabajo (congelada)
#### Cambios:
- ✅ Version base del builder para continuar mañana
- ✅ Drag & drop estable en preview
- ✅ Inspector con edicion de bloques
- ✅ Fondo y video por URL en preview
---
### Hash: `gkachele-builder-apple-20260208-v1`
**Fecha:** 08 Febrero 2026
**Estado:** ✅ En progreso
#### Cambios:
- ✅ Builder tipo drag & drop en ruta `/elementor/{site_id}`
- ✅ Vista lienzo con bloques sobre la pagina (no lista)
- ✅ Preview en vivo con marco estilo navegador
- ✅ Tema `apple-pro` para paginas profesionales
- ✅ Soporte de logo, fondo con imagen y video en ajustes
- ✅ Redes sociales ampliadas (TikTok, YouTube, LinkedIn, X, Telegram)
---
### Hash: `gkachele-login-customizer-20250114-v3`
**Fecha:** 14 Enero 2025 - 11:34
**Estado:** ✅ Funcionando
#### Cambios:
-**Login redirige correctamente a customizer**
- ✅ Añadido debugging completo (backend + frontend)
- ✅ Content-Type JSON explícito en respuesta
- ✅ Flush=True en todos los prints
- ✅ Console.log en frontend para debugging
- ✅ Verificación de sitios del usuario antes de redirigir
#### Funcionalidad:
- Login → Busca primer sitio del usuario
- Si tiene sitio → `/customizer/{site_id}`
- Si no tiene sitio → `/dashboard`
- Frontend recibe y procesa correctamente el redirect
---
### Hash: `gkachele-argentina-20250114-v2`
**Fecha:** 14 Enero 2025 - 11:15
#### Cambios:
- Documentación objetivos Argentina
- Gitea y workflows documentados
- Subdominios y pagos documentados
---
### Hash: `gkachele-template-system-20250114-v1`
**Fecha:** 14 Enero 2025 - 08:50
#### Cambios:
- Sistema modular de templates
- Menús y widgets dinámicos
- Sistema de roles basado en DB
---
**Ultima actualizacion:** 09 Febrero 2026
---
**© 2025 GKACHELE™. Todos los derechos reservados.**
## 🔄 Historial de Versiones
### Hash: `gkachele-builder-docs-20260208-v1`
**Fecha:** 08 Febrero 2026
**Estado:** ✅ Documentado
#### Cambios:
- ✅ Guía rápida del builder en `memoria/BUILDER_ELEMENTOR.md`
- ✅ Entrada en índice de documentación
---
### Hash: `gkachele-docs-sync-20260214-v1`
**Fecha:** 14 Febrero 2026
**Estado:** OK Documentacion unificada
#### Cambios:
- Fuente vigente consolidada en `codex/*`.
- `codex/VERSIONADO_IA.md` actualizado con protocolo fijo de sync local/remoto.
- `codex/MEMORIA_CODEX.md` actualizado con punto exacto (rama, commit, version base, estado sync).
- `memoria/ESTADO_ACTUAL.md` marcado como historico para evitar decisiones con contexto 2025.
---

44
codex/MEMORIA_CODEX.md Normal file
View File

@@ -0,0 +1,44 @@
# Memoria Codex - GKACHELE
**Fecha de corte:** 22 Febrero 2026
## Fuente de verdad (estado IA)
- `codex/VERSIONADO_IA.md`
- `codex/BUILDER_ELEMENTOR_VERSION.md`
- `codex/HISTORIAL_CAMBIOS.md`
## Punto exacto
- Rama activa: `ai/ub24-builder-v1`
- Commit de referencia funcional: `e83e915`
- Version base builder: `gkachele-elementor-templates-20260210-v21`
- Estado de sync local/remoto al corte: `3/0`
## Estado actual funcional
- Builder visual operativo en `/elementor/<site_id>`.
- Drag/drop y resize fluido en canvas.
- Inspector para estilos y contenido.
- Modo libre con snapping.
- Menu mobile con modo `Drawer Pro` estabilizado (apertura/cierre, overlay, escape, foco, lock scroll).
- Reset corrige bloques + settings y evita recarga de plantilla por autoload no deseado.
- Tema restaurante mejorado, pero aun con ajustes pendientes de calidad fina.
## Pendientes inmediatos
- Revisar cada icono del menu en preview final (flujo completo, uno por uno).
- Validar responsive del menu (desktop/tablet/mobile) con focus y accesibilidad.
- Ajuste fino visual del tema restaurante (estado "mejorable").
- Consolidar puente Builder -> SaaS (`/customizer/<id>`).
## Flujo operativo memorizado
1. Construir y validar local en `http://127.0.0.1:5001`.
2. Guardar cambios en commits atomicos.
3. Push a `origin/ai/ub24-builder-v1` en cada lote validado.
4. Actualizar hash y estado en `codex/VERSIONADO_IA.md`.
## Metodo acordado (memorizado)
- Misma rama + control por hash/revert.
- Fixes acotados (un archivo por lote cuando aplique).
- Probar inmediatamente cada cambio antes de avanzar.
- Sin commit/push hasta orden explicita del usuario.
## Comando de arranque
- `python -m demo.app` desde `c:\word`

View File

@@ -1,68 +1,127 @@
# Versionado IA - UB24/Elementor # Versionado IA - UB24 / Elementor
## Rama de trabajo ## 0) Protocolo Bloqueante (siempre)
- `ai/ub24-builder-v1` 1. Definir objetivo del lote en 1 linea.
2. Tocar un solo archivo por fix (salvo excepcion aprobada).
3. Hacer un solo cambio por intento.
4. Probar inmediatamente con flujo fijo acordado.
5. Si falla, revert inmediato por hash/commit (sin encadenar parches).
6. Si pasa, commit atomico con mensaje semantico.
7. Push solo con orden explicita del usuario.
8. Antes de declarar estado, verificar sync real (`fetch` + `rev-list`).
## Regla de trabajo ## 1) Objetivo
1. Cada cambio funcional se guarda en un commit separado. Definir un proceso de versionado auditable, reproducible y estable para el desarrollo del builder UB24.
2. Cada commit se registra con su hash.
3. Cada commit debe incluir comando de reversión rápida.
## Registro de hashes ## 2) Estado actual verificado
### Baseline - Fecha de verificacion: `2026-02-22`
- Commit: `cb99f26` - Rama activa: `ai/ub24-builder-v1`
- Objetivo: crear rama y política de versionado para trabajo IA. - Upstream: `origin/ai/ub24-builder-v1`
- Revert: - Divergencia local/remoto: `3 0`
- `git revert <hash>` - Comando usado:
- o volver a commit previo: `git reset --hard <hash_anterior>` (solo si se aprueba explícitamente) - `git rev-list --left-right --count ai/ub24-builder-v1...origin/ai/ub24-builder-v1`
## Convención de mensaje ## 3) Politica de versionado
1. Commits atomicos por cambio funcional.
2. Mensajes bajo convencion semantica.
3. Reversion siempre definida por commit.
4. Cada bloque validado se empuja a remoto.
5. No mezclar cambios de infraestructura con cambios de UX en el mismo commit.
## 4) Convencion de commits
- `feat(builder): ...` - `feat(builder): ...`
- `fix(builder): ...` - `fix(builder): ...`
- `refactor(builder): ...` - `refactor(builder): ...`
- `chore(versioning): ...` - `chore(versioning): ...`
- `docs(builder): ...`
## Flujo con Gitea ## 5) Flujo obligatorio por sesion
1. Trabajo local en `ai/ub24-builder-v1`. 1. Verificar rama activa:
2. Push continuo a `origin/ai/ub24-builder-v1`. - `git branch --show-current`
3. Merge cuando validemos en local y Raspberry. 2. Actualizar referencias remotas:
- `git fetch origin --prune`
3. Verificar divergencia:
- `git rev-list --left-right --count ai/ub24-builder-v1...origin/ai/ub24-builder-v1`
4. Si no es `0 0`, sincronizar antes de editar.
5. Al cerrar lote validado:
- `git add <archivos>`
- `git commit -m "tipo(scope): mensaje"`
- `git push origin ai/ub24-builder-v1`
### Correccion historial ## 5.1) Metodo de ejecucion memorizado (obligatorio)
- Commit: `fe8657e` 1. Misma rama activa (`ai/ub24-builder-v1`), sin ramas paralelas para fixes rapidos.
- Objetivo: revertir commit no deseado y mantener separacion de cambios. 2. Control por hash/revert: si un intento falla, revert inmediato por commit.
- Revert: 3. Un archivo por fix cuando sea posible (evitar mezclar cambios laterales).
- `git revert fe8657e` 4. Validacion funcional inmediata despues de cada microcambio.
5. No commit/push sin orden explicita del usuario.
### Fix local Elementor ## 6) Protocolo de arranque local
- Commit: `22e564e` - Comando canonico:
- Objetivo: robustecer arranque local y carga de themes en Windows (BOM + logs seguros). - `python -m demo.app`
- Revert: - URL canonica:
- `git revert 22e564e` - `http://127.0.0.1:5001`
- Builder:
- `http://127.0.0.1:5001/elementor/1`
- Verificacion rapida:
- `Invoke-WebRequest http://127.0.0.1:5001/elementor/1 -UseBasicParsing`
### Fase 1 Builder (visual pro) ## 7) Criterios de estabilidad (no negociables)
- Commit: `1c04f04` 1. No tocar funcionalidades estables sin requerimiento explicito.
- Objetivo: consolidar estilos reutilizables y subir calidad visual en hero, features, cards y contact del preview. 2. Mantener una sola estrategia de layout y DnD por flujo.
- Revert: 3. Mantener una sola ruta de guardado activa:
- `git revert 1c04f04` - `/api/elementor/save`
4. Validar guardado/publicacion antes de cerrar lote.
5. Evitar cambios amplios si un fix local resuelve el problema.
## URL local canonica (unificada) ## 8) Registro de commits relevantes
- Base local: `http://127.0.0.1:5001` | Fecha | Commit | Tipo | Objetivo | Revert recomendado |
- Builder local: `http://127.0.0.1:5001/elementor/1` |---|---|---|---|---|
- Regla: usar siempre `127.0.0.1` (no `localhost`) en scripts, pruebas y documentacion local. | 2026-02-21 | `e83e915` | fix | Estabilizar Drawer Pro, reset real de builder y restaurar tema restaurante editable + ancho | `git revert e83e915` |
| 2026-02-14 | `cb99f26` | chore | Crear rama y politica inicial de versionado IA | `git revert cb99f26` |
| 2026-02-14 | `fe8657e` | fix | Revertir commit no deseado y limpiar historial | `git revert fe8657e` |
| 2026-02-14 | `22e564e` | fix | Robustecer arranque local/theme load en Windows | `git revert 22e564e` |
| 2026-02-14 | `1c04f04` | feat | Mejora visual base (hero/features/cards/contact) | `git revert 1c04f04` |
| 2026-02-14 | `7c5f671` | fix | Limpieza preview/menu y ajustes de ancho | `git revert 7c5f671` |
| 2026-02-14 | `dd98e9d` | fix | Preview limpio y menu por modos | `git revert dd98e9d` |
| 2026-02-15 | `1a5778b` | refactor | Runtime unificado `python -m demo.app` + blueprint Elementor | `git revert 1a5778b` |
| 2026-02-15 | `8ac360b` | feat | Educacion V2 + correccion de anclas | `git revert 8ac360b` |
| 2026-02-15 | `f6d8ab1` | fix | Corregir wrapper SQLite para evitar fallo de arranque | `git revert f6d8ab1` |
| 2026-02-15 | `b6fb4da` | feat | API dedicada `/api/elementor/save` con opcion publicar | `git revert b6fb4da` |
| 2026-02-15 | `c2ee81d` | fix | Persistencia de bloques + feedback de publish | `git revert c2ee81d` |
| 2026-02-15 | `e20f086` | fix | Preview full-page y layout estable por secciones | `git revert e20f086` |
| 2026-02-15 | `e5df6de` | feat | Full width + soporte real de 2 columnas | `git revert e5df6de` |
| 2026-02-15 | `a6089ee` | feat | Drag inteligente por drop + preview en nueva pestana | `git revert a6089ee` |
| 2026-02-15 | `f9f7d23` | fix | Quitar layout global y forzar preview completo | `git revert f9f7d23` |
| 2026-02-15 | `f363eef` | fix | Correccion de texto/UI + modo libre + `?full=1` | `git revert f363eef` |
| 2026-02-16 | `6f14308` | fix | Unificar layout y estabilizar redimension en canvas | `git revert 6f14308` |
## Control de rama (local/remoto) ## 9) Decisiones funcionales vigentes
- Rama local activa: `ai/ub24-builder-v1` - Rubros oficiales permitidos:
- Upstream remoto: `origin/ai/ub24-builder-v1` - `restaurante`
- Estado al registrar: local `ahead 5` - `danza`
- Politica: seguir commits atomicos y luego `git push origin ai/ub24-builder-v1` por lote validado. - `cosmeticos`
- `despachos`
- `gimnasios`
- `educacion`
- `base_otro`
- Preview final separada habilitada:
- `GET /elementor/<site_id>/preview-final`
- `GET /ub24/<site_id>/preview-final`
- Motor de reordenamiento seleccionado para DnD:
- `SortableJS` (estrategia unica)
## Fases memorizadas (builder) ## 10) Pendientes priorizados
1. Fase 1 (UI Pro base): navbar premium, hero premium, sistema de espaciado/grid, pulido visual consistente. 1. QA manual de cada icono/accion del menu superior en preview final (siguiente lote).
2. Fase 2 (estructura): separar renderers por bloque y reducir inline styles para automatizacion. 2. Footer global obligatorio con autoria del proyecto.
3. Fase 3 (presets): presets por rubro + reglas responsive + variantes exportables. 3. Watermark de autoria en codigo bajo convencion unica.
4. Flujo dual estable de preview (editor/pagina real).
5. Mejora de interaccion touch/capacitiva del builder.
## 11) Referencias cruzadas
- Historial funcional detallado: `codex/HISTORIAL_CAMBIOS.md`
- Arranque rapido local: `codex/ARRANQUE_RAPIDO_UB24.md`
- Flujo general del proyecto: `codex/FLUJO_PROYECTO.md`
## 12) Nota operativa
Este archivo define el estandar de trabajo. Cualquier cambio de proceso debe registrarse en un commit `chore(versioning)` y quedar reflejado aqui.
### Ajustes Builder (limpieza + preview + ancho)
- Commit: `7c5f671`
- 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:
- `git revert 7c5f671`

View File

@@ -1,17 +1,37 @@
""" """
GKACHELE SaaS PageBuilder - Sistema Modular GKACHELE SaaS PageBuilder - Sistema Modular
© 2025 GKACHELE™. Todos los derechos reservados.
""" """
import os import os
from flask import Flask, jsonify, request import sys
from config import SECRET_KEY, PORT from flask import Flask, jsonify
from database import init_db
from routes.auth import auth_bp BASE_DIR = os.path.dirname(os.path.abspath(__file__))
from routes.dashboard import dashboard_bp PROJECT_ROOT = os.path.dirname(BASE_DIR)
from routes.customizer import customizer_bp if PROJECT_ROOT not in sys.path:
from routes.admin import admin_bp sys.path.insert(0, PROJECT_ROOT)
from routes.public import public_bp
try:
from .config import SECRET_KEY, PORT
from .database import init_db
from .routes.auth import auth_bp
from .routes.dashboard import dashboard_bp
from .routes.customizer import customizer_bp
from .routes.admin import admin_bp
from .routes.public import public_bp
except ImportError:
from config import SECRET_KEY, PORT
from database import init_db
from routes.auth import auth_bp
from routes.dashboard import dashboard_bp
from routes.customizer import customizer_bp
from routes.admin import admin_bp
from routes.public import public_bp
try:
from elementor.routes import elementor_bp
except ImportError:
elementor_bp = None
app = Flask(__name__, template_folder='templates', static_folder='static') app = Flask(__name__, template_folder='templates', static_folder='static')
app.secret_key = SECRET_KEY app.secret_key = SECRET_KEY
@@ -26,6 +46,8 @@ app.register_blueprint(dashboard_bp)
app.register_blueprint(customizer_bp) app.register_blueprint(customizer_bp)
app.register_blueprint(admin_bp) app.register_blueprint(admin_bp)
app.register_blueprint(public_bp) app.register_blueprint(public_bp)
if elementor_bp is not None and 'elementor' not in app.blueprints:
app.register_blueprint(elementor_bp)
# Manejadores de Errores Globales # Manejadores de Errores Globales
@app.errorhandler(500) @app.errorhandler(500)
@@ -34,15 +56,18 @@ def handle_500(e):
response.status_code = 500 response.status_code = 500
return response return response
@app.errorhandler(404) @app.errorhandler(404)
def handle_404(e): def handle_404(e):
return jsonify({'success': False, 'error': 'No encontrado'}), 404 return jsonify({'success': False, 'error': 'No encontrado'}), 404
@app.errorhandler(Exception) @app.errorhandler(Exception)
def handle_exception(e): def handle_exception(e):
print(f"ERROR: EXCEPCION: {e}") print(f"ERROR: EXCEPCION: {e}")
return jsonify({'success': False, 'error': str(e)}), 500 return jsonify({'success': False, 'error': str(e)}), 500
# Middleware # Middleware
@app.after_request @app.after_request
def add_header(response): def add_header(response):
@@ -50,6 +75,7 @@ def add_header(response):
response.headers['Content-Security-Policy'] = "frame-ancestors *;" response.headers['Content-Security-Policy'] = "frame-ancestors *;"
return response return response
if __name__ == '__main__': if __name__ == '__main__':
print(f"GKACHELE SaaS Modular iniciado en puerto {PORT}") print(f"GKACHELE SaaS Modular iniciado en puerto {PORT}")
app.run(debug=True, host='0.0.0.0', port=PORT) app.run(debug=True, host='0.0.0.0', port=PORT)

104
demo/db.py Normal file
View File

@@ -0,0 +1,104 @@
import os
import sqlite3
import json
# DB Settings (Postgres)
DB_HOST = os.environ.get('DB_HOST', None)
DB_PORT = int(os.environ.get('DB_PORT', '5432'))
DB_NAME = os.environ.get('DB_NAME', 'gkachele')
DB_USER = os.environ.get('DB_USER', 'gkachele')
DB_PASSWORD = os.environ.get('DB_PASSWORD', 'gkachele_pass')
# SQLite Settings
BASE_DIR = os.path.dirname(os.path.abspath(__file__))
SQLITE_PATH = os.path.join(BASE_DIR, 'database', 'main.db')
class CursorWrapper:
def __init__(self, cursor, is_sqlite=False):
self._cursor = cursor
self._is_sqlite = is_sqlite
def execute(self, query, params=None):
try:
if self._is_sqlite:
# Skip postgres-specific maintenance commands
if 'setval' in query or 'pg_get_serial_sequence' in query:
return None
# Adapt psycopg2-style placeholders (%s) to sqlite (?)
if isinstance(query, str) and '%s' in query:
query = query.replace('%s', '?')
# SQLite doesn't support IF NOT EXISTS in ALTER TABLE
if 'ALTER TABLE' in query and 'ADD COLUMN' in query and 'IF NOT EXISTS' in query:
query = query.replace('IF NOT EXISTS', '')
# Handle SERIAL PRIMARY KEY and other PG types
query = query.replace('SERIAL PRIMARY KEY', 'INTEGER PRIMARY KEY AUTOINCREMENT')
if 'IF NOT EXISTS' not in query and 'CREATE TABLE' in query:
query = query.replace('CREATE TABLE', 'CREATE TABLE IF NOT EXISTS')
else:
# Adapt sqlite-style placeholders (?) to psycopg2 (%s)
if isinstance(query, str) and '?' in query:
query = query.replace('?', '%s')
if params is None:
return self._cursor.execute(query)
return self._cursor.execute(query, params)
except (sqlite3.OperationalError, sqlite3.IntegrityError) as e:
msg = str(e).lower()
if "duplicate column name" in msg or "already exists" in msg:
return None
raise e
def fetchone(self):
return self._cursor.fetchone()
def fetchall(self):
return self._cursor.fetchall()
def __getattr__(self, name):
return getattr(self._cursor, name)
class ConnectionWrapper:
def __init__(self, conn, is_sqlite=False):
self._conn = conn
self._is_sqlite = is_sqlite
def cursor(self):
return CursorWrapper(self._conn.cursor(), is_sqlite=self._is_sqlite)
def commit(self):
return self._conn.commit()
def close(self):
return self._conn.close()
def __getattr__(self, name):
return getattr(self._conn, name)
def get_db():
if DB_HOST:
try:
import psycopg2
conn = psycopg2.connect(
host=DB_HOST,
port=DB_PORT,
dbname=DB_NAME,
user=DB_USER,
password=DB_PASSWORD,
)
return ConnectionWrapper(conn, is_sqlite=False)
except Exception as e:
print(f"Postgres connection failed: {e}. Falling back to SQLite.")
# Fallback to SQLite
os.makedirs(os.path.dirname(SQLITE_PATH), exist_ok=True)
conn = sqlite3.connect(SQLITE_PATH)
return ConnectionWrapper(conn, is_sqlite=True)
try:
import psycopg2
IntegrityError = psycopg2.IntegrityError
except ImportError:
IntegrityError = sqlite3.IntegrityError

106
elementor/routes.py Normal file
View File

@@ -0,0 +1,106 @@
from flask import Blueprint, render_template, session, request, jsonify
import json
from db import get_db
from utils.theme_engine import get_theme_config
elementor_bp = Blueprint(
'elementor',
__name__,
template_folder='templates',
static_folder='static',
static_url_path='/elementor/static'
)
def _render_builder(site_id, builder_mode='default', **_kwargs):
conn = get_db()
c = conn.cursor()
c.execute('SELECT user_id, slug, theme, content_json FROM sites WHERE id = ?', (site_id,))
site = c.fetchone()
if not site:
conn.close()
return 'Sitio no encontrado', 404
if 'user_id' in session and site[0] != session['user_id']:
conn.close()
return 'No autorizado', 403
content = json.loads(site[3]) if site[3] else {}
if not isinstance(content, dict):
content = {}
theme = site[2]
theme_config = get_theme_config(theme)
c.execute('SELECT plan, rubro FROM users WHERE id = ?', (site[0],))
user_data = c.fetchone()
conn.close()
user_plan = user_data[0] if user_data else 'base'
user_rubro = user_data[1] if user_data else 'restaurante'
return render_template(
'elementor_builder.html',
site_id=site_id,
slug=site[1],
theme=theme,
content=content,
theme_config=theme_config,
user_plan=user_plan,
rubro=user_rubro,
builder_mode=builder_mode
)
@elementor_bp.route('/elementor/<int:site_id>')
def elementor_view(site_id):
return _render_builder(site_id, builder_mode='default')
@elementor_bp.route('/ub24/<int:site_id>')
def ub24_view(site_id):
return _render_builder(site_id, builder_mode='ub24')
@elementor_bp.route('/api/elementor/save', methods=['POST'])
def save_elementor():
data = request.get_json(silent=True) or {}
site_id = data.get('site_id')
content = data.get('content')
publish = bool(data.get('publish'))
if not site_id or not isinstance(content, dict):
return jsonify({'success': False, 'error': 'Payload invalido'}), 400
conn = get_db()
c = conn.cursor()
c.execute('SELECT user_id, content_json FROM sites WHERE id = ?', (site_id,))
row = c.fetchone()
if not row:
conn.close()
return jsonify({'success': False, 'error': 'Sitio no encontrado'}), 404
owner_id = row[0]
if 'user_id' in session and session['user_id'] != owner_id:
conn.close()
return jsonify({'success': False, 'error': 'No autorizado'}), 403
current_content = {}
try:
if row[1]:
current_content = json.loads(row[1]) or {}
except Exception:
current_content = {}
merged = dict(current_content)
merged.update(content)
if publish:
c.execute('UPDATE sites SET content_json = ?, status = ? WHERE id = ?', (json.dumps(merged), 'published', site_id))
else:
c.execute('UPDATE sites SET content_json = ? WHERE id = ?', (json.dumps(merged), site_id))
conn.commit()
conn.close()
return jsonify({'success': True, 'published': publish})

File diff suppressed because it is too large Load Diff

View File

@@ -1,133 +1,20 @@
# 📊 Estado Actual del Proyecto - GKACHELE # Estado Actual del Proyecto - GKACHELE
**© 2025 GKACHELE™. Todos los derechos reservados.** **Fecha de actualizacion:** 14 Febrero 2026
## 🎯 Hash Actual ## Aviso
Este archivo queda como referencia historica del ciclo 2025 (customizer inicial).
**Hash:** `gkachele-customizer-wordpress-adaptado-20250115-002` ## Fuente vigente de estado IA/UB24
**Fecha:** 15 Enero 2025 - `codex/VERSIONADO_IA.md`
**Estado:****Demo WordPress completo creado - Listo para copiar y adaptar** - `codex/MEMORIA_CODEX.md`
- `codex/BUILDER_ELEMENTOR_VERSION.md`
- `codex/HISTORIAL_CAMBIOS.md`
--- ## Estado vigente resumido
- Rama activa: `ai/ub24-builder-v1`
- Builder UB24 en evolucion activa (ciclo 2026).
- Estado local/remoto verificado en sincronizacion al corte.
## ✅ FUNCIONANDO ## Nota operativa
No usar este archivo como fuente principal para decisiones de desarrollo actuales.
### Flujo Completo:
1.**Landing** - Funciona correctamente
2.**Registro** - Crea usuario + sitio automático
3.**Login** - Redirige DIRECTAMENTE a `/customizer/{site_id}`
4.**Customizer** - Personalización funcional
- Cambiar contenido
- Cambiar colores
- Cambiar tipografía
- **✅ Añadir bloques (video, imagen, texto, redes sociales, mapa)**
- **✅ Eliminar bloques**
- **✅ Ver lista de bloques añadidos**
- Guardar cambios (draft)
- Enviar solicitud (pending)
5.**Dashboard Cliente** - `/dashboard` - Ve sus sitios
6.**Dashboard Admin** - `/admin` - Gestión completa
- Ver usuarios
- Eliminar usuarios
- Ver solicitudes
- Aprobar/rechazar sitios
### Sistema de Base de Datos:
- ✅ Multi-tenant en `main.db`
- ✅ Tablas: users, sites, menus, widgets, content, settings, requests, media
- ✅ Sistema de roles basado en DB (administrator, editor, author, subscriber)
- ✅ Filtrado por `user_id` (cada cliente solo ve sus datos)
### Templates:
- ✅ Sistema modular (_gkachele/header.php, footer.php, sidebar.php)
- ✅ Menús dinámicos (header, footer, sidebar)
- ✅ Widgets dinámicos
- ✅ Temas: restaurante-moderno, restaurante-elegante, gimnasio-claro
---
## ⚠️ PENDIENTE
### Funcionalidades Core:
- [x] **Añadir bloques (COMPLETADO)**
- [x] **Eliminar bloques (COMPLETADO)**
- [x] **Lista de bloques en sidebar (COMPLETADO)**
- [ ] Editar contenido de bloques existentes
- [ ] Mover bloques (drag & drop) en customizer
- [ ] Editar inline (contenteditable)
- [ ] UI completa para gestionar menús desde customizer
### Infraestructura:
- [ ] Subdominios automáticos
- [ ] Integración pagos Nominalia
- [ ] Gitea y workflows
- [ ] Control de versiones Git
### Mejoras:
- [ ] Landing optimizada para Argentina
- [ ] Limitaciones por plan
- [ ] Sistema de actividad/logs
- [ ] Mejorar UI/UX
---
## 🚀 PRÓXIMOS PASOS
1. **Probar con 1 rubro completo** (restaurante)
2. **Mejorar customizer** (mover bloques, editar inline)
3. **Gitea y workflows** (despliegues automáticos)
4. **Subdominios** (con tu dominio)
5. **Pagos Nominalia** (comodines)
---
## 📍 DEPLOYMENT
### Actual: Raspberry Pi 3
- ✅ Funcionando
- ✅ Login → Customizer funciona
- ✅ Todo operativo
### Futuro: VPS
- Si funciona 1 rubro bien → Migrar a VPS
- Mismo código
- Más recursos
- Dominio propio
---
## 🔄 ÚLTIMA ACTUALIZACIÓN
**Hash:** `gkachele-customizer-wordpress-adaptado-20250115-002`
**Fecha:** 15 Enero 2025
**Logro:****Demo WordPress completo creado - Listo para copiar y adaptar**
### Cambios en este Hash:
- ✅ Creado demo completo WordPress: `customizer-wordpress-COMPLETO.html`
- ✅ Todas las funcionalidades de WordPress implementadas (paneles, toggles, sliders, repeaters, etc.)
- ✅ Documentación completa: `CUSTOMIZER_WORDPRESS_COMPLETO.md`
- ✅ Objetivo claro documentado: `OBJETIVO_CUSTOMIZER_ADAPTADO.md`
- ✅ Identificados problemas críticos: `PROBLEMAS_CRITICOS_CUSTOMIZER.md`
### Plan para Próxima Sesión:
1. **COPIAR WordPress** (demo completo)
2. **AUTOMATIZAR** procesos (guardado, preview, etc.)
3. **CAMBIAR branding** a GKACHELE™ (logo, nombres, colores)
4. **ADAPTAR** funcionalidades con lo que ya sabemos
5. **INTEGRAR** con backend Flask existente
### Archivos Creados:
- `customizer-wordpress-COMPLETO.html` - Demo completo independiente
- `CUSTOMIZER_WORDPRESS_COMPLETO.md` - Documentación completa
- `OBJETIVO_CUSTOMIZER_ADAPTADO.md` - Objetivo claro
- `PROBLEMAS_CRITICOS_CUSTOMIZER.md` - Problemas identificados
### Estado:
- ✅ Demo WordPress completo (funcional, independiente)
- ✅ Documentación completa
- ✅ Objetivo claro definido
- ⏳ Pendiente: Copiar y adaptar al customizer real
---
**© 2025 GKACHELE™. Todos los derechos reservados.**