Agrega propiedades flexbox al contenedor .hero-section para que el contenido (título y badges) se muestre centrado verticalmente cuando no hay badges de categorías. Cambios: - display: flex - align-items: center - justify-content: center También incluye specs OpenSpec para arquitectura del tema. 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude <noreply@anthropic.com>
407 lines
15 KiB
Markdown
407 lines
15 KiB
Markdown
# Especificacion de Flujo de Componentes
|
|
|
|
## Purpose
|
|
|
|
Define el flujo de trabajo de 5 fases para crear componentes en ROITheme, incluyendo convenciones de nomenclatura, estructura de archivos y validacion.
|
|
|
|
## Requirements
|
|
|
|
### Requirement: Nomenclatura NO NEGOCIABLE
|
|
|
|
The system MUST follow strict naming conventions that are NON-NEGOTIABLE.
|
|
|
|
#### Scenario: Nomenclatura de component_name en JSON y BD
|
|
- **WHEN** se define el nombre del componente en JSON o base de datos
|
|
- **THEN** DEBE usar kebab-case
|
|
- **AND** ejemplo: featured-image, hero-section, top-bar
|
|
|
|
#### Scenario: Nomenclatura de archivo schema JSON
|
|
- **WHEN** se crea un archivo de schema JSON
|
|
- **THEN** el nombre DEBE ser kebab-case
|
|
- **AND** ejemplo: featured-image.json, hero-section.json
|
|
|
|
#### Scenario: Nomenclatura de carpeta de modulo
|
|
- **WHEN** se crea la carpeta del modulo
|
|
- **THEN** DEBE usar PascalCase
|
|
- **AND** ejemplo: FeaturedImage/, HeroSection/, TopBar/
|
|
|
|
#### Scenario: Nomenclatura de namespace PHP
|
|
- **WHEN** se define el namespace PHP
|
|
- **THEN** DEBE usar PascalCase
|
|
- **AND** patron: ROITheme\[Contexto]\[Componente]\[Capa]
|
|
|
|
#### Scenario: Nomenclatura de clases Renderer y FormBuilder
|
|
- **WHEN** se nombran las clases Renderer o FormBuilder
|
|
- **THEN** DEBEN usar PascalCase
|
|
- **AND** ejemplo: FeaturedImageRenderer, HeroSectionFormBuilder
|
|
|
|
#### Scenario: Conversion kebab-case a PascalCase
|
|
- **WHEN** se convierte de kebab-case a PascalCase
|
|
- **THEN** se eliminan los guiones
|
|
- **AND** se capitaliza cada palabra
|
|
- **AND** ejemplo: featured-image se convierte en FeaturedImage
|
|
|
|
---
|
|
|
|
### Requirement: Fase 1 - Creacion de Schema JSON
|
|
|
|
The first step MUST be creating the component JSON schema.
|
|
|
|
#### Scenario: Ubicacion del schema
|
|
- **WHEN** se crea un schema JSON
|
|
- **THEN** DEBE colocarse en Schemas/[nombre-en-kebab-case].json
|
|
- **AND** ejemplo: Schemas/featured-image.json
|
|
|
|
#### Scenario: Campo component_name en schema
|
|
- **WHEN** se define component_name en el schema
|
|
- **THEN** DEBE usar kebab-case
|
|
- **AND** ejemplo: component_name con valor featured-image
|
|
|
|
#### Scenario: Fuente del schema
|
|
- **WHEN** se extrae informacion para el schema
|
|
- **THEN** DEBE basarse en _planeacion/roi-theme/roi-theme-template/index.html
|
|
- **AND** DEBEN extraerse TODOS los campos CSS y textos del HTML
|
|
|
|
#### Scenario: Campos obligatorios de visibilidad
|
|
- **WHEN** se crea un schema
|
|
- **THEN** DEBE incluir is_enabled como boolean
|
|
- **AND** DEBE incluir show_on_desktop como boolean
|
|
- **AND** DEBE incluir show_on_mobile como boolean
|
|
|
|
#### Scenario: Grupos JSON estandar con priorities
|
|
- **WHEN** se estructura un schema JSON
|
|
- **THEN** DEBE organizar campos en los 12 grupos estandar con priorities fijas
|
|
- **AND** VISIBILITY DEBE tener priority 10
|
|
- **AND** CONTENT DEBE tener priority 20
|
|
- **AND** TYPOGRAPHY DEBE tener priority 30
|
|
- **AND** COLORS DEBE tener priority 40
|
|
- **AND** SPACING DEBE tener priority 50
|
|
- **AND** VISUAL_EFFECTS DEBE tener priority 60
|
|
- **AND** BEHAVIOR DEBE tener priority 70
|
|
- **AND** LAYOUT DEBE tener priority 80
|
|
- **AND** LINKS, ICONS, MEDIA, FORMS DEBEN tener priority 90
|
|
|
|
#### Scenario: Tipos de campo validos en schema
|
|
- **WHEN** se define un campo en el schema JSON
|
|
- **THEN** el type DEBE ser uno de: boolean, text, textarea, url, select, color
|
|
- **AND** si type es select DEBE incluir array de options
|
|
- **AND** si type es boolean el default DEBE ser true o false
|
|
- **AND** si type es color el default DEBE ser formato hexadecimal (#RRGGBB)
|
|
|
|
#### Scenario: Campo heading_level para semantica HTML
|
|
- **WHEN** un componente tiene titulo principal
|
|
- **THEN** el grupo TYPOGRAPHY DEBE incluir campo heading_level
|
|
- **AND** heading_level DEBE ser tipo select con options h1, h2, h3, h4, h5, h6
|
|
- **AND** heading_level es critico para jerarquia semantica y SEO
|
|
|
|
#### Scenario: Campos de accesibilidad en MEDIA
|
|
- **WHEN** un componente tiene imagenes
|
|
- **THEN** el grupo MEDIA DEBE incluir campo image_alt
|
|
- **AND** image_alt es obligatorio para accesibilidad (WCAG)
|
|
- **WHEN** la imagen puede compartirse en redes sociales
|
|
- **THEN** DEBE incluir campo is_og_image como boolean
|
|
|
|
#### Scenario: Campos tipicos del grupo BEHAVIOR
|
|
- **WHEN** un componente tiene comportamiento interactivo
|
|
- **THEN** el grupo BEHAVIOR puede incluir is_sticky, sticky_offset, collapse_on_mobile
|
|
- **AND** para Table of Contents puede incluir generate_jump_links, enable_scrollspy
|
|
- **AND** para animaciones puede incluir animation_type
|
|
|
|
---
|
|
|
|
### Requirement: Fase 2 - Sincronizacion JSON a BD
|
|
|
|
The second step MUST synchronize the JSON schema with the database.
|
|
|
|
#### Scenario: Comando de sincronizacion
|
|
- **WHEN** se necesita sincronizar un componente
|
|
- **THEN** ejecutar wp roi-theme sync-component [nombre]
|
|
- **AND** ejemplo: wp roi-theme sync-component featured-image
|
|
|
|
#### Scenario: Tabla destino
|
|
- **WHEN** se sincroniza
|
|
- **THEN** los datos van a la tabla wp_roi_theme_component_settings
|
|
|
|
#### Scenario: Preservacion de valores
|
|
- **WHEN** se sincroniza un schema actualizado
|
|
- **THEN** los valores existentes del usuario DEBEN preservarse
|
|
- **AND** solo se agregan campos nuevos
|
|
|
|
#### Scenario: Conversion de valores para almacenamiento
|
|
- **WHEN** se sincroniza un campo a BD
|
|
- **THEN** arrays y objects DEBEN convertirse con json_encode()
|
|
- **AND** booleans DEBEN convertirse a '1' o '0'
|
|
- **AND** otros tipos DEBEN convertirse a string con cast
|
|
|
|
---
|
|
|
|
### Requirement: Fase 3 - Creacion del Renderer
|
|
|
|
The third step MUST create the Renderer that converts DB data to HTML + CSS.
|
|
|
|
#### Scenario: Ubicacion del Renderer
|
|
- **WHEN** se crea un Renderer
|
|
- **THEN** DEBE colocarse en Public/[PascalCase]/Infrastructure/Ui/[PascalCase]Renderer.php
|
|
- **AND** ejemplo: Public/FeaturedImage/Infrastructure/Ui/FeaturedImageRenderer.php
|
|
|
|
#### Scenario: Inyeccion de CSSGeneratorInterface
|
|
- **WHEN** se implementa un Renderer
|
|
- **THEN** DEBE inyectar CSSGeneratorInterface via constructor
|
|
- **AND** NO DEBE tener CSS hardcodeado
|
|
|
|
#### Scenario: Generacion de CSS
|
|
- **WHEN** se genera CSS en el Renderer
|
|
- **THEN** DEBE usar $this->cssGenerator->generate()
|
|
- **AND** CERO CSS hardcodeado en el codigo PHP
|
|
|
|
#### Scenario: Validacion de visibilidad
|
|
- **WHEN** el Renderer procesa un componente
|
|
- **THEN** DEBE validar is_enabled, show_on_desktop, show_on_mobile
|
|
- **AND** NO renderizar si no cumple condiciones de visibilidad
|
|
|
|
#### Scenario: Clases responsive Bootstrap para visibilidad
|
|
- **WHEN** el Renderer genera HTML para show_on_desktop y show_on_mobile
|
|
- **THEN** DEBE usar clases Bootstrap d-none, d-lg-block, d-lg-none
|
|
- **AND** NO DEBE usar CSS custom para visibilidad responsive
|
|
- **AND** el breakpoint principal es lg (992px)
|
|
|
|
#### Scenario: Tabla de decision para visibilidad responsive
|
|
- **GIVEN** campos show_on_desktop y show_on_mobile del componente
|
|
- **WHEN** show_on_desktop es false AND show_on_mobile es true
|
|
- **THEN** aplicar clase d-lg-none (solo visible en mobile)
|
|
- **WHEN** show_on_desktop es true AND show_on_mobile es false
|
|
- **THEN** aplicar clases d-none d-lg-block (solo visible en desktop)
|
|
- **WHEN** show_on_desktop es false AND show_on_mobile es false
|
|
- **THEN** NO renderizar componente y retornar string vacio
|
|
- **WHEN** show_on_desktop es true AND show_on_mobile es true
|
|
- **THEN** NO aplicar clases de visibilidad (visible en ambos)
|
|
|
|
#### Scenario: Metodo supports
|
|
- **WHEN** se implementa el metodo supports()
|
|
- **THEN** DEBE retornar el nombre en kebab-case
|
|
- **AND** ejemplo: return 'featured-image'
|
|
|
|
---
|
|
|
|
### Requirement: Contrato de CSSGeneratorInterface
|
|
|
|
The CSS generation service MUST follow a specific contract defined in Shared.
|
|
|
|
#### Scenario: Ubicacion de CSSGeneratorInterface
|
|
- **WHEN** se necesita la interface de generacion CSS
|
|
- **THEN** DEBE estar en Shared/Domain/Contracts/CSSGeneratorInterface.php
|
|
|
|
#### Scenario: Firma del metodo generate
|
|
- **WHEN** se implementa CSSGeneratorInterface
|
|
- **THEN** DEBE tener metodo generate(string $selector, array $styles): string
|
|
- **AND** $selector es el selector CSS (ej: '.navbar')
|
|
- **AND** $styles es array asociativo de propiedades CSS
|
|
- **AND** retorna string CSS formateado
|
|
|
|
#### Scenario: Conversion de propiedades CSS
|
|
- **WHEN** CSSGeneratorService procesa array de estilos
|
|
- **THEN** DEBE convertir snake_case a kebab-case
|
|
- **AND** ejemplo: background_color se convierte en background-color
|
|
|
|
---
|
|
|
|
### Requirement: Fase 4 - Creacion del FormBuilder
|
|
|
|
The fourth step MUST create the FormBuilder for the admin panel.
|
|
|
|
#### Scenario: Ubicacion del FormBuilder
|
|
- **WHEN** se crea un FormBuilder
|
|
- **THEN** DEBE colocarse en Admin/[PascalCase]/Infrastructure/Ui/[PascalCase]FormBuilder.php
|
|
- **AND** ejemplo: Admin/FeaturedImage/Infrastructure/Ui/FeaturedImageFormBuilder.php
|
|
|
|
#### Scenario: Inyeccion de AdminDashboardRenderer
|
|
- **WHEN** se implementa un FormBuilder
|
|
- **THEN** DEBE inyectar AdminDashboardRenderer
|
|
|
|
---
|
|
|
|
### Requirement: Contrato de AdminDashboardRenderer
|
|
|
|
The admin panel rendering service MUST follow a specific contract.
|
|
|
|
#### Scenario: Ubicacion de AdminDashboardRenderer
|
|
- **WHEN** se necesita el renderer del panel admin
|
|
- **THEN** DEBE estar en Admin/Shared/Infrastructure/Ui/AdminDashboardRenderer.php
|
|
|
|
#### Scenario: Responsabilidad de AdminDashboardRenderer
|
|
- **WHEN** se usa AdminDashboardRenderer
|
|
- **THEN** DEBE generar el HTML de controles de formulario
|
|
- **AND** DEBE aplicar el Design System del admin (gradiente, bordes)
|
|
- **AND** DEBE usar Bootstrap 5 form controls
|
|
|
|
#### Scenario: Design System del admin
|
|
- **WHEN** se implementa la UI del admin
|
|
- **THEN** DEBE usar gradiente #0E2337 a #1e3a5f
|
|
- **AND** borde naranja #FF8600
|
|
- **AND** Bootstrap 5 form controls
|
|
|
|
#### Scenario: Registro en getComponents
|
|
- **WHEN** se registra el FormBuilder
|
|
- **THEN** DEBE registrarse en getComponents() con ID en kebab-case
|
|
- **AND** ejemplo: 'featured-image'
|
|
|
|
---
|
|
|
|
### Requirement: Fase 5 - Validacion de Arquitectura
|
|
|
|
The fifth and final step MUST validate the component architecture.
|
|
|
|
#### Scenario: Comando de validacion
|
|
- **WHEN** se necesita validar un componente
|
|
- **THEN** ejecutar php Shared/Infrastructure/Scripts/validate-architecture.php [nombre]
|
|
- **AND** ejemplo: php Shared/Infrastructure/Scripts/validate-architecture.php featured-image
|
|
|
|
#### Scenario: Elementos validados
|
|
- **WHEN** se ejecuta la validacion
|
|
- **THEN** DEBE validar estructura de carpetas
|
|
- **AND** DEBE validar schema JSON
|
|
- **AND** DEBE validar datos en BD
|
|
- **AND** DEBE validar Renderer
|
|
- **AND** DEBE validar FormBuilder
|
|
- **AND** DEBE validar cumplimiento SOLID
|
|
|
|
---
|
|
|
|
### Requirement: Estructura de Archivos por Componente
|
|
|
|
A complete component MUST have a specific file structure.
|
|
|
|
#### Scenario: Estructura de componente en Public
|
|
- **GIVEN** un componente FeaturedImage en Public
|
|
- **WHEN** esta completo
|
|
- **THEN** DEBE existir Public/FeaturedImage/Infrastructure/Ui/FeaturedImageRenderer.php
|
|
|
|
#### Scenario: Estructura de componente en Admin
|
|
- **GIVEN** un componente FeaturedImage en Admin
|
|
- **WHEN** esta completo
|
|
- **THEN** DEBE existir Admin/FeaturedImage/Infrastructure/Ui/FeaturedImageFormBuilder.php
|
|
|
|
#### Scenario: Archivo schema
|
|
- **GIVEN** un componente FeaturedImage
|
|
- **WHEN** se necesita el schema
|
|
- **THEN** DEBE existir en Schemas/featured-image.json
|
|
|
|
---
|
|
|
|
### Requirement: Variables CSS del Tema
|
|
|
|
Code MUST use the theme CSS variables.
|
|
|
|
#### Scenario: Variables de color disponibles
|
|
- **WHEN** se necesitan colores
|
|
- **THEN** DEBEN usarse las variables como --color-navy-dark y --color-orange-primary
|
|
|
|
#### Scenario: Prohibicion de CSS hardcodeado
|
|
- **WHEN** se genera CSS
|
|
- **THEN** NO DEBE haber colores hardcodeados en PHP
|
|
- **AND** DEBE usarse CSSGeneratorService
|
|
|
|
---
|
|
|
|
### Requirement: Reglas NO Negociables del Flujo
|
|
|
|
These rules MUST always be followed, without exceptions.
|
|
|
|
#### Scenario: Creacion de archivos
|
|
- **WHEN** se van a crear archivos para un componente
|
|
- **THEN** DEBE leerse primero el template HTML
|
|
- **AND** NO crear archivos sin esa referencia
|
|
|
|
#### Scenario: Campos de visibilidad
|
|
- **WHEN** se crea un schema
|
|
- **THEN** NO DEBE omitirse ninguno de los 3 campos obligatorios de visibilidad
|
|
|
|
#### Scenario: CSS en Renderers
|
|
- **WHEN** se implementa un Renderer
|
|
- **THEN** NO DEBE haber CSS inline
|
|
- **AND** todo via CSSGeneratorService
|
|
|
|
#### Scenario: Instanciacion de servicios
|
|
- **WHEN** se necesita un servicio
|
|
- **THEN** NO instanciar directamente con new Service()
|
|
- **AND** DEBE usarse Inyeccion de Dependencias
|
|
|
|
#### Scenario: Modificacion de campos en BD
|
|
- **WHEN** se necesita modificar campos
|
|
- **THEN** NO modificar campos en BD manualmente
|
|
- **AND** modificar el schema JSON y sincronizar
|
|
|
|
#### Scenario: Validacion de arquitectura
|
|
- **WHEN** se completa un componente
|
|
- **THEN** NO saltarse la validacion de arquitectura
|
|
- **AND** ejecutar validate-architecture.php
|
|
|
|
#### Scenario: Fases completas
|
|
- **WHEN** se crea un componente
|
|
- **THEN** NO crear componentes sin completar las 5 fases
|
|
- **AND** cada fase es obligatoria
|
|
|
|
---
|
|
|
|
### Requirement: Comandos WP-CLI
|
|
|
|
WP-CLI commands MUST be executed with the correct configuration.
|
|
|
|
#### Scenario: Ubicacion de WP-CLI
|
|
- **WHEN** se necesita ejecutar WP-CLI
|
|
- **THEN** usar C:\xampp\php_8.0.30_backup\wp-cli.phar
|
|
|
|
#### Scenario: Sincronizar un componente
|
|
- **WHEN** se sincroniza un componente especifico
|
|
- **THEN** ejecutar powershell -Command "php 'C:\xampp\php_8.0.30_backup\wp-cli.phar' roi-theme sync-component [nombre]"
|
|
|
|
#### Scenario: Sincronizar todos los componentes
|
|
- **WHEN** se sincroniza todo
|
|
- **THEN** ejecutar powershell -Command "php 'C:\xampp\php_8.0.30_backup\wp-cli.phar' roi-theme sync-all-components"
|
|
|
|
---
|
|
|
|
### Requirement: Flujo de 5 Fases Secuencial
|
|
|
|
Component creation MUST follow the exact sequence.
|
|
|
|
#### Scenario: Flujo completo de 5 fases
|
|
- **WHEN** se crea un nuevo componente
|
|
- **THEN** Fase 1 es crear Schema JSON en Schemas/[nombre].json
|
|
- **AND** Fase 2 es sincronizar con wp roi-theme sync-component [nombre]
|
|
- **AND** Fase 3 es crear Renderer en Public/[Nombre]/Infrastructure/Ui/[Nombre]Renderer.php
|
|
- **AND** Fase 4 es crear FormBuilder en Admin/[Nombre]/Infrastructure/Ui/[Nombre]FormBuilder.php
|
|
- **AND** Fase 5 es validar con validate-architecture.php [nombre]
|
|
|
|
#### Scenario: No saltar fases
|
|
- **WHEN** se desarrolla un componente
|
|
- **THEN** NO se DEBE saltar ninguna fase
|
|
- **AND** cada fase depende de la anterior
|
|
- **AND** la validacion final es obligatoria
|
|
|
|
---
|
|
|
|
### Requirement: Checklist de Componente Completo
|
|
|
|
A component MUST pass the checklist to be considered complete.
|
|
|
|
#### Scenario: Checklist de archivos
|
|
- **WHEN** se verifica un componente
|
|
- **THEN** DEBE existir Schemas/[nombre-kebab].json
|
|
- **AND** DEBE existir Public/[NombrePascal]/Infrastructure/Ui/[NombrePascal]Renderer.php
|
|
- **AND** DEBE existir Admin/[NombrePascal]/Infrastructure/Ui/[NombrePascal]FormBuilder.php
|
|
|
|
#### Scenario: Checklist de codigo
|
|
- **WHEN** se verifica el codigo
|
|
- **THEN** schema tiene los 3 campos de visibilidad
|
|
- **AND** Renderer inyecta CSSGeneratorInterface
|
|
- **AND** Renderer no tiene CSS hardcodeado
|
|
- **AND** supports() retorna kebab-case
|
|
- **AND** FormBuilder registrado con ID kebab-case
|
|
- **AND** validacion de arquitectura pasa
|
|
|
|
#### Scenario: Checklist de BD
|
|
- **WHEN** se verifica la base de datos
|
|
- **THEN** datos sincronizados en wp_roi_theme_component_settings
|
|
- **AND** component_name en kebab-case
|