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>
8.7 KiB
Especificacion de Arquitectura Limpia
Purpose
Define la implementacion de Clean Architecture para ROITheme, un tema WordPress que sigue principios de Domain-Driven Design con separacion fisica de contextos delimitados (Admin, Public, Shared).
Requirements
Requirement: Separacion Fisica de Contextos
The system MUST organize code into three physically delimited contexts: Admin/, Public/, and Shared/.
Scenario: Codigo pertenece al contexto de administracion
- WHEN el codigo maneja operaciones CRUD, configuracion o funcionalidad del panel admin
- THEN el codigo DEBE colocarse en el directorio
Admin/ - AND el codigo NO DEBE importar del directorio
Public/
Scenario: Codigo pertenece al contexto publico/frontend
- WHEN el codigo maneja renderizado, visualizacion o presentacion frontend
- THEN el codigo DEBE colocarse en el directorio
Public/ - AND el codigo NO DEBE importar del directorio
Admin/
Scenario: Codigo es compartido entre contextos
- WHEN el codigo es usado por AMBOS contextos Admin/ y Public/
- THEN el codigo DEBE colocarse en el directorio
Shared/raiz - AND tanto Admin/ como Public/ PUEDEN importar de Shared/
Requirement: Organizacion Granular de Codigo Compartido
The system MUST implement three levels of shared code to avoid mixing context-specific shared code.
Scenario: Codigo compartido solo dentro del contexto Admin
- WHEN el codigo es reutilizado por multiples modulos Admin pero NO por Public
- THEN el codigo DEBE colocarse en el directorio
Admin/Shared/ - AND los modulos de Public/ NO DEBEN importar de
Admin/Shared/
Scenario: Codigo compartido solo dentro del contexto Public
- WHEN el codigo es reutilizado por multiples modulos Public pero NO por Admin
- THEN el codigo DEBE colocarse en el directorio
Public/Shared/ - AND los modulos de Admin/ NO DEBEN importar de
Public/Shared/
Scenario: Codigo compartido entre ambos contextos
- WHEN el codigo es reutilizado por AMBOS modulos Admin/ y Public/
- THEN el codigo DEBE colocarse en el directorio
Shared/raiz - AND esto incluye ValueObjects, Exceptions y Contracts base
Requirement: Cada Contexto Sigue las Capas de Clean Architecture
Each context (Admin/, Public/, Shared/) MUST internally implement the three Clean Architecture layers: Domain, Application, Infrastructure.
Scenario: Estructura de modulo dentro del contexto Admin
- GIVEN un componente llamado "Navbar" en el contexto Admin
- WHEN el modulo es creado
- THEN la estructura DEBE ser: Admin/Navbar/ con subcarpetas Domain/, Application/, Infrastructure/
Scenario: Estructura de modulo dentro del contexto Public
- GIVEN un componente llamado "Navbar" en el contexto Public
- WHEN el modulo es creado
- THEN la estructura DEBE ser: Public/Navbar/ con subcarpetas Domain/, Application/, Infrastructure/
Requirement: Cumplimiento de Direccion de Dependencias
The system MUST enforce that dependencies flow ONLY from outer layers to inner layers.
Scenario: Infrastructure depende de Application y Domain
- WHEN el codigo esta en la capa Infrastructure
- THEN PUEDE importar de la capa Application
- AND PUEDE importar de la capa Domain
Scenario: Application depende solo de Domain
- WHEN el codigo esta en la capa Application
- THEN PUEDE importar de la capa Domain
- AND NO DEBE importar de la capa Infrastructure
Scenario: Domain no tiene dependencias externas
- WHEN el codigo esta en la capa Domain
- THEN NO DEBE importar de la capa Application
- AND NO DEBE importar de la capa Infrastructure
- AND NO DEBE importar funciones o globales de WordPress
Requirement: La Capa Domain Contiene Solo Logica de Negocio Pura
The Domain layer MUST contain only pure business logic without framework dependencies.
Scenario: Validacion de contenido de capa Domain
- WHEN el codigo se coloca en la capa Domain
- THEN PUEDE contener Entities, Value Objects, Domain Services, Interfaces, Exceptions
- AND NO DEBE contener global $wpdb, $_POST, $_GET, $_SESSION, add_action, add_filter, HTML, CSS, JavaScript
Scenario: Implementacion de entidad Domain
- GIVEN una entidad Domain como NavbarConfiguration
- WHEN la entidad es implementada
- THEN DEBE contener reglas de negocio y validacion
- AND NO DEBE contener logica de persistencia
- AND NO DEBE referenciar APIs de WordPress
Requirement: La Capa Application Orquesta Domain
The Application layer MUST orchestrate domain entities without containing business logic.
Scenario: Implementacion de Use Case
- WHEN un Use Case es implementado
- THEN DEBE coordinar entidades y servicios de domain
- AND DEBE depender de interfaces, NO de implementaciones concretas
- AND NO DEBE contener reglas de validacion de negocio
Scenario: Uso de DTOs para transferencia de datos
- WHEN los datos cruzan limites entre capas
- THEN se DEBEN usar DTOs (Data Transfer Objects)
- AND los DTOs DEBEN ser contenedores de datos simples sin logica de negocio
Requirement: Infrastructure Implementa Interfaces
The Infrastructure layer MUST implement interfaces defined in Domain/Application layers.
Scenario: Implementacion de Repository
- GIVEN una RepositoryInterface definida en Domain
- WHEN el repository es implementado
- THEN DEBE colocarse en Infrastructure/Persistence/
- AND DEBE implementar la interface de Domain
- AND PUEDE usar global $wpdb o APIs de WordPress
Scenario: Integracion con WordPress
- WHEN se necesita codigo especifico de WordPress
- THEN DEBE colocarse en la capa Infrastructure
- AND NO DEBE filtrarse a las capas Domain o Application
Requirement: Los Modulos Son Autocontenidos e Independientes
Each module (Navbar, Footer, Toolbar, etc.) MUST be self-contained and independent from other modules.
Scenario: Aislamiento de modulos
- WHEN un modulo como Admin/Navbar/ es implementado
- THEN NO DEBE importar de Admin/Footer/
- AND NO DEBE importar de Admin/Toolbar/
- AND SOLO PUEDE importar de Shared/
Scenario: Eliminacion de modulos
- WHEN un modulo necesita ser eliminado
- THEN borrar la carpeta del modulo NO DEBE romper otros modulos
- AND no se DEBERIAN requerir cambios de codigo en otros modulos
Requirement: Admin y Public Son Bounded Contexts Separados
Admin/ and Public/ MUST be treated as separate bounded contexts because they have different responsibilities.
Scenario: Responsabilidad del contexto Admin
- WHEN el codigo maneja administracion de componentes
- THEN la entidad Domain se enfoca en configuracion, validacion, estados draft/published
- AND los Use Cases se enfocan en operaciones Save, Update, Delete, Get
Scenario: Responsabilidad del contexto Public
- WHEN el codigo maneja renderizado de componentes
- THEN la entidad Domain se enfoca en estado activo, caching, filtrado por permisos
- AND los Use Cases se enfocan en operaciones GetActive, Render, Cache
Scenario: No hay duplicacion de domain
- WHEN Admin/Navbar/Domain/ y Public/Navbar/Domain/ ambos existen
- THEN NO son duplicados sino bounded contexts especializados
- AND Admin se enfoca en configuracion/gestion
- AND Public se enfoca en renderizado/visualizacion
Requirement: Validacion de Arquitectura Antes de Commit
The system MUST validate architectural compliance before committing code.
Scenario: Validacion de capa Domain
- WHEN se valida codigo de la capa Domain
- THEN grep por global $wpdb DEBE retornar vacio
- AND grep por add_action DEBE retornar vacio
- AND grep por $_POST DEBE retornar vacio
Scenario: Validacion de dependencias de modulos
- WHEN se validan dependencias entre modulos
- THEN imports de Admin/Navbar/ desde Admin/Footer/ NO DEBEN existir
- AND imports de Public/Navbar/ desde Public/Footer/ NO DEBEN existir
Requirement: Realizacion de Beneficios de la Arquitectura
The architecture MUST provide measurable benefits.
Scenario: Asignacion granular de trabajo
- WHEN un desarrollador es asignado a trabajar en Admin/Navbar/
- THEN puede acceder SOLO a esa carpeta
- AND no puede ver ni modificar Public/ u otros modulos de Admin/
Scenario: Eliminacion facil de modulos
- WHEN un componente ya no es necesario
- THEN eliminarlo requiere solo borrar la carpeta
- AND no se necesitan otras modificaciones de codigo
Scenario: Codigo compartido consistente
- WHEN se encuentra un bug en un ValueObject compartido
- THEN arreglarlo en Shared/Domain/ValueObjects/ lo arregla para TODOS los modulos
- AND no se necesita actualizar codigo duplicado