/* =========================================================================
   cms/pubblico/styles.css — frontend pubblico del CMS.

   Implementazione dei design token "Comunicare il Sorriso di Dio" —
   variante Caldo & Accogliente (palette terracotta su crema, Fraunces +
   Source Serif 4 + Inter + IBM Plex Mono).

   ORGANIZZAZIONE DEL FILE
     1. Token (CSS variables) — la fonte di verità di palette/scale/spazi
     2. Reset minimo + tipografia di base
     3. (Topbar rimossa — la sezione è vuota, lascio il numero per non
        rinumerare)
     4. Header del sito (brand + social + nav)
     5. Main (contenitore + larghezze)
     6. Articolo singolo (titolo, byline, copertina, corpo, tag)
     7. Pagina 404
     8. Footer
     9. Responsive (mobile-first dei pochi punti che cambiano)

   Le classi seguono la convenzione BEM lasca già usata nel progetto:
   `blocco__elemento--variante`. Niente Tailwind, niente preprocessori:
   CSS puro + variabili, perché il pubblico è statico e ogni byte conta.
   ========================================================================= */


/* =========================================================================
   1. TOKEN
   ========================================================================= */

:root {

    /* --- Palette ---------------------------------------------------------
       Bruno scuro per testo (NO nero puro: #2c2620 è il nero caldo del
       design system). Sfondo del sito = `--c-bg-pagina`: bianco-caldo
       morbido, non saturo, su cui galleggiano contenuti e widget. Crema
       più caldo #f4ede0 come highlight (citazione, hero-coperta segnaposto).
       Terracotta #c8553d come accento (categorie, CTA, capolettera). */
    --c-bg-sito:          #fffdf9;
    --c-bg-pagina:        #fbf8f1;
    --c-bg-card:          #ffffff;
    --c-bg-dark:          #2c2620;
    --c-bg-highlight:     #f4ede0;

    --c-testo:            #2c2620;
    --c-testo-corpo:      #3a2e22;
    --c-testo-corpo-soft: #5a4e42;
    --c-testo-muted:      #7a6a5a;
    --c-testo-faint:      #a8957e;

    --c-bordo:            #ebe2d4;
    --c-bordo-forte:      #d4c4ad;

    --c-accento:          #c8553d;
    --c-accento-hover:    #a3402d;
    --c-accento-soft:     #e8b86d;

    /* --- Tipografia -----------------------------------------------------
       Fraunces (display+titoli) + Source Serif 4 (corpo articolo) +
       Inter (UI) + IBM Plex Mono (meta/kicker). Caricate via Google
       Fonts dal <head>. */
    --font-display: 'Fraunces', Georgia, 'Times New Roman', serif;
    --font-corpo:   'Source Serif 4', Georgia, 'Times New Roman', serif;
    --font-ui:      'Inter', -apple-system, BlinkMacSystemFont, 'Segoe UI', system-ui, sans-serif;
    --font-mono:    'IBM Plex Mono', 'SF Mono', Menlo, Consolas, monospace;

    /* --- Spaziature -----------------------------------------------------
       Scala in rem (1rem = 16px). Preferenza per multipli pari per
       allineamenti baseline coerenti tra blocchi diversi. */
    --sp-1: 0.25rem;   /*  4px */
    --sp-2: 0.5rem;    /*  8px */
    --sp-3: 0.75rem;   /* 12px */
    --sp-4: 1rem;      /* 16px */
    --sp-5: 1.5rem;    /* 24px */
    --sp-6: 2rem;      /* 32px */
    --sp-7: 2.5rem;    /* 40px */
    --sp-8: 3.5rem;    /* 56px */
    --sp-9: 5rem;      /* 80px */

    /* --- Larghezze max -------------------------------------------------- */
    --maxw-corpo:        720px;   /* lettura ottimale (corpo articolo)     */
    --maxw-titolo:       880px;   /* title block + sommario articolo       */
    --maxw-pagina:      1200px;   /* contenitore generale (header, footer) */

    /* --- Border radius -------------------------------------------------- */
    --br-piccolo: 3px;
    --br-medio:   4px;
    --br-cerchio: 999px;

    /* --- Ombra discreta sotto le card (solo home, non articolo) -------- */
    --sh-card: 0 1px 2px rgba(44, 38, 32, 0.06);
}


/* =========================================================================
   2. RESET MINIMO + TIPOGRAFIA DI BASE
   ========================================================================= */

*, *::before, *::after { box-sizing: border-box; }
html, body { margin: 0; padding: 0; }
img, picture, video { max-width: 100%; height: auto; display: block; }
ul, ol { margin: 0; padding: 0; list-style: none; }

body {
    font-family: var(--font-ui);
    font-size: 15px;
    line-height: 1.6;
    color: var(--c-testo);
    /* Sfondo del body: bianco-caldo morbido che fa da fondo all'intero
     * sito. Layout aperto: header, navbar e main condividono lo stesso
     * sfondo, senza container ombreggiato. La centratura su
     * `--maxw-pagina` la fanno i singoli blocchi col loro padding
     * orizzontale. Il footer è full-bleed (sfondo bruno scuro).
     *
     * `overflow-x: clip` previene la scrollbar orizzontale spuria che
     * il trick "full-bleed" della navbar (margine -50vw) può
     * introdurre: `100vw` include la larghezza della scrollbar
     * verticale, che diventa overflow di pochi pixel a destra.
     * `clip` invece di `hidden` non crea un nuovo formatting context,
     * così future `position: sticky` continuano a funzionare. */
    background: var(--c-bg-pagina);
    overflow-x: clip;
    -webkit-font-smoothing: antialiased;
    -moz-osx-font-smoothing: grayscale;
}

a { color: inherit; }


/* =========================================================================
   3. (TOPBAR rimossa)
   =========================================================================
   La topbar bruna in cima (claim + contatore iscritti) è stata rimossa
   per alleggerire l'header. Le chiavi `pubblico.topbar.*` sono fuori dal
   registro e il cromo non la include più. Lasciato il numero di sezione
   per non rinumerare il resto del file. */


/* =========================================================================
   4. HEADER DEL SITO — brand + social + navbar
   =========================================================================
   Il logotipo è impaginato su due righe: "Comunicare il / *Sorriso* di
   Dio" con "Sorriso" in italic + accento rosso. La "c" cerchiata a
   sinistra è un placeholder testuale (sostituibile con un'immagine
   vera quando arriverà). Quattro social cerchiati a destra. */

.sito-header {
    background: var(--c-bg-pagina);
}
.sito-header__interno {
    /* Container centrato dell'header: max 1200px, padding laterale
     * generoso. Niente bordi né ombre — il layout è aperto, l'header
     * vive sullo stesso sfondo del resto della pagina.
     * Padding-top ridotto a --sp-3: senza la vecchia topbar bruna
     * sopra, il --sp-6 originale lasciava un vuoto ingiustificato. */
    max-width: var(--maxw-pagina);
    margin: 0 auto;
    padding: var(--sp-4) var(--sp-6) var(--sp-3) var(--sp-6);
    display: flex;
    justify-content: space-between;
    align-items: flex-start;
    gap: var(--sp-6);
}

/* --- Brand ------------------------------------------------------------- */
.sito-header__brand {
    display: flex;
    align-items: flex-start;
    gap: var(--sp-4);
    text-decoration: none;
    color: var(--c-testo);
}
.sito-header__brand:hover .sito-header__titolo-accento {
    color: var(--c-accento-hover);
}

/* "c" cerchiata: cerchio terracotta + lettera Fraunces bianca dentro.
   Quando arriverà il logo vero, sostituiremo solo questo blocco. */
.sito-header__logo {
    flex-shrink: 0;
    width: 44px;
    height: 44px;
    border-radius: var(--br-cerchio);
    background: var(--c-accento);
    color: var(--c-bg-pagina);
    font-family: var(--font-display);
    font-size: 26px;
    font-weight: 600;
    font-style: italic;
    display: flex;
    align-items: center;
    justify-content: center;
    line-height: 1;
    margin-top: 2px;
}

.sito-header__brand-testo {
    display: flex;
    flex-direction: column;
    gap: 2px;
}

.sito-header__titolo {
    /* Titolo brand su una sola riga: "Comunicare il *Sorriso* di Dio".
     * Era a due righe (riga1 22px + riga2 26px); ora unica voce a 28px
     * per dargli presenza pur restando contenuta. La parola accento
     * (italic + terracotta) la fa l'`<em class="sito-header__titolo-accento">`. */
    font-family: var(--font-display);
    font-weight: 500;
    font-size: 28px;
    line-height: 1.1;
    letter-spacing: -0.5px;
    color: var(--c-testo);
}
.sito-header__titolo-accento {
    color: var(--c-accento);
    font-style: italic;
    font-weight: 500;
    transition: color 0.15s ease;
}

.sito-header__sottotitolo {
    font-family: var(--font-corpo);
    font-style: italic;
    font-size: 13px;
    color: var(--c-testo-muted);
    margin-top: var(--sp-2);
    line-height: 1.4;
}

/* --- Social -------------------------------------------------------------
   Quattro icone cerchiate a destra del brand. Cerchio bordo terracotta
   chiaro, icona terracotta. Hover: fill pieno terracotta + icona crema. */
.sito-header__social {
    display: flex;
    gap: var(--sp-3);
    align-items: center;
    flex-shrink: 0;
}
.sito-header__social-link {
    display: flex;
    align-items: center;
    justify-content: center;
    width: 36px;
    height: 36px;
    border-radius: var(--br-cerchio);
    background: var(--c-bg-pagina);
    border: 1px solid var(--c-bordo);
    color: var(--c-accento);
    text-decoration: none;
    transition: background 0.15s ease, color 0.15s ease, border-color 0.15s ease;
}
.sito-header__social-link:hover,
.sito-header__social-link:focus-visible {
    background: var(--c-accento);
    color: var(--c-bg-pagina);
    border-color: var(--c-accento);
}
.sito-header__social-link:focus-visible {
    outline: 2px solid var(--c-accento);
    outline-offset: 2px;
}

/* --- Navbar -------------------------------------------------------------
   Fascia terracotta a piena larghezza della **finestra del browser**,
   voci bianche in maiuscoletto grassetto, centrate dentro
   `--maxw-pagina`. La voce attiva resta bianca con una sottolineatura
   bianca sotto il testo.

   Trick "full-bleed": il template HTML mette `<header>` (e quindi
   `<nav>`) DENTRO `<main class="sito-main">`, che è limitato a 1200px.
   Per far uscire la fascia rossa fino ai bordi della finestra senza
   toccare il template, i margini negativi `calc(50% - 50vw)` la
   estendono: ogni lato esce di (50vw − metà del padre), così il
   risultato è larghezza pari a `100vw`.

   Il `__interno` resta al suo posto dentro 1200, con le voci centrate
   visivamente sotto il brand. Borda sopra/sotto non ce ne sono più:
   il colore pieno della fascia fa da separatore visivo. */
.sito-nav {
    background: var(--c-accento);
    margin-left:  calc(50% - 50vw);
    margin-right: calc(50% - 50vw);
    margin-bottom: var(--sp-6);
}
.sito-nav__interno {
    max-width: var(--maxw-pagina);
    margin: 0 auto;
    padding: 0 var(--sp-6);
}
/* Bottone hamburger: nascosto su desktop, attivato nel media mobile. */
.sito-nav__toggle { display: none; }
.sito-nav__lista {
    display: flex;
    gap: var(--sp-7);
    flex-wrap: wrap;
}
.sito-nav__voce { line-height: 1; }
.sito-nav__link {
    position: relative;
    display: inline-flex;
    align-items: center;
    padding: var(--sp-4) 0;
    font-family: var(--font-ui);
    font-size: 15px;
    font-weight: 700;
    line-height: 1;
    letter-spacing: 0.8px;
    text-transform: uppercase;
    text-decoration: none;
    color: #ffffff;
    transition: color 0.15s ease;
    /* vertical-align uniforma il box del <button> contenitore a quello
       degli <a> inline-flex adiacenti nella stessa riga flex della lista */
    vertical-align: middle;
}
.sito-nav__link:hover {
    color: var(--c-accento-soft);
}
.sito-nav__link--attivo {
    color: #ffffff;
}
/* Sottolineatura della voce attiva: pseudo-elemento posizionato
 * vicino alla baseline del testo (non incollato al bordo inferiore
 * della fascia). Bianca per uniformità col colore del testo.
 * Spessore 3px. */
.sito-nav__link--attivo::after {
    content: "";
    position: absolute;
    left: 0;
    right: 0;
    bottom: calc(var(--sp-4) - 8px);
    height: 3px;
    background: #ffffff;
}

/* --- Sottomenu (un solo livello) -----------------------------------------
   Voce padre con figli: chevron al volo, dropdown on-hover/focus che si apre
   sotto. Su mobile (≤768px) si trasforma in una lista in-flow per
   accessibilità touch. */
.sito-nav__voce--ha-sottomenu {
    position: relative;
}
.sito-nav__chevron {
    display: inline-block;
    margin-left: 6px;
    font-size: 16px;
    line-height: 1;
    opacity: 0.9;
    /* il triangolo ▾ otticamente "galleggia" alto rispetto alle
       maiuscole: lo abbasso di un filo per centrarlo sul testo */
    transform: translateY(1px);
    transition: transform 0.15s ease;
}
.sito-nav__voce--ha-sottomenu:hover .sito-nav__chevron,
.sito-nav__voce--ha-sottomenu:focus-within .sito-nav__chevron {
    transform: translateY(3px);
}

/* Voce "contenitore": è un <button>, ma deve apparire ed allinearsi
   ESATTAMENTE come gli <a> della navbar. Oltre a sfondo/bordo, azzero
   gli scarti che il browser applica ai button (line-height propria,
   margin, allineamento verticale) così non risulta più bassa delle
   altre voci. Padding/font/colore li eredita da .sito-nav__link. */
.sito-nav__link--contenitore {
    background: none;
    border: none;
    margin: 0;
    cursor: pointer;
    font-family: var(--font-ui);
    line-height: 1;
    vertical-align: middle;
    -webkit-appearance: none;
    appearance: none;
}

.sito-nav__sottomenu {
    position: absolute;
    top: 100%;
    left: 0;
    min-width: 240px;
    margin: 0;
    padding: var(--sp-3) 0;
    background: var(--c-bg-sito);
    border: 1px solid var(--c-bordo);
    border-radius: var(--br-piccolo);
    box-shadow: 0 10px 30px rgba(44, 38, 32, 0.14);
    list-style: none;
    opacity: 0;
    visibility: hidden;
    transform: translateY(-4px);
    transition: opacity 0.15s ease, transform 0.15s ease, visibility 0.15s ease;
    z-index: 100;
}
.sito-nav__voce--ha-sottomenu:hover .sito-nav__sottomenu,
.sito-nav__voce--ha-sottomenu:focus-within .sito-nav__sottomenu {
    opacity: 1;
    visibility: visible;
    transform: translateY(0);
}

.sito-nav__sottomenu-voce { display: block; }
.sito-nav__sottomenu-link {
    display: block;
    position: relative;
    padding: var(--sp-3) var(--sp-5);
    font-family: var(--font-ui);
    font-size: 14px;
    font-weight: 500;
    letter-spacing: 0.2px;
    color: var(--c-testo);
    text-decoration: none;
    transition: background 0.12s ease, color 0.12s ease, padding 0.12s ease;
}
/* Barretta-accento a sinistra che appare sull'hover: dà carattere al
   dropdown senza appesantirlo. Il testo scorre di poco a destra. */
.sito-nav__sottomenu-link::before {
    content: "";
    position: absolute;
    left: 0;
    top: 50%;
    transform: translateY(-50%) scaleY(0);
    width: 3px;
    height: 60%;
    background: var(--c-accento);
    transition: transform 0.12s ease;
}
.sito-nav__sottomenu-link:hover,
.sito-nav__sottomenu-link:focus-visible {
    background: var(--c-bg-highlight);
    color: var(--c-accento);
    padding-left: calc(var(--sp-5) + 4px);
}
.sito-nav__sottomenu-link:hover::before,
.sito-nav__sottomenu-link:focus-visible::before {
    transform: translateY(-50%) scaleY(1);
}
.sito-nav__sottomenu-link--attivo {
    color: var(--c-accento);
    font-weight: 600;
}


/* =========================================================================
   5. MAIN — contenitore principale sotto l'header
   =========================================================================
   Il main è solo un wrapper che dà aria sopra/sotto. Le larghezze
   massime se le gestiscono i singoli template (articolo singolo ha la
   sua, la home avrà la sua). */

.sito-main {
    /* Layout aperto: niente più cornice ombreggiata. Centratura su
     * `--maxw-pagina` e padding verticale per dare aria sopra il primo
     * elemento (`<header class="sito-header">`) e sotto l'ultimo
     * elemento di contenuto. Il main eredita lo sfondo bianco-caldo
     * del body.
     *
     * NB sulla geometria: header e nav vivono DENTRO `<main>` (vedi
     * trick full-bleed della navbar), quindi il `padding-top` qui è
     * lo spazio sopra il **brand**, NON sotto la navbar. Per l'aria
     * sotto la navbar c'è `margin-bottom` su `.sito-nav` stessa. */
    max-width: var(--maxw-pagina);
    margin: 0 auto;
    padding: 0 var(--sp-6) var(--sp-9);
}


/* =========================================================================
   LAYOUT ARTICOLO + SIDEBAR
   =========================================================================
   Il template pubblico apre `.layout-articolo` solo quando ci sono
   widget attivi sulla sidebar (vedi header.php). Quando attivo:
   griglia 2 colonne (principale ~1.5fr / sidebar 320px). Quando
   inattivo: il main è full-width come single-column.

   Sotto i 980px la sidebar va sotto l'articolo (single-column anche
   se ci sono widget). Il design lo prevede: la sidebar è laterale
   solo da desktop in su.
   ========================================================================= */

.layout-articolo {
    display: grid;
    grid-template-columns: minmax(0, 1fr) 320px;
    gap: var(--sp-9);
    align-items: start;
}
.layout-articolo__principale {
    min-width: 0;   /* impedisce a contenuti larghi di rompere la grid */
}

@media (max-width: 980px) {
    .layout-articolo {
        grid-template-columns: 1fr;
        gap: var(--sp-7);
    }
}


/* =========================================================================
   6. ARTICOLO SINGOLO
   =========================================================================
   Dal mockup "02 · ARTICOLO SINGOLO":
     - breadcrumb mono
     - kicker mono (categoria + data)
     - titolo Fraunces grande, max-width 880px, centrato
     - sommario serif italic
     - byline con avatar dG
     - copertina full-width sotto il title block
     - corpo Source Serif 4 18px, max-width 720px
     - capolettera/pullquote/correlati: Fase D (per ora niente)
   ========================================================================= */

.articolo {
    /* Il blocco articolo non ha max-width: lo controllano i suoi figli
       (title block 880, copertina full, corpo 720). Così la copertina
       può sfondare a piena larghezza del main. */
    margin: 0 auto;
}

/* --- Banner anteprima admin (sopra l'<article>, sopra il breadcrumb) ----
   Visibile solo quando l'admin guarda un contenuto non-pubblicato via
   ?anteprima=1. Fascia gialla pallida con testo scuro: deve essere
   evidente ma non aggressiva. Stesso max-width del titolo per allineare
   visivamente al resto del contenuto. */
.articolo__banner-anteprima {
    max-width: var(--maxw-titolo);
    margin: 0 auto var(--sp-4);
    padding: var(--sp-3) var(--sp-4);
    background: #fdf6e3;
    border: 1px solid #d4c785;
    border-left: 4px solid #b8901f;
    border-radius: var(--r-piccolo, 4px);
    font-size: .95rem;
    color: #5a4515;
    line-height: 1.5;
}
.articolo__banner-anteprima strong {
    margin-right: 4px;
}
.articolo__banner-anteprima em {
    font-style: normal;
    font-weight: 600;
    color: #4a3a10;
    text-transform: lowercase;
}

/* Niente regole .articolo__breadcrumb: il breadcrumb è stato rimosso
   dal template (cms/articolo.php) — vedi il commento lì. */

/* --- Title block: kicker + titolo + sommario --------------------------- */
.articolo__intestazione {
    max-width: var(--maxw-titolo);
    margin: 0 auto var(--sp-6);
    text-align: left;
}

/* Kicker mono: "BENESSERE · 7 OTTOBRE 2025" */
.articolo__kicker {
    font-family: var(--font-mono);
    font-size: 12px;
    letter-spacing: 1.5px;
    text-transform: uppercase;
    color: var(--c-accento);
    margin: 0 0 var(--sp-4);
}
.articolo__kicker-sep {
    color: var(--c-testo-faint);
    margin: 0 var(--sp-2);
}
.articolo__kicker-cat {
    color: inherit;
    text-decoration: none;
    border-bottom: 1px solid transparent;
    transition: border-color 0.15s ease;
}
.articolo__kicker-cat:hover,
.articolo__kicker-cat:focus-visible {
    border-bottom-color: currentColor;
    outline: none;
}

.articolo__titolo {
    margin: 0 0 var(--sp-4);
    font-family: var(--font-display);
    font-size: 44px;
    font-weight: 500;
    line-height: 1.05;
    letter-spacing: -0.5px;
    color: var(--c-testo);
    text-wrap: balance;
}

/* Bottone "matita" accanto al titolo, visibile solo se l'admin e` loggato
   (rendering condizionale lato PHP). Linkato a /admin/contenuto_modifica.php
   per saltare direttamente all'edit. Dimensionato in em per scalare col
   titolo. Mai visibile ai visitatori normali. */
.articolo__titolo-edit {
    display: inline-flex;
    align-items: center;
    justify-content: center;
    vertical-align: middle;
    margin-left: 0.4em;
    width: 1em;
    height: 1em;
    padding: 0.15em;
    border-radius: 50%;
    color: var(--c-accento, #c8553d);
    background: transparent;
    border: 1px solid currentColor;
    opacity: 0.55;
    transition: opacity .15s ease, background-color .15s ease, color .15s ease;
    text-decoration: none;
}
.articolo__titolo-edit:hover,
.articolo__titolo-edit:focus-visible {
    opacity: 1;
    background: var(--c-accento, #c8553d);
    color: var(--c-bg-pagina, #faf6f0);
}
.articolo__titolo-edit svg {
    display: block;
}

.articolo__sommario {
    margin: 0 0 var(--sp-5);
    padding: 0;
    background: transparent;
    border-left: none;
    font-family: var(--font-display);
    font-style: italic;
    font-weight: 500;
    font-size: 22px;
    line-height: 1.4;
    color: var(--c-testo-corpo-soft);
}
.articolo__sommario p { margin: 0; }

/* --- Byline: avatar + nome + meta -------------------------------------- */
.articolo__byline {
    max-width: var(--maxw-titolo);
    margin: 0 auto var(--sp-6);
    display: flex;
    align-items: center;
    gap: var(--sp-3);
}
.articolo__byline-avatar {
    flex-shrink: 0;
    width: 40px;
    height: 40px;
    border-radius: var(--br-cerchio);
    background: var(--c-accento);
    color: var(--c-bg-pagina);
    font-family: var(--font-display);
    font-weight: 600;
    font-size: 15px;
    display: flex;
    align-items: center;
    justify-content: center;
    line-height: 1;
}
.articolo__byline-info {
    display: flex;
    flex-direction: column;
    gap: 1px;
    font-size: 13px;
    line-height: 1.4;
}
.articolo__byline-nome {
    font-family: var(--font-ui);
    font-weight: 600;
    color: var(--c-testo);
}
.articolo__byline-meta {
    font-family: var(--font-mono);
    font-size: 11px;
    letter-spacing: 0.8px;
    color: var(--c-testo-muted);
}

/* --- Copertina (foto hero) --------------------------------------------- */
.articolo__copertina {
    margin: 0 0 var(--sp-7);
    /* Volutamente NON ha max-width: la copertina sfora a tutta la
       larghezza del main per dare impatto visivo. */
}
.articolo__copertina img {
    width: 100%;
    border-radius: var(--br-medio);
    aspect-ratio: 16 / 9;
    object-fit: cover;
}

/* --- Corpo dell'articolo (HTML da TinyMCE/sanitize_rich_html) ---------- */
.articolo__corpo {
    max-width: var(--maxw-corpo);
    margin: 0 auto;
    font-family: var(--font-corpo);
    font-size: 18px;
    line-height: 1.75;
    color: var(--c-testo-corpo);
}
.articolo__corpo p {
    margin: 0 0 var(--sp-5);
}

.articolo__corpo h2 {
    margin: var(--sp-8) 0 var(--sp-4);
    font-family: var(--font-display);
    font-size: 30px;
    font-weight: 600;
    line-height: 1.2;
    letter-spacing: -0.3px;
    color: var(--c-testo);
}
.articolo__corpo h3 {
    margin: var(--sp-7) 0 var(--sp-3);
    font-family: var(--font-display);
    font-size: 24px;
    font-weight: 600;
    line-height: 1.25;
    color: var(--c-testo);
}
.articolo__corpo h4 {
    margin: var(--sp-6) 0 var(--sp-3);
    font-family: var(--font-display);
    font-size: 20px;
    font-weight: 600;
    color: var(--c-testo);
}

/* Se il PRIMO elemento del corpo è un titolo (h2/h3/h4), niente spazio
   sopra: il titolo parte attaccato in alto. Stesso comportamento dentro
   l'editor TinyMCE (admin-tinymce.js, content_style). */
.articolo__corpo > h2:first-child,
.articolo__corpo > h3:first-child,
.articolo__corpo > h4:first-child {
    margin-top: 0;
}

.articolo__corpo a {
    color: var(--c-accento);
    text-decoration: underline;
    text-decoration-thickness: 1px;
    text-underline-offset: 3px;
}
.articolo__corpo a:hover {
    color: var(--c-accento-hover);
}

.articolo__corpo strong { font-weight: 700; color: var(--c-testo); }
.articolo__corpo em     { font-style: italic; }

/* --- Capolettera ---------------------------------------------------------
   Solo articoli (classe `articolo__corpo--con-capolettera`). La prima
   lettera del primo paragrafo viene ingrandita, in Fraunces, terracotta,
   "annegata" sulla sinistra. Cosmesi forte, da rivista. */
.articolo__corpo--con-capolettera > p:first-of-type::first-letter {
    float: left;
    font-family: var(--font-display);
    font-weight: 600;
    font-size: 76px;
    line-height: 0.85;
    color: var(--c-accento);
    margin: 6px 12px 0 0;
    padding: 0;
    /* Allineamento ottico: alcune lettere (J, Q) sforerebbero la baseline */
    -webkit-font-smoothing: antialiased;
}


/* --- Pullquote (blockquote nel corpo) ------------------------------------
   Riformattato dalla Fase A: virgolette grafiche grandi sopra (pseudo-element
   ::before in terracotta opaca), Fraunces italic 24px, bordo terracotta
   più presente. È il "blockquote da rivista" del mockup. */
.articolo__corpo blockquote {
    position: relative;
    margin: var(--sp-7) 0;
    padding: var(--sp-5) var(--sp-6);
    border-left: 4px solid var(--c-accento);
    background: var(--c-bg-highlight);
    font-family: var(--font-display);
    font-style: italic;
    font-weight: 500;
    font-size: 24px;
    line-height: 1.4;
    color: var(--c-testo);
    border-radius: 0 var(--br-medio) var(--br-medio) 0;
}
.articolo__corpo blockquote::before {
    content: '\201C';   /* virgoletta aperta unicode (singola) */
    position: absolute;
    top: -16px;
    left: var(--sp-5);
    font-family: var(--font-display);
    font-size: 80px;
    line-height: 1;
    color: var(--c-accento);
    opacity: 0.35;
    letter-spacing: 0;
    user-select: none;
}
.articolo__corpo blockquote p { margin: var(--sp-2) 0; }
.articolo__corpo blockquote p:first-child { margin-top: 0; }
.articolo__corpo blockquote p:last-child  { margin-bottom: 0; }


/* --- Widget iniettato nello slot articolo --------------------------------
   Wrapper attorno al widget pescato da `articoloIniettaCtaNewsletter()` e
   piazzato a metà del corpo di un articolo lungo. Eredita gli stili del
   `.widget` di base e del `.widget--<tipo>` specifico; qui aggiungiamo
   solo margini verticali generosi per separare il blocco dal flusso del
   testo, e ripuliamo il margin esterno del primo/ultimo paragrafo
   interno per evitare doppie spaziature col padding del widget. */
.articolo__corpo .widget--slot-articolo {
    margin: var(--sp-8) 0;
}
.articolo__corpo .widget--slot-articolo > *:first-child { margin-top: 0; }
.articolo__corpo .widget--slot-articolo > *:last-child  { margin-bottom: 0; }


/* --- Form risorsa (shortcode [[form:slug]]) -----------------------------
   Form di iscrizione dedicato, inserito esplicitamente dall'admin dentro
   il corpo di un contenuto (tipicamente una landing) via lo shortcode
   `[[form:<slug>]]`. A differenza della CTA newsletter inline (iniettata
   automaticamente a metà articolo), questo è "voluto qui": layout più
   ampio, più enfatico, con disclaimer in piè di form. Per impostazione
   visiva eredita dal pattern terracotta della CTA inline ma con
   tipografia più grande e padding più generoso. */
.articolo__form-risorsa {
    margin: var(--sp-8) 0;
    padding: var(--sp-7) var(--sp-7);
    background: var(--c-accento);
    color: var(--c-bg-pagina);
    border-radius: var(--br-medio);
}
.articolo__form-risorsa-titolo {
    margin: 0 0 var(--sp-2);
    font-family: var(--font-display);
    font-weight: 600;
    font-size: 28px;
    line-height: 1.2;
    color: var(--c-bg-pagina);
}
.articolo__form-risorsa-descrizione {
    margin: 0 0 var(--sp-5);
    font-family: var(--font-corpo);
    font-size: 16px;
    line-height: 1.55;
    color: rgba(250, 246, 240, 0.95);
}
.articolo__form-risorsa-form {
    display: flex;
    flex-wrap: wrap;
    gap: var(--sp-2);
    align-items: stretch;
}
.articolo__form-risorsa-input {
    flex-grow: 1;
    min-width: 200px;
    padding: var(--sp-3);
    border: 1px solid rgba(250, 246, 240, 0.4);
    border-radius: var(--br-piccolo);
    background: rgba(250, 246, 240, 0.95);
    color: var(--c-testo);
    font-family: var(--font-ui);
    font-size: 15px;
}
.articolo__form-risorsa-btn {
    flex-shrink: 0;
    padding: var(--sp-3) var(--sp-5);
    border: none;
    border-radius: var(--br-piccolo);
    background: var(--c-bg-dark);
    color: var(--c-bg-pagina);
    font-family: var(--font-mono);
    font-size: 13px;
    font-weight: 500;
    letter-spacing: 1.2px;
    cursor: pointer;
    white-space: nowrap;
}
.articolo__form-risorsa-esito {
    flex-basis: 100%;
    margin: var(--sp-2) 0 0;
    font-size: 14px;
    color: var(--c-bg-pagina);
}
.articolo__form-risorsa-disclaimer {
    margin: var(--sp-4) 0 0;
    font-family: var(--font-corpo);
    font-size: 13px;
    line-height: 1.5;
    color: rgba(250, 246, 240, 0.85);
    font-style: italic;
}
@media (max-width: 600px) {
    .articolo__form-risorsa-form { flex-direction: column; }
    .articolo__form-risorsa-input { min-width: 0; }
}

/* Variante "errore" mostrata quando lo shortcode punta a uno slug
   inesistente o disattivato. Stile neutro (grigio) per non essere
   confusa con un form vero — è un avviso, non un invito. */
.articolo__form-risorsa--errore {
    background: #e8e3dc;
    color: #5a4f44;
    padding: var(--sp-4) var(--sp-5);
    border-left: 4px solid #b58a5e;
}
.articolo__form-risorsa--errore p {
    margin: 0 0 var(--sp-2);
    font-family: var(--font-corpo);
    font-size: 14px;
    color: #5a4f44;
}
.articolo__form-risorsa--errore p:last-child { margin-bottom: 0; }
.articolo__form-risorsa--errore code {
    background: rgba(255, 255, 255, 0.7);
    padding: 1px 6px;
    border-radius: 3px;
    font-size: .9em;
}


/* --- Form di contatto (shortcode [[form:contatti]]) ---------------------
   Modulo "Scrivimi" inserito nel corpo di una pagina. A differenza del
   form risorsa (CTA di conversione, sfondo terracotta pieno), questo e`
   un modulo funzionale: palette "carta" piu` sobria, bordo morbido, in
   modo che sia chiaramente un form da compilare e non un richiamo
   pubblicitario. Il pannello di conferma post-invio e` invece positivo
   e ben visibile (verde), perche` deve dare un feedback inequivocabile
   che l'invio e` andato a buon fine. */
.articolo__form-contatto {
    margin: var(--sp-8) 0;
    padding: var(--sp-7);
    background: var(--c-bg-card);
    border: 1px solid var(--c-bordo);
    border-radius: var(--br-medio);
}
/* L'attributo HTML `hidden` equivale a display:none, MA una qualunque
   regola `display` esplicita nel CSS lo sovrascrive (gotcha nota di CSS).
   Diversi nostri elementi hanno display:flex (il form, il pannello di
   conferma, lo slot esito), quindi senza questa regola `hidden` non li
   nasconderebbe: la conferma comparirebbe subito e il form non sparirebbe
   dopo l'invio. Forziamo il rispetto di `hidden`, limitato al nostro blocco. */
.articolo__form-contatto [hidden] { display: none !important; }
.articolo__form-contatto-testa {
    margin-bottom: var(--sp-5);
}
.articolo__form-contatto-titolo {
    margin: 0 0 var(--sp-2);
    font-family: var(--font-display);
    font-weight: 600;
    font-size: 28px;
    line-height: 1.2;
    color: var(--c-testo);
}
.articolo__form-contatto-descrizione {
    margin: 0;
    font-family: var(--font-corpo);
    font-size: 16px;
    line-height: 1.55;
    color: var(--c-testo-corpo);
}
.articolo__form-contatto-form {
    display: flex;
    flex-direction: column;
    gap: var(--sp-3);
}
/* Riga nome+email affiancati su desktop, in colonna su mobile. */
.articolo__form-contatto-riga {
    display: flex;
    gap: var(--sp-3);
}
.articolo__form-contatto-riga > .articolo__form-contatto-input {
    flex: 1 1 0;
    min-width: 0;
}
.articolo__form-contatto-input,
.articolo__form-contatto-textarea {
    width: 100%;
    padding: var(--sp-3);
    border: 1px solid var(--c-bordo-forte);
    border-radius: var(--br-piccolo);
    background: var(--c-bg-pagina);
    color: var(--c-testo);
    font-family: var(--font-ui);
    font-size: 15px;
    line-height: 1.5;
}
.articolo__form-contatto-textarea {
    resize: vertical;
    min-height: 140px;
}
.articolo__form-contatto-input:focus,
.articolo__form-contatto-textarea:focus {
    outline: 2px solid var(--c-accento);
    outline-offset: 1px;
    border-color: var(--c-accento);
}
/* Campi bloccati (utente loggato): visivamente "gia` compilati", non
   editabili. Sfondo leggermente spento per comunicare la sola-lettura. */
.articolo__form-contatto-input--bloccato {
    background: var(--c-bg-highlight);
    color: var(--c-testo-muted);
    cursor: not-allowed;
}
.articolo__form-contatto-nota-loggato {
    margin: 0;
    font-family: var(--font-corpo);
    font-size: 13px;
    line-height: 1.5;
    color: var(--c-testo-muted);
}
.articolo__form-contatto-nota-loggato strong {
    color: var(--c-testo-corpo);
}
.articolo__form-contatto-azioni {
    display: flex;
    flex-wrap: wrap;
    align-items: center;
    gap: var(--sp-3);
    margin-top: var(--sp-1);
}
.articolo__form-contatto-btn {
    flex-shrink: 0;
    padding: var(--sp-3) var(--sp-6);
    border: none;
    border-radius: var(--br-piccolo);
    background: var(--c-accento);
    color: var(--c-bg-pagina);
    font-family: var(--font-mono);
    font-size: 13px;
    font-weight: 500;
    letter-spacing: 1.2px;
    cursor: pointer;
    white-space: nowrap;
    transition: background 0.15s ease;
}
.articolo__form-contatto-btn:hover {
    background: var(--c-accento-hover);
}
.articolo__form-contatto-btn:disabled {
    opacity: 0.6;
    cursor: default;
}
.articolo__form-contatto-esito {
    margin: 0;
    font-family: var(--font-corpo);
    font-size: 14px;
    line-height: 1.4;
}
.articolo__form-contatto-esito--errore {
    color: #a3402c;
}
.articolo__form-contatto-esito--info {
    color: var(--c-testo-corpo);
}
.articolo__form-contatto-disclaimer {
    margin: var(--sp-4) 0 0;
    font-family: var(--font-corpo);
    font-size: 13px;
    line-height: 1.5;
    color: var(--c-testo-muted);
    font-style: italic;
}
/* Pannello di conferma post-invio: feedback positivo, grande e chiaro.
   Sostituisce il form (che il JS nasconde) sulla stessa pagina. */
.articolo__form-contatto-conferma {
    display: flex;
    flex-direction: column;
    align-items: center;
    text-align: center;
    gap: var(--sp-2);
    padding: var(--sp-7) var(--sp-5);
    background: #eaf5ec;
    border: 1px solid #b7dcc0;
    border-radius: var(--br-medio);
    color: #245c37;
}
.articolo__form-contatto-conferma-icona {
    display: flex;
    align-items: center;
    justify-content: center;
    width: 64px;
    height: 64px;
    margin-bottom: var(--sp-1);
    border-radius: var(--br-cerchio);
    background: #cfeacf;
    color: #2e7d46;
}
.articolo__form-contatto-conferma-titolo {
    margin: 0;
    font-family: var(--font-display);
    font-weight: 600;
    font-size: 24px;
    line-height: 1.2;
    color: #245c37;
}
.articolo__form-contatto-conferma-testo {
    margin: 0;
    max-width: 46ch;
    font-family: var(--font-corpo);
    font-size: 16px;
    line-height: 1.55;
    color: #2f6b42;
}
@media (max-width: 600px) {
    .articolo__form-contatto { padding: var(--sp-5); }
    .articolo__form-contatto-riga { flex-direction: column; }
    .articolo__form-contatto-azioni { flex-direction: column; align-items: stretch; }
    .articolo__form-contatto-btn { width: 100%; }
}


/* --- Articoli correlati --------------------------------------------------
   Blocco "↳ Continua a leggere — Articoli correlati" in fondo
   all'articolo, dentro la colonna principale (non sotto la sidebar).
   Grid 3 colonne con copertina + kicker categoria mono + titolo Fraunces
   + data. A 980px collassa la sidebar (l'articolo va full-width); a 640px
   le card vanno in colonna singola. */
.articolo__correlati {
    margin: var(--sp-9) 0 0;
    padding-top: var(--sp-7);
    border-top: 1px solid var(--c-bordo);
}
.articolo__correlati-header {
    margin-bottom: var(--sp-5);
}
.articolo__correlati-kicker {
    display: block;
    margin-bottom: var(--sp-2);
    font-family: var(--font-mono);
    font-size: 11px;
    letter-spacing: 1.5px;
    text-transform: uppercase;
    color: var(--c-testo-muted);
}
.articolo__correlati-titolo {
    margin: 0;
    font-family: var(--font-display);
    font-weight: 600;
    font-size: 28px;
    line-height: 1.1;
    color: var(--c-testo);
}
.articolo__correlati-grid {
    display: grid;
    grid-template-columns: repeat(3, 1fr);
    gap: var(--sp-5);
    margin: 0;
    padding: 0;
    list-style: none;
}
.articolo__correlati-card {
    /* niente, le voci sono direttamente nella grid */
}
.articolo__correlati-link {
    display: flex;
    flex-direction: column;
    gap: var(--sp-2);
    text-decoration: none;
    color: inherit;
    transition: opacity 0.15s ease;
}
.articolo__correlati-link:hover {
    opacity: 0.88;
}
.articolo__correlati-cop {
    width: 100%;
    aspect-ratio: 16 / 10;
    overflow: hidden;
    border-radius: var(--br-medio);
    background: var(--c-bg-highlight);
    margin-bottom: var(--sp-2);
}
.articolo__correlati-cop img {
    width: 100%;
    height: 100%;
    object-fit: cover;
    transition: transform 0.3s ease;
}
.articolo__correlati-link:hover .articolo__correlati-cop img {
    transform: scale(1.04);
}
.articolo__correlati-kicker-card {
    font-family: var(--font-mono);
    font-size: 10px;
    letter-spacing: 1px;
    color: var(--c-accento);
}
/* Card pescata a sorpresa dal fondo dell'archivio (vedi contenutiCorrelati()
   nel pannello): al posto della categoria porta la sua micro-etichetta, e la
   distinguiamo con un colore piu` sommesso invece dell'accento. E` un
   segnale, non un richiamo: chi guarda il blocco deve capire che quella card
   arriva da un altro criterio, senza che gli salti agli occhi prima delle
   altre. Se l'etichetta e` vuota nei settings, questa classe non compare mai
   e il jolly resta indistinguibile. */
.articolo__correlati-kicker-card--jolly {
    color: var(--c-testo-muted);
    font-style: italic;
    letter-spacing: .5px;
}
.articolo__correlati-titolo-card {
    margin: 0;
    font-family: var(--font-display);
    font-weight: 600;
    font-size: 18px;
    line-height: 1.25;
    color: var(--c-testo);
}
.articolo__correlati-data {
    font-family: var(--font-mono);
    font-size: 11px;
    color: var(--c-testo-muted);
}
@media (max-width: 980px) {
    .articolo__correlati-grid {
        grid-template-columns: repeat(2, 1fr);
    }
}
@media (max-width: 640px) {
    .articolo__correlati-grid {
        grid-template-columns: 1fr;
        gap: var(--sp-6);
    }
}


.articolo__corpo ul,
.articolo__corpo ol {
    margin: var(--sp-4) 0 var(--sp-5);
    padding-left: var(--sp-5);
    list-style: revert;
}
.articolo__corpo li {
    margin: 0 0 var(--sp-2);
    padding: 0;
}
.articolo__corpo li > p { margin: 0; }

.articolo__corpo img {
    margin: var(--sp-6) auto;
    border-radius: var(--br-medio);
    height: auto;        /* preserva proporzioni quando applichiamo width via classe */
}

/* --- Immagini inline: classi grandezza ---------------------------------
   Settate dal picker TinyMCE in admin. Sono in coppia con le classi
   allineamento sotto: l'admin ne sceglie sempre una di ciascuna. */
.articolo__corpo img.img-piccola   { width: auto; max-width: 250px; }
.articolo__corpo img.img-media     { width: auto; max-width: 450px; }
.articolo__corpo img.img-grande    { width: auto; max-width: 700px; }
.articolo__corpo img.img-originale { width: auto; max-width: 100%;  }

/* --- Immagini inline: classi allineamento ------------------------------
   `sinistra/destra` fanno wrappare il testo accanto all'immagine.
   Sotto i 700px il float diventa display:block per evitare colonne
   troppo strette (su mobile il testo che wrappa è illegibile). */
.articolo__corpo img.img-sinistra {
    float: left;
    margin: var(--sp-2) var(--sp-5) var(--sp-3) 0;
    clear: left;
}
.articolo__corpo img.img-destra {
    float: right;
    margin: var(--sp-2) 0 var(--sp-3) var(--sp-5);
    clear: right;
}
.articolo__corpo img.img-centrata {
    display: block;
    margin: var(--sp-6) auto;
    clear: both;
}
.articolo__corpo img.img-larghezza-piena {
    display: block;
    width: 100%;
    max-width: 100%;
    margin: var(--sp-6) 0;
    clear: both;
    float: none;         /* difensivo: vince su un eventuale img-sinistra/destra */
    border-radius: 0;    /* a tutta larghezza no rounding */
}

/* I paragrafi che seguono un'immagine flottata "respirano" finché il
   float non è chiuso. Il selettore + dopo .articolo__corpo p è già
   gestito globalmente; aggiungo solo un clear di salvaguardia sui
   block-level che ne forzano la fine (h2/h3/hr). */
.articolo__corpo h2,
.articolo__corpo h3,
.articolo__corpo hr {
    clear: both;
}

/* Mobile: il float è scomodo se il viewport è stretto, le immagini
   "sinistra/destra" diventano block centrato a tutta larghezza. */
@media (max-width: 700px) {
    .articolo__corpo img.img-sinistra,
    .articolo__corpo img.img-destra {
        float: none;
        display: block;
        margin: var(--sp-6) auto;
        max-width: 100%;
    }
}

/* --- Allineamento del testo: classi has-text-align-* -------------------
   Emesse dai bottoni allineamento di TinyMCE (formats custom in
   assets/js/admin-tinymce.js) e presenti anche negli articoli importati
   da WordPress, che usa la stessa convenzione. Nel DB c'è solo
   l'etichetta: come si vede un blocco allineato si decide QUI.
   Niente `justify` di proposito: sul web il giustificato manca di
   sillabazione affidabile e apre "fiumi" di bianco sulle colonne
   strette. Il default resta la bandiera a sinistra. */
.articolo__corpo .has-text-align-left   { text-align: left; }
.articolo__corpo .has-text-align-center { text-align: center; }
.articolo__corpo .has-text-align-right  { text-align: right; }

/* Su una <figure> l'allineamento riguarda la figura nel flusso, non il
   testo al suo interno: l'immagine si sposta col box. */
.articolo__corpo figure.has-text-align-center { margin-left: auto; margin-right: auto; }
.articolo__corpo figure.has-text-align-right  { margin-left: auto; margin-right: 0; }

.articolo__corpo hr {
    margin: var(--sp-7) 0;
    border: none;
    border-top: 1px solid var(--c-bordo);
}

/* Embed YouTube e altri iframe del corpo articolo: il sanitize_rich_html
   produce <figure class="wp-block-embed"> oppure direttamente <iframe>.
   Diamo aspect-ratio 16/9 e centratura coerente. */
.articolo__corpo iframe {
    width: 100%;
    aspect-ratio: 16 / 9;
    height: auto;
    margin: var(--sp-6) 0;
    border: none;
    border-radius: var(--br-medio);
}
.articolo__corpo .wp-block-embed,
.articolo__corpo figure {
    margin: var(--sp-6) 0;
}
.articolo__corpo figure img {
    margin: 0 auto;
}
.articolo__corpo figcaption {
    font-family: var(--font-corpo);
    font-style: italic;
    font-size: 14px;
    color: var(--c-testo-muted);
    text-align: center;
    margin-top: var(--sp-2);
}

/* --- Tag in fondo all'articolo ----------------------------------------- */
.articolo__tag {
    max-width: var(--maxw-corpo);
    margin: var(--sp-8) auto 0;
    padding-top: var(--sp-5);
    border-top: 1px solid var(--c-bordo);
    font-family: var(--font-ui);
    font-size: 13px;
    display: flex;
    flex-wrap: wrap;
    gap: var(--sp-2);
    align-items: center;
}
.articolo__tag-label {
    font-family: var(--font-mono);
    font-size: 11px;
    letter-spacing: 1.2px;
    text-transform: uppercase;
    color: var(--c-testo-muted);
    margin-right: var(--sp-2);
}
.articolo__tag-pill {
    display: inline-block;
    padding: var(--sp-1) var(--sp-3);
    background: color-mix(in srgb, var(--c-accento-soft) 22%, var(--c-bg-card));
    border: 1px solid color-mix(in srgb, var(--c-accento-soft) 55%, var(--c-bordo));
    border-radius: var(--br-cerchio);
    color: var(--c-testo-corpo);
    text-decoration: none;
    font-size: 12px;
    font-weight: 500;
    cursor: pointer;
    transition: background 0.15s ease, border-color 0.15s ease, color 0.15s ease;
}
.articolo__tag-pill:hover,
.articolo__tag-pill:focus-visible {
    background: var(--c-accento);
    border-color: var(--c-accento);
    color: #fff;
    outline: none;
}


/* =========================================================================
   7. PAGINA 404
   =========================================================================
   Le regole della pagina 404 sono in fondo al file (sezione "Pagina 404 —
   design caldo"): più ricche, con icona, kicker, bottoni primary/secondary.
   Questa sezione è qui solo come segnaposto della numerazione. */


/* =========================================================================
   8. FOOTER
   =========================================================================
   Versione minimalista in attesa che il design system completi la
   specifica del footer (oggi marcata "da definire" in design-tokens.md).
   Sfondo bruno scuro per chiudere la pagina con peso visivo. */

.sito-footer {
    background: var(--c-bg-dark);
    color: var(--c-bg-pagina);
    padding: var(--sp-7) var(--sp-6);
    margin-top: var(--sp-9);
}
.sito-footer__interno {
    max-width: var(--maxw-pagina);
    margin: 0 auto;
    text-align: center;
    display: flex;
    flex-direction: column;
    gap: var(--sp-2);
}
.sito-footer__claim {
    margin: 0;
    font-family: var(--font-display);
    font-size: 17px;
    font-weight: 500;
    letter-spacing: -0.2px;
}
.sito-footer__copyright {
    margin: 0;
    font-family: var(--font-mono);
    font-size: 11px;
    letter-spacing: 1px;
    text-transform: uppercase;
    color: var(--c-testo-faint);
}


/* =========================================================================
   SIDEBAR PUBBLICA
   =========================================================================
   Wrapper della colonna laterale + base comune dei widget. Ogni widget
   è un blocco indipendente, separato dai vicini con margine e
   (opzionalmente) bordo. I widget specifici (newsletter, argomenti, ecc.)
   estendono questi stili base con regole proprie.
   ========================================================================= */

.sidebar {
    display: flex;
    flex-direction: column;
    gap: var(--sp-5);
}

.widget {
    background: var(--c-bg-pagina);
    border: 1px solid var(--c-bordo-forte);
    border-radius: var(--br-medio);
    padding: var(--sp-5);
}

/* Intestazione widget: contiene il `__kicker` (titolo della sezione).
 * Sottolineato con un filo, ma con il kicker stesso vicino al bordo
 * superiore del widget (margin-top negativo cancella metà del padding
 * del widget così l'effetto visivo è "il titolo sta appoggiato al top
 * del riquadro"). */
.widget__intestazione {
    margin-top: calc(var(--sp-3) * -1);
    margin-bottom: var(--sp-4);
    padding-bottom: var(--sp-3);
    border-bottom: 1px solid var(--c-bordo);
}
/* Kicker mono del widget. Più grande, più contrastato e con tracking
 * leggero rispetto alle versioni precedenti (era 13px / muted /
 * tracking 1.5px → quasi invisibile). Mantiene maiuscoletto+mono per
 * coerenza con gli altri kicker del sito. */
.widget__kicker {
    font-family: var(--font-mono);
    font-size: 14px;
    font-weight: 600;
    letter-spacing: 1.2px;
    text-transform: uppercase;
    color: var(--c-testo);
}

/* --- Widget: Argomenti --------------------------------------------------- */
.widget-argomenti__chip-lista {
    display: flex;
    flex-wrap: wrap;
    gap: var(--sp-2);
    margin: 0;
    padding: 0;
    list-style: none;
}
.widget-argomenti__chip-voce {
    display: inline-block;
}
.widget-argomenti__chip {
    display: inline-flex;
    align-items: baseline;
    gap: var(--sp-2);
    padding: var(--sp-1) var(--sp-3);
    border: 1px solid var(--c-bordo);
    border-radius: var(--br-cerchio);
    background: var(--c-bg-card);
    color: var(--c-testo-corpo);
    text-decoration: none;
    font-family: var(--font-ui);
    font-size: 13px;
    transition: border-color 0.12s ease, color 0.12s ease, background 0.12s ease;
}
.widget-argomenti__chip:hover {
    border-color: var(--c-accento);
    color: var(--c-accento);
}
.widget-argomenti__chip-nome {
    font-weight: 500;
}
.widget-argomenti__chip-conteggio {
    font-family: var(--font-mono);
    font-size: 10px;
    color: var(--c-testo-faint);
}




/* --- Widget: Chi sono -----------------------------------------------------
   Avatar cerchiato + nome + qualifica + bio. Compatto, presenta don
   Giovanni in poche parole. */
.widget-chisono__corpo {
    display: flex;
    align-items: center;
    gap: var(--sp-3);
    text-decoration: none;
    color: inherit;
    margin-bottom: var(--sp-3);
}
.widget-chisono__corpo--linkato {
    transition: opacity 0.15s ease;
}
.widget-chisono__corpo--linkato:hover {
    opacity: 0.75;
}
.widget-chisono__avatar {
    flex-shrink: 0;
    width: 54px;
    height: 54px;
    border-radius: var(--br-cerchio);
    background: var(--c-accento);
    color: var(--c-bg-pagina);
    font-family: var(--font-display);
    font-weight: 600;
    font-size: 22px;
    display: flex;
    align-items: center;
    justify-content: center;
    line-height: 1;
}
.widget-chisono__info {
    display: flex;
    flex-direction: column;
    gap: 2px;
    min-width: 0;
}
.widget-chisono__nome {
    font-family: var(--font-ui);
    font-weight: 600;
    color: var(--c-testo);
    font-size: 15px;
}
.widget-chisono__qualifica {
    font-family: var(--font-mono);
    font-size: 11px;
    letter-spacing: 0.6px;
    color: var(--c-testo-muted);
}
.widget-chisono__bio {
    margin: 0;
    font-family: var(--font-corpo);
    font-size: 14px;
    line-height: 1.5;
    color: var(--c-testo-corpo-soft);
}


/* --- Widget: Ultimo video ------------------------------------------------
   Anteprima del video con thumbnail YouTube + play sopra, titolo e
   meta sotto. Tutto cliccabile. */
.widget-ultimovideo__link {
    display: block;
    text-decoration: none;
    color: inherit;
    transition: opacity 0.15s ease;
}
.widget-ultimovideo__link:hover {
    opacity: 0.92;
}
.widget-ultimovideo__thumb {
    position: relative;
    width: 100%;
    aspect-ratio: 16 / 9;
    border-radius: var(--br-medio);
    overflow: hidden;
    margin-bottom: var(--sp-3);
    background: var(--c-bg-highlight);
}
.widget-ultimovideo__thumb img {
    width: 100%;
    height: 100%;
    object-fit: cover;
}
.widget-ultimovideo__play {
    position: absolute;
    top: 50%;
    left: 50%;
    transform: translate(-50%, -50%);
    width: 48px;
    height: 48px;
    border-radius: var(--br-cerchio);
    background: rgba(44, 38, 32, 0.85);
    color: var(--c-bg-pagina);
    display: flex;
    align-items: center;
    justify-content: center;
    font-size: 16px;
    line-height: 1;
    padding-left: 3px;   /* ottica, il triangolo è leggermente sbilanciato */
    transition: background 0.15s ease;
}
.widget-ultimovideo__link:hover .widget-ultimovideo__play {
    background: var(--c-accento);
}
.widget-ultimovideo__titolo {
    margin: 0 0 var(--sp-1) 0;
    font-family: var(--font-ui);
    font-weight: 600;
    font-size: 14px;
    line-height: 1.4;
    color: var(--c-testo);
}
.widget-ultimovideo__meta {
    margin: 0;
    font-family: var(--font-mono);
    font-size: 11px;
    letter-spacing: 0.6px;
    color: var(--c-testo-muted);
}


/* --- Widget: HTML puro ---------------------------------------------------
   Wrapper minimale: il contenuto è interamente disegnato dall'admin
   (sanitizzato). Il container dà solo lo stile coerente del widget
   (sfondo, padding) senza imporre tipografia: l'HTML inserito si vede
   come l'admin l'ha pensato. */
.widget-htmlpuro__corpo {
    /* Niente font-family: eredita da body.
       Niente colori forzati: l'admin può usare i suoi nello style inline. */
    line-height: 1.55;
}
.widget-htmlpuro__corpo p { margin: 0 0 var(--sp-3); }
.widget-htmlpuro__corpo p:last-child { margin-bottom: 0; }
.widget-htmlpuro__corpo a {
    color: var(--c-accento);
    text-decoration: underline;
    text-underline-offset: 2px;
}
.widget-htmlpuro__corpo a:hover { color: var(--c-accento-hover); }
.widget-htmlpuro__corpo img,
.widget-htmlpuro__corpo iframe {
    max-width: 100%;
    height: auto;
    border-radius: var(--br-piccolo);
    margin: var(--sp-2) 0;
}
.widget-htmlpuro__corpo iframe {
    aspect-ratio: 16 / 9;
    border: none;
}

/* Modalità "form-host" — il widget html_puro ospita un form di
 * iscrizione tramite shortcode `[[form:<slug>]]`. Il box rosso del
 * form ha già la sua identità visiva forte (sfondo terracotta,
 * titolo, descrizione, campi); il widget intorno deve SPARIRE come
 * cornice — niente bordo, niente sfondo crema, niente padding. Il
 * form si presenta da solo.
 *
 * Si combina con il marker `$isFormHost` di widgets/html_puro.php,
 * che applica la classe `--form` e omette anche il kicker (così
 * non c'è doppia intestazione tra widget e form). */
.widget--html_puro:has(.widget-htmlpuro__corpo--form) {
    background: transparent;
    border: none;
    padding: 0;
}
.widget-htmlpuro__corpo--form .articolo__form-risorsa {
    /* Annulla i margini verticali del form risorsa quando vive in un
       widget: dentro un widget non ha senso "spazio sopra/sotto", il
       widget stesso (ora trasparente) non aggiunge cornice. */
    margin: 0;
    /* Padding interno ridotto rispetto al default (sp-7 era pensato
       per il form quando appare a metà articolo in un blocco enfatico).
       Qui siamo in sidebar, lo spazio è prezioso. */
    padding: var(--sp-4);
}
/* Form-host in sidebar: i campi e il bottone vanno in colonna. La
 * regola default `.articolo__form-risorsa-form` usa flex-row + wrap,
 * pensato per il form inline a metà articolo (largo); in sidebar (290
 * px utili) quel calcolo di shrink-fit dei flex-grow produce input di
 * larghezze leggermente diverse. Forzando column con stretch tutti
 * gli elementi prendono la stessa larghezza piena. */
.widget-htmlpuro__corpo--form .articolo__form-risorsa-form {
    flex-direction: column;
    align-items: stretch;
}
.widget-htmlpuro__corpo--form .articolo__form-risorsa-input {
    min-width: 0;
}


/* --- Widget: Cerca ------------------------------------------------------- */
.widget-cerca__form {
    position: relative;
    display: flex;
    align-items: center;
}
.widget-cerca__label-lente {
    position: absolute;
    left: var(--sp-3);
    color: var(--c-testo-muted);
    pointer-events: none;
    display: flex;
    align-items: center;
}
.widget-cerca__input {
    width: 100%;
    padding: var(--sp-3) var(--sp-3) var(--sp-3) calc(var(--sp-3) * 2 + 16px);
    border: 1px solid var(--c-bordo);
    border-radius: var(--br-piccolo);
    background: var(--c-bg-card);
    color: var(--c-testo-corpo);
    font-family: var(--font-ui);
    font-size: 13px;
}
.widget-cerca__input::placeholder {
    color: var(--c-testo-faint);
    font-style: italic;
}
.widget-cerca__input:focus {
    outline: 2px solid var(--c-accento);
    outline-offset: 1px;
    border-color: var(--c-accento);
}


/* --- Widget: I miei libri ------------------------------------------------ */
.widget-libri__lista {
    display: flex;
    flex-direction: column;
    gap: var(--sp-4);
    margin: 0;
    padding: 0;
    list-style: none;
}
.widget-libri__voce {
    display: flex;
    gap: var(--sp-3);
    align-items: flex-start;
}
.widget-libri__copertina {
    flex-shrink: 0;
    width: 60px;
    display: block;
    transition: opacity 0.15s ease;
}
a.widget-libri__copertina:hover {
    opacity: 0.85;
}
.widget-libri__copertina img {
    width: 100%;
    height: auto;
    aspect-ratio: 2 / 3;
    object-fit: cover;
    border-radius: var(--br-piccolo);
    box-shadow: 0 2px 6px rgba(44, 38, 32, 0.12);
}
.widget-libri__info {
    min-width: 0;
    flex-grow: 1;
}
.widget-libri__titolo {
    margin: 0 0 2px;
    font-family: var(--font-display);
    font-weight: 600;
    font-size: 15px;
    line-height: 1.2;
    color: var(--c-testo);
}
.widget-libri__titolo-link {
    color: inherit;
    text-decoration: none;
}
.widget-libri__titolo-link:hover {
    color: var(--c-accento);
    text-decoration: underline;
    text-underline-offset: 2px;
}
.widget-libri__descrizione {
    margin: var(--sp-1) 0;
    font-family: var(--font-corpo);
    font-size: 13px;
    line-height: 1.45;
    color: var(--c-testo-corpo-soft);
}
.widget-libri__editore {
    margin: 0 0 var(--sp-1);
    font-family: var(--font-mono);
    font-size: 10px;
    letter-spacing: 0.5px;
    color: var(--c-testo-muted);
}
.widget-libri__cta {
    display: inline-block;
    margin-top: 2px;
    color: var(--c-accento);
    text-decoration: none;
    font-family: var(--font-ui);
    font-size: 12px;
    font-weight: 500;
}
.widget-libri__cta:hover {
    color: var(--c-accento-hover);
    text-decoration: underline;
    text-underline-offset: 2px;
}


/* --- Widget: Citazione --------------------------------------------------- */
.widget--citazione {
    background: var(--c-bg-highlight);
    border-color: var(--c-bordo);
    position: relative;
}
/* Virgolette grafiche: glifo grande in alto a sinistra. Il glifo di
 * apertura virgolette ha una grossa parte vuota sotto la baseline (è
 * normale per come è disegnato); un margin-bottom NEGATIVO recupera
 * quello spazio e fa "appoggiare" il glifo sulla prima riga del testo. */
.widget-citazione__virgolette {
    font-family: var(--font-display);
    font-size: 64px;
    line-height: 0.4;
    color: var(--c-accento);
    opacity: 0.35;
    margin: 0 0 calc(var(--sp-4) * -1);
    user-select: none;
    letter-spacing: -8px;
}
.widget-citazione__testo {
    margin: 0 0 var(--sp-3);
    font-family: var(--font-display);
    font-style: italic;
    font-weight: 500;
    font-size: 19px;
    line-height: 1.4;
    color: var(--c-testo);
}
/* Attribuzione: mono ma più presente che in passato (era 11px,
 * percepito come "didascalia di nota"). 13px è ancora "sussurro" ma
 * leggibile, e si separa dalla citazione con un margin-top netto. */
.widget-citazione__autore {
    margin: var(--sp-2) 0 0;
    font-family: var(--font-mono);
    font-size: 13px;
    letter-spacing: 0.8px;
    color: var(--c-testo-muted);
}
/* "Vai" cliccabile opzionale (campo link_url del widget). Sotto
 * l'attribuzione, mono come l'attribuzione ma in terracotta per
 * dichiarare la cliccabilità. Hover: sottolineato. La freccia è
 * decorativa (aria-hidden). */
.widget-citazione__link {
    margin: var(--sp-3) 0 0;
    font-family: var(--font-mono);
    font-size: 12px;
    letter-spacing: 1px;
    text-transform: uppercase;
}
.widget-citazione__link a {
    color: var(--c-accento);
    text-decoration: none;
}
.widget-citazione__link a:hover {
    text-decoration: underline;
    text-underline-offset: 3px;
}


/* =========================================================================
   HOMEPAGE
   =========================================================================
   La home pubblica (cms/index.php) ha tre sezioni: hero, griglia articoli
   paginata, sezione "Ultimi video". La sidebar è la stessa dell'articolo
   (riusa il sistema della Fase C).
   ========================================================================= */


/* --- Header sezione (kicker mono + titolo Fraunces) ----------------------
   Pattern condiviso da tutte le sezioni della home (griglia, video). */
.home-sezione-header {
    margin-bottom: var(--sp-5);
}
.home-sezione-kicker {
    display: block;
    margin-bottom: var(--sp-2);
    font-family: var(--font-mono);
    font-size: 11px;
    letter-spacing: 1.5px;
    text-transform: uppercase;
    color: var(--c-testo-muted);
}
.home-sezione-titolo {
    margin: 0;
    font-family: var(--font-display);
    font-weight: 600;
    font-size: 32px;
    line-height: 1.1;
    letter-spacing: -0.5px;
    color: var(--c-testo);
}


/* --- Hero: articolo in evidenza ------------------------------------------
   Card grossa, copertina enorme, titolo Fraunces 44px. È l'apertura del
   sito: deve essere il pezzo più impattante della home. */
.home-hero {
    margin-bottom: var(--sp-7);
}
.home-hero__link {
    /* Layout orizzontale (copertina a lato, non a piena larghezza): la
     * hero resta l'articolo "in evidenza" ma legge come una card più
     * grande delle altre, non come la pagina dell'articolo aperto. */
    display: grid;
    grid-template-columns: minmax(0, 1.4fr) minmax(0, 1fr);
    gap: var(--sp-5);
    align-items: center;
    text-decoration: none;
    color: inherit;
    transition: opacity 0.18s ease;
}
.home-hero__link:hover {
    opacity: 0.94;
}
.home-hero__cop {
    width: 100%;
    aspect-ratio: 16 / 9;
    overflow: hidden;
    border-radius: var(--br-medio);
    background: var(--c-bg-highlight);
    /* copertina come seconda colonna, a destra dei testi */
    order: 2;
}
.home-hero__cop img {
    width: 100%;
    height: 100%;
    object-fit: cover;
    transition: transform 0.4s ease;
}
.home-hero__link:hover .home-hero__cop img {
    transform: scale(1.02);
}
.home-hero__testi {
    order: 1;
    min-width: 0;
}
.home-hero__kicker {
    margin: 0 0 var(--sp-3);
    font-family: var(--font-mono);
    font-size: 12px;
    letter-spacing: 1.2px;
    color: var(--c-testo-muted);
    display: flex;
    align-items: center;
    gap: var(--sp-2);
    flex-wrap: wrap;
}
.home-hero__kicker-cat {
    color: var(--c-accento);
    font-weight: 500;
}
.home-hero__kicker-sep {
    color: var(--c-testo-faint);
}
.home-hero__pillola {
    display: inline-flex;
    align-items: center;
    gap: 2px;
    padding: 2px var(--sp-2);
    background: var(--c-accento);
    color: var(--c-bg-pagina);
    font-size: 10px;
    letter-spacing: 0.8px;
    border-radius: 100px;
    margin-left: var(--sp-2);
}
.home-hero__titolo {
    margin: 0 0 var(--sp-3);
    font-family: var(--font-display);
    font-weight: 600;
    font-size: 30px;
    line-height: 1.1;
    letter-spacing: -0.5px;
    color: var(--c-testo);
}
.home-hero__sommario {
    /* Source Serif 4 (corpo) e non Fraunces (display) per due ragioni:
     * (1) l'URL Google Fonts attuale carica Fraunces italic SOLO nei
     *     pesi 500 e 600 — non c'è italic 400 caricato, e specificare
     *     `font-weight: 400` farebbe scivolare sul 500 sintetico
     *     (visibilmente grasso, non era l'intento);
     * (2) coerenza con `.home-card__sommario` qui sotto, che è già in
     *     Source Serif. Hero e card così hanno lo stesso font italic
     *     leggero per il sommario, mentre Fraunces resta per i titoli.
     * 19px per compensare l'ottica più piccola di Source Serif rispetto
     * a Fraunces. */
    margin: 0 0 var(--sp-2);
    font-family: var(--font-corpo);
    font-style: italic;
    font-weight: 400;
    font-size: 19px;
    line-height: 1.45;
    color: var(--c-testo-corpo);
}
.home-hero__cta {
    display: inline-block;
    font-family: var(--font-ui);
    font-size: 14px;
    font-weight: 600;
    color: var(--c-accento);
    transition: color 0.15s ease;
}
.home-hero__link:hover .home-hero__cta {
    color: var(--c-accento-hover);
}


/* --- Griglia articoli ----------------------------------------------------
   Numero di colonne da CSS variable `--home-cols` settata via inline style
   sulla lista (la sorgente è il setting sistema.home.articoli_per_riga).
   Default 2. Su mobile (≤640px) collassa sempre a 1 colonna. */
.home-griglia {
    margin-bottom: var(--sp-5);
}
.home-griglia__lista {
    display: grid;
    grid-template-columns: repeat(var(--home-cols, 2), 1fr);
    gap: var(--sp-7);
    margin: 0;
    padding: 0;
    list-style: none;
}

.home-card {
    /* slot della grid */
}
.home-card__link {
    display: block;
    text-decoration: none;
    color: inherit;
    transition: opacity 0.18s ease;
}
.home-card__link:hover {
    opacity: 0.92;
}
.home-card__cop {
    width: 100%;
    aspect-ratio: 16 / 10;
    overflow: hidden;
    border-radius: var(--br-medio);
    margin-bottom: var(--sp-3);
    background: var(--c-bg-highlight);
}
.home-card__cop img {
    width: 100%;
    height: 100%;
    object-fit: cover;
    transition: transform 0.3s ease;
}
.home-card__link:hover .home-card__cop img {
    transform: scale(1.04);
}
.home-card__testi {
    display: flex;
    flex-direction: column;
    gap: var(--sp-2);
}
.home-card__kicker {
    font-family: var(--font-mono);
    font-size: 10px;
    letter-spacing: 1.2px;
    color: var(--c-accento);
}
.home-card__titolo {
    margin: 0;
    font-family: var(--font-display);
    font-weight: 600;
    font-size: 22px;
    line-height: 1.2;
    color: var(--c-testo);
}
.home-card__sommario {
    margin: 0;
    font-family: var(--font-corpo);
    font-size: 15px;
    line-height: 1.5;
    color: var(--c-testo-corpo-soft);
}
/* --- Pied della card: data + "continua a leggere" sulla stessa riga ----
   margin-top:auto su `.home-card__pied` lo spinge in fondo alla card,
   perché `.home-card__testi` è flex column. La distribuzione interna
   è `space-between`: data a sx, "continua" a dx. */
.home-card__pied {
    margin-top: auto;
    padding-top: var(--sp-3);
    display: flex;
    align-items: baseline;
    justify-content: space-between;
    gap: var(--sp-3);
}
.home-card__data {
    font-family: var(--font-mono);
    font-size: 11px;
    color: var(--c-testo-muted);
    flex: 0 0 auto;
}
.home-card__data--vuota {
    /* Placeholder invisibile: tiene lo spazio a sinistra quando una card
       non ha data, così il "continua a leggere" resta a destra. */
    visibility: hidden;
}
.home-card__continua {
    flex: 0 0 auto;
    font-family: var(--font-ui);
    font-size: 13px;
    font-weight: 600;
    color: var(--c-accento);
    letter-spacing: 0.2px;
    transition: color 0.15s ease, transform 0.15s ease;
}
.home-card__link:hover .home-card__continua {
    color: var(--c-accento-hover, var(--c-accento));
    transform: translateX(2px);
}


/* --- Paginazione --------------------------------------------------------- */
.home-paginazione {
    margin-top: var(--sp-7);
    padding-top: var(--sp-5);
    border-top: 1px solid var(--c-bordo);
    display: flex;
    align-items: center;
    justify-content: space-between;
    gap: var(--sp-4);
    flex-wrap: wrap;
}
.home-paginazione__btn {
    padding: var(--sp-2) var(--sp-4);
    border: 1px solid var(--c-bordo);
    border-radius: var(--br-piccolo);
    background: var(--c-bg-card);
    color: var(--c-testo);
    text-decoration: none;
    font-family: var(--font-ui);
    font-size: 14px;
    font-weight: 500;
    transition: border-color 0.15s ease, color 0.15s ease;
}
.home-paginazione__btn:hover:not(.home-paginazione__btn--off) {
    border-color: var(--c-accento);
    color: var(--c-accento);
}
.home-paginazione__btn--off {
    opacity: 0.4;
    cursor: not-allowed;
}
.home-paginazione__info {
    font-family: var(--font-mono);
    font-size: 12px;
    color: var(--c-testo-muted);
    letter-spacing: 0.6px;
}


/* --- Sezione "Ultimi video" ---------------------------------------------- */
.home-video {
    margin-top: var(--sp-6);
    padding-top: var(--sp-5);
    border-top: 1px solid var(--c-bordo);
}
.home-video__lista {
    display: grid;
    grid-template-columns: repeat(3, 1fr);
    gap: var(--sp-5);
    margin: 0;
    padding: 0;
    list-style: none;
}
.home-video__card {
    /* slot */
}
.home-video__link {
    display: block;
    text-decoration: none;
    color: inherit;
    transition: opacity 0.15s ease;
}
.home-video__link:hover {
    opacity: 0.92;
}
.home-video__thumb {
    position: relative;
    width: 100%;
    aspect-ratio: 16 / 9;
    overflow: hidden;
    border-radius: var(--br-medio);
    margin-bottom: var(--sp-2);
    background: var(--c-bg-highlight);
}
.home-video__thumb img {
    width: 100%;
    height: 100%;
    object-fit: cover;
}
.home-video__play {
    position: absolute;
    top: 50%;
    left: 50%;
    transform: translate(-50%, -50%);
    width: 56px;
    height: 56px;
    border-radius: var(--br-cerchio);
    background: rgba(44, 38, 32, 0.85);
    color: var(--c-bg-pagina);
    display: flex;
    align-items: center;
    justify-content: center;
    font-size: 18px;
    line-height: 1;
    padding-left: 4px;
    transition: background 0.15s ease;
}
.home-video__link:hover .home-video__play {
    background: var(--c-accento);
}
.home-video__titolo {
    margin: var(--sp-2) 0 var(--sp-1);
    font-family: var(--font-ui);
    font-weight: 600;
    font-size: 15px;
    line-height: 1.3;
    color: var(--c-testo);
}
.home-video__data {
    margin: 0;
    font-family: var(--font-mono);
    font-size: 11px;
    color: var(--c-testo-muted);
}


/* --- Responsive home ----------------------------------------------------- */
@media (max-width: 980px) {
    .home-hero__link {
        /* torna a colonna: copertina sopra, testi sotto */
        grid-template-columns: 1fr;
        gap: var(--sp-4);
    }
    .home-hero__cop { order: 1; }
    .home-hero__testi { order: 2; }
    .home-hero__titolo { font-size: 26px; }
    .home-griglia__lista {
        /* Mobile-tablet: forza 2 colonne se ce ne sono 3+, altrimenti tieni il valore */
        grid-template-columns: repeat(min(var(--home-cols, 2), 2), 1fr);
    }
    .home-video__lista { grid-template-columns: repeat(2, 1fr); }
    .home-sezione-titolo { font-size: 26px; }
}
@media (max-width: 640px) {
    .home-hero__titolo { font-size: 24px; }
    .home-hero__sommario { font-size: 16px; }
    .home-griglia__lista {
        grid-template-columns: 1fr;
        gap: var(--sp-6);
    }
    .home-video__lista {
        grid-template-columns: 1fr;
    }
    .home-paginazione {
        justify-content: center;
    }
}


/* =========================================================================
   PAGINA CERCA + ARCHIVIO CATEGORIA
   =========================================================================
   Layout simile alla home (riusa .home-griglia__lista, .home-card,
   .home-paginazione, .home-sezione-titolo, .home-sezione-kicker).
   Aggiunge: header con form di ricerca, messaggi vuoti, suggerimenti.
   ========================================================================= */

.cerca {
    margin-bottom: var(--sp-9);
}

.cerca__header {
    margin-bottom: var(--sp-6);
}

.cerca__sotto {
    margin: var(--sp-2) 0 var(--sp-4);
    font-family: var(--font-mono);
    font-size: 12px;
    letter-spacing: 0.6px;
    color: var(--c-testo-muted);
}

.cerca__form {
    display: flex;
    gap: var(--sp-2);
    max-width: 640px;
    margin-top: var(--sp-3);
}
.cerca__input {
    flex-grow: 1;
    padding: var(--sp-3) var(--sp-4);
    border: 1px solid var(--c-bordo);
    border-radius: var(--br-piccolo);
    background: var(--c-bg-card);
    color: var(--c-testo);
    font-family: var(--font-ui);
    font-size: 15px;
    min-width: 0;
}
.cerca__input:focus {
    outline: 2px solid var(--c-accento);
    outline-offset: 1px;
    border-color: var(--c-accento);
}
.cerca__btn {
    flex-shrink: 0;
    padding: var(--sp-3) var(--sp-5);
    border: none;
    border-radius: var(--br-piccolo);
    background: var(--c-accento);
    color: var(--c-bg-pagina);
    font-family: var(--font-mono);
    font-size: 12px;
    font-weight: 500;
    letter-spacing: 1.2px;
    text-transform: uppercase;
    cursor: pointer;
    transition: background 0.15s ease;
}
.cerca__btn:hover {
    background: var(--c-accento-hover);
}

.cerca__vuoto {
    margin-top: var(--sp-7);
    padding: var(--sp-6) var(--sp-5);
    background: var(--c-bg-highlight);
    border-radius: var(--br-medio);
    text-align: center;
}
.cerca__vuoto-msg {
    margin: 0 0 var(--sp-4);
    font-family: var(--font-display);
    font-style: italic;
    font-size: 18px;
    color: var(--c-testo-corpo);
    line-height: 1.5;
}
.cerca__suggerimenti {
    list-style: none;
    margin: 0;
    padding: 0;
    display: flex;
    flex-wrap: wrap;
    gap: var(--sp-2);
    justify-content: center;
}


/* =========================================================================
   Archivio "argomento" (categoria + tag omonimo)
   -------------------------------------------------------------------------
   /blog/cat/<slug> e /blog/tag/<slug> convergono su un UNICO elenco
   continuo: prima gli articoli della categoria, poi quelli col solo tag
   omonimo, paginato sul totale. "Articoli su <categoria>" apre l'elenco;
   "Ne parlano anche questi" è un separatore inline nel punto in cui la
   categoria lascia il posto ai tag. Titoli in Fraunces come i
   titoli-sezione della home. */
.argomento__sezione-titolo {
    margin: 0 0 var(--sp-5) 0;
    font-family: var(--font-display);
    font-weight: 600;
    font-size: 22px;
    line-height: 1.15;
    letter-spacing: -0.3px;
    color: var(--c-testo);
}
.argomento__sezione-titolo--extra {
    /* Separatore fra la parte "categoria" e la parte "tag": stacco sopra
       con una riga, così si distingue come inizio di una nuova fascia
       dell'elenco. Quando apre la pagina (confine sul taglio) il margine
       resta gradevole anche in cima. */
    margin-top: var(--sp-8);
    padding-top: var(--sp-6);
    border-top: 1px solid var(--c-accento-soft);
    color: var(--c-testo-corpo);
}
.argomento__sezione-titolo--apertura {
    /* Quando il separatore APRE la pagina (confine caduto sul taglio), sta
       subito sotto l'header: niente riga di stacco né margine ampio in cima,
       che sarebbero fuori posto. */
    margin-top: 0;
    padding-top: 0;
    border-top: none;
}


/* =========================================================================
   9. RESPONSIVE
   =========================================================================
   Mobile first ambiguo: i mockup sono desktop, ma il template deve
   reggere su mobile. Un breakpoint solo (768px) per ridurre titoli,
   ricomporre header in colonna, accorciare paddings. La versione
   mobile completa arriverà nelle Fase D/E. */

@media (max-width: 768px) {

    /* Header: ricomposto in colonna, social sotto al brand */
    .sito-header__interno {
        padding: var(--sp-5) var(--sp-4) var(--sp-3);
        flex-direction: column;
        align-items: flex-start;
        gap: var(--sp-4);
    }
    .sito-header__social { gap: var(--sp-2); }

    .sito-header__titolo      { font-size: 22px; }
    .sito-header__sottotitolo { font-size: 12px; }

    /* ---- Nav mobile: hamburger ----------------------------------------
       Sotto i 768px la navbar orizzontale strabordava (scroll laterale) e
       i sottomenu si affiancavano illeggibili. Diventa un pannello a
       colonna che si apre col bottone hamburger; i sottomenu sono liste
       verticali indentate, aperte in-flow (niente hover su touch). */

    .sito-nav__interno {
        padding: 0 var(--sp-4);
        position: relative;
    }

    /* Bottone hamburger: nascosto su desktop, mostrato qui. */
    .sito-nav__toggle {
        display: flex;
        align-items: center;
        gap: var(--sp-2);
        width: 100%;
        padding: var(--sp-3) 0;
        background: transparent;
        border: none;
        color: #fff;
        cursor: pointer;
    }
    /* Testo "Menu" accanto all'hamburger: stessa tipografia delle voci di
       menu (font UI, grassetto, maiuscolo, spaziatura), così è coerente
       con HOME / RECENSIONI / ecc. invece di sembrare un font a parte. */
    .sito-nav__toggle-testo {
        font-family: var(--font-ui);
        font-size: 15px;
        font-weight: 700;
        letter-spacing: 0.8px;
        text-transform: uppercase;
    }
    .sito-nav__toggle-icona {
        display: inline-block;
        width: 22px;
        height: 2px;
        background: currentColor;
        position: relative;
    }
    .sito-nav__toggle-icona::before,
    .sito-nav__toggle-icona::after {
        content: '';
        position: absolute;
        left: 0;
        width: 22px;
        height: 2px;
        background: currentColor;
    }
    .sito-nav__toggle-icona::before { top: -7px; }
    .sito-nav__toggle-icona::after  { top: 7px; }

    /* Lista: pannello verticale, chiuso di default, aperto con .is-aperta */
    .sito-nav__lista {
        flex-direction: column;
        align-items: stretch;
        gap: 0;
        flex-wrap: nowrap;
        overflow: hidden;
        max-height: 0;
        transition: max-height 0.25s ease;
    }
    .sito-nav__lista.is-aperta {
        max-height: 80vh;
        overflow-y: auto;
        padding-bottom: var(--sp-3);
    }
    .sito-nav__voce {
        line-height: 1.2;
        border-top: 1px solid rgba(255, 255, 255, 0.15);
    }
    .sito-nav__link {
        display: flex;
        align-items: center;
        justify-content: space-between;
        width: 100%;
        font-size: 15px;
        padding: var(--sp-4) 0;
        white-space: normal;
    }
    /* Voce attiva su mobile: il link è a piena larghezza (flex 100%), quindi
       lo pseudo-elemento ::after (left:0 / right:0) darebbe una riga lunga
       tutto lo schermo. La disattiviamo e usiamo una sottolineatura di testo,
       che segue solo i glifi della voce selezionata. */
    .sito-nav__link--attivo::after {
        content: none;
    }
    .sito-nav__link--attivo {
        text-decoration: underline;
        text-decoration-thickness: 3px;
        text-underline-offset: 5px;
    }

    /* Sottomenu: lista verticale indentata, in-flow. Chiuso di default
       su mobile; aperto quando la voce ha .is-espansa (tap sul padre).
       Il chevron resta visibile come indicatore e ruota da aperto. */
    .sito-nav__voce--ha-sottomenu { position: static; }
    .sito-nav__chevron {
        display: inline-block;
        transition: transform 0.2s ease;
    }
    .sito-nav__voce.is-espansa .sito-nav__chevron { transform: rotate(180deg); }
    .sito-nav__sottomenu {
        position: static;
        opacity: 1;
        visibility: visible;
        transform: none;
        background: rgba(0, 0, 0, 0.12);
        border: none;
        box-shadow: none;
        padding: 0 0 0 var(--sp-4);
        min-width: 0;
        display: none;           /* chiuso di default su mobile */
        flex-direction: column;
        gap: 0;
    }
    .sito-nav__voce.is-espansa .sito-nav__sottomenu {
        display: flex;
        padding: var(--sp-2) 0 var(--sp-2) var(--sp-4);
    }
    .sito-nav__sottomenu-link {
        font-size: 13px;
        padding: var(--sp-3) 0;
        text-transform: uppercase;
        letter-spacing: 0.6px;
        color: rgba(255, 255, 255, 0.85);
    }

    /* Main: padding ridotto */
    .sito-main { padding: var(--sp-5) var(--sp-4) var(--sp-8); }

    /* Articolo: titoli più piccoli, copertina meno aggressiva */
    .articolo__titolo     { font-size: 32px; }
    .articolo__sommario   { font-size: 18px; }
    .articolo__corpo      { font-size: 17px; line-height: 1.7; }
    .articolo__corpo h2   { font-size: 24px; margin-top: var(--sp-7); }
    .articolo__corpo h3   { font-size: 20px; }
    .articolo__corpo blockquote { font-size: 18px; padding: var(--sp-3) var(--sp-4); }

    /* Footer */
    .sito-footer { padding: var(--sp-6) var(--sp-4); }
    .sito-footer__claim { font-size: 15px; }
}


/* =========================================================================
   Pagina 404 — design caldo, niente "muro di tristezza" tipo Chrome
   ========================================================================= */
.errore-404 {
    max-width: 640px;
    margin: var(--sp-7) auto;
    padding: var(--sp-7) var(--sp-5);
    text-align: center;
}
.errore-404__icona {
    color: var(--c-accento);
    opacity: 0.7;
    margin-bottom: var(--sp-4);
}
.errore-404__kicker {
    font-family: var(--font-mono);
    font-size: 13px;
    letter-spacing: 1.5px;
    text-transform: uppercase;
    color: var(--c-testo-muted);
    margin: 0 0 var(--sp-2) 0;
}
.errore-404__titolo {
    font-family: var(--font-display);
    font-size: 44px;
    font-weight: 600;
    line-height: 1.15;
    color: var(--c-testo);
    margin: 0 0 var(--sp-4) 0;
}
.errore-404__messaggio {
    font-family: var(--font-corpo);
    font-size: 18px;
    line-height: 1.6;
    color: var(--c-testo-corpo-soft);
    margin: 0 0 var(--sp-6) 0;
}
.errore-404__azioni {
    display: flex;
    gap: var(--sp-3);
    justify-content: center;
    flex-wrap: wrap;
}
.errore-404__cta {
    display: inline-block;
    padding: var(--sp-3) var(--sp-5);
    background: var(--c-accento);
    color: var(--c-bg-pagina);
    text-decoration: none;
    border-radius: var(--br-piccolo);
    font-family: var(--font-ui);
    font-weight: 600;
    font-size: 15px;
    transition: filter 0.15s ease, transform 0.15s ease;
}
.errore-404__cta:hover {
    filter: brightness(1.08);
    transform: translateY(-1px);
}
.errore-404__cta--secondaria {
    background: var(--c-bg-card);
    color: var(--c-accento);
    border: 1px solid var(--c-bordo);
}
.errore-404__cta--secondaria:hover {
    border-color: var(--c-accento);
    background: var(--c-bg-pagina);
}


/* =========================================================================
   Landing mode
   -------------
   Modalità di rendering "nuda" per pagine di conversione. Attivata dal
   flag `landing_mode` su `csdd_contenuti` (vedi cms/articolo.php).
   Il controller include solo `header_documento.php` + `footer_documento.php`,
   saltando topbar/brand/social/nav/sidebar/footer. Quindi quei selettori
   non hanno markup da nascondere — non serve `display: none` su di essi.

   Cosa fa questo blocco:
   1. <body class="sito-body--landing"> riceve uno sfondo neutro pieno (no
      pattern, no decorazioni) per non distrarre.
   2. <main class="sito-main--landing"> centra il contenuto e gli dà aria
      verticale: tipica landing che si apre con tanto spazio sopra il
      titolo (pattern Stripe/Linear/marketing).
   3. Alcuni elementi del template `articolo.php` semanticamente non
      hanno posto in una landing (breadcrumb di navigazione, lista tag in
      coda, sezione "Articoli correlati"): li nascondiamo via CSS quando
      siamo dentro `.sito-body--landing`.
   ========================================================================= */

/* Body in modalità landing: sfondo bianco caldo. La landing non ha
   "cornice esterna" né "scrivania": è un foglio pulito a tutta pagina
   pensato per concentrare l'attenzione sul contenuto, senza la
   semantica del cromo del sito. */
.sito-body--landing {
    background: var(--c-bg-sito);
}

.sito-main--landing {
    /* La pagina respira: tanto spazio sopra il titolo e sotto il corpo,
       contenuto centrato in un blocco di larghezza confortevole per la
       lettura tipografica (ampio quanto un articolo normale).

       In landing NIENTE decorazioni della scrivania: niente bordi
       laterali, niente ombra, niente sfondo bianco-caldo. Una landing
       vuole essere un foglio libero, non una cartolina dentro a una
       cornice. Lo sfondo erediterà quello del body (crema). */
    background: transparent;
    border: 0;
    box-shadow: none;
    max-width: 760px;
    margin: 0 auto;
    padding: var(--sp-6, 4rem) var(--sp-3, 1.25rem);
    min-height: 100vh;
    box-sizing: border-box;
}

@media (max-width: 720px) {
    .sito-main--landing {
        padding: var(--sp-4, 2rem) var(--sp-2, 1rem);
    }
}

/* Nascondo gli elementi che non hanno senso in una landing:
   - lista tag in coda (cataloga il contenuto in una tassonomia di blog)
   - sezione "Articoli correlati" (porta altrove, è esattamente quello che
     una landing NON vuole — concentrare l'attenzione sull'invito all'azione) */
.sito-body--landing .articolo__tag,
.sito-body--landing .articolo__correlati {
    display: none;
}