# Change: Refactorizar AdSense Lazy Loading con Intersection Observer ## Why La implementacion actual carga TODOS los ads simultaneamente despues de interaccion del usuario o timeout de 5 segundos. Esto causa: 1. **Slots vacios visibles**: Cuando hay mas ads que inventario disponible, los slots vacios quedan visibles en la pagina creando espacios en blanco. 2. **Sobrecarga inicial**: Cargar 20+ ads simultaneamente impacta el rendimiento y el fill rate de Google. 3. **Desperdicio de impresiones**: Ads below-the-fold se cargan aunque el usuario nunca llegue a verlos. ## What Changes - **BREAKING**: El comportamiento de carga cambia de "cargar todo" a "cargar por visibilidad" - Nuevos campos de configuracion en schema `adsense-placement.json` (grupo `forms`) - Extension del modulo `AdsensePlacement` existente (NO modulo nuevo) - Implementar Intersection Observer para detectar cuando un slot entra al viewport - Cargar cada ad individualmente cuando el usuario se aproxima (rootMargin configurable) - NO mostrar el contenedor `.roi-ad-slot` hasta que el ad tenga contenido real - Estilos generados via CSSGeneratorService (NO CSS estatico) ## Impact - Affected specs: Extension de especificacion existente `adsense-placement` - Affected code: - `Schemas/adsense-placement.json` - Nuevos campos en grupo `forms` - `Assets/Js/adsense-loader.js` - Refactorizacion con Intersection Observer - `Public/AdsensePlacement/Infrastructure/Ui/AdsensePlacementRenderer.php` - Ajustar markup y estilos - `Public/AdsensePlacement/Infrastructure/Services/AdsenseAssetEnqueuer.php` - Pasar config a JS - `Admin/AdsensePlacement/Infrastructure/Ui/AdsensePlacementFormBuilder.php` - Nuevos campos UI - `Admin/AdsensePlacement/Infrastructure/FieldMapping/AdsensePlacementFieldMapper.php` - Mapping ## Arquitectura Esta mejora se integra al modulo **existente** `AdsensePlacement`: ``` Public/AdsensePlacement/ ├── Domain/ # Sin cambios (no hay logica de negocio nueva) ├── Application/ # Sin cambios └── Infrastructure/ ├── Ui/ │ └── AdsensePlacementRenderer.php # Genera CSS dinamico via CSSGenerator └── Services/ └── AdsenseAssetEnqueuer.php # Enqueue JS con config desde BD Admin/AdsensePlacement/ ├── Infrastructure/ │ ├── Ui/ │ │ └── AdsensePlacementFormBuilder.php # Nuevos campos lazy loading │ └── FieldMapping/ │ └── AdsensePlacementFieldMapper.php # Mapping nuevos campos ``` **NO se crea modulo nuevo** - es extension del componente existente.