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:
@@ -5,7 +5,6 @@ namespace ROITheme\Public\TopNotificationBar\Infrastructure\Ui;
|
||||
|
||||
use ROITheme\Shared\Domain\Contracts\RendererInterface;
|
||||
use ROITheme\Shared\Domain\Contracts\CSSGeneratorInterface;
|
||||
use ROITheme\Shared\Domain\Contracts\CriticalCSSCollectorInterface;
|
||||
use ROITheme\Shared\Domain\Entities\Component;
|
||||
|
||||
/**
|
||||
@@ -37,11 +36,9 @@ final class TopNotificationBarRenderer implements RendererInterface
|
||||
{
|
||||
/**
|
||||
* @param CSSGeneratorInterface $cssGenerator Servicio de generación de CSS
|
||||
* @param CriticalCSSCollectorInterface $criticalCollector Colector de CSS crítico
|
||||
*/
|
||||
public function __construct(
|
||||
private CSSGeneratorInterface $cssGenerator,
|
||||
private CriticalCSSCollectorInterface $criticalCollector
|
||||
private CSSGeneratorInterface $cssGenerator
|
||||
) {}
|
||||
|
||||
/**
|
||||
@@ -61,19 +58,19 @@ final class TopNotificationBarRenderer implements RendererInterface
|
||||
return '';
|
||||
}
|
||||
|
||||
// Generar CSS usando CSSGeneratorService
|
||||
$css = $this->generateCSS($data);
|
||||
|
||||
// Generar HTML
|
||||
$html = $this->buildHTML($data);
|
||||
|
||||
// Siempre incluir CSS inline con el componente
|
||||
// Nota: is_critical se reserva para futura implementación con output buffering
|
||||
return sprintf(
|
||||
"<style>%s</style>\n%s",
|
||||
$css,
|
||||
$html
|
||||
);
|
||||
// Si is_critical=true, CSS ya fue inyectado en <head> por CriticalCSSService
|
||||
$isCritical = $data['visibility']['is_critical'] ?? false;
|
||||
|
||||
if ($isCritical) {
|
||||
return $html; // Solo HTML, sin CSS inline
|
||||
}
|
||||
|
||||
// CSS inline para componentes no críticos
|
||||
$css = $this->generateCSS($data);
|
||||
return sprintf("<style>%s</style>\n%s", $css, $html);
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -165,10 +162,13 @@ final class TopNotificationBarRenderer implements RendererInterface
|
||||
/**
|
||||
* Generar CSS usando CSSGeneratorService
|
||||
*
|
||||
* Este método es público para que CriticalCSSService pueda
|
||||
* generar CSS crítico antes de wp_head sin duplicar lógica.
|
||||
*
|
||||
* @param array $data Datos del componente
|
||||
* @return string CSS generado
|
||||
*/
|
||||
private function generateCSS(array $data): string
|
||||
public function generateCSS(array $data): string
|
||||
{
|
||||
$css = '';
|
||||
|
||||
|
||||
Reference in New Issue
Block a user