/* ============================================================
   CLS STABILIZATION — Torresette News
   Anti-Layout-Shift CSS per contenitori pubblicitari e media.

   Problema: CLS ~0.33 in Search Console vs ~0 in Lighthouse.
   Causa: shift post-caricamento da annunci iniettati dinamicamente
   (Google AdSense, ProjectADV, Revive Adserver, social embed).

   Le regole più critiche sono anche inline in application.tpl
   (render-blocking) per garantire l'applicazione prima del primo
   paint e prima di qualsiasi script ads.

   Questo file è la versione standalone/documentata.
   ============================================================ */


/* ============================================================
   1. CONTENITORI .ad-header (template Smarty legacy)

   .ad-header ha già min-height: 266px in style.css.
   overflow:hidden blocca espansioni anomale che spostano
   il contenuto sottostante quando l'ad supera la min-height.
   ============================================================ */
.ad-header {
    overflow: hidden;
}


/* ============================================================
   2. SLOT PROJECTADV — prj_* divs

   Iniettati vuoti nel markup, riempiti da ProjectADV
   (https://d27gtglsu4f4y2.cloudfront.net/prebid_hb_171_20.js).
   Senza placeholder, il loro caricamento provoca shift verticali
   proporzionali all'altezza dell'ad (tipicamente 250–280px).

   Slot identificati nel codebase:
   - prj_728x90_atf       : leaderboard desktop ATF
   - prj_300x250_intext   : in-article (_in_article.tpl)
   - prj_artcorr          : contenuti correlati
   - prj_vidinread        : video in-read
   - prj_300x250_mob_atf  : mobile ATF
   ============================================================ */

#prj_728x90_atf {
    display: block;
    min-height: 90px;
}

#prj_300x250_intext,
#prj_artcorr,
#prj_vidinread {
    display: block;
    min-height: 250px;
}

#prj_300x250_mob_atf {
    display: block;
    min-height: 250px;
}


/* ============================================================
   3. REVIVE ADSERVER — <ins data-revive-zoneid>

   In _column_right.tpl (righe 155, 163) compaiono <ins> Revive
   senza container dedicato: il browser li vede come elementi
   inline vuoti, zero altezza. Quando Revive JS li riempie con
   300x250, causano un layout shift di 250px.

   Zone presenti: 13, 19, 32, 33, 34, 37, 38.
   ============================================================ */

ins[data-revive-zoneid] {
    display: block;
    min-height: 250px;
    overflow: hidden;
}


/* ============================================================
   4. BANNER SIDEBAR CON ROTAZIONE (jquery.innerfade.js)

   I rotatori innerfade passano la visibilità tra le <li> della
   lista banner. Senza min-height sulla <ul>, l'alternanza tra
   un'immagine e la successiva può contrarre/espandere il
   contenitore.
   ============================================================ */

#banner_300x250_1,
#banner_300x250_2,
#banner_300x250_3 {
    min-height: 250px;
    overflow: hidden;
}

#banner_300x600_dx_desktop {
    min-height: 600px;
    overflow: hidden;
}


/* ============================================================
   5. IMMAGINI — aspect-ratio intrinseco

   Quando width e height sono presenti nell'attributo HTML,
   i browser moderni (Chrome 79+, Firefox 71+, Safari 14+)
   calcolano l'aspect-ratio prima che l'immagine sia scaricata,
   riservando lo spazio corretto e prevenendo il reflow.

   height:auto è il prerequisito CSS per questo meccanismo:
   senza di esso, l'attributo height HTML impone un'altezza
   fissa che può causare distorsioni su schermi diversi.

   Nota: Bootstrap 3 imposta già height:auto su .img-responsive.
   Questa regola copre le immagini senza quella classe.

   NON toccare ins.adsbygoogle globalmente (vedi note in detail.tpl):
   colpirebbe anchor/auto ads iniettate da Google nel <body>.
   ============================================================ */

img {
    height: auto;
}

/* Immagini nel corpo articolo: larghezza massima responsive */
.article-body img,
.description-detail img {
    max-width: 100%;
    height: auto;
}


/* ============================================================
   6. TWITTER EMBED

   Il widget Twitter (platform.twitter.com/widgets.js) espande
   il <blockquote class="twitter-tweet"> già nel DOM.
   min-height riduce lo shift visibile al caricamento del widget.
   ============================================================ */

.twitter-tweet,
blockquote.twitter-tweet {
    min-height: 200px;
}


/* ============================================================
   7. INSTAGRAM EMBED

   Stessa logica del widget Twitter.
   ============================================================ */

.instagram-media,
blockquote.instagram-media {
    min-height: 300px;
}


/* ============================================================
   8. STICKY FOOTER / ANCHOR ADS

   Gli slot sticky devono essere position:fixed per non occupare
   spazio nel document flow e non causare CLS.

   AVVERTENZA: NON aggiungere padding-bottom al body qui.
   Google Auto Ads gestisce già il padding-bottom dinamicamente.
   Un padding extra causerebbe doppio shift (step 6 in detail.tpl).

   Questi selettori coprono eventuali slot manuali; gli anchor
   ads di Google vengono già iniettati con position:fixed.
   ============================================================ */

[data-slot="sticky-footer"],
[data-slot="anchor"],
.sticky-footer-ad {
    position: fixed !important;
    bottom: 0;
    left: 0;
    width: 100%;
    z-index: 9999;
}


/* ============================================================
   9. SLOT UNIFICATI .tsr-ad-slot (sistema inmoby.js)

   SlotSizeManager in inmoby.js imposta min-height via JS.
   overflow:hidden supplementa questa protezione impedendo
   che il contenuto dell'ad sfori durante il caricamento.
   ============================================================ */

.tsr-ad-slot {
    overflow: hidden;
}


/* ============================================================
   10. VIDEO EMBED — aspect-ratio 16:9

   Contenitori per iframe YouTube / video embed responsive.
   ============================================================ */

.embed-responsive,
.embed-container {
    position: relative;
    width: 100%;
    overflow: hidden;
}

.embed-responsive iframe,
.embed-responsive video,
.embed-container iframe,
.embed-container video {
    position: absolute;
    top: 0;
    left: 0;
    width: 100%;
    height: 100%;
}


/* ============================================================
   11. CONTENT-BANNER-RIGHT — sidebar destra

   overflow:hidden previene che widget lazy-loaded o banner
   in caricamento espandano il contenitore oltre la dimensione
   riservata.
   ============================================================ */

.content-banner-right {
    overflow: hidden;
}


/* ============================================================
   12. #wrapper — transition CLS fix

   "transition: all" su #wrapper includeva padding-top: quando
   Google Auto Ads aggiunge body.paddingTop per l'anchor top,
   la transizione anima il layout shift su #wrapper per 0.5s.
   Chrome misura CLS su ogni frame interpolato, moltiplicando
   il punteggio reale (tipicamente 7–8 eventi da un solo shift).

   Regola di override: viene caricata dopo style.min.css nella
   cascade, quindi vince senza bisogno di !important.

   L'override è anche inline nell'application.tpl <style> come
   doppio presidio (stessa specificità, ordine sorgente garantito).
   ============================================================ */

#wrapper {
    -webkit-transition: padding-left 0.5s ease;
    -moz-transition: padding-left 0.5s ease;
    -o-transition: padding-left 0.5s ease;
    transition: padding-left 0.5s ease;
}


/* ============================================================
   13. #page-content-wrapper e .container.boxed — stabilizzazione

   Nessuna proprietà che causa layout shift automatico.
   overflow:hidden su .container.boxed previene che contenuti
   pubblicitari espandano il boxed container oltre le dimensioni
   previste e spingano il contenuto sotto.

   NOTA: NON usare overflow:hidden su #page-content-wrapper
   perché confina il sidebar offcanvas che usa position:fixed.
   ============================================================ */

.container.boxed {
    overflow: hidden;
}


/* ============================================================
   14. article.detail-news — prevenzione shift verticale

   L'articolo può essere spinto verso il basso da:
   a) body.paddingTop aggiunto da Google anchor (gestito via JS)
   b) Slot ads nel .container.boxed (header) che cambiano altezza

   min-height evita il collasso a 0 del contenitore dell'articolo
   durante il caricamento lazy dei componenti interni.
   ============================================================ */

article.detail-news {
    min-height: 200px;
}


/* ============================================================
   FINE cls-stabilize.css
   ============================================================ */
