/* IL PESO DEI TITOLI VIENE DAL TEMA, non e' scritto qui.
 *
 * Qui c'erano cinque `font-weight: 400`, decisi quando il tema aveva un
 * carattere con le grazie: su un didone un titolo in grassetto e' pesante, e
 * il 400 era la scelta giusta. Il negozio e' poi tornato al proprio carattere
 * geometrico, dove il 400 a 52px e' una riga sottile che non fa da titolo.
 *
 * Il tema ha corretto i propri, e questi cinque sono rimasti: il foglio del
 * blog sta in `@layer gr-modules`, che viene DOPO `@layer gr-base` dove il
 * tema mette la regola sul peso — quindi vinceva questo, e il blog e' rimasto
 * indietro mentre tutto il resto del sito cambiava. Il token `--peso-titoli`
 * arrivava fin qui e non serviva a niente.
 *
 * Adesso il peso lo decide il tema e il ripiego 600 vale per un tema che il
 * token non ce l'ha. */
/**
 * Blog GR — il foglio di stile del front office.
 *
 * NESSUN COLORE LETTERALE QUI DENTRO. Le classi sono nomi; a vestirle e' il
 * tema con le proprie variabili. Ogni valore cromatico passa da una `var()` con
 * un ripiego neutro — `currentColor`, `inherit`, o una miscela ricavata dal
 * colore del testo — cosi' il blog funziona anche su un tema che quelle
 * variabili non le ha, e senza portarsi dietro la tavolozza di un cliente. Un
 * modulo che si porta i propri colori se li porta anche quando il tema cambia,
 * ed e' cosi' che un sito ridisegnato resta con la grafica di prima.
 *
 * Nessuna ombra, nessuna sfumatura: a separare una scheda dal fondo e' un
 * filetto. Su un tema chiaro un'ombra e' un colore fisso mascherato, e su un
 * tema scuro non si vede.
 */


/* ============================================================================
   TUTTO DENTRO `@layer gr-modules`, E NON E' UN DETTAGLIO DI STILE.
   ----------------------------------------------------------------------------
   Un foglio non incapsulato batte QUALUNQUE livello, quindi un modulo che
   scrive fuori dai livelli non e' piu' sovrascrivibile dal tema che lo ospita:
   il rapporto si rovescia, e il tema — che dovrebbe avere l'ultima parola sul
   proprio aspetto — non ce l'ha piu'. Su questo progetto e' gia' costato tre
   difetti in un pomeriggio, ogni volta con un sintomo diverso.

   L'ordine dichiarato da `theme.css` e':

     vendors, bs-base, bs-components, bs-custom-components,
     ps-base, ps-components, ps-pages, ps-modules,
     gr-base, gr-components, gr-pages, gr-layouts, gr-modules, utilities

   `gr-modules` e' il posto di un modulo: dopo i componenti e gli impaginati del
   tema, cosi' il blog vince sulle regole generiche senza rincorrerne la
   specificita', e prima di `utilities` e del `custom.css` del negozio — che
   non e' incapsulato e quindi ha comunque l'ultima parola. Chi deve battere una
   regola di qui scrive in `utilities`, oppure in `custom.css`, e non ha bisogno
   di `!important`.

   Dentro un livello la specificita' non conta: conta l'ordine. Una regola qui
   dentro perde contro `utilities` anche se e' dieci volte piu' specifica.
   ============================================================================ */

@layer gr-modules {

  /* ==========================================================================
     1. LE MANOPOLE
     --------------------------------------------------------------------------
     Le poche misure che un tema puo' voler cambiare, in un posto solo. Si
     ritoccano con una riga — `.gr-blog { --gr-blog-lato: 20rem; }` — senza
     riscrivere nessuna delle regole che seguono.

     Stanno su `.gr-blog` e non su `:root` di proposito: un modulo che scrive
     nella radice del documento lascia le proprie variabili in giro per tutto il
     negozio, e il giorno che due moduli scelgono lo stesso nome nessuno dei due
     funziona. Ogni uso ripete comunque il ripiego, cosi' una scheda che
     finisse fuori dal contenitore non resta senza misure.
     ========================================================================== */

  .gr-blog {
    /* Larghezza minima di una scheda: e' questa a decidere quante colonne
       entrano, non un numero di colonne fisso. Vedi la griglia piu' sotto. */
    --gr-blog-scheda-minima: 17rem;

    /* 3:2 e' la proporzione delle copertine che arrivano da WordPress
       (1024x683). Ritagliare a 16:9 taglierebbe un sesto di ogni fotografia. */
    --gr-blog-copertina: 3 / 2;

    --gr-blog-lato: 16rem;

    /* Lo stacco fra le fasce della pagina. Cresce con la finestra: su un
       telefono tre righe di aria fra due schede sono tre righe di articolo in
       meno. */
    --gr-blog-stacco: clamp(1.5rem, 4vw, 3rem);

    /* Il movimento del tema: 180ms e questa curva sono le misure dichiarate
       dal design system, non valori scelti qui. */
    --gr-blog-durata: 180ms;
    --gr-blog-curva: cubic-bezier(0.2, 0.7, 0.2, 1);
  }

  /* ==========================================================================
     2. L'IMPAGINATO DELLA PAGINA
     ========================================================================== */

  /* Nessun margine laterale qui.
     PrestaShop rende il modulo dentro `layouts/layout-*.tpl`, che avvolge tutto
     in un `.container` con il proprio respiro laterale. Aggiungerne un secondo
     si vedrebbe come un doppio margine su ogni pagina dove il tema fa il suo
     lavoro. Un tema che non lo facesse rimedia con una riga sua. */
  .gr-blog {
    max-width: var(--dentro, 1240px);
    margin-inline: auto;
    color: var(--testo, inherit);
  }

  .gr-blog__intestazione {
    margin-block-end: var(--gr-blog-stacco, 2rem);
    padding-block-end: 1.5rem;
    border-block-end: 1px solid var(--filetto, color-mix(in srgb, currentColor 14%, transparent));
  }

  .gr-blog__titolo {
    margin: 0;
    font-family: var(--display, var(--gr-font-display, inherit));
    font-size: clamp(1.9rem, 5vw, 3rem);
    line-height: 1.05;
    font-weight: var(--peso-titoli, 600);

    /* Un titolo di due righe con una parola sola sulla seconda sembra un
       errore di impaginazione. `balance` distribuisce; dove non e' supportato
       non succede niente. */
    text-wrap: balance;
  }

  /* La riga sopra il titolo — «Categoria», «Tag», «Articoli di…». Serve a dire
     dove si e' finiti: un archivio che si apre col solo nome della categoria si
     confonde con l'elenco intero. */
  .gr-blog__occhiello {
    display: block;
    margin-block-end: 0.5rem;
    font-size: 0.72rem;
    font-weight: 600;
    letter-spacing: 0.14em;
    text-transform: uppercase;
    color: var(--testo-tenue, color-mix(in srgb, currentColor 65%, transparent));
  }

  .gr-blog__descrizione {
    max-width: var(--misura, 66ch);
    margin-block: 0.75rem 0;
    font-size: 1rem;
    line-height: 1.55;
    color: var(--testo-tenue, color-mix(in srgb, currentColor 70%, transparent));
  }

  /* Il corpo: colonna principale piu' colonna laterale.
     `:has()` invece di un modificatore `--con-lato` sul contenitore: il
     modificatore andrebbe messo a mano nel template, e il giorno che la colonna
     laterale non viene resa — un negozio senza categorie piene, per dire —
     resterebbe scritto lo stesso e la pagina avrebbe una colonna vuota larga
     sedici rem. Cosi' l'impaginato segue quello che c'e' davvero. */
  .gr-blog__corpo {
    display: grid;
    grid-template-columns: minmax(0, 1fr);
    gap: var(--gr-blog-stacco, 2rem);
    align-items: start;
  }

  .gr-blog__principale {
    min-width: 0;
  }

  /* I punti di rottura sono in `rem` e non in pixel: chi ingrandisce il
     carattere del browser perche' fatica a leggere ottiene prima la colonna
     unica, che e' esattamente cio' che gli serve. */
  @media (min-width: 62rem) {
    .gr-blog__corpo:has(> .gr-blog__lato) {
      grid-template-columns: minmax(0, 1fr) minmax(0, var(--gr-blog-lato, 16rem));
    }

    .gr-blog__lato {
      position: sticky;
      top: 1.5rem;
    }
  }

  /* ==========================================================================
     3. LA GRIGLIA DELL'ELENCO
     --------------------------------------------------------------------------
     `auto-fill` e una larghezza minima, non un numero di colonne per punto di
     rottura: le colonne diventano tre, due o una da sole, e la stessa griglia
     regge l'elenco a tutta pagina e quello stretto accanto alla colonna
     laterale — che con i punti di rottura sarebbe un secondo elenco di media
     query da tenere allineato.

     `min(100%, …)` protegge il caso stretto: senza, una scheda da 17rem dentro
     una colonna da 15rem sfonda, e la pagina scorre di lato.
     ========================================================================== */

  .gr-blog-griglia {
    display: grid;
    /* `auto-fit` e non `auto-fill`: la differenza si vede solo quando gli
       articoli sono MENO delle colonne che ci starebbero. `auto-fill` crea
       comunque le tracce vuote per riempire la riga — in home, con tre
       articoli in evidenza su una fascia larga, ne generava quattro e la
       quarta restava vuota, lasciando 324px di buco a destra e schede piu'
       strette del necessario. `auto-fit` collassa le tracce vuote e distribuisce
       lo spazio fra le schede che ci sono davvero. Sull'elenco, dove gli
       articoli riempiono la riga, le due forme si comportano identiche. */
    grid-template-columns: repeat(auto-fit, minmax(min(100%, var(--gr-blog-scheda-minima, 17rem)), 1fr));
    gap: var(--gr-blog-stacco, 2rem);
    margin: 0;
    padding: 0;
    list-style: none;
  }

  .gr-blog-griglia > li {
    display: flex;
    min-width: 0;
  }

  /* ==========================================================================
     3-bis. LA FASCIA IN EVIDENZA, IN HOME
     --------------------------------------------------------------------------
     Riusa la griglia e la scheda dell'elenco: qui c'e' solo cio' che in
     un'altra pagina non serve — l'intestazione con il collegamento «Tutti gli
     articoli» accanto al titolo.

     `flex-wrap` e non una media query: quando il titolo e il collegamento non
     ci stanno su una riga vanno a capo da soli, a qualunque larghezza succeda,
     e non c'e' un punto di rottura da indovinare.
     ========================================================================== */

  .gr-blog-evidenza {
    margin-block: var(--gr-blog-stacco, 2rem);
  }

  .gr-blog-evidenza__intestazione {
    display: flex;
    flex-wrap: wrap;
    align-items: baseline;
    justify-content: space-between;
    gap: 0.5rem 1rem;
    margin-bottom: 1.5rem;
  }

  .gr-blog-evidenza__titolo {
    margin: 0;
  }

  .gr-blog-evidenza__tutti {
    color: inherit;
  }

  /* ==========================================================================
     4. LA SCHEDA
     --------------------------------------------------------------------------
     Il collegamento sta sul titolo, e un pseudo-elemento steso sopra rende
     cliccabile tutta la scheda. L'alternativa — avvolgere l'intera scheda in un
     `<a>` — la rende cliccabile allo stesso modo, ma il nome accessibile di
     quel collegamento diventa tutto il testo dentro: data, categoria, titolo e
     riassunto letti di fila, per ogni scheda dell'elenco. E rende impossibile
     mettere nella scheda un secondo collegamento, perche' un `<a>` dentro un
     `<a>` non e' HTML valido: la categoria smetterebbe di essere cliccabile.
     ========================================================================== */

  .gr-blog-scheda {
    position: relative;
    display: flex;
    flex-direction: column;
    width: 100%;
    min-width: 0;
    background: var(--fondo, transparent);
    border: 1px solid var(--filetto, color-mix(in srgb, currentColor 14%, transparent));
    border-radius: 2px;
    overflow: hidden;
  }

  .gr-blog-scheda__copertina {
    position: relative;
    display: block;
    margin: 0;
    aspect-ratio: var(--gr-blog-copertina, 3 / 2);
    overflow: hidden;
    background: var(--fondo-alt, color-mix(in srgb, currentColor 6%, transparent));
  }

  .gr-blog-scheda__immagine {
    width: 100%;
    height: 100%;
    object-fit: cover;
    transition: transform var(--gr-blog-durata, 180ms) var(--gr-blog-curva, ease);
  }

  .gr-blog-scheda:hover .gr-blog-scheda__immagine,
  .gr-blog-scheda:focus-within .gr-blog-scheda__immagine {
    transform: scale(1.03);
  }

  .gr-blog-scheda__testo {
    display: flex;
    flex: 1 1 auto;
    flex-direction: column;
    gap: 0.5rem;
    padding: 1.25rem;
  }

  .gr-blog-scheda__meta {
    display: flex;
    flex-wrap: wrap;
    align-items: baseline;
    gap: 0.5rem;
    font-size: 0.72rem;
    letter-spacing: 0.12em;
    text-transform: uppercase;
    color: var(--testo-tenue, color-mix(in srgb, currentColor 65%, transparent));
  }

  /* La categoria e' un secondo collegamento dentro una scheda gia' cliccabile:
     `z-index` la tiene sopra la zona stesa dal titolo, altrimenti il clic
     finisce sempre all'articolo e la categoria sembra rotta. */
  .gr-blog-scheda__categoria {
    position: relative;
    z-index: 1;
    color: var(--accento, currentColor);
    text-decoration: none;
  }

  .gr-blog-scheda__categoria:hover,
  .gr-blog-scheda__categoria:focus-visible {
    text-decoration: underline;
  }

  .gr-blog-scheda__titolo {
    margin: 0;
    font-family: var(--display, var(--gr-font-display, inherit));
    font-size: 1.25rem;
    font-weight: var(--peso-titoli, 600);
    line-height: 1.15;
    text-wrap: balance;
  }

  .gr-blog-scheda__collegamento {
    color: inherit;
    text-decoration: none;
  }

  /* La zona cliccabile stesa su tutta la scheda. */
  .gr-blog-scheda__collegamento::after {
    content: '';
    position: absolute;
    inset: 0;
  }

  .gr-blog-scheda__collegamento:hover {
    color: var(--accento, currentColor);
  }

  /* Il contorno di messa a fuoco deve seguire la scheda, non il titolo: chi
     naviga da tastiera vede evidenziato l'oggetto che sta per aprire. Il
     contorno sul solo titolo, con la zona cliccabile grande dieci volte tanto,
     e' il genere di dettaglio che fa perdere il segno. */
  .gr-blog-scheda:has(.gr-blog-scheda__collegamento:focus-visible) {
    outline: 2px solid var(--accento, currentColor);
    outline-offset: 3px;
  }

  .gr-blog-scheda__riassunto {
    margin: 0;
    font-size: 0.95rem;
    line-height: 1.55;
    color: var(--testo-tenue, color-mix(in srgb, currentColor 78%, transparent));

    /* Tre righe e poi si taglia. I riassunti arrivano da due strade diverse —
       cinquantasette scritti a mano, gli altri ricavati dal contenuto — e senza
       un limite la griglia diventa una fila di schede di altezze diverse, con
       una che ne sfora due. */
    display: -webkit-box;
    -webkit-box-orient: vertical;
    -webkit-line-clamp: 3;
    line-clamp: 3;
    overflow: hidden;
  }

  /* L'articolo in evidenza. Un filetto d'accento sul bordo alto e nient'altro:
     una scheda piu' grande spezzerebbe la griglia, un fondo colorato la
     farebbe sembrare pubblicita'. */
  .gr-blog-scheda--evidenza {
    border-block-start: 3px solid var(--accento, currentColor);
  }

  /* ==========================================================================
     5. LA PAGINA DELL'ARTICOLO
     ========================================================================== */

  .gr-blog-articolo {
    /* La colonna di lettura. `--misura` e' la larghezza tipografica del tema
       (66ch): oltre, l'occhio perde la riga tornando a capo.

       La misura del corpo sta QUI e non sul contenuto, e non e' indifferente:
       `ch` e' la larghezza di uno zero nel carattere dell'elemento che lo usa,
       quindi `66ch` misurato su un titoletto da 13px e su un corpo da 18px da'
       due larghezze diverse. Con la misura dichiarata una volta sola e tutti i
       pezzi dell'articolo che la ereditano, l'occhiello, il testo e il piede
       cominciano sulla stessa colonna verticale. Sono i bordi che si vedono,
       non i millimetri. */
    font-size: clamp(1rem, 0.35vw + 0.95rem, 1.125rem);

    /* 1,65 e non l'1,55 del tema: quello e' la misura da interfaccia, giusta
       per un carrello. Un articolo da sette chilobyte si legge con l'interlinea
       piu' aperta, ed e' il caso principale di questa pagina. */
    line-height: 1.65;

    --gr-blog-lettura: var(--misura, 66ch);

    /* Quanto le immagini escono dalla colonna di lettura, per lato: la meta'
       dello spazio che avanza, e mai piu' di 6rem.

       LA MISURA E' L'ARTICOLO, NON LA FINESTRA. `container-type: inline-size`
       rende l'articolo un contenitore interrogabile e `100cqw` diventa la sua
       larghezza vera. Con `100vw` il conto ignorerebbe tutto quello che
       l'articolo non occupa: il giorno che questa pagina prendesse anche la
       colonna laterale, le immagini sporgerebbero sopra le categorie invece di
       allargarsi dentro la colonna che hanno. In piu' `100vw` comprende la
       barra di scorrimento, che andrebbe scontata a mano e a occhio.

       Dove i contenitori non sono supportati la dichiarazione cade, ogni
       `var()` piu' avanti usa il proprio ripiego — zero — e le immagini restano
       larghe quanto il testo: meno bello, mai rotto. */
    container-type: inline-size;

    --gr-blog-sporgenza: clamp(0rem, (100cqw - var(--gr-blog-lettura)) / 2, 6rem);
  }

  .gr-blog-articolo__intestazione {
    max-width: var(--gr-blog-lettura);
    margin-inline: auto;
    margin-block-end: var(--gr-blog-stacco, 2rem);
    text-align: center;
  }

  .gr-blog-articolo__titolo {
    margin: 0.5rem 0 0;
    font-family: var(--display, var(--gr-font-display, inherit));
    font-size: clamp(1.9rem, 5.5vw, 3.25rem);
    font-weight: var(--peso-titoli, 600);
    line-height: 1.05;
    text-wrap: balance;
  }

  .gr-blog-articolo__meta {
    display: flex;
    flex-wrap: wrap;
    justify-content: center;
    gap: 0.5rem 1rem;
    font-size: 0.72rem;
    letter-spacing: 0.12em;
    text-transform: uppercase;
    color: var(--testo-tenue, color-mix(in srgb, currentColor 65%, transparent));
  }

  .gr-blog-articolo__meta a {
    color: var(--accento, currentColor);
    text-decoration: none;
  }

  .gr-blog-articolo__meta a:hover,
  .gr-blog-articolo__meta a:focus-visible {
    text-decoration: underline;
  }

  /* Il sommario sotto il titolo. Non e' il primo paragrafo dell'articolo, e' il
     riassunto — la stessa frase che si legge nella scheda dell'elenco. Va
     vestito diverso dal corpo, altrimenti chi arriva dall'elenco rilegge la
     stessa riga senza capire perche'.

     Nessuna larghezza massima qui: va dentro `__intestazione`, che gliela da'
     gia'. Rimettercela vorrebbe dire misurare `66ch` a 1,15em, cioe' una
     colonna piu' larga del testo che sta sotto — e il bordo sinistro che non
     torna e' esattamente cio' che si vede. */
  .gr-blog-articolo__riassunto {
    margin: 1.25rem 0 0;
    font-size: 1.15em;
    line-height: 1.5;
    color: var(--testo-tenue, color-mix(in srgb, currentColor 78%, transparent));
  }

  .gr-blog-articolo__copertina {
    margin: 0 0 var(--gr-blog-stacco, 2rem);
  }

  .gr-blog-articolo__copertina img {
    display: block;
    width: 100%;
    height: auto;
    max-height: 70vh;
    object-fit: cover;
    background: var(--fondo-alt, color-mix(in srgb, currentColor 6%, transparent));
  }

  /* ==========================================================================
     6. IL CONTENUTO — CIOE' L'HTML CHE ARRIVA DA WORDPRESS
     --------------------------------------------------------------------------
     Qui dentro non si comanda la marcatura: e' quella che c'era sul blog, con
     le classi che WordPress ci ha messo. Le regole che seguono vestono cio' che
     c'e' davvero nei 260 articoli, contato sulla base dati d'origine:
     253 con `<h2>`, 141 con `<h3>`, 251 con immagini, 88 con `<figure>`,
     49 con didascalia, 77 con elenchi puntati, 14 con gallerie a blocchi,
     6 con citazioni.

     PERCHE' NON UNA GRIGLIA. La colonna di lettura con le immagini che escono
     dai bordi si scrive volentieri con `grid-template-columns` e delle linee
     con nome. Qui no: **166 articoli su 260 non contengono un solo `<p>`** —
     sono testi dell'editor classico, dove i paragrafi sono righe vuote e la
     divisione in `<p>` la faceva WordPress al momento di mostrarli. In una
     griglia ogni pezzo di testo nudo diventa un elemento anonimo, e gli
     elementi anonimi si posizionano da soli: finirebbero nella prima colonna
     libera, cioe' nel margine stretto a sinistra del testo. Un blocco e dei
     margini negativi non hanno questo problema e degradano bene.

     (Che quei 174 articoli vadano avvolti in `<p>` resta un compito
     dell'importazione: qui si evita solo che il difetto si moltiplichi.)
     ========================================================================== */

  /* Misura e interlinea arrivano da `.gr-blog-articolo`: qui c'e' solo la
     colonna. */
  .gr-blog-articolo__contenuto {
    max-width: var(--gr-blog-lettura);
    margin-inline: auto;
  }

  .gr-blog-articolo__contenuto > * {
    margin-block: 0 1.15em;
  }

  .gr-blog-articolo__contenuto > *:last-child {
    margin-block-end: 0;
  }

  .gr-blog-articolo__contenuto h2,
  .gr-blog-articolo__contenuto h3,
  .gr-blog-articolo__contenuto h4 {
    margin-block-start: 1.8em;
    font-family: var(--display, var(--gr-font-display, inherit));
    font-weight: var(--peso-titoli, 600);
    text-wrap: balance;
  }

  .gr-blog-articolo__contenuto h2 {
    font-size: 1.65em;
    line-height: 1.1;
  }

  .gr-blog-articolo__contenuto h3 {
    font-size: 1.3em;
    line-height: 1.15;
  }

  .gr-blog-articolo__contenuto h4 {
    font-size: 1.1em;
    line-height: 1.15;
  }

  .gr-blog-articolo__contenuto a {
    color: inherit;
    text-decoration: underline;
    text-decoration-color: var(--accento, currentColor);
    text-decoration-thickness: 1px;

    /* La sottolineatura tocca le discendenti e le rende illeggibili: lo stacco
       e' quello che distingue un collegamento leggibile da uno indovinato. */
    text-underline-offset: 0.18em;
  }

  .gr-blog-articolo__contenuto a:hover,
  .gr-blog-articolo__contenuto a:focus-visible {
    color: var(--accento, currentColor);
  }

  .gr-blog-articolo__contenuto ul,
  .gr-blog-articolo__contenuto ol {
    padding-inline-start: 1.5rem;
  }

  .gr-blog-articolo__contenuto li + li {
    margin-block-start: 0.4em;
  }

  .gr-blog-articolo__contenuto blockquote {
    margin-inline: 0;
    padding-inline-start: 1.25rem;
    border-inline-start: 2px solid var(--accento, currentColor);
    font-family: var(--display, var(--gr-font-display, inherit));
    font-size: 1.2em;
    line-height: 1.35;
  }

  .gr-blog-articolo__contenuto blockquote p:last-child {
    margin-block-end: 0;
  }

  /* --------------------------------------------------------------------------
     Le immagini.

     `max-width: 100%` e `height: auto` non sono una precauzione generica: 185
     articoli su 260 hanno `width=` e `height=` scritti nel tag, con le misure
     dell'originale a 1024px. Senza queste due righe quelle immagini escono
     dalla finestra su qualunque telefono.
     -------------------------------------------------------------------------- */

  .gr-blog-articolo__contenuto img {
    max-width: 100%;
    height: auto;
  }

  /* Il margine laterale che i browser danno da soli alle figure e' di 40px per
     lato. Va azzerato PRIMA della regola della sporgenza qui sotto e non dopo,
     e non e' una questione di ordine di lettura: le due regole hanno la stessa
     specificita' — una classe e un elemento — quindi fra le due vince l'ultima
     scritta. Con l'ordine invertito la sporgenza si calcola, si applica e viene
     azzerata dalla riga seguente: le figure restano larghe quanto il testo e
     nel foglio non si vede niente di storto. Trovato misurando sulla pagina,
     non rileggendo. */
  .gr-blog-articolo__contenuto figure {
    margin-inline: 0;
  }

  /* A uscire dalla colonna di lettura sono le FIGURE, non le immagini.
     Una `<figure>` e' un contenitore: allargarla con dei margini negativi non
     tocca l'immagine dentro, che si adatta e basta. Un `<img>` e' un elemento
     sostituito, e allargarlo significa dichiarargli una larghezza — che su una
     fotografia da 1024px non si vede, ma su un'immagine piccola la ingrandisce
     sfocandola. Le due cose sembrano la stessa e non lo sono.

     Le figure annidate — quelle dentro una galleria — restano dove sono: il
     selettore e' un figlio diretto proprio per questo. */
  .gr-blog-articolo__contenuto > figure {
    margin-inline: calc(-1 * var(--gr-blog-sporgenza, 0rem));
  }

  /* I margini automatici non sono una ripetizione dell'allineamento. I tre
     articoli del 2026 hanno l'immagine ridimensionata dall'editor a blocchi, che
     scrive la larghezza in uno stile in linea: `style="width:704px;height:auto"`.
     Uno stile in linea batte qualunque selettore di questo foglio, quindi su
     quelle tre il `width: 100%` qui sopra non arriva — restano larghe 704px
     dentro una figura che sporge fino a 6rem per lato, cioe' incollate al bordo
     sinistro, fuori dalla colonna del testo, col vuoto tutto a destra. Sono i tre
     articoli piu' recenti: i primi che si guardano.

     I margini automatici non provano a vincere sullo stile in linea — la
     larghezza resta quella che l'autore ha scelto, e l'immagine si centra. Dove
     l'immagine e' larga quanto la figura non fanno niente. */
  .gr-blog-articolo__contenuto > figure > img,
  .gr-blog-articolo__contenuto > figure > a > img {
    display: block;
    width: 100%;
    height: auto;
    margin-inline: auto;
  }

  .gr-blog-articolo__contenuto figcaption {
    margin-block-start: 0.6rem;
    font-size: 0.85rem;
    line-height: 1.45;
    text-align: center;
    color: var(--testo-tenue, color-mix(in srgb, currentColor 65%, transparent));
  }

  /* Le classi di allineamento dell'editor classico. `aligncenter` compare in
     126 articoli e `alignnone` in 81: senza queste righe le immagini restano
     in linea col testo, sulla riga di base, con lo spazio sotto che sembra un
     errore.

     Il selettore dice `img` e non solo la classe, e non e' pignoleria: le
     stesse classi WordPress le mette anche sulle figure, e li' due classi
     batterebbero il selettore della sporgenza qui sopra — la figura tornerebbe
     larga quanto il testo. Alla figura centrata serve un'altra cosa, ed e' la
     regola qui sotto. */
  .gr-blog-articolo__contenuto img.aligncenter,
  .gr-blog-articolo__contenuto img.alignnone {
    display: block;
    margin-inline: auto;
  }

  /* Sulla figura la stessa classe vuole `text-align` e non i margini automatici.
     I margini la riporterebbero larga quanto il testo — e' esattamente cio' che
     la regola qui sopra evita dicendo `img` — e comunque non servirebbero: a
     stare storta non e' la figura, che e' gia' un blocco a tutta larghezza, e'
     l'immagine dentro.

     In 33 articoli `aligncenter` sta sulla figura, e in 19 di quelli l'editor ha
     ridimensionato l'immagine, che quindi e' piu' stretta del contenitore. Senza
     questa riga la figura e' centrata e la fotografia dentro sta a sinistra: e'
     l'unico caso in cui si vede che `aligncenter` non ha fatto niente. */
  .gr-blog-articolo__contenuto figure.aligncenter {
    text-align: center;
  }

  .gr-blog-articolo__contenuto .alignleft {
    float: inline-start;
    max-width: 50%;
    margin: 0.35rem 1.25rem 1rem 0;
  }

  .gr-blog-articolo__contenuto .alignright {
    float: inline-end;
    max-width: 50%;
    margin: 0.35rem 0 1rem 1.25rem;
  }

  /* --------------------------------------------------------------------------
     Le gallerie, in due marcature diverse (14 articoli: 10 vecchie, 4 nuove).

     WordPress ha cambiato il blocco galleria a meta' strada, e nella base dati
     d'origine ci sono tutte e due le versioni. La vecchia e' un `<ul>` di voci
     `.blocks-gallery-item`; la nuova e' una `<figure>` che ne contiene altre —
     `.wp-block-gallery.has-nested-images` — e sono le quattro gallerie del 2026,
     da due a cinque fotografie l'una.

     In entrambi i casi il difetto senza regola e' lo stesso e ha due facce: nel
     `<ul>` compare un pallino accanto a ogni fotografia, nelle figure annidate le
     immagini si impilano a tutta larghezza e la galleria diventa cinque schermate
     di scorrimento. E' il difetto che si nota per ultimo, perche' la pagina non
     sembra rotta — sembra solo brutta.

     Un solo blocco di regole per le due marcature e non due paralleli: una
     galleria e' una griglia di immagini ritagliate, e il giorno che si cambia il
     ritaglio va cambiato una volta. Quello che le due NON condividono e' un
     capitolo a parte, due regole piu' sotto.
     -------------------------------------------------------------------------- */

  /* 10rem e non 12: a 12 una galleria su un telefono da 375px scende a una
     colonna sola, cioe' una fila di quadrati a tutta larghezza che allunga
     l'articolo di tre schermate. A 10 ne restano due affiancate, che e' quello
     che una galleria e'. */
  .gr-blog-articolo__contenuto .blocks-gallery-grid,
  .gr-blog-articolo__contenuto .wp-block-gallery.has-nested-images {
    display: grid;
    grid-template-columns: repeat(auto-fit, minmax(min(100%, 10rem), 1fr));
    gap: 0.5rem;
  }

  /* I margini si azzerano SOLO sul vecchio `<ul>`, e la distinzione non e'
     pignoleria. Quell'elenco sta dentro una `<figure class="wp-block-gallery">`
     che ha gia' il proprio respiro, e va tolto il rientro dei pallini che il
     browser gli da' da solo. La galleria nuova invece la figura E' lei, figlia
     diretta del contenuto: un `margin: 0` scritto qui le spegnerebbe la sporgenza
     calcolata poche righe sopra, e le quattro gallerie del 2026 verrebbero larghe
     quanto il testo mentre le dieci vecchie restano larghe quanto la pagina. Due
     marcature della stessa cosa non possono venire di due larghezze. */
  .gr-blog-articolo__contenuto .blocks-gallery-grid {
    margin: 0;
    padding: 0;
    list-style: none;
  }

  .gr-blog-articolo__contenuto .blocks-gallery-item figure,
  .gr-blog-articolo__contenuto .wp-block-gallery.has-nested-images > figure {
    height: 100%;
    margin: 0;
  }

  .gr-blog-articolo__contenuto .blocks-gallery-item img,
  .gr-blog-articolo__contenuto .wp-block-gallery.has-nested-images > figure img {
    width: 100%;
    height: 100%;
    object-fit: cover;
  }

  /* Il bottone del blocco WordPress: tre articoli soli, ma senza una regola e'
     un collegamento sottolineato in mezzo a un paragrafo, cioe' un invito
     all'azione che non si vede. */
  .gr-blog-articolo__contenuto .wp-block-button__link {
    display: inline-block;
    padding: 0.7rem 1.4rem;
    border-radius: 2px;
    /* Stesso ripiego fisso della paginazione, e per la stessa ragione: e' una
       superficie che porta parole. */
    background: var(--accento-fondo, var(--accento, #333));
    color: var(--accento-testo, #fff);
    text-decoration: none;
  }

  /* Tabelle e contenuti incorporati non ce n'e' nessuno nei 260 articoli
     importati — ma l'editor del pannello ne produce, e una tabella o un video
     con la larghezza scritta dentro esce dallo schermo di un telefono. Il
     contenitore scorre da solo invece di allargare la pagina: scorrere una
     tabella si capisce, una pagina che si sposta di lato sembra rotta. */
  .gr-blog-articolo__contenuto table {
    display: block;
    max-width: 100%;
    overflow-x: auto;
    border-collapse: collapse;
  }

  .gr-blog-articolo__contenuto th,
  .gr-blog-articolo__contenuto td {
    padding: 0.5rem 0.75rem;
    border: 1px solid var(--filetto, color-mix(in srgb, currentColor 14%, transparent));
    text-align: start;
  }

  .gr-blog-articolo__contenuto iframe,
  .gr-blog-articolo__contenuto video {
    max-width: 100%;
  }

  /* Il testo preformattato non va a capo per definizione: una riga lunga allarga
     il blocco quanto le serve, e con lui la pagina. E' lo stesso rimedio della
     tabella qui sopra e per la stessa ragione, ma la causa e' piu' subdola —
     basta un indirizzo incollato senza spazi. Nei 260 articoli ce n'e' uno solo,
     per giunta vuoto: un `<pre>` lasciato indietro dal traduttore di Google. */
  .gr-blog-articolo__contenuto pre {
    max-width: 100%;
    overflow-x: auto;
  }

  /* ==========================================================================
     7. IL PIEDE DELL'ARTICOLO — I TAG
     ========================================================================== */

  .gr-blog-articolo__piede {
    max-width: var(--gr-blog-lettura);
    margin: var(--gr-blog-stacco, 2rem) auto 0;
    padding-block-start: 1.5rem;
    border-block-start: 1px solid var(--filetto, color-mix(in srgb, currentColor 14%, transparent));
  }

  .gr-blog-tag {
    display: flex;
    flex-wrap: wrap;
    gap: 0.5rem;
    margin: 0;
    padding: 0;
    list-style: none;
  }

  /* La pillola e' l'eccezione dichiarata alla regola dei due pixel di raccordo:
     una targhetta squadrata si confonde con un bottone. */
  .gr-blog-tag__collegamento {
    display: inline-block;
    padding: 0.35rem 0.85rem;
    border: 1px solid var(--filetto, color-mix(in srgb, currentColor 14%, transparent));
    border-radius: 9999px;
    font-size: 0.8rem;
    color: inherit;
    text-decoration: none;
    transition: border-color var(--gr-blog-durata, 180ms) var(--gr-blog-curva, ease),
                color var(--gr-blog-durata, 180ms) var(--gr-blog-curva, ease);
  }

  .gr-blog-tag__collegamento:hover,
  .gr-blog-tag__collegamento:focus-visible {
    border-color: var(--accento, currentColor);
    color: var(--accento, currentColor);
  }

  /* ==========================================================================
     8. LA PAGINAZIONE
     ========================================================================== */

  .gr-blog-paginazione {
    margin-block-start: var(--gr-blog-stacco, 2rem);
  }

  .gr-blog-paginazione__elenco {
    display: flex;
    flex-wrap: wrap;
    justify-content: center;
    gap: 0.5rem;
    margin: 0;
    padding: 0;
    list-style: none;
  }

  /* 2,75rem di lato: e' il bersaglio minimo che si tocca con un dito senza
     sbagliare. Una paginazione fatta di numeri alti come una riga di testo si
     usa col mouse e si indovina col pollice. */
  .gr-blog-paginazione__collegamento {
    display: inline-flex;
    align-items: center;
    justify-content: center;
    min-width: 2.75rem;
    min-height: 2.75rem;
    padding-inline: 0.75rem;
    border: 1px solid var(--filetto, color-mix(in srgb, currentColor 14%, transparent));
    border-radius: 2px;
    font-size: 0.9rem;
    color: inherit;
    text-decoration: none;
    transition: border-color var(--gr-blog-durata, 180ms) var(--gr-blog-curva, ease);
  }

  .gr-blog-paginazione__collegamento:hover,
  .gr-blog-paginazione__collegamento:focus-visible {
    border-color: var(--accento, currentColor);
  }

  /* La pagina corrente puo' essere segnata sulla voce o sul collegamento, e un
     template accessibile la segna comunque con `aria-current`. Accettarle tutte
     e tre costa un selettore e evita che l'indicazione manchi proprio dove
     serve, cioe' quando non si sa piu' a che pagina si e'.

     QUI IL RIPIEGO NON PUO' ESSERE `currentColor`, ed e' l'unico punto del
     foglio dove la differenza si vede. Su un tema senza i token, `background:
     currentColor` prende il colore del testo dell'elemento — che questa stessa
     regola ha appena messo a bianco, perche' e' il ripiego di
     `--accento-testo`. Risultato: numero bianco su fondo bianco, cioe' la
     pagina corrente e' l'unica che non si legge. Un grigio scuro fisso come
     ultima spiaggia regge il bianco sopra e non dipende da niente. */
  .gr-blog-paginazione__voce--attiva > .gr-blog-paginazione__collegamento,
  .gr-blog-paginazione__collegamento--attiva,
  .gr-blog-paginazione__collegamento[aria-current] {
    background: var(--accento-fondo, var(--accento, #333));
    border-color: var(--accento-fondo, var(--accento, #333));
    color: var(--accento-testo, #fff);
  }

  .gr-blog-paginazione__voce--disabilitata > .gr-blog-paginazione__collegamento,
  .gr-blog-paginazione__collegamento--disabilitata {
    opacity: 0.4;
    pointer-events: none;
  }

  /* ==========================================================================
     9. I PRODOTTI COLLEGATI
     --------------------------------------------------------------------------
     Qui dentro non si veste la miniatura del prodotto: quella e' del tema,
     ed e' la stessa che si vede in catalogo. Un modulo che ridisegna la scheda
     prodotto fa sembrare i prodotti dell'articolo una cosa diversa da quelli
     del negozio, e il collegamento fra blog e catalogo — che e' il motivo per
     cui questo modulo esiste — perde proprio li'.
     ========================================================================== */

  /* `font-size` esplicito, e non e' una ripetizione: queste due fasce possono
     stare dentro `.gr-blog-articolo`, che porta la misura da lettura. Senza,
     una fila di prodotti in fondo a un articolo esce piu' grande della stessa
     fila in catalogo, e la differenza non ha nessuna ragione di esserci. */
  .gr-blog-prodotti,
  .gr-blog-simili {
    font-size: 1rem;
    line-height: 1.55;
  }

  .gr-blog-prodotti {
    margin-block-start: calc(var(--gr-blog-stacco, 2rem) * 1.5);
    padding-block-start: var(--gr-blog-stacco, 2rem);
    border-block-start: 1px solid var(--filetto, color-mix(in srgb, currentColor 14%, transparent));
  }

  .gr-blog-prodotti__titolo,
  .gr-blog-simili__titolo {
    margin: 0 0 1.5rem;
    font-family: var(--display, var(--gr-font-display, inherit));
    font-size: 1.5rem;
    font-weight: var(--peso-titoli, 600);
    line-height: 1.1;
  }

  .gr-blog-prodotti__elenco {
    display: grid;
    grid-template-columns: repeat(auto-fill, minmax(min(100%, 13rem), 1fr));
    gap: 1.5rem;
    margin: 0;
    padding: 0;
    list-style: none;
  }

  .gr-blog-prodotti__voce {
    min-width: 0;
  }

  /* ==========================================================================
     10. GLI ARTICOLI SIMILI
     ========================================================================== */

  .gr-blog-simili {
    margin-block-start: calc(var(--gr-blog-stacco, 2rem) * 1.5);
    padding-block-start: var(--gr-blog-stacco, 2rem);
    border-block-start: 1px solid var(--filetto, color-mix(in srgb, currentColor 14%, transparent));
  }

  /* ==========================================================================
     11. LA COLONNA LATERALE
     ========================================================================== */

  .gr-blog__lato > * + * {
    margin-block-start: var(--gr-blog-stacco, 2rem);
  }

  .gr-blog-categorie__titolo {
    margin: 0 0 0.75rem;
    font-size: 0.72rem;
    font-weight: 600;
    letter-spacing: 0.14em;
    text-transform: uppercase;
    color: var(--testo-tenue, color-mix(in srgb, currentColor 65%, transparent));
  }

  .gr-blog-categorie__elenco {
    margin: 0;
    padding: 0;
    list-style: none;
    border-block-start: 1px solid var(--filetto, color-mix(in srgb, currentColor 14%, transparent));
  }

  .gr-blog-categorie__collegamento {
    display: flex;
    align-items: baseline;
    justify-content: space-between;
    gap: 0.75rem;
    min-height: 2.75rem;
    padding-block: 0.6rem;
    border-block-end: 1px solid var(--filetto, color-mix(in srgb, currentColor 14%, transparent));
    color: inherit;
    text-decoration: none;
    transition: color var(--gr-blog-durata, 180ms) var(--gr-blog-curva, ease);
  }

  .gr-blog-categorie__collegamento:hover,
  .gr-blog-categorie__collegamento:focus-visible {
    color: var(--accento, currentColor);
  }

  .gr-blog-categorie__voce--attiva > .gr-blog-categorie__collegamento,
  .gr-blog-categorie__collegamento[aria-current] {
    color: var(--accento, currentColor);
    font-weight: 600;
  }

  .gr-blog-categorie__quanti {
    flex: 0 0 auto;
    font-size: 0.8rem;
    font-variant-numeric: tabular-nums;
    color: var(--testo-tenue, color-mix(in srgb, currentColor 60%, transparent));
  }

  /* ==========================================================================
     12. QUANDO NON C'E' NIENTE DA MOSTRARE
     ========================================================================== */

  .gr-blog__vuoto {
    margin: 0;
    padding: var(--gr-blog-stacco, 2rem);
    border: 1px dashed var(--filetto, color-mix(in srgb, currentColor 20%, transparent));
    border-radius: 2px;
    text-align: center;
    color: var(--testo-tenue, color-mix(in srgb, currentColor 70%, transparent));
  }

  /* ==========================================================================
     13. IL TELEFONO
     --------------------------------------------------------------------------
     Leggere un articolo su uno schermo piccolo e' il caso principale di questo
     modulo, non l'eccezione. Quasi tutto qui sopra e' gia' a colonna unica per
     conto suo — griglie con `auto-fill`, misure con `clamp`, sporgenza che va a
     zero da sola — e quello che resta sono le poche cose che a quella larghezza
     vanno decise, non calcolate.
     ========================================================================== */

  @media (max-width: 47.99rem) {
    /* Il titolo centrato regge finche' sono due righe. A tre o quattro, che su
       un telefono sono la norma, un blocco centrato si legge peggio di uno
       allineato: ogni riga comincia in un punto diverso e l'occhio deve
       cercarlo. */
    .gr-blog-articolo__intestazione,
    .gr-blog-articolo__meta {
      text-align: start;
      justify-content: flex-start;
    }

    /* La copertina alta 70vh su un telefono si prende quasi tutto lo schermo:
       si apre l'articolo e non si vede una parola. */
    .gr-blog-articolo__copertina img {
      max-height: 45vh;
    }

    /* Le categorie diventano una fila che scorre invece di un elenco alto
       sette righe fra la fine dell'articolo e il piede. */
    .gr-blog-categorie__elenco {
      display: flex;
      gap: 0.5rem;
      overflow-x: auto;
      border-block-start: 0;
      scrollbar-width: none;
      -webkit-overflow-scrolling: touch;
    }

    .gr-blog-categorie__elenco::-webkit-scrollbar {
      display: none;
    }

    .gr-blog-categorie__collegamento {
      min-height: 2.5rem;
      padding-inline: 0.85rem;
      border: 1px solid var(--filetto, color-mix(in srgb, currentColor 14%, transparent));
      border-radius: 9999px;
      white-space: nowrap;
    }

    /* L'immagine affiancata al testo torna in colonna. A meta' di uno schermo da
       375px restano centosettanta pixel per le parole, cioe' tre o quattro per
       riga e una sillabazione ogni due: il testo si legge peggio di quanto
       l'immagine accanto valga. Sono due articoli, ma sono due articoli
       illeggibili proprio dove il blog si legge di piu'.

       `display: block` perche' tolto il galleggiamento un `<img>` torna in linea,
       e un'immagine in linea i margini automatici non la centrano: dei due
       articoli uno ha la classe sull'immagine e uno sulla figura. */
    .gr-blog-articolo__contenuto .alignleft,
    .gr-blog-articolo__contenuto .alignright {
      display: block;
      float: none;
      max-width: 100%;
      margin-inline: auto;
    }

    .gr-blog-scheda__testo {
      padding: 1rem;
    }
  }

  /* ==========================================================================
     14. MOVIMENTO RIDOTTO
     --------------------------------------------------------------------------
     Chi ha chiesto meno movimento al sistema lo ha chiesto perche' il movimento
     gli da' fastidio, non per gusto: un'immagine che si ingrandisce sotto il
     dito, per alcune persone, e' nausea.

     La regola del tema vuole `prefers-reduced-motion` FUORI da ogni livello,
     perche' li' doveva spegnere transizioni dichiarate in livelli successivi al
     proprio e le perdeva tutte. Qui non serve e non si puo': tutte le
     transizioni di questo foglio sono dichiarate qui dentro, e dentro un
     livello vince l'ultima scritta — questa. Uscire dal livello per un caso che
     non lo richiede vorrebbe dire rendere non sovrascrivibile l'unica regola
     che nessuno vuole sovrascrivere.

     Se un giorno il tema aggiungesse una transizione alle classi del blog da
     `utilities`, quella sopravviverebbe: a spegnerla tocca a chi l'ha scritta.
     ========================================================================== */

  @media (prefers-reduced-motion: reduce) {
    .gr-blog-scheda__immagine,
    .gr-blog-tag__collegamento,
    .gr-blog-paginazione__collegamento,
    .gr-blog-categorie__collegamento {
      transition: none;
    }

    .gr-blog-scheda:hover .gr-blog-scheda__immagine,
    .gr-blog-scheda:focus-within .gr-blog-scheda__immagine {
      transform: none;
    }
  }
}
