FrankZamora
36d5cf56de
fix(wrappers): eliminar wrappers vacíos y corregir exclusiones AdSense (Plan 99.15)
...
## Problema
- Componentes deshabilitados/excluidos dejaban wrappers HTML vacíos
(navbar 32px, sidebar col-lg-3 294px)
- AdSense ignoraba exclusiones por URL pattern en grupo _exclusions
## Solución Plan 99.15 (Clean Architecture)
### Domain Layer
- WrapperVisibilityCheckerInterface: contrato para verificar visibilidad
### Application Layer
- CheckWrapperVisibilityUseCase: orquesta verificaciones de visibilidad
### Infrastructure Layer
- WordPressComponentVisibilityRepository: consulta BD + PageVisibilityHelper
- WrapperVisibilityService: facade estático para templates
- BodyClassHooksRegistrar: agrega clases CSS failsafe al body
### Templates modificados
- header.php: renderizado condicional de <nav> wrapper
- page.php/single.php: lógica dinámica col-lg-9/col-lg-12 según sidebar
### CSS Failsafe
- css-global-utilities.css: reglas body.roi-hide-* como respaldo
## Fix AdSense (Inc/adsense-placement.php)
- Agregado PageVisibilityHelper::shouldShow() a todas las funciones:
roi_render_ad_slot, roi_render_rail_ads, roi_enqueue_adsense_script,
roi_inject_content_ads, roi_render_anchor_ads, roi_render_vignette_ad,
roi_enqueue_anchor_vignette_scripts
🤖 Generated with [Claude Code](https://claude.com/claude-code )
Co-Authored-By: Claude <noreply@anthropic.com >
2025-12-04 11:46:21 -06:00
FrankZamora
6004420620
fix: eliminate forced reflows in TOC ScrollSpy + revert Bootstrap defer
...
- Replace scroll event listener with Intersection Observer in TableOfContentsRenderer
- Eliminates ~100ms forced reflows from offsetTop reads during scroll
- Revert Bootstrap CSS to blocking (media='all') - deferring caused CLS 0.954
- Keep CriticalBootstrapService available for future optimization
- Simplify CriticalCSSHooksRegistrar to only use CriticalCSSService
🤖 Generated with [Claude Code](https://claude.com/claude-code )
Co-Authored-By: Claude <noreply@anthropic.com >
2025-11-29 10:52:25 -06:00
FrankZamora
d5a2fd2702
perf: defer Bootstrap CSS with critical subset inline
...
- Created Assets/css/critical-bootstrap.css (~10KB subset)
Contains only Bootstrap classes used in above-the-fold components:
container, navbar, flexbox, dropdown, spacing utilities
- Created CriticalBootstrapService (singleton)
Injects minified critical Bootstrap in <head> at priority 0
Output: <style id="roi-critical-bootstrap">...</style>
- Modified enqueue-scripts.php
Bootstrap now loads with media="print" + onload="this.media='all'"
Full 31KB Bootstrap loads async, doesn't block rendering
- Updated CriticalCSSHooksRegistrar
Now registers both CriticalBootstrapService (priority 0)
and CriticalCSSService (priority 1)
Flow:
1. wp_head (priority 0) → Critical Bootstrap (~10KB inline)
2. wp_head (priority 1) → Critical Component CSS (~4KB inline)
3. Bootstrap full (31KB) loads deferred, non-blocking
Expected PageSpeed improvement: ~400-600ms LCP reduction
🤖 Generated with [Claude Code](https://claude.com/claude-code )
Co-Authored-By: Claude <noreply@anthropic.com >
2025-11-29 10:26:24 -06:00
FrankZamora
ce0179a134
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 >
2025-11-29 10:06:38 -06:00
FrankZamora
4f25297f14
feat(pagespeed): implementar campo is_critical para CSS crítico dinámico (Phase 4.2)
...
Implementación completa del sistema de Critical CSS dinámico según plan 13.01:
Domain Layer:
- Crear CriticalCSSCollectorInterface para DIP compliance
Infrastructure Layer:
- Implementar CriticalCSSCollector (singleton via DIContainer)
- Crear CriticalCSSHooksRegistrar para inyección en wp_head
- Actualizar DIContainer con getCriticalCSSCollector()
Schemas:
- Agregar campo is_critical a navbar, top-notification-bar, hero
- Sincronizar con BD (18+39+31 campos)
Renderers (navbar, top-notification-bar, hero):
- Inyectar CriticalCSSCollectorInterface via constructor
- Lógica condicional: si is_critical=true → CSS a <head>
Admin (FormBuilders + FieldMappers):
- Toggle "CSS Crítico" en sección visibility
- Mapeo AJAX para persistencia
Beneficios:
- LCP optimizado: CSS crítico inline en <head>
- Above-the-fold rendering sin FOUC
- Componentes configurables desde admin panel
🤖 Generated with [Claude Code](https://claude.com/claude-code )
Co-Authored-By: Claude <noreply@anthropic.com >
2025-11-29 09:29:45 -06:00