feat: implement is_critical CSS injection via CriticalCSSService

- Created CriticalCSSService (singleton) that queries BD directly in wp_head
- Service generates CSS BEFORE components render (priority 1)
- Renderers check is_critical flag and skip inline CSS if true
- Made generateCSS() public in Renderers for CriticalCSSService to use
- Removed CriticalCSSCollector pattern (timing issue with WordPress)

Flow:
1. wp_head (priority 1) → CriticalCSSService::render()
2. Service queries BD for components with visibility.is_critical=true
3. Generates CSS using Renderer->generateCSS() methods
4. Outputs: <style id="roi-critical-css">...</style>
5. When Renderers execute, they detect is_critical and omit CSS inline

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude <noreply@anthropic.com>
This commit is contained in:
FrankZamora
2025-11-29 10:06:38 -06:00
parent 38d7099bcd
commit ce0179a134
8 changed files with 366 additions and 179 deletions

View File

@@ -1,45 +0,0 @@
<?php
declare(strict_types=1);
namespace ROITheme\Shared\Domain\Contracts;
/**
* Interface para recolectar CSS crítico de componentes above-the-fold
*
* RESPONSABILIDAD:
* - Definir contrato para recolección de CSS crítico
* - Permitir inyección en Renderers (DIP)
*
* UBICACIÓN: Domain (según 00.02 líneas 239-252)
*
* @package ROITheme\Shared\Domain\Contracts
*/
interface CriticalCSSCollectorInterface
{
/**
* Agregar CSS de un componente a la colección crítica
*
* @param string $componentName Identificador del componente (kebab-case)
* @param string $css CSS generado del componente
*/
public function add(string $componentName, string $css): void;
/**
* Obtener todo el CSS crítico recolectado
*
* @return array<string, string> [componentName => css]
*/
public function getAll(): array;
/**
* Renderizar CSS crítico como tag <style>
*
* @return string HTML del tag <style> o string vacío si no hay CSS
*/
public function render(): string;
/**
* Limpiar colección (útil para tests)
*/
public function clear(): void;
}