/* ============================================================
   gr-hybrid — sezioni riusabili
   ------------------------------------------------------------
   Le sezioni del mockup portate qui come componenti del tema.

   Niente nome di negozio nelle classi. Il mockup si chiamava
   `.categoria`, `.showroom`, `.rate`; qui le stesse regole si
   chiamano `.gr-tessere`, `.gr-apertura`, `.gr-richiamo`, perche'
   descrivono la forma e non il contenuto di un cliente. Un tema
   con dentro `.showroom-ida` e' un tema che serve un negozio solo,
   e la prossima volta lo si riscrive da capo.

   Nessun colore letterale se non quelli del mockup su fondo scuro,
   e in quel caso il valore fisso resta come ripiego e subito sotto
   c'e' la versione che segue il token: cosi' le stesse classi
   funzionano anche con una tavolozza diversa dalla nostra.

   Tutto sta dentro i @layer che `theme.css` dichiara gia'. Fuori
   dai layer queste regole batterebbero qualunque cosa nel tema,
   anche quando non e' quello che serve: dentro, si inseriscono
   nella cascata al posto giusto e restano scavalcabili dal BO.
   L'ordine dichiarato da theme.css e':
     … gr-base, gr-components, gr-pages, gr-layouts, gr-modules.
   `gr-layouts` viene DOPO `gr-components`: e' li' che si mette una
   regola che deve vincere su un componente senza rincorrerne la
   specificita'.

   ------------------------------------------------------------
   Le classi di `grcontentblocks`
   ------------------------------------------------------------
   Da qui in giu' compaiono anche nomi che questo tema non inventa:
   `gr-slider__…`, `gr-tessera__…`, `gr-marchio__…`, `gr-prodotti__…`.
   Sono i nomi che emette il modulo `grcontentblocks`, e il modulo e'
   la fonte: i suoi template hanno i loro test e l'importatore ci
   scrive dentro. Rinominarli li' per comodita' nostra vorrebbe dire
   rompere l'importazione per non riscrivere trenta righe di CSS.

   Le sezioni del mockup erano state portate qui con nomi generici
   (`.gr-scheda`, `.gr-loghi`, `.gr-tessera__nome`) prima che i
   template esistessero. Dove il modulo emette un nome proprio, e'
   quello a essere vestito: tenere le due famiglie in parallelo
   significa avere due posti dove cambiare una misura e ricordarsene
   uno solo.
   ============================================================ */

@layer gr-base {
  /* IL PESO DEI TITOLI
     ------------------------------------------------------------
     `theme.css` scrive `font-weight: 400` su h1-h6. Con un Bodoni
     funzionava: un serif a forte contrasto a 43px ha gia' il suo
     peso ottico. Con Montserrat no — un geometrico in tondo, alla
     stessa misura, e' una riga sottile che non legge come titolo.

     600 non e' un gusto: e' quello che l'originale usa su h2 e h3.
     Il valore sta in `gr-tokens.css` perche' e' identita'; la regola
     sta qui, dentro un livello, cosi' un componente che voglia un
     titolo piu' leggero puo' ancora dirlo da `gr-components` in poi.
     Fuori dai livelli vincerebbe su tutto e non si potrebbe piu'.

     L'elenco dei selettori ricalca quello di `theme.css`, classi
     comprese, e non e' ridondanza: il titolo della scheda prodotto e'
     un `h1` che porta anche `class="h2"`, e contro una classe (0,1,0)
     un selettore di solo tag (0,0,1) perde. Stesso elenco, stesso
     livello, file caricato dopo: vince per ordine e non per forza. */
  h1, h2, h3, h4, h5, h6,
  .h1, .h2, .h3, .h4, .h5, .h6,
  .left-block__title, .right-block__title {
    font-weight: var(--peso-titoli, 600);
  }

  /* Il contorno di messa a fuoco e' l'unico modo di sapere dove si
     e' quando si naviga da tastiera. Colore d'accento e distacco di
     3px: si vede anche sopra un bottone pieno. */
  :focus-visible {
    outline: 2px solid var(--accento);
    outline-offset: 3px;
  }

  /* Chi ha chiesto meno movimento al sistema lo ha chiesto perche'
     il movimento gli da' fastidio, non per gusto. Per alcune persone
     un'immagine che si ingrandisce sotto il puntatore o una fascia che
     scatta da sola sono nausea, non effetto. */
}

@layer gr-layouts {
  /* Fascia: il respiro laterale. Dentro: la colonna di lettura.
     Sono due cose diverse e vanno tenute separate, altrimenti una
     sezione a tutta larghezza col fondo colorato non si puo' fare. */
  .gr-fascia {
    padding-inline: var(--gutter);
  }

  .gr-dentro {
    max-width: var(--dentro);
    margin-inline: auto;
  }

  /* ------------------------------------------------------------
     La misura del sito, in un elemento solo
     ------------------------------------------------------------
     `.gr-fascia > .gr-dentro` sono due elementi, e servono quando il
     fondo deve arrivare ai bordi mentre il contenuto no. Testata,
     topbar, barra del menu, briciole, contenuto e piede hanno UN
     elemento solo da vestire: infilarci un div in mezzo vorrebbe dire
     riscrivere la marcatura di sette template e di ogni modulo che ci
     stampa dentro.

     Questa classe fa la stessa identica cosa con un elemento solo.
     Non e' un'approssimazione, e' la stessa aritmetica. Con W la
     finestra, g il gutter e D la misura:

       fascia + dentro → inchiostro a  g + max(0, (W - 2g - D) / 2)
       gr-misura       → inchiostro a  g + max(0, (W - 2g - D) / 2)

     perche' `box-sizing: border-box` — che il tema mette su tutto —
     fa misurare a `max-width` la SCATOLA, non l'inchiostro: chiedendo
     D + 2g alla scatola, dentro restano esattamente D.

     Il `+ 2 * var(--gutter)` non e' cosmesi. Senza, la scatola si
     fermerebbe a D e l'inchiostro cadrebbe a D - 2g: il contenuto si
     restringerebbe di due gutter proprio sugli schermi larghi, cioe'
     dove si guarda per giudicare se un sito e' fatto bene.

     Sostituisce `container` e `container-md` di Bootstrap ovunque, e
     va sostituito OVUNQUE in una volta. Le due misure non erano
     conciliabili: Bootstrap va a gradini (720/960/1140/1320 ai punti
     768/992/1200/1400) piu' 12px di padding, questa e' fluida. Il
     segno dello scarto si rovesciava a 1400 — sotto le fasce
     sporgevano oltre la testata, sopra rientravano — e fra 1399 e
     1400 il bordo saltava di quasi novanta pixel per un pixel di
     finestra. Non e' una cosa che si aggiusta una fascia per volta:
     e' proprio il MISTO delle due misure a fare il gradino, e finche'
     ne resta una sola addosso a un elemento il gradino ricompare
     dove nessuno lo guarda. */
  .gr-misura {
    max-width: calc(var(--dentro) + 2 * var(--gutter));
    margin-inline: auto;
    padding-inline: var(--gutter);
  }

  /* Un `container` di Bootstrap dentro `.gr-misura` e' un
     contenimento impilato: il suo padding si somma al gutter e il suo
     max-width a gradini rientra rispetto alla misura del sito. E' il
     difetto che aveva il piede (fascia col gutter + container dentro
     + i 12px di Bootstrap = tre bordi sinistri diversi nella stessa
     pagina) e tornerebbe da solo ogni volta che un modulo stampa un
     `container` dentro il contenuto: `components/module-products.tpl`
     lo fa per cinque moduli, e quel template e' condiviso, quindi
     toglierlo li' sposterebbe il problema altrove invece di
     risolverlo. Qui si disinnesca il livello di troppo una volta
     sola, e i template dei moduli restano come sono. */
  .gr-misura :is(.container, .container-md) {
    max-width: none;
    padding-inline: 0;
  }

  /* Stessa storia per le fasce. `.gr-blocco` porta il gutter perche' in home
     e' una fascia a tutta larghezza; ma i moduli vetrina (`ps_featuredproducts`,
     `ps_crossselling` e compagnia) escono con le stesse classi anche DENTRO il
     contenuto — nel carrello stanno in fondo alla pagina — e li' il respiro
     laterale ce l'ha gia' `.gr-misura`. Misurato sul carrello a 1400: il
     riquadro «potrebbe interessarti» partiva a 124,6 mentre tutto il resto
     della pagina parte a 80. Non e' un difetto nuovo, e' lo stesso di prima
     con un altro numero: prima partiva a 96,6 contro 60. */
  .gr-misura .gr-blocco {
    padding-inline: 0;
  }

  /* Se pero' la fascia e' figlia di una `row`, il padding non va azzerato: va
     RIMESSO quello della colonna. La `row` si tira indietro di mezzo gutter di
     Bootstrap e conta sulle colonne per recuperarlo; una colonna senza padding
     sporge di quei 12px oltre la misura. E' lo stesso tranello del marchio in
     testata, al contrario: li' i due si annullavano da soli, qui bisogna
     ridarglielo. `--bs-gutter-x` lo dichiara la `row` stessa, quindi il conto
     resta giusto anche dove il tema cambia il passo (`.columns-container` lo
     porta a 2.5rem). */
  .gr-misura .row > .gr-blocco {
    padding-inline: calc(var(--bs-gutter-x, 1.5rem) * 0.5);
  }

  /* ------------------------------------------------------------
     Le pagine che devono restare strette
     ------------------------------------------------------------
     Accesso, registrazione, recupero password e le pagine di errore
     stanno volutamente su una colonna piu' corta: un campo largo
     1240px non si compila, si attraversa, e un messaggio d'errore
     lungo una riga intera non si legge come un messaggio.

     Ma «piu' stretta» deve valere sulla COLONNA, non sul respiro
     laterale. Con le classi di Bootstrap che c'erano prima
     (`container--limited-sm/md`) il fianco tornava ai 12px fissi del
     container: a 375 il modulo di accesso partiva a 12 mentre tutta
     la pagina intorno parte a 20. Otto pixel — cioe' abbastanza pochi
     da passare una revisione e restare li' per sempre, e abbastanza
     per far sembrare il modulo incollato al bordo su un telefono.

     Qui il gutter resta quello del sito e cambia solo la colonna. I
     540 e i 720 sono gli stessi numeri di prima, per non ridiscutere
     una scelta editoriale mentre se ne sistema una tecnica. */
  .gr-misura--stretta {
    max-width: calc(540px + 2 * var(--gutter));
  }

  .gr-misura--media {
    max-width: calc(720px + 2 * var(--gutter));
  }

  /* Sezione. Il corpo del tema sta a 13px, misura da interfaccia:
     va bene per il carrello, e' stretta per una pagina che si legge.
     Qui dentro si torna alla misura del mockup senza toccare il
     resto del negozio. */
  .gr-blocco {
    position: relative;
    padding: clamp(3rem, 7vw, 5.5rem) var(--gutter);
    font-size: 1rem;
    line-height: 1.6;
  }

  .gr-blocco--alt {
    background: var(--fondo-alt);
  }

  /* ------------------------------------------------------------
     La colonna di lettura dentro un blocco del modulo
     ------------------------------------------------------------
     `blocchi.tpl` non emette un involucro interno: dentro la sezione
     il contenuto e' figlio diretto, e senza questa regola su uno
     schermo largo si allarga quanto la fascia. Il mockup teneva la
     `.dentro` come elemento separato; qui la stessa misura si da'
     ai figli, che e' l'unico punto che il tema puo' toccare senza
     chiedere al modulo di cambiare marcatura. */
  .gr-blocco > .gr-blocco__intestazione,
  .gr-blocco > .gr-tessere,
  .gr-blocco > .gr-marchi,
  .gr-blocco > .gr-prodotti,
  .gr-blocco > .gr-html {
    max-width: var(--dentro);
    margin-inline: auto;
  }

  /* Il testo redazionale non va a 1240px: un paragrafo largo quanto
     una griglia di otto tessere non si legge, si scansiona. Resta
     alla misura tipografica e allineato a sinistra come nel mockup,
     dove la citazione occupava meta' della fascia. */
  .gr-blocco > .gr-testo {
    max-width: var(--misura);
  }

  /* ------------------------------------------------------------
     Sezioni impaginate a colonne
     ------------------------------------------------------------
     La configurazione dei blocchi puo' aggiungere alla sezione una
     classe del tema: sulla home di un negozio il punto vendita puo' arrivare come
     `gr-blocco gr-blocco--banner_grid gr-apertura gr-apertura--secondaria`.
     `.gr-apertura` la trasforma in una griglia a due colonne, e le due
     colonne diventano l'intestazione e la tessera. Serve solo dirle
     come stanno in verticale. */
  .gr-blocco.gr-apertura {
    gap: clamp(1.6rem, 4vw, 3.5rem);
    align-items: center;
  }

  /* Quando la sezione e' a colonne, l'intestazione e' una colonna e non
     un cappello: il margine sotto la sfalserebbe rispetto all'altra. */
  :is(.gr-apertura, .gr-newsletter, .gr-editoriale) > .gr-blocco__intestazione {
    margin-bottom: 0;
  }

  /* ------------------------------------------------------------
     Il blocco slider e' l'apertura della pagina
     ------------------------------------------------------------
     Due classi e non una (`.gr-blocco.gr-blocco--slider`) perche' la
     configurazione gli mette addosso anche `gr-apertura`, che vale
     0,2,0: con una classe sola questa regola perderebbe e lo slider
     finirebbe schiacciato nella prima delle due colonne, con l'altra
     meta' della fascia vuota e scura. La griglia a due colonne, qui,
     la fa la diapositiva.

     Padding a zero: l'apertura arriva fino ai bordi della fascia, ed
     e' il rientro interno della diapositiva a tenere il testo lontano
     dal margine. */
  .gr-blocco.gr-blocco--slider {
    display: block;
    padding: 0;
  }

  /* Se pero' lo slider porta un'intestazione, quella il rientro lo
     vuole: senza, il titolo tocca il bordo dello schermo. */
  .gr-blocco--slider > .gr-blocco__intestazione {
    max-width: calc(var(--dentro) + var(--gutter) * 2);
    margin-inline: auto;
    padding: clamp(2.5rem, 6vw, 4rem) var(--gutter) 1.5rem;
  }
}

@layer gr-components {
  /* ============================================================
     I quattro punti in cui il tema mette testo bianco sull'accento
     ------------------------------------------------------------
     `theme.css` ha un accento solo, `--gr-accent`, e lo usa per due
     mestieri diversi: come colore grafico (contorno di messa a fuoco,
     link al passaggio del mouse, bordi) e come *superficie* con sopra
     del testo bianco. Sono quattro posti in tutto il tema, e sono
     tutti posti che contano — il bottone primario e' quello di
     «aggiungi al carrello» e di «paga».

     Queste regole nacquero perche' il rosso di allora, #EC1C24, col
     bianco sopra faceva 4,40:1: sotto la soglia di 4,5 per il testo
     normale. Servivano a portare le superfici su un secondo rosso
     piu' scuro.

     Col rosso del marchio, #851316, il problema non c'e' piu': bianco
     sopra fa 9,99:1, e `--accento-fondo` punta oggi allo stesso
     colore di `--accento`. Le regole restano perche' nominano il
     ruolo giusto — «questa e' una superficie, non un filetto» — e
     perche' il giorno in cui l'accento tornera' chiaro tornano a
     lavorare da sole. Sono documentazione eseguibile, non un cerotto.

     La specificita' e' quella delle regole originali e il file arriva
     dopo `theme.css`, quindi vincono per ordine e non per forza. */

  .btn-primary {
    --bs-btn-bg: var(--accento-fondo);
    --bs-btn-border-color: var(--accento-fondo);
    --bs-btn-disabled-bg: var(--accento-fondo);
    --bs-btn-disabled-border-color: var(--accento-fondo);
  }

  /* Da vuoto a pieno: finche' e' vuoto il rosso e' solo testo e bordo
     e resta quello grafico; riempiendosi diventa una superficie con
     sopra del bianco. */
  .btn-outline-primary {
    --bs-btn-hover-bg: var(--accento-fondo);
    --bs-btn-hover-border-color: var(--accento-fondo);
    --bs-btn-active-bg: var(--accento-fondo);
    --bs-btn-active-border-color: var(--accento-fondo);
  }

  /* Il contatore del carrello: due cifre bianche dentro un cerchio
     piccolo. Piccolo e bianco su rosso e' proprio il caso peggiore. */
  .gr-minicart__count {
    background: var(--accento-fondo);
  }

  /* ---------- occhiello ----------
     L'etichettina sopra un titolo. Il filetto che sfuma a destra
     tiene la riga senza chiuderla: e' un invito a continuare, non
     un bordo. Maiuscolo con 0.18em di spaziatura, perche' il
     maiuscolo stretto non si legge. */

  .gr-occhiello {
    display: flex;
    align-items: center;
    gap: 0.9rem;
    margin: 0;
    font-family: var(--corpo);
    font-size: 0.7rem;
    letter-spacing: 0.18em;
    text-transform: uppercase;
    color: var(--testo-tenue);
  }

  .gr-occhiello::after {
    content: "";
    flex: 1;
    height: 1px;
    background: linear-gradient(to right, var(--filetto), transparent);
  }

  /* ---------- intestazione di sezione ---------- */

  .gr-intestazione {
    display: flex;
    flex-direction: column;
    gap: 0.9rem;
    margin-bottom: 2.2rem;
  }

  .gr-intestazione h2,
  .gr-intestazione .gr-titolo {
    font-family: var(--display);
    font-size: clamp(1.8rem, 3.6vw, 2.7rem);
    line-height: 1.1;
    text-wrap: balance;
    margin: 0;
  }

  .gr-intestazione p {
    margin: 0;
    max-width: var(--misura);
    color: var(--testo-tenue);
  }

  /* ---------- barra promozionale ---------- */

  .gr-barra-promo {
    display: flex;
    justify-content: center;
    align-items: baseline;
    flex-wrap: wrap;
    gap: 1rem;
    padding: 0.6rem var(--gutter);
    background: var(--scuro-fondo);
    color: var(--scuro-testo);
    font-size: 0.8rem;
  }

  .gr-barra-promo strong {
    color: var(--accento);
    font-weight: 600;
  }

  /* ---------- marchio ----------
     Due file, non una scritta che gli somiglia: il lockup per i
     fondi chiari e il monogramma per quelli scuri. Si scambiano col
     tema — e' proprio a questo che serve avere due varianti.
     Entrambe le immagini stanno nel documento e a decidere quale si
     vede e' il CSS: cosi' lo scambio avviene anche a JavaScript
     spento, e non c'e' un lampo di logo sbagliato al caricamento. */

  .gr-logo {
    display: block;
    line-height: 0;
  }

  .gr-logo img {
    display: block;
    width: auto;
    height: 44px;
  }

  /* Lo scambio col tema riguarda solo il marchio appoggiato al fondo
     di pagina. Nel piede il fondo e' scuro in entrambi i temi e lo
     scambio non deve avvenire: per questo le regole qui sotto
     escludono la variante `--piede` invece di essere poi disfatte da
     lei. Disfarle avrebbe voluto dire rincorrere la specificita' di
     `:not()` con un `:not()` piu' lungo, cioe' scrivere una regola
     che si capisce solo contando i due punti. */
  .gr-logo:not(.gr-logo--piede) .gr-logo__su-scuro {
    display: none;
  }

  /* QUI C'ERA lo scambio del marchio sulla PREFERENZA DI SISTEMA
     (`prefers-color-scheme: dark`), ed e' stato tolto perche' rendeva
     il marchio invisibile.

     Il tema non ha una tavolozza scura: `--fondo` resta #F7F5F3 in
     tutti e due i modi, e nessun'altra regola del tema risponde a
     quella preferenza. Scambiando il file, chi ha il telefono in modo
     scuro riceveva la variante per fondi scuri — inchiostro bianco — su un
     fondo chiaro: contrasto misurato 1,01:1, cioe' un buco di 89x40
     pixel al posto della ragione sociale. La testata si apriva senza
     insegna, ed e' la prima cosa che si vede.

     Lo scambio resta invece sotto `[data-theme="dark"]` e
     `[data-bs-theme="dark"]` qui sotto: quelli non sono una preferenza
     del visitatore ma l'interruttore di grthemekit, e quando e' acceso
     la tavolozza scura c'e' davvero. Il marchio segue il FONDO, non il
     sistema operativo — che e' la regola, e prima non lo era.

     Il giorno che il tema avra' una vera tavolozza scura legata alla
     preferenza di sistema, questa regola va rimessa INSIEME a quella,
     mai da sola.

     Effetto collaterale che vale la pena sapere: il file chiaro e'
     largo 170,5px e quello scuro 89,3. Finche' lo scambio c'era, una
     prova fatta in modo scuro misurava una testata con ottantun pixel
     in piu' di spazio libero — e quegli ottantun pixel sono
     esattamente quelli che decidono se il carrello resta in riga a
     768. Un collaudo fatto in scuro dava percio' esito buono su una
     testata che in chiaro era rotta. */

  :root[data-theme="dark"] .gr-logo:not(.gr-logo--piede) .gr-logo__su-chiaro,
  :root[data-bs-theme="dark"] .gr-logo:not(.gr-logo--piede) .gr-logo__su-chiaro {
    display: none;
  }

  :root[data-theme="dark"] .gr-logo:not(.gr-logo--piede) .gr-logo__su-scuro,
  :root[data-bs-theme="dark"] .gr-logo:not(.gr-logo--piede) .gr-logo__su-scuro {
    display: block;
    height: 40px;
  }

  :root[data-theme="light"] .gr-logo:not(.gr-logo--piede) .gr-logo__su-chiaro,
  :root[data-bs-theme="light"] .gr-logo:not(.gr-logo--piede) .gr-logo__su-chiaro {
    display: block;
    height: 44px;
  }

  :root[data-theme="light"] .gr-logo:not(.gr-logo--piede) .gr-logo__su-scuro,
  :root[data-bs-theme="light"] .gr-logo:not(.gr-logo--piede) .gr-logo__su-scuro {
    display: none;
  }

  /* Nel piede vale sempre la variante per fondi scuri. Manca il
     lockup completo in bianco nel kit del cliente: li' si e' costretti
     al monogramma, che dice il nome ma non la ragione sociale estesa.
     E' un file da far produrre, non una scelta di disegno. */
  .gr-logo--piede .gr-logo__su-chiaro {
    display: none;
  }

  .gr-logo--piede .gr-logo__su-scuro {
    display: block;
    height: 38px;
    margin-bottom: 1rem;
  }

  /* ---------- ricerca ---------- */

  .gr-cerca {
    display: flex;
    flex: 1 1 260px;
    overflow: hidden;
    border: 1px solid var(--filetto);
    border-radius: 2px;
  }

  .gr-cerca__campo {
    flex: 1;
    border: 0;
    padding: 0.7rem 0.9rem;
    font: inherit;
    font-size: 0.9rem;
    background: transparent;
    color: var(--testo);
  }

  /* Il bottone porta la parola «Cerca»: prende il rosso leggibile,
     non quello grafico. */
  .gr-cerca__invio {
    border: 0;
    padding-inline: 1.1rem;
    font: inherit;
    font-size: 0.85rem;
    background: var(--accento-fondo);
    color: var(--accento-testo);
    cursor: pointer;
  }

  /* ---------- navigazione ---------- */

  .gr-navigazione {
    padding: 0 var(--gutter);
    border-bottom: 1px solid var(--filetto);
  }

  .gr-navigazione .gr-dentro {
    display: flex;
    align-items: center;
    gap: clamp(0.9rem, 2.4vw, 2rem);
    overflow-x: auto;
    scrollbar-width: thin;
  }

  .gr-navigazione__voce {
    padding: 1rem 0;
    font-size: 0.86rem;
    letter-spacing: 0.06em;
    text-transform: uppercase;
    text-decoration: none;
    white-space: nowrap;
    border-bottom: 2px solid transparent;
    transition: border-color 0.2s, color 0.2s;
  }

  .gr-navigazione__voce:hover {
    border-bottom-color: var(--accento);
  }

  .gr-navigazione__voce--risalto {
    margin-left: auto;
    padding: 0.5rem 1.1rem;
    border-bottom: 0;
    border-radius: 2px;
    background: var(--accento-fondo);
    color: var(--accento-testo);
  }

  /* ---------- apertura ----------
     Testo a sinistra, immagine a destra, fondo scuro. Sotto i
     900px le due meta' si impilano invece di stringersi: una
     colonna di testo larga meta' schermo su un telefono non e' una
     colonna, e' una striscia. */

  .gr-apertura {
    position: relative;
    display: grid;
    grid-template-columns: minmax(0, 1fr);
    overflow: hidden;
    background: var(--scuro-fondo);
    color: var(--scuro-testo);
    font-size: 1rem;
    line-height: 1.6;
  }

  @media (min-width: 900px) {
    .gr-apertura {
      grid-template-columns: 0.95fr 1.05fr;
    }

    /* Variante per le sezioni scure che non aprono la pagina —
       il punto vendita, un servizio — dove il testo pesa piu'
       dell'immagine. */
    .gr-apertura--secondaria {
      grid-template-columns: 1.1fr 0.9fr;
    }
  }

  .gr-apertura__testo {
    display: flex;
    flex-direction: column;
    justify-content: center;
    gap: 1.6rem;
    padding: clamp(2.5rem, 6vw, 5.5rem) var(--gutter);
  }

  .gr-apertura--secondaria .gr-apertura__testo {
    gap: 1.2rem;
    padding: clamp(2.5rem, 5vw, 4.5rem) var(--gutter);
  }

  .gr-apertura__titolo {
    font-family: var(--display);
    font-size: clamp(2.4rem, 5.2vw, 4.2rem);
    line-height: 1.02;
    letter-spacing: -0.015em;
    text-wrap: balance;
    margin: 0;
  }

  .gr-apertura--secondaria .gr-apertura__titolo,
  .gr-apertura--secondaria h2 {
    font-family: var(--display);
    font-size: clamp(1.8rem, 3.4vw, 2.6rem);
    line-height: 1.1;
    margin: 0;
  }

  /* La parola in corsivo prende il rosso grafico: e' un accento
     visivo, non una superficie che porta testo. */
  .gr-apertura__titolo em {
    font-style: italic;
    color: var(--accento);
  }

  /* Il testo dentro le sezioni scure e' leggermente spento rispetto
     al bianco pieno. Il valore fisso e' quello del mockup e resta
     come ripiego; la riga sotto lo ricava dal token, cosi' la stessa
     classe regge anche una tavolozza che non sia la nostra. */
  .gr-apertura__testo p:not(.gr-occhiello) {
    max-width: 46ch;
    margin: 0;
    font-size: 1.02rem;
    color: rgba(247, 245, 243, 0.8);
    color: color-mix(in srgb, var(--scuro-testo) 80%, transparent);
  }

  .gr-apertura .gr-occhiello {
    color: rgba(247, 245, 243, 0.6);
    color: color-mix(in srgb, var(--scuro-testo) 60%, transparent);
  }

  .gr-apertura .gr-occhiello::after {
    background: linear-gradient(to right, rgba(247, 245, 243, 0.28), transparent);
    background: linear-gradient(to right, color-mix(in srgb, var(--scuro-testo) 28%, transparent), transparent);
  }

  /* Elenco di dati — indirizzo, telefono, orari — dentro una
     sezione scura. */
  .gr-dettagli {
    display: flex;
    flex-direction: column;
    gap: 0.5rem;
    font-size: 0.9rem;
  }

  .gr-dettagli span {
    color: rgba(247, 245, 243, 0.6);
    color: color-mix(in srgb, var(--scuro-testo) 60%, transparent);
  }

  /* ---------- azioni e bottoni ---------- */

  .gr-azioni {
    display: flex;
    flex-wrap: wrap;
    gap: 0.9rem;
  }

  .gr-bottone {
    display: inline-block;
    padding: 0.85rem 1.7rem;
    font-family: var(--corpo);
    font-size: 0.82rem;
    letter-spacing: 0.1em;
    text-transform: uppercase;
    text-decoration: none;
    border-radius: 2px;
    transition: transform 0.15s, background 0.2s;
  }

  .gr-bottone:hover {
    transform: translateY(-1px);
  }

  /* Porta parole su fondo rosso: il rosso leggibile, sempre. */
  .gr-bottone--pieno {
    border: 0;
    background: var(--accento-fondo);
    color: var(--accento-testo);
    cursor: pointer;
  }

  .gr-bottone--vuoto {
    border: 1px solid rgba(247, 245, 243, 0.45);
    border-color: color-mix(in srgb, var(--scuro-testo) 45%, transparent);
    color: var(--scuro-testo);
  }

  .gr-bottone--vuoto:hover {
    border-color: var(--accento);
    color: var(--accento);
  }

  /* Su fondo chiaro il contrasto piu' forte non e' il rosso: e' il
     nero del testo. Serve dove il rosso c'e' gia' nel filetto della
     sezione e un secondo rosso farebbe rumore. */
  .gr-bottone--scuro {
    background: var(--testo);
    color: var(--fondo);
  }

  /* ---------- segnaposto fotografico ----------
     Non finge una foto che non c'e': dichiara l'inquadratura
     prevista. Un mockup che finge di avere le foto finali fa
     approvare una pagina che poi non esiste. */

  .gr-scatto {
    position: relative;
    display: flex;
    align-items: flex-end;
    min-height: 320px;
    padding: 1.2rem;
    background:
      radial-gradient(120% 90% at 70% 18%, rgba(236, 28, 36, 0.20), transparent 62%),
      linear-gradient(150deg, #3A2C26 0%, #211A17 55%, #14100E 100%);
    /* Stesso segnaposto ricavato dai token: e' lo stesso fondo che porta
       la diapositiva dello slider, e le due misure devono restare una
       cosa sola anche il giorno che la tavolozza cambia. */
    background:
      radial-gradient(120% 90% at 70% 18%, color-mix(in srgb, var(--accento) 20%, transparent), transparent 62%),
      linear-gradient(150deg,
        color-mix(in srgb, var(--inchiostro-2) 82%, var(--grigio)) 0%,
        var(--inchiostro-2) 55%,
        var(--inchiostro) 100%);
  }

  .gr-scatto--basso {
    min-height: 260px;
  }

  .gr-scatto__nota {
    margin: 0;
    padding-left: 0.6rem;
    border-left: 2px solid var(--accento);
    font-size: 0.66rem;
    letter-spacing: 0.14em;
    text-transform: uppercase;
    color: rgba(247, 245, 243, 0.55);
    color: color-mix(in srgb, var(--scuro-testo) 55%, transparent);
  }

  /* Quando la foto vera arriva, entra qui sotto e copre il
     segnaposto senza che cambi il markup intorno. */
  .gr-scatto__foto {
    position: absolute;
    inset: 0;
    width: 100%;
    height: 100%;
    object-fit: cover;
  }

  /* ---------- garanzie ---------- */

  .gr-garanzie {
    padding: 1.6rem var(--gutter);
    border-bottom: 1px solid var(--filetto);
    background: var(--fondo-alt);
  }

  .gr-garanzie .gr-dentro {
    display: grid;
    gap: 1.4rem;
    grid-template-columns: repeat(auto-fit, minmax(200px, 1fr));
  }

  .gr-garanzia strong {
    display: block;
    margin-bottom: 0.15rem;
    font-size: 0.88rem;
    letter-spacing: 0.03em;
  }

  .gr-garanzia span {
    font-size: 0.83rem;
    color: var(--testo-tenue);
  }

  /* ============================================================
     TESSERE — blocco `banner_grid` di grcontentblocks
     ------------------------------------------------------------
     Marcatura vera (banner_grid.tpl):

       ul.gr-tessere[data-gr-tessere="8"]
         li.gr-tessera
           a.gr-tessera__collegamento          ← facoltativo
             img.gr-tessera__immagine          ← facoltativo
             span.gr-tessera__testo
               span.gr-tessera__titolo
               span.gr-tessera__sottotitolo
               span.gr-tessera__bottone

     Facoltativo vuol dire che va disegnata anche la tessera senza
     foto e senza collegamento. Oggi sulla home NON c'e' una sola
     immagine: e' esattamente il caso da cui parte il disegno, non
     un'eccezione da rimandare.

     La griglia non ha spazi fra le tessere: il fondo del filetto
     passa dalle fessure di 1px, e le celle sembrano ritagliate da
     un foglio solo invece che appoggiate una accanto all'altra. */

  .gr-tessere {
    display: grid;
    gap: 1px;

    /* 320 e non 210, ed e' una correzione che si vede solo a pagina aperta.
       A 210 la griglia da otto voci diventava cinque per riga piu' tre, con
       una casella vuota in fondo che si legge come un errore. Ma soprattutto:
       una tessera e' una FOTOGRAFIA con sopra una parola, e a duecento pixel
       la fotografia non si capisce e la parola non si legge. Il sito da cui
       questo nasce ne mette tre, grandi, ed e' la scelta giusta — una tessera
       esiste per far venire voglia di cliccarla, non per stare in elenco. */
    grid-template-columns: repeat(auto-fit, minmax(320px, 1fr));

    /* E' un `ul`: senza questi tre azzeramenti la griglia parte
       rientrata di 40px e con i pallini in mezzo alle fessure. */
    margin: 0;
    padding: 0;
    list-style: none;
    background: var(--filetto);
    border: 1px solid var(--filetto);
  }

  /* Tre e sei voci: righe da tre esatte, mai una riga spaiata in fondo.
     `auto-fit` da solo, su un contenitore largo, ne metterebbe quattro e
     lascerebbe la seconda riga con due tessere e un buco. */
  @media (min-width: 62rem) {
    .gr-tessere[data-gr-tessere="3"],
    .gr-tessere[data-gr-tessere="6"] {
      grid-template-columns: repeat(3, 1fr);
    }
  }

  /* Il modulo dichiara quante tessere sono, e non per decorazione: una
     tessera sola non e' una griglia da una cella, e' un pannello. Le si
     da' l'altezza di un'immagine invece che quella di una miniatura. */
  .gr-tessere[data-gr-tessere="1"] .gr-tessera {
    min-height: 260px;
  }

  .gr-tessera {
    /* Il testo delle tessere sta sempre sopra una velatura scura, in
       tutti e due i temi. Il suo colore non e' `--scuro-testo`, che
       segue il tema e di notte cambia valore, ma la carta, che nella
       tavolozza grezza sta ferma: sotto c'e' del nero comunque. */
    --su-velatura: var(--carta, #F7F5F3);

    position: relative;
    display: flex;
    align-items: flex-end;

    /* Alta come una fotografia, non come una riga d'elenco. A 210 pixel una
       stanza inquadrata non si legge: si vede un ritaglio. Il rapporto che ne
       esce, 320 per 340, e' quasi quadrato ed e' quello che regge meglio
       fotografie d'interni girate sia in orizzontale sia in verticale. */
    min-height: 340px;

    /* Il rientro sta sul collegamento e non qui: se lo tenesse la
       tessera, la fascia di 1.1rem lungo i bordi resterebbe fuori
       dall'area cliccabile, e su una tessera si clicca dappertutto. */
    padding: 0;
    overflow: hidden;
    background: var(--fondo);
  }

  /* Il segnaposto fotografico. Due tinte passate dal contenuto con
     --c1 e --c2; se non arrivano — e oggi non arrivano mai — resta il
     bruno scuro del catalogo. E' questo a garantire il vincolo di
     leggibilita': una tessera senza foto ha comunque un fondo scuro
     sotto un testo chiaro, invece del testo quasi nero su fondo quasi
     nero che si vede adesso sul sito. */
  .gr-tessera::before {
    content: "";
    position: absolute;
    inset: 0;
    /* Un fondo decorativo non deve mai rubare il clic al collegamento
       che ricopre: senza questa riga la tessera «Divani» sembra un
       bottone e non porta da nessuna parte. */
    pointer-events: none;
    background: linear-gradient(160deg, var(--c1, var(--inchiostro-2)), var(--c2, var(--inchiostro)));
    opacity: 0.9;
    transition: transform 0.5s ease;
  }

  /* La foto copre il segnaposto perche' viene dopo nell'ordine del
     documento: fra elementi posizionati senza z-index vince l'ultimo,
     e la velatura qui sotto viene dopo di lei. E' l'unica ragione per
     cui questi tre non hanno bisogno di uno z-index a testa. */
  .gr-tessera__immagine {
    position: absolute;
    inset: 0;
    width: 100%;
    height: 100%;
    object-fit: cover;
  }

  /* La velatura. Sul sito vecchio «Sedie» era bianco su fotografia
     chiara e non si leggeva. Una velatura piena spegnerebbe la foto;
     una velatura solo nella fascia bassa risolve il contrasto dove
     c'e' scritto e lascia vedere il prodotto dove non c'e'. */
  .gr-tessera::after {
    content: "";
    position: absolute;
    inset: auto 0 0 0;
    height: 62%;
    pointer-events: none;
    background: linear-gradient(to top, rgba(12, 10, 9, 0.82), transparent);
    background: linear-gradient(to top, color-mix(in srgb, var(--inchiostro) 82%, transparent), transparent);
  }

  .gr-tessera:hover::before,
  .gr-tessera:focus-within::before {
    transform: scale(1.05);
  }

  /* Il collegamento avvolge tutta la tessera: `flex: 1` lo porta fino
     ai bordi in larghezza, senza bisogno di stenderlo in assoluto
     sopra il contenuto.

     `align-self: stretch` non e' un di piu': la tessera allinea i suoi
     figli in basso (serve alla tessera senza collegamento, dove il
     testo e' figlio diretto), e allineare in basso vuol dire NON
     stirare. Senza questa riga il collegamento e' alto quanto le sue
     parole — su «Divani» sono 60 pixel su 210 — e i due terzi
     superiori della tessera non portano da nessuna parte, pur
     sembrando cliccabili. */
  .gr-tessera__collegamento {
    /* Posizionato, e non per capriccio: `::before` (il segnaposto) e
       `::after` (la velatura) sono elementi assoluti e vengono dopo di
       lui nell'ordine di disegno. Un collegamento statico ci finisce
       sotto, e con lui il suo contorno di messa a fuoco: chi naviga da
       tastiera arriva sulla tessera e non vede dove si trova.
       Il testo dentro era gia' stato alzato; mancava il collegamento,
       che e' proprio l'elemento che riceve la messa a fuoco. */
    position: relative;
    z-index: 1;
    display: flex;
    flex: 1;
    align-self: stretch;
    align-items: flex-end;
    min-width: 0;
    padding: 1.1rem;
    text-decoration: none;
    color: inherit;
  }

  /* Il contorno di messa a fuoco sta DENTRO la tessera: `overflow:
     hidden` taglierebbe quello standard, che sporge di 3px, e chi
     naviga da tastiera si troverebbe sulla tessera senza vederlo. */
  .gr-tessera__collegamento:focus-visible {
    outline-offset: -4px;
  }

  /* z-index 1 e non `position: relative` e basta: la velatura e' un
     elemento posizionato che viene dopo nel documento, e senza un
     livello esplicito il testo le finirebbe sotto. */
  .gr-tessera__testo {
    position: relative;
    z-index: 1;
    display: flex;
    flex-direction: column;
    align-items: flex-start;
    gap: 0.15rem;
    min-width: 0;
  }

  /* Senza collegamento il testo e' figlio diretto della tessera, e il
     rientro non gliel'ha dato nessuno. */
  .gr-tessera > .gr-tessera__testo {
    padding: 1.1rem;
  }

  .gr-tessera__titolo {
    font-family: var(--display);
    font-size: 1.45rem;
    line-height: 1.15;
    letter-spacing: 0.01em;
    color: var(--su-velatura, #F7F5F3);
  }

  /* Nel mockup questa riga era un conteggio — «24 prodotti» — e stava
     in maiuscoletto spaziato. Qui ci arrivano frasi intere («Lunedi –
     sabato, 9:30 – 13:00»): il maiuscolo su una frase la rende un
     cartello stradale. Resta minuscola e piu' tenue del titolo. */
  .gr-tessera__sottotitolo {
    margin-top: 0.2rem;
    font-family: var(--corpo);
    font-size: 0.84rem;
    line-height: 1.45;
    color: rgba(247, 245, 243, 0.78);
    color: color-mix(in srgb, var(--su-velatura, #F7F5F3) 78%, transparent);
  }

  /* Non e' un bottone: e' uno `span` dentro il collegamento, e fingere
     un bottone dove non c'e' un elemento premibile e' una promessa che
     la tastiera non mantiene. Un'etichetta sottolineata dice «di qui si
     prosegue» senza mentire. */
  .gr-tessera__bottone {
    align-self: flex-start;
    margin-top: 0.8rem;
    padding-bottom: 0.25rem;
    border-bottom: 1px solid var(--accento);
    font-family: var(--corpo);
    font-size: 0.72rem;
    letter-spacing: 0.14em;
    text-transform: uppercase;
    color: var(--su-velatura, #F7F5F3);
    transition: border-color 0.2s ease;
  }

  .gr-tessera__collegamento:hover .gr-tessera__bottone,
  .gr-tessera__collegamento:focus-visible .gr-tessera__bottone {
    border-bottom-color: var(--su-velatura, #F7F5F3);
  }

  /* Dentro una sezione scura il filetto chiaro sparisce: le fessure
     fra le tessere diventano invisibili e la griglia si sfalda. */
  .gr-apertura .gr-tessere {
    background: rgba(242, 238, 234, 0.14);
    background: color-mix(in srgb, var(--scuro-testo) 14%, transparent);
    border-color: rgba(242, 238, 234, 0.14);
    border-color: color-mix(in srgb, var(--scuro-testo) 14%, transparent);
  }

  /* ---------- carosello ----------
     Scorre col dito e si aggancia all'inizio della scheda. Niente
     frecce e niente JavaScript: e' una lista che si trascina, e
     funziona anche col pollice su un telefono.

     `.gr-prodotti__elenco` e' il nome che il modulo da' alla stessa
     cosa. Sta nello stesso gruppo e non in una copia piu' sotto:
     due liste scorrevoli con misure diverse sono il modo piu' rapido
     di far scorrere due caroselli in modo diverso sulla stessa
     pagina senza che nessuno capisca perche'. */

  .gr-carosello,
  .gr-prodotti__elenco {
    display: grid;
    grid-auto-flow: column;
    grid-auto-columns: minmax(240px, 1fr);
    gap: 1.5rem;
    padding-bottom: 1rem;
    /* Lo scorrimento sta QUI dentro e non sul corpo della pagina: una
       fila di dodici schede larga il doppio dello schermo che sfora
       dal `body` fa comparire la barra orizzontale sotto tutto il
       sito, non solo sotto il carosello. */
    overflow-x: auto;
    overscroll-behavior-x: contain;
    scrollbar-width: thin;
    scroll-snap-type: x mandatory;
  }

  .gr-carosello > *,
  .gr-prodotti__voce {
    scroll-snap-align: start;
    min-width: 0;
  }

  /* ---------- scheda prodotto ---------- */

  .gr-scheda {
    display: flex;
    flex-direction: column;
    gap: 0.8rem;
    text-decoration: none;
  }

  .gr-scheda__scatto {
    position: relative;
    aspect-ratio: 4 / 5;
    overflow: hidden;
    background: linear-gradient(155deg, var(--c1, var(--inchiostro-2)), var(--c2, var(--inchiostro)));
  }

  .gr-scheda__scatto img {
    width: 100%;
    height: 100%;
    object-fit: cover;
  }

  .gr-scheda__scatto span {
    position: absolute;
    left: 0.7rem;
    bottom: 0.7rem;
    font-size: 0.62rem;
    letter-spacing: 0.13em;
    text-transform: uppercase;
    color: rgba(255, 255, 255, 0.68);
    color: color-mix(in srgb, var(--carta) 68%, transparent);
  }

  .gr-scheda__marca {
    font-size: 0.68rem;
    letter-spacing: 0.16em;
    text-transform: uppercase;
    color: var(--testo-tenue);
  }

  .gr-scheda__nome {
    font-family: var(--display);
    font-size: 1.12rem;
    line-height: 1.25;
  }

  /* Cifre a larghezza fissa: in colonna i prezzi si incolonnano
     davvero, invece di ballare da una riga all'altra. */
  .gr-scheda__prezzo {
    font-size: 0.92rem;
    font-variant-numeric: tabular-nums;
  }

  .gr-scheda__prezzo em {
    font-style: normal;
    font-size: 0.78rem;
    color: var(--testo-tenue);
  }

  /* ---------- editoriale ---------- */

  .gr-editoriale {
    display: grid;
    gap: clamp(1.6rem, 4vw, 3.5rem);
    align-items: center;
  }

  @media (min-width: 860px) {
    .gr-editoriale {
      grid-template-columns: 1fr 1fr;
    }
  }

  .gr-citazione {
    margin: 0;
    font-family: var(--display);
    font-size: clamp(1.5rem, 3vw, 2.15rem);
    line-height: 1.24;
    font-style: italic;
  }

  .gr-firma {
    margin-top: 1.4rem;
    font-size: 0.78rem;
    letter-spacing: 0.12em;
    text-transform: uppercase;
    color: var(--testo-tenue);
  }

  .gr-firma::before {
    content: "— ";
    color: var(--accento);
  }

  /* ============================================================
     MARCHI — blocco `manufacturer_carousel` di grcontentblocks
     ------------------------------------------------------------
     Marcatura vera (manufacturer_carousel.tpl):

       ul.gr-marchi[data-gr-carosello]
         li.gr-marchio
           a.gr-marchio__collegamento
             img.gr-marchio__logo    ← se c'e' l'immagine
             span.gr-marchio__nome   ← altrimenti il nome, nel carattere dei titoli

     Qui c'era `.gr-loghi` / `.gr-logo`, portate dal mockup prima che
     il template esistesse. Sono state tolte per due motivi, e il
     secondo e' un difetto vero: `.gr-logo` era gia' il marchio del
     negozio in testata, e la stessa classe gli imponeva `height:
     108px` e `display: grid`. Due componenti diversi con lo stesso
     nome non convivono, convivono finche' nessuno guarda la testata.

     Altezza fissa e fondo neutro: sul sito attuale la fila mescola
     fotografie di prodotto e loghi e sembra disordinata. Qui tutte le
     celle sono uguali e a variare e' solo cio' che ci sta dentro. */

  .gr-marchi {
    /* Griglia in colonna e non a capo automatico: i marchi sono dieci
       e crescono col catalogo. A capo diventerebbero tre file di
       loghi alte trecento pixel in mezzo alla home; in colonna
       restano una fascia sola che scorre. */
    display: grid;
    grid-auto-flow: column;
    grid-auto-columns: minmax(150px, 1fr);
    gap: 1px;
    margin: 0;
    padding: 0;
    list-style: none;
    overflow-x: auto;
    overscroll-behavior-x: contain;
    scrollbar-width: thin;
    scroll-snap-type: x proximity;
    background: var(--filetto);
    border: 1px solid var(--filetto);
  }

  .gr-marchio {
    display: grid;
    height: 108px;
    scroll-snap-align: start;
    background: var(--fondo);
  }

  .gr-marchio__collegamento {
    display: grid;
    place-items: center;
    height: 100%;
    padding: 0.9rem;
    text-align: center;
    text-decoration: none;
    color: var(--testo-tenue);
    transition: color 0.2s ease, background 0.2s ease;
  }

  .gr-marchio__collegamento:hover {
    color: var(--testo);
    background: var(--fondo-alt);
  }

  /* La cella non ha margine intorno: il contorno standard, che sporge
     di 3px, finirebbe sotto la cella accanto. */
  .gr-marchio__collegamento:focus-visible {
    outline-offset: -4px;
  }

  /* Il vincolo e' l'altezza, non la larghezza: e' l'altezza che fa
     sembrare disordinata una fila di loghi. `contain` non ritaglia —
     un logo tagliato non e' piu' quel marchio. */
  .gr-marchio__logo {
    max-width: 100%;
    max-height: 64px;
    width: auto;
    height: auto;
    object-fit: contain;
  }

  /* Dove il logo manca resta il nome, ed e' comunque un marchio
     leggibile: nel carattere dei titoli, alla misura della cella. */
  .gr-marchio__nome {
    font-family: var(--display);
    font-size: 1.05rem;
    line-height: 1.2;
    letter-spacing: 0.08em;
    color: inherit;
  }

  /* ---------- richiamo ----------
     Una riga di testo che vende qualcosa — le rate, una spedizione,
     una garanzia. Testo e non immagine: un PNG nero con dentro delle
     parole Google non lo legge, non si adatta al telefono, e una
     promessa commerciale merita di essere una frase. Il filetto
     rosso a sinistra e' l'unica grafica che serve. */

  .gr-richiamo {
    display: flex;
    align-items: center;
    justify-content: space-between;
    flex-wrap: wrap;
    gap: 1.6rem;
    padding: 1.6rem 1.8rem;
    border: 1px solid var(--filetto);
    border-left: 3px solid var(--accento);
  }

  .gr-richiamo h3,
  .gr-richiamo .gr-titolo {
    margin: 0;
    font-family: var(--display);
    font-size: 1.35rem;
  }

  .gr-richiamo p {
    margin: 0.35rem 0 0;
    font-size: 0.92rem;
    color: var(--testo-tenue);
  }

  /* ---------- iscrizione ---------- */

  .gr-newsletter {
    display: grid;
    gap: 1.6rem;
    align-items: center;
  }

  @media (min-width: 820px) {
    .gr-newsletter {
      grid-template-columns: 1fr 1fr;
    }
  }

  .gr-iscrizione {
    display: flex;
    flex-wrap: wrap;
    gap: 0.6rem;
  }

  .gr-iscrizione__campo {
    flex: 1 1 220px;
    padding: 0.85rem 1rem;
    border: 1px solid var(--filetto);
    border-radius: 2px;
    background: transparent;
    color: var(--testo);
    font: inherit;
    font-size: 0.92rem;
  }

  .gr-consenso {
    margin-top: 0.7rem;
    font-size: 0.76rem;
    color: var(--testo-tenue);
  }

  /* ---------- piede ----------
     Scuro in entrambi i temi: e' il fondo su cui il monogramma
     bianco funziona, ed e' anche il modo in cui la pagina dichiara
     di essere finita. */

  /* Niente gutter laterale qui: lo mette `.gr-misura` sul figlio.
     Prima ce l'avevano tutti e due — la fascia col suo `var(--gutter)`
     e il `container` dentro col suo padding e il suo max-width a
     gradini — e i due contenimenti si sommavano: il piede finiva su
     una misura tutta sua, diversa sia dalla testata sia dalle fasce
     della home, e a 1024, 1400 e 1440 nella stessa pagina si potevano
     contare tre bordi sinistri distinti. Non si aggiusta cambiando la
     classe al figlio: finche' il genitore tiene il suo gutter,
     qualunque cosa gli si metta dentro parte da un'altra parte. Va
     tolto uno dei due livelli, ed e' questo. */
  .gr-piede {
    padding: clamp(2.5rem, 5vw, 4rem) 0 2rem;
    background: var(--scuro-fondo);
    color: var(--scuro-testo);
  }

  /* Il tema aveva gia' un suo interruttore per il piede scuro:
     `data-footer-style="dark"` sul <footer>, che dipinge il fondo con
     `--gr-ink`. Funziona finche' `--gr-ink` e' scuro — cioe' finche'
     non esiste un tema scuro. Da quando esiste, `--gr-ink` di notte e'
     quasi bianco, e quella regola schiarirebbe il piede proprio dove
     dovrebbe scurirlo, portandosi dietro il monogramma bianco su fondo
     bianco. Qui la regola viene raggiunta di specificita' e riportata
     su `--scuro-fondo`, che e' il token che vuol dire «superficie
     scura in tutti e due i temi». */
  [data-footer-style="dark"] .gr-piede {
    background: var(--scuro-fondo);
    color: var(--scuro-testo);
  }

  .gr-colonne {
    display: grid;
    gap: 2rem;
    grid-template-columns: repeat(auto-fit, minmax(190px, 1fr));
  }

  /* I titoli del piede li disegnano i moduli, non il tema: ps_linklist,
     ps_contactinfo e gli altri emettono la marcatura loro — `h3`, `p.h3`,
     `.block-title` — e nessuno di quei nomi si puo' prevedere qui.

     Dare un fondo scuro al piede senza questa regola significa lasciare quei
     titoli del colore che theme.css gli assegna, cioe' l'inchiostro: testo
     nero su fondo nero. Non e' un difetto che si nota rileggendo il CSS, si
     nota aprendo il sito — e nemmeno subito, perche' il testo c'e', e' solo
     invisibile.

     Si stabilisce quindi il colore per ereditarieta' su tutto il ramo, e le
     regole piu' precise qui sotto restano per chi usa la marcatura nostra. */
  .gr-piede :is(h1, h2, h3, h4, h5, h6),
  .gr-piede :is(.h1, .h2, .h3, .h4, .h5, .h6),
  .gr-piede .block-title,
  .gr-piede .block_newsletter p {
    color: var(--scuro-testo);
  }

  .gr-piede h4,
  .gr-piede .gr-colonna-titolo {
    margin: 0 0 0.9rem;
    font-family: var(--corpo);
    font-size: 0.72rem;
    font-weight: 600;
    letter-spacing: 0.16em;
    text-transform: uppercase;
    color: rgba(247, 245, 243, 0.5);
    color: color-mix(in srgb, var(--scuro-testo) 50%, transparent);
  }

  .gr-piede ul {
    display: flex;
    flex-direction: column;
    gap: 0.45rem;
    margin: 0;
    padding: 0;
    list-style: none;
  }

  .gr-piede a {
    font-size: 0.88rem;
    text-decoration: none;
    color: rgba(247, 245, 243, 0.78);
    color: color-mix(in srgb, var(--scuro-testo) 78%, transparent);
  }

  .gr-piede a:hover {
    color: var(--accento);
  }

  .gr-chiusura {
    display: flex;
    justify-content: space-between;
    flex-wrap: wrap;
    gap: 1rem;
    margin-top: 2.5rem;
    padding-top: 1.4rem;
    border-top: 1px solid rgba(247, 245, 243, 0.14);
    border-top-color: color-mix(in srgb, var(--scuro-testo) 14%, transparent);
    font-size: 0.78rem;
    color: rgba(247, 245, 243, 0.55);
    color: color-mix(in srgb, var(--scuro-testo) 55%, transparent);
  }

  /* ============================================================
     INTESTAZIONE DI BLOCCO — `_intestazione.tpl`
     ------------------------------------------------------------
       header.gr-blocco__intestazione
         h2.gr-blocco__titolo
         p.gr-blocco__sottotitolo

     Le stesse misure di `.gr-intestazione`, che era il nome del tema
     per la stessa cosa: qui si vestono i nomi che il modulo emette
     davvero, ed e' questa la coppia che compare in pagina.
     ============================================================ */

  .gr-blocco__intestazione {
    display: flex;
    flex-direction: column;
    gap: 0.9rem;
    margin-bottom: 2.2rem;
  }

  /* `color: inherit` e non `--testo`: la stessa intestazione compare
     dentro sezioni chiare e dentro sezioni scure (`gr-apertura`), e
     un colore fisso qui sarebbe nero su nero nella seconda. */
  .gr-blocco__titolo {
    margin: 0;
    font-family: var(--display);
    /* Il 400 stava qui perche' il titolo era in Bodoni, che il peso se
       lo porta da solo. Col carattere del marchio, che e' un
       geometrico, 400 a 2,7rem e' una riga sottile: il titolo segue
       il peso dei titoli come tutti gli altri. */
    font-weight: var(--peso-titoli, 600);
    font-size: clamp(1.8rem, 3.6vw, 2.7rem);
    line-height: 1.1;
    letter-spacing: -0.005em;
    text-wrap: balance;
    color: inherit;
  }

  .gr-blocco__sottotitolo {
    margin: 0;
    max-width: var(--misura);
    font-size: 1rem;
    line-height: 1.6;
    color: var(--testo-tenue);
  }

  /* Su fondo scuro il grigio caldo del testo tenue fa 2,5:1 contro
     l'inchiostro: la riga degli orari dello showroom c'e' ma non si
     legge. Sopra il fondo scuro il tenue e' la carta smorzata, non
     il grigio. */
  .gr-apertura .gr-blocco__sottotitolo,
  .gr-blocco--slider .gr-blocco__sottotitolo {
    color: rgba(247, 245, 243, 0.8);
    color: color-mix(in srgb, var(--scuro-testo) 80%, transparent);
  }

  /* ------------------------------------------------------------
     IL CAPPELLO DI SEZIONE — le misure sono quelle dell'originale
     ------------------------------------------------------------
     Misurate su https://www.idainterni.com/ a pagina impaginata, non
     a occhio. I tre titoli di sezione della home dell'originale —
     «Ida - ARREDAMENTO DI DESIGN», «Lasciati ispirare», «Ida Brands»
     — sono tutti e tre, a ogni larghezza da 768 in su:

       Montserrat 600 · 58px · interlinea 58px (1,0)
       letter-spacing: normal · text-align: center

     e scendono a 30px sotto i 768 (regola dell'originale:
     `@media (max-width: 767px)`).

     Qui erano `clamp(1.8rem, 3.6vw, 2.7rem)` — 43,2px a 1366 —
     allineati a SINISTRA e con `letter-spacing: -0.005em`. Tre
     proprieta' su quattro diverse dall'originale. E peggio: le due
     fasce prodotto (`.gr-vetrina .section-title`) erano gia'
     centrate, quindi la stessa home aveva due specie di titolo di
     sezione, e nessuna delle due era quella del sito che si sta
     continuando.

     PERCHE' UN CLAMP E NON IL GRADINO DELL'ORIGINALE
     L'originale salta da 58px a 30px a 767px. Fra i 768 e i 900,
     dove la colonna e' larga meno di 700px, 58px sono due righe e
     mezzo di titolo. Il clamp qui sotto tocca gli stessi due estremi
     — 30px sul telefono, 58px da 1366 in su — e nel mezzo interpola
     invece di saltare. E' l'unico punto in cui non copio l'originale,
     ed e' per fargli fare meglio cio' che gia' fa:
       ·  375px -> 1,875rem = 30px   (come l'originale)
       ·  768px -> 4,25vw   = 32,6px
       ·  992px -> 4,25vw   = 42,2px
       · 1366px -> tetto    = 58px   (come l'originale)
       · 1920px -> tetto    = 58px   (come l'originale)

     Interlinea 1,05 e non 1,0: i titoli dell'originale sono corti e
     stanno sempre su una riga sola, i nostri no — «Da dove vuoi
     cominciare» va a capo sotto i 700px. A 1,0 le due righe si
     toccherebbero.

     PERCHE' SOLO IL CAPPELLO
     Vale quando l'intestazione sta SOPRA il contenuto. Nelle sezioni
     impaginate a colonne — `gr-apertura`, `gr-newsletter`,
     `gr-editoriale` — l'intestazione E' una delle due colonne e si
     porta dietro sottotitolo, dati e bottone: centrarla la
     staccherebbe dalla colonna accanto, e portarla a 58px farebbe
     traboccare il titolo su quattro righe dentro una colonna da
     650px. Sono le stesse tre classi che poco piu' su azzerano il
     margine sotto all'intestazione, per la stessa identica ragione:
     l'elenco e' ricopiato apposta, cosi' se un giorno se ne aggiunge
     una quarta la si aggiunge in due punti vicini e non in due file
     diversi.

     Lo slider e' escluso perche' la sua intestazione, quando c'e', e'
     un cappello sopra un'apertura a tutta pagina, con un rientro e un
     ritmo suoi decisi in `gr-layouts`. */
  .gr-blocco:not(.gr-apertura, .gr-newsletter, .gr-editoriale, .gr-blocco--slider)
    > .gr-blocco__intestazione {
    align-items: center;
    text-align: center;
  }

  .gr-blocco:not(.gr-apertura, .gr-newsletter, .gr-editoriale, .gr-blocco--slider)
    > .gr-blocco__intestazione
    > .gr-blocco__titolo {
    font-size: clamp(1.875rem, 4.25vw, 3.625rem);
    line-height: 1.05;
    letter-spacing: normal;
  }

  /* ============================================================
     SLIDER — blocco `slider` di grcontentblocks
     ------------------------------------------------------------
     Marcatura vera (slider.tpl):

       div.gr-slider[data-gr-slider][data-gr-intervallo]
         ul.gr-slider__diapositive
           li.gr-slider__diapositiva(.gr-slider__diapositiva--attiva)
             img.gr-slider__immagine        ← facoltativa
             div.gr-slider__testo
               p.gr-slider__titolo
               p.gr-slider__sottotitolo
               a.gr-slider__bottone
             a.gr-slider__collegamento      ← quando non c'e' il bottone
               span.gr-slider__collegamento-testo
         button.gr-slider__freccia--indietro   ← solo con 2+ diapositive
         button.gr-slider__freccia--avanti

     E' l'apertura della pagina: due colonne, titolo nel carattere
     dei titoli,
     immagine di sfondo. Le frecce con una diapositiva sola non
     esistono affatto — non le nasconde il CSS, non le stampa il
     template — ed e' il modo giusto: una freccia nascosta col CSS
     resta premibile col tabulatore.
     ============================================================ */

  .gr-slider {
    position: relative;
    /* Le frecce si appoggiano allo slider e devono restare sopra la
       diapositiva senza scavalcare la testata: un contesto di
       impilamento proprio tiene il loro z-index dentro casa. */
    isolation: isolate;
  }

  .gr-slider__diapositive {
    margin: 0;
    padding: 0;
    list-style: none;
  }

  /* Le diapositive stanno tutte nel documento: chi arriva prima che il
     JavaScript parta vede il contenuto invece di un buco. A nasconderle
     e' il tema, e lo fa con `display: none` e non con la trasparenza:
     una diapositiva trasparente resta raggiungibile col tabulatore, e
     ci si ritrova a premere un bottone che non si vede. */
  .gr-slider__diapositiva {
    position: relative;
    display: none;
    grid-template-columns: minmax(0, 1fr);
    align-items: center;
    min-height: clamp(320px, 48vh, 540px);
    overflow: hidden;
    color: var(--scuro-testo);
    /* Il segnaposto: nessuna diapositiva ha oggi un'immagine, e senza
       questo fondo il titolo chiaro finirebbe sul fondo della pagina.
       Il valore fisso e' quello del mockup e resta come ripiego; la
       riga sotto lo ricava dai token. */
    background:
      radial-gradient(120% 90% at 78% 18%, rgba(236, 28, 36, 0.20), transparent 62%),
      linear-gradient(150deg, #3A2C26 0%, #211A17 55%, #14100E 100%);
    background:
      radial-gradient(120% 90% at 78% 18%, color-mix(in srgb, var(--accento) 20%, transparent), transparent 62%),
      linear-gradient(150deg,
        color-mix(in srgb, var(--inchiostro-2) 82%, var(--grigio)) 0%,
        var(--inchiostro-2) 55%,
        var(--inchiostro) 100%);
  }

  .gr-slider__diapositiva--attiva {
    display: grid;
  }

  @media (min-width: 900px) {
    .gr-slider__diapositiva {
      grid-template-columns: 0.95fr 1.05fr;
    }
  }

  /* La foto sta sotto tutto: e' un fondo, non un contenuto. Copre il
     segnaposto e viene coperta dalla velatura, per ordine nel
     documento e senza z-index. */
  .gr-slider__immagine {
    position: absolute;
    inset: 0;
    width: 100%;
    height: 100%;
    object-fit: cover;
  }

  /* La velatura, di nuovo sotto il testo e non sull'immagine intera.
     Su telefono il testo sta in mezzo alla foto e la velatura deve
     coprire tutta l'altezza; da 900px in su il testo occupa la
     colonna di sinistra e la velatura sfuma verso destra, dove la
     fotografia resta visibile. */
  .gr-slider__diapositiva::after {
    content: "";
    position: absolute;
    inset: 0;
    pointer-events: none;
    background: linear-gradient(to top, rgba(12, 10, 9, 0.88), rgba(12, 10, 9, 0.62));
    background: linear-gradient(to top,
      color-mix(in srgb, var(--inchiostro) 88%, transparent),
      color-mix(in srgb, var(--inchiostro) 62%, transparent));
  }

  @media (min-width: 900px) {
    .gr-slider__diapositiva::after {
      background: linear-gradient(to right, rgba(12, 10, 9, 0.9) 0%, rgba(12, 10, 9, 0.6) 45%, rgba(12, 10, 9, 0) 78%);
      background: linear-gradient(to right,
        color-mix(in srgb, var(--inchiostro) 90%, transparent) 0%,
        color-mix(in srgb, var(--inchiostro) 60%, transparent) 45%,
        transparent 78%);
    }
  }

  .gr-slider__testo {
    position: relative;
    z-index: 1;
    grid-column: 1;
    display: flex;
    flex-direction: column;
    justify-content: center;
    gap: 1.4rem;
    min-width: 0;
    padding: clamp(2.5rem, 6vw, 5rem) var(--gutter);
  }

  /* E' un `p` e non un `h1`: l'`h1` della home appartiene alla pagina,
     non a una diapositiva. Il peso glielo da' il foglio, non il tag. */
  .gr-slider__titolo {
    margin: 0;
    font-family: var(--display);
    /* Vale qui a maggior ragione: e' il titolo piu' grande della home,
       fino a 4rem. Un geometrico in tondo a quella misura non e' un
       titolo, e' una didascalia gigante. */
    font-weight: var(--peso-titoli, 600);
    font-size: clamp(2.1rem, 5vw, 4rem);
    line-height: 1.04;
    letter-spacing: -0.015em;
    text-wrap: balance;
    color: inherit;
  }

  .gr-slider__sottotitolo {
    margin: 0;
    max-width: 46ch;
    font-size: 1.02rem;
    line-height: 1.6;
    color: rgba(247, 245, 243, 0.82);
    color: color-mix(in srgb, var(--scuro-testo) 82%, transparent);
  }

  /* Porta delle parole su fondo rosso: prende il rosso leggibile
     (5,34:1), non quello grafico (4,40:1). `align-self` perche' in
     una colonna flessibile un bottone si stirerebbe per tutta la
     larghezza della colonna. */
  .gr-slider__bottone {
    align-self: flex-start;
    display: inline-block;
    padding: 0.85rem 1.7rem;
    border: 0;
    border-radius: 2px;
    font-family: var(--corpo);
    font-size: 0.82rem;
    letter-spacing: 0.1em;
    text-transform: uppercase;
    text-decoration: none;
    background: var(--accento-fondo);
    color: var(--accento-testo);
    transition: transform 0.15s ease, background 0.2s ease;
  }

  .gr-slider__bottone:hover {
    transform: translateY(-1px);
    background: var(--gr-accent-soft, var(--accento-fondo));
  }

  /* Una diapositiva che porta da qualche parte ma non ha bottone e'
     cliccabile tutta. Il collegamento e' steso sopra la diapositiva:
     non e' «invisibile ma raggiungibile col tabulatore», perche' col
     tabulatore disegna il contorno lungo tutto il bordo — si vede
     benissimo dove si e'. */
  .gr-slider__collegamento {
    position: absolute;
    inset: 0;
    z-index: 2;
  }

  .gr-slider__collegamento:focus-visible {
    outline: 2px solid var(--accento);
    outline-offset: -6px;
  }

  /* Il testo del collegamento ripete il titolo della diapositiva, che
     e' gia' scritto due centimetri piu' in la'. Mostrarlo vorrebbe
     dire stampare due volte la stessa frase; toglierlo dal documento
     lascerebbe un collegamento senza nome, che un lettore di schermo
     annuncia come «link, vuoto». Si nasconde alla vista e resta
     leggibile alla voce: e' l'unico modo di averle tutte e due. */
  .gr-slider__collegamento-testo {
    position: absolute;
    width: 1px;
    height: 1px;
    margin: -1px;
    padding: 0;
    overflow: hidden;
    clip-path: inset(50%);
    white-space: nowrap;
    border: 0;
  }

  /* Le frecce. 44px di lato: e' la misura minima di un bersaglio da
     dito, e una freccia da 24px sopra una fotografia si manca. */
  .gr-slider__freccia {
    position: absolute;
    z-index: 3;
    display: grid;
    place-items: center;
    width: 44px;
    height: 44px;
    padding: 0;
    border: 1px solid rgba(247, 245, 243, 0.45);
    border-color: color-mix(in srgb, var(--scuro-testo) 45%, transparent);
    border-radius: 2px;
    background: rgba(12, 10, 9, 0.45);
    background: color-mix(in srgb, var(--inchiostro) 45%, transparent);
    color: var(--scuro-testo);
    cursor: pointer;
    transition: background 0.2s ease, border-color 0.2s ease;
  }

  /* Il template non mette niente dentro il bottone — ha solo
     l'`aria-label` — quindi il segno lo disegna il tema: due lati di
     un quadrato ruotati, che restano netti a qualunque ingrandimento
     e non chiedono un carattere di icone. */
  .gr-slider__freccia::before {
    content: "";
    width: 9px;
    height: 9px;
    border-top: 2px solid currentColor;
    border-right: 2px solid currentColor;
  }

  .gr-slider__freccia--indietro::before {
    margin-left: 4px;
    transform: rotate(-135deg);
  }

  .gr-slider__freccia--avanti::before {
    margin-right: 4px;
    transform: rotate(45deg);
  }

  .gr-slider__freccia:hover {
    background: var(--accento-fondo);
    border-color: var(--accento-fondo);
  }

  /* Su telefono le frecce stanno in basso a destra, una accanto
     all'altra: a meta' dei lati finirebbero in mezzo al titolo, che
     su schermo stretto occupa tutta la larghezza. */
  .gr-slider__freccia {
    bottom: 1rem;
  }

  .gr-slider__freccia--avanti {
    right: 1rem;
  }

  .gr-slider__freccia--indietro {
    right: calc(1rem + 44px + 0.5rem);
  }

  @media (min-width: 900px) {
    .gr-slider__freccia {
      top: 50%;
      bottom: auto;
      transform: translateY(-50%);
    }

    .gr-slider__freccia--indietro {
      left: 1rem;
      right: auto;
    }
  }

  /* ============================================================
     PRODOTTI — blocco `product_carousel` di grcontentblocks
     ------------------------------------------------------------
     Marcatura vera (product_carousel.tpl):

       div.gr-prodotti[data-gr-carosello]
         ul.gr-prodotti__elenco
           li.gr-prodotti__voce
             … la miniatura del tema (`product-miniature`)

     La scheda la disegna la miniatura del tema, non il modulo: e'
     l'unica dipendenza dal tema di tutto `grcontentblocks`, ed e'
     voluta — lo stesso prodotto in home e in categoria deve avere lo
     stesso prezzo scritto allo stesso modo. Qui si dichiara solo come
     quella miniatura si comporta DENTRO un carosello, dove le schede
     stanno in fila e le differenze di altezza si vedono tutte.

     La fila scorrevole e' nel gruppo di `.gr-carosello`, piu' su.
     ============================================================ */

  .gr-prodotti {
    position: relative;
  }

  /* E' un `ul`: rientro e pallini vanno tolti. Il `padding-bottom`
     lascia posto alla barra di scorrimento senza che tocchi le
     schede. */
  .gr-prodotti__elenco {
    margin: 0;
    padding: 0 0 1rem;
    list-style: none;
  }

  /* Rapporto d'aspetto fisso: e' l'altezza diversa delle fotografie a
     far sembrare storta una fila di schede, non la larghezza. */
  .gr-prodotti__voce .product-miniature__image-container {
    aspect-ratio: 4 / 5;
    overflow: hidden;
    background: var(--fondo);
  }

  .gr-prodotti__voce .product-miniature__image-link {
    display: block;
    width: 100%;
    height: 100%;
  }

  /* `contain` e non `cover`: le miniature del catalogo sono quadrate e
     dentro un riquadro 4/5 `cover` ne taglierebbe un quinto in
     larghezza. Su un divano vuol dire tagliargli un bracciolo, e in
     un negozio di arredamento la fotografia e' la merce. Si perde una
     striscia di fondo, si tiene il prodotto intero. */
  .gr-prodotti__voce .product-miniature__image {
    width: 100%;
    height: 100%;
    object-fit: contain;
  }

  .gr-prodotti__voce .product-miniature__title {
    font-family: var(--display);
    font-size: 1.12rem;
    line-height: 1.25;
    text-decoration: none;
    color: var(--testo);
  }

  /* Cifre a larghezza fissa: in fila i prezzi si incolonnano davvero,
     invece di ballare da una scheda all'altra. */
  .gr-prodotti__voce .product-miniature__price {
    font-size: 0.92rem;
    font-variant-numeric: tabular-nums;
  }

  .gr-prodotti__voce .product-miniature__regular-price {
    font-size: 0.78rem;
    color: var(--testo-tenue);
  }

  /* ============================================================
     TESTO — blocco `text` di grcontentblocks
     ------------------------------------------------------------
       div.gr-testo   →   HTML scritto in redazione

     Dentro c'e' quello che ha scritto chi ha accesso al pannello:
     paragrafi, citazioni, elenchi, a volte le classi del tema
     (`gr-occhiello`, `gr-citazione`, `gr-firma`) messe dal contenuto
     importato. Si vestono quindi gli ELEMENTI, non delle classi che
     nessuno garantisce: un `blockquote` scritto a mano deve venire
     come quello che porta la classe giusta.
     ============================================================ */

  .gr-testo {
    max-width: var(--misura);
    font-family: var(--corpo);
    font-size: 1.02rem;
    line-height: 1.7;
    color: var(--testo);
    /* Un indirizzo lungo incollato senza spazi e' il modo piu' comune
       in cui un blocco redazionale sfora dallo schermo. */
    overflow-wrap: break-word;
  }

  .gr-testo > :first-child {
    margin-top: 0;
  }

  .gr-testo > :last-child {
    margin-bottom: 0;
  }

  .gr-testo p {
    margin: 0 0 1rem;
  }

  .gr-testo :is(h2, h3, h4) {
    margin: 1.8rem 0 0.8rem;
    font-family: var(--display);
    font-weight: var(--peso-titoli, 600);
    line-height: 1.15;
  }

  /* La citazione e' il centro di questo blocco: corsivo, grande.
     Niente filetto rosso a sinistra: il rosso in questa sezione lo
     porta gia' il trattino della firma, e due accenti a mezzo metro
     l'uno dall'altro si annullano. */
  .gr-testo blockquote {
    margin: 1.6rem 0;
    font-family: var(--display);
    font-style: italic;
    font-size: clamp(1.5rem, 3vw, 2.15rem);
    line-height: 1.24;
  }

  /* La firma. `.gr-firma` la porta gia' il contenuto importato ed e'
     vestita piu' su; questi sono i due elementi che scriverebbe chi
     redige a mano, e devono venire uguali. */
  .gr-testo :is(cite, figcaption) {
    display: block;
    margin-top: 1.4rem;
    font-family: var(--corpo);
    font-style: normal;
    font-size: 0.78rem;
    letter-spacing: 0.12em;
    text-transform: uppercase;
    color: var(--testo-tenue);
  }

  .gr-testo :is(cite, figcaption)::before {
    content: "— ";
    color: var(--accento);
  }

  .gr-testo :is(ul, ol) {
    margin: 0 0 1rem;
    padding-left: 1.3rem;
  }

  .gr-testo li {
    margin-bottom: 0.35rem;
  }

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

  /* Sottolineatura tenue e non rossa: dentro un paragrafo di
     redazione i collegamenti sono tanti, e tanti accenti rossi in
     fila sono coriandoli. Il rosso arriva al passaggio del mouse,
     dove indica uno solo. */
  .gr-testo a {
    color: inherit;
    text-decoration: underline;
    text-decoration-color: var(--filetto);
    text-underline-offset: 0.18em;
    transition: color 0.2s ease, text-decoration-color 0.2s ease;
  }

  .gr-testo a:hover,
  .gr-testo a:focus-visible {
    color: var(--accento);
    text-decoration-color: currentColor;
  }

  /* ============================================================
     HTML — blocco `html` di grcontentblocks
     ------------------------------------------------------------
       div.gr-html   →   codice che arriva da fuori (Scalapay e simili)

     Il modulo dichiara con questo tipo che dentro c'e' roba altrui,
     coi suoi script e i suoi contenitori. Il tema puo' fare due cose
     sole, e le fa entrambe: impedirgli di sfondare la pagina, e dire
     a chi guarda che quel pezzo arriva da un'altra parte.
     ============================================================ */

  .gr-html {
    font-family: var(--corpo);
    color: var(--testo);
    overflow-wrap: break-word;
  }

  .gr-html > :first-child {
    margin-top: 0;
  }

  .gr-html > :last-child {
    margin-bottom: 0;
  }

  .gr-html :is(img, video, iframe, svg) {
    max-width: 100%;
  }

  .gr-html img {
    height: auto;
  }

  /* Una tabella larga e' il modo tipico in cui un banner di terze
     parti allarga tutta la pagina: qui la barra di scorrimento resta
     dentro la tabella. */
  .gr-html table {
    display: block;
    width: max-content;
    max-width: 100%;
    overflow-x: auto;
  }

  /* Il filetto d'accento a sinistra e' il modo del tema di dire
     «questo pezzo arriva da fuori».

     Ma sul sito, dentro `gr-html`, arriva spesso qualcosa che porta
     gia' addosso una veste nostra — un `.gr-richiamo` con la sua
     cornice, una riga di consenso della newsletter. Incorniciare
     quello vorrebbe dire una cornice dentro una cornice, che si vede
     subito ed e' peggio di nessuna cornice. Quindi la cornice si
     mette solo quando dentro non c'e' niente di gia' vestito.

     Se `:has()` non c'e' — browser vecchi — questa regola sola cade,
     e il blocco resta senza cornice: mancare un filetto e' un difetto
     piu' piccolo che raddoppiarlo. */
  .gr-html:not(:has([class^="gr-"], [class*=" gr-"])) {
    padding: 1.6rem 1.8rem;
    border: 1px solid var(--filetto);
    border-left: 3px solid var(--accento);
  }
}

/* Il numero di passo del checkout sta in `@layer gr-modules`, che nella
   scala dichiarata da theme.css viene dopo `gr-components`: per essere
   raggiunto va corretto dal suo stesso strato, non da uno precedente.
   Anche qui e' un cerchio pieno con dentro una cifra bianca. */
@layer gr-modules {
  .checkout-steps[data-step-indicator="icons"] .checkout-steps__number {
    background: var(--accento-fondo);
    border-color: var(--accento-fondo);
  }
}

/* ============================================================
   RIDUCI IL MOVIMENTO — FUORI DAI LAYER, ED E' IL PUNTO
   ============================================================

   Questo blocco stava in `@layer gr-base`. Ogni transizione che prova a
   spegnere pero' e' dichiarata in `@layer gr-components`, che nell'ordine di
   theme.css viene dopo — e nei livelli CSS vince l'ultimo, non il piu'
   specifico. Il risultato: chi ha «riduci il movimento» acceso nel sistema
   apriva la home e vedeva le tessere ingrandirsi lo stesso.

   Le regole non incapsulate battono qualunque livello. Per una preferenza di
   accessibilita' e' la collocazione giusta: non deve vincere quasi sempre,
   deve vincere.
   ============================================================ */

@media (prefers-reduced-motion: reduce) {
    .gr-tessera::before,
    .gr-tessera__bottone,
    .gr-bottone,
    .gr-navigazione__voce,
    .gr-logo,
    .gr-marchio__collegamento,
    .gr-slider__bottone,
    .gr-slider__freccia,
    .gr-testo a {
      transition: none;
      animation: none;
    }

    /* I caroselli continuano a scorrere — toglierlo renderebbe il
       contenuto irraggiungibile — ma senza aggancio: e' l'aggancio a
       far sobbalzare la fascia quando ci si ferma a meta'. */
    .gr-marchi,
    .gr-carosello,
    .gr-prodotti__elenco {
      scroll-behavior: auto;
      scroll-snap-type: none;
    }
}

@layer gr-modules {
  /* ============================================================
     I MODIFICATORI DI TIPO
     ============================================================

     `.gr-blocco--<tipo>` lo stampa il modulo su ogni sezione, uno per
     tipo di blocco. Erano gli ultimi quattro nomi senza una regola: non
     rompevano niente, ma un modificatore che non modifica e' una promessa
     che il markup fa e il foglio non mantiene — e il primo che ci prova
     scrive una regola nuova invece di trovare quella che c'e'.

     Qui fanno il minimo che ha senso: dare a ciascun tipo il respiro che
     gli serve, che non e' lo stesso per un carosello e per una citazione.

     STANNO IN `gr-modules` E NON IN `gr-components`: la regola generale
     `.gr-blocco` vive in `gr-layouts`, che nell'ordine di theme.css viene
     DOPO `gr-components`. Un modificatore piu' specifico ma in un livello
     precedente perde comunque — nei livelli CSS decide l'ordine, non la
     specificita'. Misurato: il padding restava 88px invece dei 64 chiesti.
     ============================================================ */

  /* Un blocco di sola scrittura non ha bisogno della larghezza piena:
     la colonna di lettura la decide gia' `.gr-testo`. Qui si toglie
     spazio sopra e sotto, perche' fra due sezioni piene una citazione
     respira meglio se non e' distanziata quanto loro. */
  .gr-blocco--text {
    padding-block: clamp(2.5rem, 5vw, 4rem);
  }

  /* Il blocco html ospita contenuto altrui — un richiamo, un banner, un
     modulo di iscrizione — e non deve aggiungere aria a quella che quel
     contenuto si porta gia'. */
  .gr-blocco--html {
    padding-block: clamp(1.75rem, 3.5vw, 3rem);
  }

  /* I due caroselli scorrono orizzontalmente dentro di se'. Il respiro
     laterale va tolto al blocco e restituito agli elementi, o la prima
     e l'ultima cella restano incollate al bordo mentre si scorre. */
  .gr-blocco--manufacturer_carousel,
  .gr-blocco--product_carousel {
    padding-inline: 0;
  }

  .gr-blocco--manufacturer_carousel > .gr-dentro,
  .gr-blocco--product_carousel > .gr-dentro {
    padding-inline: var(--gutter);
  }
}

@layer gr-modules {
  /* ============================================================
     LA BARRA DEL MENU VA A CAPO
     ============================================================

     Nella testata del tema logo, ricerca, account e carrello stanno in una
     riga che non va a capo. Infilandoci anche il mega menu succede una di
     due cose, e nessuna va bene: o il menu si prende tutta la riga e
     spinge fuori gli altri — la pagina scorreva di lato di settecento
     pixel — oppure si accontenta dello spazio che avanza, e undici voci
     finiscono in duecento pixel.

     Nel mockup il menu ha una riga sua, sotto la testata. E' anche la
     forma del sito attuale, ed e' quella giusta: la riga va a capo, e la
     barra la occupa tutta.
     ============================================================ */

}

/* FUORI DAI LIVELLI, di proposito.
   E' il tema a decidere la propria testata, e deve vincere sul foglio del
   modulo qualunque cosa quello dichiari. Con la regola dentro `gr-modules`
   non arrivava mai: `megamenu.css` si caricava dopo, nello stesso livello,
   e la barra restava schiacciata in duecento pixel.

   Vale anche contro theme.css, che e' un artefatto di compilazione e porta le
   proprie regole di testata con `!important` dentro `@layer gr-layouts`. Per
   le dichiarazioni `!important` l'ordine dei livelli e' ROVESCIATO — vince il
   primo dichiarato, non l'ultimo — quindi un `!important` scritto in
   `gr-modules` perde comunque. Fuori dai livelli si vince senza rilanciare.

   Da qui in giu' c'e' tutta la riga alta: come va a capo, come si comporta la
   colonna della ricerca, dove sta lo slot delle utilities. Stanno insieme
   perche' si condizionano a vicenda: chi tocca una delle tre senza guardare le
   altre due sposta il difetto invece di risolverlo. */

/* ------------------------------------------------------------------
   LA RIGA ALTA NON VA A CAPO.

   `flex-wrap: wrap` stava qui per la modalita' `header_inline` di grthemekit,
   dove il mega menu e' un figlio della riga e chiede una riga tutta sua (vedi
   la regola su `.gr-megamenu` piu' sotto). Ma la modalita' predefinita e'
   `header_below`, il menu sta nella fascia sotto, e in quella modalita' il
   capo non serve a niente e fa danno.

   Misurato sul servito, prima: a 768px esatti la riga andava a capo e il
   carrello finiva DA SOLO su una seconda riga, all'estrema sinistra sotto il
   logo — riga alta 98px invece di 58, cima del carrello a 107 contro i 49
   degli altri. La causa non era il carrello: era la barra di ricerca, che con
   `min-width: 19rem` non scendeva sotto i 304px e faceva sforare la somma.
   L'ultimo elemento veniva spinto giu'.

   Un capo del genere peggiora a ogni elemento che si aggiunge alla riga. Il
   pulsante «Prenota consulenza» e' un elemento in piu': senza questa riga lo
   si sarebbe visto scattare anche a 992.
   ------------------------------------------------------------------ */
.header-bottom__row {
  flex-wrap: nowrap;
}

/* Sotto i 992 il capo torna, ma per UNA cosa sola e voluta: lo slot delle
   utilities prende una riga propria (vedi piu' sotto). Tutto il resto sta
   comunque su una riga, perche' la ricerca adesso ha il permesso di
   stringersi. */
@media (max-width: 991.98px) {
  .header-bottom__row {
    flex-wrap: wrap;
  }
}

/* La modalita' `header_inline` continua a volere il capo a tutte le larghezze:
   li' il menu E' un figlio della riga e senza capo non avrebbe dove andare.
   Stessa specificita' della regola qui sopra, quindi vince perche' viene dopo. */
.header-bottom__row--menu-inbar {
  flex-wrap: wrap;
}

/* ------------------------------------------------------------------
   LA COLONNA DELLA RICERCA SMETTE DI TENERSI IL VUOTO.

   theme.css da' a `#_desktop_ps_searchbar` `flex: 1 1 auto !important`, ed e'
   giusto: e' quella crescita che tiene Accedi e il carrello inchiodati al
   bordo destro. Il difetto era dentro: il widget `#ps_searchbar` aveva
   `flex: 0 1 auto` e `min-width: 19rem`, cioe' restava largo 304px in una
   colonna larga 914 e non cresceva mai. Misurato a 1440: 610,2px di vuoto
   dentro la colonna, e 614,2px fra il bordo dell'input e «Accedi» — un buco
   proprio in mezzo al gruppo delle azioni, ed era MASSIMO sui monitor grandi,
   dove tutto il resto stava comodo.

   Delle tre strade — far crescere il campo, togliere alla colonna l'avanzo,
   riempire l'avanzo con qualcosa — si fanno la prima e la terza insieme, e non
   la seconda: togliere alla colonna la crescita staccherebbe le azioni dal
   bordo destro e le lascerebbe a meta' riga, che e' un difetto peggiore di
   quello che si sta correggendo.

   Il campo cresce fino a 36rem e li' si ferma. Il limite serve: senza, su un
   monitor da 1920 la casella di ricerca diventa larga settecento pixel e un
   negozio che vende Baxter finisce con l'aria di un motore di ricerca.

   `justify-content: flex-end` decide dove finisce l'avanzo che resta dopo il
   limite: a SINISTRA del campo, cioe' fra il logo e la ricerca, dove si legge
   come respiro. A destra si leggeva come buco, perche' spezzava in due un
   gruppo di comandi che l'occhio si aspetta unito.

   `min-width: 0` batte `.ps-searchbar{min-width:19rem}` di theme.css — che
   fortunatamente non e' `!important` — ed e' cio' che permette al campo di
   stringersi invece di far andare a capo la riga a 768. Senza questa riga il
   `nowrap` qui sopra non risolverebbe il difetto: lo trasformerebbe in uno
   sfondamento orizzontale della pagina, che e' peggio.
   ------------------------------------------------------------------ */
.header-bottom__row > #_desktop_ps_searchbar {
  justify-content: flex-end;
}

.header-bottom__row #ps_searchbar {
  flex: 1 1 auto;
  min-width: 0;
  max-width: 36rem;
}

/* ------------------------------------------------------------------
   LO SLOT DELLE UTILITIES: dove sta, riga per riga.

   Il contenitore lo emette `_partials/header/utilities.tpl` (caso 2: topbar
   accesa e non `default`). Ci esce cio' che il negozio aggancia a
   `displayGrHeaderUtilities`: lingua, valuta, e le voci di menu marcate
   «testata» — per esempio un pulsante «Prenota consulenza».

   `order: 98` e non `order-last` di Bootstrap: quello vale `order: 6
   !important` e arriva dal livello `utilities`, l'ultimo dichiarato, quindi
   una volta messo non si sposta piu' senza rilanciare con un `!important`.
   Qui invece il numero dice cosa significa: la ricerca sta a `order: 1` e
   Accedi/carrello a `order: 99` (entrambi `!important`, per ID, in theme.css),
   e 98 e' l'unico posto fra i due.
   ------------------------------------------------------------------ */
/* `order: 100` e non 98, cioe' DOPO le azioni (che theme.css porta a 99) e non
   in mezzo fra ricerca e «Accedi».
   Il 98 metteva il pulsante fra i due gruppi sopra i 992 e su una riga propria
   in fondo sotto i 992: due posizioni diverse per lo stesso elemento, e siccome
   il tabulatore segue il documento e non lo schermo, una delle due era per
   forza sbagliata. Con 100 a tutte le larghezze — e l'include spostato in coda
   in main.tpl — le due sequenze coincidono ovunque. */
.header-bottom__row > .header-bottom__utilities {
  order: 100;
  flex: 0 0 auto;
}

/* Sotto i 992 il pulsante nella riga non ci sta piu': alle spalle ha una
   ricerca che a 992 dispone di poco meno di trecento pixel, e togliergliene
   centosessanta la renderebbe inservibile. Invece di nasconderlo — cioe' di
   perdere l'invito all'azione proprio dove sta meta' del traffico — prende una
   riga tutta sua, sotto.

   `order: 100` e non 98: dev'essere DOPO Accedi e il carrello (99), o la riga
   piena si infilerebbe fra la ricerca e le azioni e spingerebbe quelle su una
   terza riga. E' esattamente il difetto da cui si viene, al contrario.

   `flex: 1 0 100%` e' anche cio' che fa scattare il capo: e' l'unico elemento
   della riga a cui e' concesso, ed e' per questo che il capo sotto i 992 e'
   una riga in piu' voluta e non un carrello che scivola via. */
@media (max-width: 991.98px) {
  .header-bottom__row > .header-bottom__utilities {
    order: 100;
    flex: 1 0 100%;
    justify-content: center;
    margin-top: 0.5rem;
  }
}

.header-bottom__row > .gr-megamenu {
  flex: 1 0 100%;
  max-width: 100%;
  margin-top: 0.25rem;
  border-top: 1px solid var(--filetto, rgba(0, 0, 0, 0.12));
}

/* ------------------------------------------------------------------
   LA TESTATA COMPATTA COMINCIA A 992, NON A 768.

   Il tema ha DUE testate complete e le scambia con le classi `d-md-*` che i
   moduli si portano dietro: quella estesa (campo di ricerca aperto, «Accedi»
   e «Carrello» con la scritta) e quella compatta (hamburger e tre icone).
   Lo scambio avveniva a 768, e fra 768 e 991 quella estesa NON CI STA.

   Il conto, misurato a 768 in modalita' chiara: marchio 195 + ricerca 378 +
   Accedi 111 = 684 su 716 disponibili. Il carrello chiede 134 e non ne restano
   che 32: andava a capo DA SOLO, all'estrema sinistra sotto il marchio, con la
   testata alta 263px invece di 58. Lo stesso a 820 e 834, cioe' le larghezze
   degli iPad in verticale, e di ogni finestra affiancata a meta' schermo.

   Non e' il carrello a spingere: e' la ricerca, che ha `flex: 1 1 auto` e si
   prende l'avanzo. Appena il carrello va a capo, il campo si allarga a
   riempire il buco che ha lasciato — ed e' per questo che guardando la prima
   riga sembra tutto in ordine.

   PERCHE' QUESTO DIFETTO ERA SFUGGITO A UN COLLAUDO CHE DICHIARAVA DI AVERLO
   CORRETTO: la prova era stata fatta con la preferenza di sistema in modo
   scuro. Finche' il tema scambiava il file del marchio su
   `prefers-color-scheme` (vedi la nota a meta' foglio, quello scambio e' stato
   tolto), in scuro veniva servito un marchio largo 89px invece di 170 —
   ottantun pixel, esattamente quelli che mancavano al carrello. In scuro la
   testata stava su una riga sola e i numeri tornavano. Il difetto viveva solo
   in chiaro, cioe' nel modo in cui il sito lo vedono tutti.

   Si scavalca il `display` delle classi dei moduli e non si toccano i loro
   modelli: quei file non sono del tema, e un tema che riscrive i template dei
   moduli per spostare un punto di rottura e' un tema che va rifatto a ogni
   aggiornamento dei moduli.

   QUESTO BLOCCO STA DENTRO `@layer gr-modules` MENTRE TUTTO CIO' CHE LO
   CIRCONDA STA FUORI DAI LIVELLI, e non e' una svista: e' l'unico modo in cui
   funziona.

   Il documento dichiara
     @layer vendors, bs-base, …, gr-layouts, gr-modules, utilities;
   e le classi `d-md-flex` / `d-md-none` di Bootstrap vivono nell'ultimo,
   `utilities`, con `!important`.

   Per le dichiarazioni NORMALI una regola fuori dai livelli batte qualunque
   livello — ed e' la ragione per cui il resto di questo blocco sta fuori. Per
   le dichiarazioni `!important` l'ordine si ROVESCIA: vince il livello piu' a
   sinistra, e una regola fuori dai livelli perde contro TUTTE quelle dentro un
   livello. Scritta fuori, `display: none !important` non arrivava: a 768 la
   testata estesa restava accesa e il carrello continuava ad andare a capo,
   mentre il foglio servito conteneva la regola giusta. Sono i due minuti in cui
   si accusa la cache di un difetto che e' di cascata.

   `gr-modules` viene prima di `utilities`, quindi qui l'`!important` vince.
   Qualunque livello andrebbe bene: l'importante e' che non sia nessuno.
   ------------------------------------------------------------------ */
@layer gr-modules {
@media (max-width: 991.98px) {
  .header-bottom__row > #_desktop_ps_searchbar,
  .header-bottom__row > #_desktop_ps_customersignin,
  .header-bottom__row > #_desktop_ps_shoppingcart {
    display: none !important;
  }

  .header-bottom__row > .ps-searchbar--mobile,
  .header-bottom__row > #_mobile_ps_customersignin,
  .header-bottom__row > #_mobile_ps_shoppingcart {
    display: flex !important;
  }

  /* La fascia orizzontale sparisce insieme alla testata estesa: sotto i 992 le
     sue tendine erano gia' spente, quindi restava un elenco che scorreva di
     lato mostrando tre voci su nove — e su un telefono la barra di scorrimento
     ha altezza reale ZERO, quindi non dava nemmeno l'indizio di poter scorrere.
     Le nove voci e le loro centonovantuno sottovoci stanno ora nel pannello che
     apre l'hamburger. Due navigazioni sovrapposte erano il difetto, non la
     ridondanza utile. */
  .header__nav-strip {
    display: none;
  }
}
}

/* ------------------------------------------------------------------
   IL CAMPO DI RICERCA PARLA LA LINGUA DELLA TESTATA — SENZA PERDERE IL
   CONTRASTO CHE GLI SERVE.

   Il difetto segnalato era vero: il bordo calcolato, `1px solid #767d87`, e'
   un grigio-ardesia FREDDO, l'unico oggetto freddo di una tavolozza calda, e
   sul campo piu' grande della riga (il 45% della misura). La testata di un
   negozio che vende Baxter sembrava un pannello di amministrazione.

   La correzione proposta — dargli lo stesso `--filetto` di tutte le altre
   linee della testata — E' SBAGLIATA, e vale la pena scrivere perche', perche'
   e' una trappola che sembra buon gusto. Quel colore non e' capitato li': in
   theme.css c'e'
       .form-check-input,.form-control,.form-select{border-color:#767d87!important}
   e #767d87 sul fondo #F7F5F3 fa 3,82:1, cioe' supera il minimo di 3:1 che le
   WCAG 1.4.11 chiedono per il CONTORNO di un elemento interattivo. `--filetto`
   e' rgba(23,18,15,0.12) e fa 1,28:1: va benissimo per una linea decorativa e
   non e' ammissibile per il bordo di un campo. Uniformare avrebbe reso la
   testata piu' bella e il campo meno accessibile — e nessuno se ne sarebbe
   accorto guardandola.

   Si tiene quindi il contrasto e si cambia la TEMPERATURA: l'inchiostro del
   tema a meta' forza. E' rgba(23,18,15,0.5), che composito sul fondo da'
   3,45:1 — sopra la soglia con margine — ed e' letteralmente lo stesso colore
   del testo che gli sta intorno, quindi appartiene alla tavolozza invece di
   litigarci.

   `color-mix` e non un valore scritto a mano: il giorno che cambia `--testo`
   cambia anche questo, ed e' come il tema tratta gia' le altre tinte derivate.

   `!important` E DENTRO UN LIVELLO. La regola da battere ne ha uno, e per le
   dichiarazioni `!important` l'ordine dei livelli si rovescia: cio' che sta
   FUORI dai livelli perde contro tutto. E' esattamente il verso opposto delle
   dichiarazioni normali, ed e' il motivo per cui in questo stesso foglio ci
   sono regole della testata dentro e fuori dai livelli senza che sia una
   contraddizione.
   ------------------------------------------------------------------ */
@layer gr-base {
  .header-bottom__row #gr-search-input {
    border-color: color-mix(in srgb, var(--testo, #17120f) 50%, transparent) !important;
  }

  /* Al passaggio e alla messa a fuoco il bordo si scalda ancora invece di
     raffreddarsi: e' l'unico momento in cui il campo deve farsi notare, e lo fa
     col colore d'accento del negozio. Il contorno di messa a fuoco NON si
     tocca: quello e' accessibilita', non decorazione. */
  .header-bottom__row #gr-search-input:hover {
    border-color: color-mix(in srgb, var(--testo, #17120f) 70%, transparent) !important;
  }

  .header-bottom__row #gr-search-input:focus {
    border-color: var(--accento, currentColor) !important;
    box-shadow: none;
  }
}

/* ------------------------------------------------------------------
   UN FILETTO SOLO FRA LA RIGA DEL MARCHIO E LA FASCIA DEL MENU.

   Ce n'erano due, appoggiati uno all'altro: `.header-bottom` porta
   `border-bottom: 1px` che finisce a y=111, e `.header__nav-strip` porta
   `border-top: 1px` che comincia a y=112. Il risultato e' una riga da due
   pixel, in una testata dove tutti gli altri filetti sono da uno — quello
   sotto la topbar, quello sotto il menu. Nei primi duecento pixel di pagina
   c'erano quattro righe orizzontali e proprio quella sotto il marchio era
   l'unica di spessore diverso: si legge come una sbavatura, non come una
   scelta.

   Si toglie quello della fascia e non quello della riga: `.header-bottom`
   chiude la riga del marchio anche quando la fascia non c'e' — sotto i 992 e'
   spenta, e su un tema senza menu non esiste affatto. Togliere il suo
   lascerebbe la testata senza chiusura in quei casi.

   E il filetto che resta smette di essere freddo. `--gr-line-soft` e' #eef0f3,
   un grigio azzurrato, mentre ogni altra linea usa `--filetto`
   rgba(23,18,15,0.12), che e' l'inchiostro del negozio diluito. Due grigi di
   temperatura diversa a dieci pixel l'uno dall'altro si notano anche senza
   saperli nominare.
   ------------------------------------------------------------------ */
header .header__nav-strip {
  border-top: 0;
  border-bottom-color: var(--filetto, rgba(0, 0, 0, 0.12));
}

/* ------------------------------------------------------------------
   LA STRISCIA DELLE PROMESSE ENTRA NELLA MISURA DEL SITO.

   Era l'ultima fascia rimasta fuori: `padding-inline: 16px`, `max-width: none`,
   quindi il suo contenuto si posava dove capitava. Scarto misurato fra il primo
   inchiostro della striscia e il bordo interno della testata: -177px a 1920,
   +123 a 1200, +152 a 768. Nemmeno una volta sulla misura. E siccome sta
   incollata sotto la fascia del menu, con un fondo suo e un filetto, l'occhio
   la legge come la quarta banda della testata e la confronta col marchio.

   IL FONDO RESTA A TUTTA LARGHEZZA — e' una banda, deve arrivare ai bordi — ma
   il CONTENUTO no. Il rientro si calcola invece di essere scritto:
   `(100% - var(--dentro)) / 2` e' quanto serve per centrare una colonna larga
   `--dentro` dentro la finestra, e `max()` col `--gutter` garantisce il
   respiro minimo quando la finestra e' piu' stretta della misura. E' lo stesso
   risultato di un contenitore interno, senza aggiungere un elemento e senza
   toccare l'HTML che sta in configurazione.

   Le quattro promesse restano CENTRATE dentro quella colonna e non allineate a
   sinistra: insieme sono piu' larghe di 1240px e vanno a capo comunque, e con
   `space-between` la seconda riga — che porta una promessa sola — se ne
   andrebbe a sbattere contro un bordo. Centrate, le due righe si leggono come
   una banda voluta. Il primo inchiostro percio' non coincide col marchio: a
   coincidere e' la COLONNA, che e' quello che mancava.

   Se un domani si accorciano i quattro testi fino a farli stare in una riga
   sola, allora `justify-content: space-between` diventa la scelta giusta e i
   due bordi combaciano al pixel con la testata. Oggi no.
   ------------------------------------------------------------------ */
.gr-home-usp-strip {
  /* La colonna del sito: fondo a tutta larghezza, contenuto in misura.
     Il rientro si calcola invece di essere scritto — vedi la nota qui sopra. */
  padding-inline: max(var(--gutter, 1.25rem), (100% - var(--dentro, 1240px)) / 2);

  /* QUATTRO COLONNE, e non piu' quattro blocchi in fila che vanno a capo.
     Con `flex-wrap` le promesse si spezzavano dove capitava: tre sulla prima
     riga e una sola sulla seconda, centrata sotto il nulla. Sembrava un testo
     andato a capo per sbaglio, non una fascia di garanzie. Con la griglia le
     quattro colonne sono uguali per costruzione, a qualunque lunghezza dei
     testi. */
  display: grid;
  grid-template-columns: repeat(4, minmax(0, 1fr));
  gap: 1.5rem 2rem;
  align-items: start;
  padding-block: 1.75rem;
}

/* Due colonne sul tablet e una sul telefono. Non tre: con quattro promesse,
   tre colonne lasciano l'ultima da sola su una riga — lo stesso difetto di
   prima, con un numero diverso. */
@media (max-width: 61.99rem) {
  .gr-home-usp-strip {
    grid-template-columns: repeat(2, minmax(0, 1fr));
  }
}

@media (max-width: 35.99rem) {
  .gr-home-usp-strip {
    grid-template-columns: minmax(0, 1fr);
    gap: 1.25rem;
  }
}

/* Ogni promessa e' una colonna: l'etichetta sopra, la spiegazione sotto.
   Erano sulla stessa riga separate da un trattino — che e' cio' che si fa
   quando non si ha una colonna a disposizione. */
.gr-home-usp-strip .gr-usp {
  display: flex;
  flex-direction: column;
  gap: 0.3rem;
  text-align: center;
}

/* Si aggancia l'ELEMENTO e non una classe: il depuratore HTML del modulo
   ammette la classe solo su `div` e `span`, e su `<strong>` la toglie in
   silenzio. Una classe scritta li' arriverebbe nel contenuto e non in pagina,
   e il foglio sembrerebbe non funzionare. */
.gr-home-usp-strip .gr-usp > strong {
  font-size: 0.875rem;
  font-weight: 600;
  line-height: 1.3;
  color: var(--testo, inherit);
}

/* Il dettaglio piu' piccolo e piu' spento: si legge dopo l'etichetta, non
   insieme. Prima erano lo stesso corpo e lo stesso colore, quindi la fascia
   era un blocco di testo uniforme in cui non si capiva dove guardare. */
.gr-home-usp-strip .gr-usp__testo {
  font-size: 0.8125rem;
  line-height: 1.45;
  color: var(--testo-tenue, inherit);
}

/* ------------------------------------------------------------------
   LA STRISCIA VA SOTTO L'APERTURA, NON SOPRA.

   Il modello la rende PRIMA dei blocchi della home (`index.tpl`, fuori dai
   `{block}` per non farsela spostare dall'ereditarieta' di Smarty), quindi nel
   documento e' il primo figlio e finiva incastrata fra la testata e la
   fotografia: quattro righe di testo minuto prima di aver visto un solo
   divano.

   Non si sposta nel modello: li' sta prima del `{hook h='displayHome'}` e
   metterla dopo la manderebbe in FONDO alla pagina, dopo tutte le sezioni.
   Per infilarla fra la prima e la seconda bisognerebbe spezzare l'uscita
   dell'hook, che non si puo'.

   Si sposta invece con l'ordine, e costa tre righe perche' `#content` e' gia'
   una griglia: le sue sezioni sono gia' elementi di griglia e `order` vale
   senza cambiare niente della disposizione. L'ordine predefinito e' 3 per
   tutti, l'apertura passa a 1 e la striscia a 2 — le due regole con la classe
   battono quella con l'asterisco per specificita', quindi l'ordine in cui
   sono scritte non conta.
   ------------------------------------------------------------------ */
.page-content--home > * {
  order: 3;
}

.page-content--home > .gr-blocco--slider {
  order: 1;
}

.page-content--home > .gr-home-usp-strip {
  order: 2;
}


/* ============================================================
   LA TESTATA COME QUELLA DELL'ORIGINALE — QUATTRO FASCE SU FONDO SCURO
   ============================================================

   Misurato su https://www.idainterni.com/ a 1366 (viewport utile 1351):

     0 ->  37  fascia rossa  #851316  «Registrati alla newsletter ... 10%» + REGISTRATI
    37 ->  74  fascia nera   rgb(17,17,17)  Spedizioni · Chi siamo · Contattaci · Lista dei desideri
    74 -> 175  riga del marchio, logo 157x70 a x=56, ricerca 586 CENTRATA, azioni a destra
   175 -> 225  barra del menu, larga 1240 a x=56, DIECI voci, la decima rossa larga 200

   La testata intera e' scura: `rgba(51,51,51,0.8)` sopra la fotografia della
   home, `rgb(51,51,51)` PIENO su ogni altra pagina — misurato su
   /illuminazione/, dove `#header` e' `position: relative` e il fondo non e'
   piu' translucido. E' per questo che le voci di menu dell'originale sono
   bianche: non e' una scelta sul menu, e' una conseguenza del fondo.

   PERCHE' QUESTO BLOCCO STA FUORI DAI LIVELLI: vale la nota del blocco della
   riga alta piu' sopra. Le regole da battere stanno in `ps-base`
   (`.header{background-color:var(--bs-body-bg)}`), in `gr-layouts`
   (`.header__nav-strip{background-color:var(--gr-paper)}`) e in `gr-modules`
   (`.header-top__html{color:var(--gr-mute)}`), e nessuna di loro e'
   `!important`: per le dichiarazioni NORMALI cio' che sta fuori dai livelli
   vince su tutto. Dove invece serve battere un `!important` di theme.css la
   regola va DENTRO un livello anteriore — e' il caso del bordo del campo di
   ricerca, che resta dov'era.

   E sta IN CODA AL FOGLIO di proposito: le regole della testata scritte piu'
   sopra sono anch'esse fuori dai livelli, quindi a pari specificita' decide
   l'ordine. Qui si arriva per ultimi e si vince senza alzare la specificita'
   di ogni selettore.
   ============================================================ */

header.header {
  /* Il grigio scuro della testata. NON e' `#333333` letterale: e' l'inchiostro
     del negozio schiarito del 15% con la sua carta. Il conto e' stato fatto,
     non stimato — l'originale sta a L* 21,3 (#333333) e questo a L* 22,1
     (rgb(57,52,49)): otto decimi di L* di scarto, invisibili — ma questo e'
     CALDO come tutto il resto della tavolozza, mentre #333333 e' un grigio
     neutro. La testata e' la superficie piu' grande del sito dopo la pagina: un
     grigio freddo li' sopra si nota anche senza saperlo nominare. E' lo stesso
     ragionamento gia' scritto per il bordo del campo di ricerca.
     Bianco su questo fondo: 12,29:1 (l'originale, con #333333, fa 12,63:1). */
  --testata-fondo: color-mix(in srgb, var(--scuro-fondo, #17120F) 85%, var(--fondo, #F7F5F3));

  /* L'inchiostro della testata e' la carta del negozio, non il bianco puro:
     11,30:1 sul fondo qui sopra — misurato sul servito, non stimato: e' AAA
     con margine, e appartiene alla tavolozza invece di essere un colore in
     piu'. */
  --testata-inchiostro: var(--scuro-testo, #F2EEEA);

  /* Il rosso del marchio su un fondo scuro NON e' `--accento`: #851316 sul
     grigio della testata fa 1,23:1 e come segno sottile — un filetto, un
     contorno di messa a fuoco — semplicemente non esiste. `--rosso-su-scuro`
     e' la variante che il registro dei colori tiene apposta per questo caso e
     fa 3,22:1, sopra il 3:1 che le WCAG 1.4.11 chiedono a un indicatore non
     testuale.
     Il BLOCCO pieno della consulenza resta invece #851316, come l'originale:
     li' il contrasto che conta e' quello del testo bianco DENTRO il blocco
     (9,99:1), e la separazione dal fondo la fa la tinta, non la luminanza —
     esattamente come sull'originale, dove quel blocco fa 1,35:1 col fondo. */
  --testata-accento: var(--accento);

  /* La stessa misura ai due lati della riga del marchio: e' cosi' che
     l'originale ottiene la ricerca centrata nella FINESTRA e non a meta'
     strada fra i suoi vicini. Li' le due colonne laterali sono entrambe larghe
     254px; qui 254px e' la larghezza che prendono davvero «Accedi» (116) e il
     carrello (138) — misurata sul servito, non scelta. Se un domani
     l'etichetta del carrello si allunga, la ricerca si sposta a sinistra della
     differenza: e' il prezzo di centrare con i flexbox invece che con una
     griglia, ed e' scritto qui perche' si sappia dove guardare. */
  --testata-lato: 15.875rem;

  /* 50px: l'altezza della barra del menu dell'originale. */
  --testata-fascia: 3.125rem;

  background-color: var(--testata-fondo);
  color: var(--testata-inchiostro);
}

/* Il contorno di messa a fuoco dentro la testata cambia colore e basta: la
   regola generale (`@layer gr-base`) usa `--accento`, che qui sparisce. */
header.header :focus-visible {
  outline-color: var(--testata-accento);
}

/* ------------------------------------------------------------------
   FASCE 1 E 2 — le due bande sottili sopra il marchio.

   Vivono tutte e due dentro `.header-top`, che e' la zona che grthemekit
   sa configurare (`GR_THEMEKIT_TOPBAR_*`). La zona porta il fondo quasi
   nero — cosi' una topbar qualunque, anche di un altro negozio che non
   conosce queste classi, e' comunque la fascia scura — e il primo figlio
   marcato `__avviso` si ridipinge di rosso sopra.

   E' un cancello che si apre da solo: se domani si toglie l'avviso resta la
   fascia scura, se si tolgono le classi resta una fascia scura sola. Nessuna
   configurazione produce una testata rotta.
   ------------------------------------------------------------------ */
header .header-top {
  background: var(--scuro-fondo, #17120F);
  color: var(--testata-inchiostro);
  padding: 0;
  border-bottom: 0;
}

/* Testo nudo (nessun `<div>` dentro il valore): il rientro se lo prende il
   contenitore. E' il caso di chi scrive una frase e basta. */
header .header-top__html {
  display: block;
  min-height: 0;
  color: inherit;
  font-size: 0.8125rem;
  padding-inline: max(var(--gutter, 1.25rem), (100% - var(--dentro, 1240px)) / 2);
  padding-block: 0.5rem;
}

/* Fasce vere (uno o piu' `<div>` dentro il valore): il rientro passa ai figli,
   cosi' il FONDO di ciascuna arriva ai bordi della finestra e il contenuto
   resta sulla misura del sito. Senza questa riga il contenitore rientrerebbe
   anche lui e le fasce sarebbero due rettangoli larghi 1240 in mezzo a niente.
   `:has()` e' sostenuto da tutti i browser in corso; dove mancasse, l'unico
   effetto e' un rientro doppio — una fascia piu' stretta, non una testata
   rotta. */
header .header-top__html:has(> div) {
  padding: 0;
}

header .header-top__html > div {
  display: flex;
  flex-wrap: wrap;
  align-items: center;
  gap: 0.25rem 1.25rem;
  min-height: 2.3125rem; /* 37px, come le due fasce dell'originale */
  padding-block: 0.25rem;
  padding-inline: max(var(--gutter, 1.25rem), (100% - var(--dentro, 1240px)) / 2);
}

/* Fascia 1 — l'avviso rosso. Centrato, come l'originale. */
header .header-top__avviso {
  justify-content: center;
  text-align: center;
  font-size: 1rem;
  background: var(--accento-fondo);
  color: var(--accento-testo, #FFFFFF);
}

/* Il richiamo dentro l'avviso e' una pastiglia chiara su fondo rosso, come
   sull'originale. Li' il testo della pastiglia e' rgb(119,119,119) su bianco,
   che fa 4,48:1 — due centesimi sotto la soglia AA di 4,5. Qui e' l'inchiostro
   del negozio sulla sua carta: 17,09:1. Stessa forma, contrasto che passa. */
header .header-top__avviso a {
  padding: 0.25rem 1rem;
  border-radius: 2px;
  font-size: 1rem;
  /* 21px di riga, come l'originale: la pastiglia esce alta 29 e la fascia 37.
     Con l'interlinea del corpo (1,55) sarebbero 30 e 38, e la testata intera
     due pixel piu' alta dei 225 dell'originale invece di uno. */
  line-height: 1.3125;
  text-transform: uppercase;
  text-decoration: none;
  white-space: nowrap;
  background: var(--fondo, #F7F5F3);
  color: var(--testo, #17120F);
  transition: background-color 0.18s ease;
}

header .header-top__avviso a:hover,
header .header-top__avviso a:focus-visible {
  background: var(--fondo-alt, #EDE9E5);
}

/* Fascia 2 — i servizi. Allineati a sinistra come sull'originale, dove
   «Spedizioni», «Chi siamo» e «Contattaci» partono dal bordo interno della
   misura con circa 20px di stacco l'uno dall'altro (56 -> 146 -> 234). */
header .header-top__servizi {
  justify-content: flex-start;
  font-size: 0.8125rem;
}

header .header-top__servizi a {
  color: inherit;
  text-decoration: none;
  transition: color 0.18s ease;
}

header .header-top__servizi a:hover,
header .header-top__servizi a:focus-visible {
  color: var(--testata-accento);
  text-decoration: underline;
}

/* ------------------------------------------------------------------
   FASCIA 3 — la riga del marchio.

   Niente fondo proprio e niente filetto in basso: dalla riga del marchio alla
   barra del menu l'originale ha UNA SOLA superficie continua, e ogni linea
   disegnata li' in mezzo la spezza in due.

   Questo NON riapre il difetto del doppio filetto corretto piu' sopra — due
   bordi da 1px appoggiati uno all'altro che facevano una riga da 2px in una
   testata dove tutte le altre erano da 1. Li' il rimedio era «uno solo»;
   qui non ce n'e' nessuno perche' non c'e' piu' niente da separare: sopra e
   sotto il confine il colore e' lo stesso. Un filetto in una superficie
   monocroma o non si vede, o si vede e allora e' un errore. */
header .header-bottom {
  background: transparent;
  border-bottom: 0;
  padding: 0;
}

header .header-bottom__container {
  /* 16px sopra e sotto un marchio alto 70 fanno una riga di 102px. Sommata
     alle due fasce da 37 e alla barra da 50 la testata misura 226px, contro i
     225 dell'originale: un pixel, che viene dall'avere reso simmetrico un
     respiro che li' e' 25 sopra e 6 sotto (la loro barra del menu risale di 19
     pixel dentro la riga). Un pixel di differenza in cambio di una riga che
     non e' storta. */
  padding-block: 1rem;
}

header .header-bottom__row {
  align-items: center;
}

/* Il marchio bianco, e non per il tema scuro: per il FONDO scuro.
   `marchio-su-scuro.png` e' 236x102 — inchiostro medio 246,6 su 255, cioe'
   bianco — e a 70px di altezza esce largo 162. Il file per fondi chiari e'
   395x92, inchiostro medio 43,9: su questa testata sarebbe nero su quasi nero.
   I nomi dei due file dicono il FONDO su cui vanno, ed e' esattamente il caso
   d'uso per cui il tema ne tiene due.

   Le regole generali stanno in `@layer gr-components` e valgono per il marchio
   su fondo chiaro: queste, fuori dai livelli, valgono qui e non le disfano
   altrove. Non c'entrano nulla con `prefers-color-scheme`, il cui scambio
   resta tolto: li' il fondo restava chiaro e il marchio spariva. Qui il fondo
   e' scuro davvero. */
header .header-bottom__logo .gr-logo__su-chiaro {
  display: none;
}

header .header-bottom__logo .gr-logo__su-scuro {
  display: block;
  height: 2.75rem;
}

/* ------------------------------------------------------------------
   AZIONI: «Accedi», il carrello, l'hamburger.

   Su una testata scura devono essere chiari, e theme.css li vuole del colore
   del corpo (`--bs-body-color`) dentro `ps-components` e `gr-layouts`. Nessuna
   di quelle dichiarazioni e' `!important`, quindi qui fuori si vince.

   Il colore di riposo e' l'inchiostro della testata all'88%, che composito sul
   fondo da' 9,16:1 — ben oltre i 4,5 richiesti — e lascia al passaggio del
   mouse un gradino da percorrere (11,30:1 a pieno). Al passaggio si arriva al pieno, non all'accento: l'accento del
   negozio su questo fondo fa 1,23:1 e un collegamento che al passaggio SPARISCE
   e' peggio di uno che non reagisce.
   ------------------------------------------------------------------ */
header .header-bottom__row .header-block__action-btn,
header .header-bottom__row .header-block__action-btn .header-block__icon,
header .header-bottom__row .header-block__title,
header .header-bottom__menu-toggle .menu-toggle {
  color: color-mix(in srgb, var(--testata-inchiostro) 88%, transparent);
  transition: color 0.18s ease;
}

header .header-bottom__row .header-block__action-btn:hover,
header .header-bottom__row .header-block__action-btn:hover .header-block__icon,
header .header-bottom__row .header-block__action-btn:focus-visible,
header .header-bottom__menu-toggle .menu-toggle:hover {
  color: var(--testata-inchiostro);
}

/* Il gettone del carrello: pastiglia chiara con la cifra scura.
   theme.css sopra i 768 gli da' `background: var(--bs-tertiary-bg)` e
   `color: inherit`, cioe' un grigio chiarissimo con sopra il colore ereditato
   — che qui e' chiaro: la cifra sparirebbe dentro la pastiglia. In rosso
   d'accento non va nemmeno: #851316 sul fondo della testata fa 1,23:1 e la
   pastiglia non si vedrebbe come forma. Chiara su scuro fa 10,6:1. */
header .header-bottom__row .header-block__badge {
  background: var(--testata-inchiostro);
  color: var(--testata-fondo);
}

/* ------------------------------------------------------------------
   LA RICERCA AL CENTRO, larga 586 come l'originale.

   L'originale mette logo e azioni in due colonne larghe uguali (254px
   ciascuna) e la ricerca in mezzo: e' quell'uguaglianza — non un centraggio
   dichiarato — a far cadere il campo esattamente a meta' della finestra. Qui
   si fa lo stesso, dando alla colonna del marchio la larghezza minima che le
   azioni prendono davvero.

   Sotto i 1200 la larghezza minima si toglie: li' i pixel servono al campo di
   ricerca piu' di quanto serva la simmetria, e la ricerca si centra fra i suoi
   vicini invece che nella finestra.

   La regola `justify-content: flex-end` scritta piu' sopra — che spingeva
   l'avanzo a sinistra del campo — vale ancora sotto i 992, dove la simmetria
   non c'e'. Qui viene scavalcata da un selettore piu' specifico, non
   cancellata: sotto i 992 la riga cambia forma e quella scelta li' e' ancora
   quella giusta.
   ------------------------------------------------------------------ */
@media (min-width: 992px) {
  /* 52px e non i 70 dell'originale, ed e' una differenza voluta.
     Il logo dell'originale e' un disegno COMPATTO (157x70, rapporto 2,24): a
     70px di altezza occupa 157 di larghezza. Il nostro e' il lockup disteso
     (395x92, rapporto 4,29) e alla stessa altezza ne occupava 301 — quasi il
     doppio, con la ricerca spinta di venti pixel fuori centro e una testata
     che si mangiava la pagina. A 52px il lockup esce largo 223, cioe' un
     ingombro paragonabile a quello dell'originale con la stessa grafica.
     Fedelta' non vuol dire copiare il numero: vuol dire ottenere lo stesso
     effetto con il materiale che si ha. */
  header .header-bottom__logo .gr-logo__su-scuro {
    height: 3.25rem; /* 52px */
  }

  header .header-bottom__row > #_desktop_ps_searchbar {
    justify-content: center;
  }

  header .header-bottom__row #ps_searchbar {
    max-width: 36.625rem; /* 586px */
    margin-inline: auto;
  }

  /* 49px come l'originale. L'icona della lente e il bottone di pulizia sono
     ancorati a `top: 50%` con `translateY(-50%)`: seguono l'altezza da soli. */
  header .header-bottom__row #gr-search-input {
    min-height: 3.0625rem;
  }
}

@media (min-width: 1200px) {
  header .header-bottom__row > .header-bottom__logo {
    flex: 0 0 auto;
    min-width: var(--testata-lato);
  }
}

/* ------------------------------------------------------------------
   FASCIA 4 — la barra del menu.

   Nessun fondo e nessun filetto: e' la stessa superficie della riga sopra.
   ------------------------------------------------------------------ */
header .header__nav-strip {
  background: transparent;
  border: 0;
}

/* ------------------------------------------------------------------
   LE VOCI COME QUELLE DELL'ORIGINALE.

   Misurate sul suo `span.cbp-tab-title`, che e' dove sta il testo: Montserrat
   **700**, 14px, `text-transform: none`, `letter-spacing: normal`,
   `line-height: 14px`, bianco, dentro un collegamento con `padding: 0 15px` e
   `line-height: 50px`.

   IL PESO E' 700 E NON 400. Chi misura il `<a>` legge 400 — ma quel `<a>` ha
   `font-size: 0px` e non stampa nulla: tutto il testo visibile sta nello span.
   Il controllo indipendente e' la larghezza: «Blog» reso a 14px/700 misura
   33,9px e la voce dell'originale e' larga 64 = 33,9 + 15 + 15. A 400 sarebbe
   circa 31,5 e la voce 61,5. Le quattro voci con la tendina sono 16px piu'
   larghe delle altre: e' la freccetta, che qui non c'e'.

   Qui si scavalcano le scelte tipografiche del modulo — maiuscolo, 0.86rem,
   spaziatura 0.06em — e non si toccano nel modulo: quelle restano il suo
   comportamento per gli altri negozi, questa e' la voce di QUESTO negozio. Il
   foglio del modulo sta in `@layer gr-modules`; queste righe stanno fuori dai
   livelli e vincono senza alzare la specificita'.
   ------------------------------------------------------------------ */
header .gr-megamenu__voci {
  /* Zero: lo stacco fra le voci lo fa il `padding` dei collegamenti, come
     sull'originale. Sommare i due dava voci larghe il doppio del necessario e
     dieci voci in una barra dove ne stavano sei. */
  gap: 0;
}

header .gr-megamenu__collegamento {
  min-height: var(--testata-fascia);
  padding: 0 0.9375rem; /* 15px per lato, come l'originale */
  font-size: 0.875rem;  /* 14px */
  font-weight: 700;
  letter-spacing: normal;
  text-transform: none;
  color: var(--testata-inchiostro);
}

/* Il segno del passaggio e' un filetto sotto la voce. Il modulo lo colora con
   `--accento`, che su questo fondo fa 1,23:1 e non si vede: qui prende la
   variante chiara del rosso del marchio, 3,22:1, sopra il 3:1 che le WCAG
   chiedono a un indicatore non testuale. */
header .gr-megamenu__voce:hover > .gr-megamenu__collegamento,
header .gr-megamenu__voce:focus-within > .gr-megamenu__collegamento {
  border-bottom-color: var(--testata-accento);
}

/* La decima voce: «CONSULENZA INTERIOR DESIGN».
   Larga 200px fissi, testo centrato su due righe, fondo del rosso del marchio,
   in fondo alla barra. Sono i numeri dell'originale, dove quella voce misura
   esattamente 200px e la sua etichetta va a capo (28px di testo in una barra
   alta 50). Angoli vivi e non arrotondati: nella barra e' un BLOCCO che la
   riempie in altezza, non un pulsante appoggiato dentro. */
header .gr-megamenu__voce--evidenziata > .gr-megamenu__collegamento {
  width: 12.5rem;
  padding-inline: 0.9375rem;
  border-radius: 0;
}

/* Le tendine restano chiare, con il loro inchiostro: `megamenu.css` dichiara
   `background: var(--fondo)` e `color: var(--testo)` sul pannello, quindi il
   chiaro della testata non ci entra per eredita'. Questa riga e' una cintura:
   il colore del pannello non deve mai poter ereditare quello della barra. */
header .gr-megamenu__tendina {
  color: var(--testo, #17120F);
}

/* ------------------------------------------------------------------
   LE MISURE DELLE VOCI SCENDONO CON LA FINESTRA — e questo e' il punto in cui
   si migliora l'originale invece di copiarlo.

   Il conto, con i testi di questo negozio resi a 14px/700 (misurati uno per
   uno su tela: 79,5 + 98,1 + 99,4 + 50,6 + 61,4 + 44,3 + 66,4 + 60,1 + 33,9 =
   593,7) piu' 30px di respiro per voce piu' i 200 della consulenza:

     >=1300     15px per lato -> 863,7 + 200 = 1063,7 in 1182 a 1300        (118 di avanzo)
     1200-1299  10px          -> 773,7 + 200 =  973,7 in 1090 a 1200        (116 di avanzo)
     992-1199   8px e 12px    -> 652,9 + 200 =  852,9 in  899 a  992        ( 46 di avanzo)

   La soglia e' 1300 e non 1400 perche' li' sta quella dell'originale: a 1366
   di finestra il suo respiro e' ancora 15px, a 1280 e' gia' 10.

   L'originale scende da 15 a 10 pixel di respiro e li' si ferma: sotto i 1140
   le sue dieci voci non ci stanno piu', e siccome la decima e' `float: right`
   gli passa SOTTO — misurato 129px di sovrapposizione a 1024 e 145 a 992, con
   due etichette stampate una sull'altra. Il terzo gradino qui sotto e' cio'
   che evita di ereditare quel difetto insieme alla forma.

   Sotto i 992 la fascia e' spenta e il menu sta nel pannello dell'hamburger:
   li' non c'e' niente da far entrare.
   ------------------------------------------------------------------ */
@media (max-width: 1299.98px) {
  header .gr-megamenu__collegamento {
    padding-inline: 0.625rem; /* 10px, come l'originale sotto la sua soglia */
  }
}

@media (max-width: 1199.98px) {
  header .gr-megamenu__collegamento {
    padding-inline: 0.5rem;
    font-size: 0.75rem; /* 12px */
  }
}

/* ------------------------------------------------------------------
   LA STRISCIA DI GARANZIE DEL PIEDE.

   Queste quattro regole esistono nel `theme.css` COMPILATO in locale e NON in
   quello servito: la build sul server e' piu' vecchia di 1.245 byte, e la
   differenza e' esattamente questa striscia. Risultato misurato su ogni pagina
   del negozio: le quattro voci impilate in colonna, larghe 162px, appoggiate al
   bordo sinistro di un contenitore largo 1240. Doveva essere una riga
   orizzontale centrata.

   Non si e' rimediato pubblicando il compilato locale, che pure le contiene, e
   la ragione e' precisa: confrontando i selettori dei due file, al servito ne
   mancano quattro (queste) ma ne ha UNO che il locale non ha
   (`.gr-minicart__close, .gr-minicart__count`). Pubblicare la build locale
   avrebbe sistemato il piede e tolto una regola del mini-carrello — si
   scambiava un difetto con un altro, e per giunta in un file che si rigenera e
   che nessuno dovrebbe modificare a mano.

   Scritte qui, valgono comunque: `gr-sezioni.css` e' a mano, si pubblica in
   modo affidabile, e il giorno in cui sul server arrivera' una build
   aggiornata queste diranno la stessa cosa senza fare danno.
   ------------------------------------------------------------------ */
.footer__trust,
.gr-footer-trust {
  display: flex;

  /* `flex-direction: row` DICHIARATA, e non lasciata al valore predefinito.
     Il predefinito sarebbe gia' `row`, ma sul servito la direzione calcolata
     risultava `column` e le quattro garanzie stavano incolonnate: qualcosa
     nella cascata la impone a un elenco dentro il piede. Non e' stato cercato
     chi — l'introspezione dei fogli in questo ambiente da' falsi negativi e
     inseguirla sarebbe costato piu' di quanto valga — perche' il rimedio e' lo
     stesso in ogni caso: una fascia che DEVE essere una riga lo dice, invece
     di sperare di ereditarlo. */
  flex-direction: row;
  flex-wrap: wrap;
  align-items: center;
}

.gr-footer-trust {
  gap: 0.75rem 2.5rem;
  justify-content: center;
  width: 100%;
  margin: 0;
  padding: 0;
  list-style: none;
}

.gr-footer-trust__item {
  display: inline-flex;
  align-items: center;
  gap: 0.5rem;
  color: inherit;
}

.gr-footer-trust__label {
  font-size: 0.8125rem;
  line-height: 1.2;
  letter-spacing: 0.01em;
  white-space: nowrap;
}

/* ------------------------------------------------------------------
   IL NOME DEL PRODOTTO NELL'ELENCO DI CATEGORIA.

   E' la superficie piu' grande del negozio — ventiquattro schede per pagina su
   decine di categorie — ed era rimasta indietro rispetto a tutto il resto.

   Misurato sull'originale, /illuminazione/: il nome e' Montserrat **700** e
   **centrato**. Qui era **400** e allineato a sinistra, cioe' esattamente com'era
   prima che il negozio tornasse all'identita' del marchio: la correzione dei
   pesi aveva toccato i titoli di sezione e le fasce della home, e l'elenco di
   categoria non l'aveva guardato nessuno.

   Si cambiano DUE cose e non tre. Il corpo resta 13px: sull'originale l'ho
   letto 12,8px, ma quel valore si muove con la larghezza della finestra, e non
   vale la pena inseguire un decimo di pixel su una misura che cambia da sola.
   Peso e allineamento invece sono gli stessi a ogni larghezza, e sono i due che
   si vedono.

   NON si tocca la scheda della vetrina in home: `gr-vetrina.css` la porta a 600
   e centrata, ed e' giusto cosi' — sull'originale il carosello della home
   scrive i nomi in 600 e l'elenco di categoria in 700. Sono due contesti con
   due pesi, e lo erano gia' nel sito che stiamo continuando.
   ------------------------------------------------------------------ */
.product-miniature__title,
.product-miniature .product-title,
.product-miniature .product-title > a {
  font-weight: 700;
  text-align: center;
}


/* ------------------------------------------------------------------
   LE DUE FASCE SOTTILI SI RITRAGGONO QUANDO SI SCORRE.

   La testata e' appiccicata: senza questo, l'avviso rosso e i collegamenti di
   servizio restano in cima allo schermo per tutta la lettura, e sono due cose
   che si leggono una volta sola. Ritraendole, la testata scende da 208 pixel a
   122 e restituisce alla pagina la differenza — che su un portatile e' piu' di
   un decimo dell'altezza dello schermo.

   SI RITRAGGONO, NON SPARISCONO: `max-height` a zero con la transizione, non
   `display: none`. Cosi' il ritorno in cima le riporta con lo stesso movimento
   con cui se n'erano andate, invece di farle comparire di scatto.

   Lo stato di riposo — fasce VISIBILI — e' quello dichiarato qui, e la classe
   che le ritrae la aggiunge il JavaScript. Il verso conta: se lo script non
   parte, la testata resta intera. Il contrario — fasce nascoste per
   impostazione e mostrate dallo script — avrebbe fatto sparire l'offerta del
   10% su ogni browser in cui qualcosa fosse andato storto. In questo progetto
   e' gia' successo, con un pannello che si dichiarava aperto ed era invisibile:
   la visibilita' non si appende mai a qualcosa che puo' non succedere.

   `max-height: 10rem` e non l'altezza esatta: fra 768 e 991 la frase
   dell'offerta va a capo e la fascia rossa passa da 37 a 63 pixel. Un
   `max-height` piu' generoso del contenuto non cambia nulla a riposo e
   funziona a tutte le larghezze.
   ------------------------------------------------------------------ */
.header-top {
  overflow: hidden;
  max-height: 10rem;
  transition: max-height 0.26s ease, opacity 0.2s ease;
}

.header--scorsa .header-top {
  max-height: 0;
  opacity: 0;
}

@media (prefers-reduced-motion: reduce) {
  .header-top {
    transition: none;
  }
}

/* ==================================================================
   LA TESTATA SOPRA L'APERTURA, COME NELL'ORIGINALE — SOLO SULLA HOME.

   Misurato su https://www.idainterni.com/ : `<header>` e' `position: absolute;
   top: 0; z-index: 100` con fondo `rgba(51,51,51,0.8)`, e lo slider comincia a
   y=20 ed e' alto 868. La testata non spinge giu' la fotografia: ci sta sopra,
   e sotto il grigio translucido la fotografia si intravede.

   E NON e' tutta translucida, ed e' il dettaglio che rende il mestiere: le due
   fasce sottili — l'avviso rosso e i servizi — hanno fondo PIENO; a lasciar
   passare la fotografia sono la riga del marchio e la barra del menu, che di
   fondo proprio non ne hanno e mostrano quello della testata. La nostra
   testata e' costruita allo stesso modo, quindi basta velare `<header>`.

   PERCHE' SOLO SULLA HOME: sulle pagine interne dell'originale la testata e'
   scura PIENA e in flusso. Non c'e' niente da lasciar vedere sotto, e una
   testata trasparente sopra un testo lo renderebbe illeggibile.

   ------------------------------------------------------------------
   IL COMPORTAMENTO ALLO SCORRIMENTO

   A riposo la testata e' `absolute`: esce dal flusso, l'apertura sale a y=0 e
   la fotografia le passa sotto. Appena si scorre diventa `fixed` e il fondo si
   fa PIENO — perche' da li' in poi sotto non c'e' piu' una fotografia ma il
   testo della pagina, e un testo che scorre dietro un velo non si legge.

   Il passaggio non fa saltare niente: a scorrimento zero `absolute` con
   `top: 0` e `fixed` con `top: 0` disegnano nello stesso identico posto. Lo
   scatto sarebbe visibile solo se cambiasse anche la posizione, e non cambia.
   ================================================================== */
:root {
  /* Il fondo velato si ricava da quello pieno invece di essere una tinta
     nuova: il giorno che cambia la tavolozza, cambiano insieme. L'82% e'
     l'equivalente percettivo dello 0,8 dell'originale sul nostro fondo, che
     e' piu' caldo e un filo piu' chiaro del loro grigio neutro. */
  --testata-fondo-velato: color-mix(in srgb, var(--testata-fondo, #17120F) 82%, transparent);
}

body#index header.header {
  position: absolute;
  inset-inline: 0;
  top: 0;
  background-color: var(--testata-fondo-velato);
}

body#index header.header.header--scorsa {
  position: fixed;
  background-color: var(--testata-fondo);
}

/* L'apertura si prende la schermata, perche' adesso ne cede 221 pixel alla
   testata che le sta sopra. Restando alta 505 ne resterebbero 284 visibili:
   una striscia, non un'apertura. L'originale risolve lo stesso problema con
   una fotografia alta 868. */
body#index .gr-slider__diapositiva {
  min-height: clamp(26.25rem, 88vh, 51.25rem);
}

/* Il testo della diapositiva scende sotto la testata.
   Senza, il titolo — che e' centrato verticalmente nella diapositiva — finisce
   dietro la barra del menu, e si legge a meta'. Il rientro non e' un numero
   scritto a mano: e' l'altezza vera della testata, che `gr-testata.js` misura e
   pubblica, piu' un respiro. Il ripiego di 13,75rem serve al caso in cui lo
   script non parta: e' l'altezza della testata a riposo sul desktop. */
body#index .gr-slider__testo {
  padding-top: calc(var(--gr-altezza-testata, 13.75rem) + clamp(1.5rem, 3vw, 3rem));
}

/* ==================================================================
   I COLLEGAMENTI DEL PIEDE SI VEDONO.

   Misurato sul servito: `.footer__main li a` era `rgb(23,18,15)` su fondo
   `rgb(23,18,15)`. Contrasto 1,00 — nero su nero. Idem il copyright. I titoli
   delle colonne invece si vedevano, perche' per quelli una regola c'era.

   Il tema il piede scuro ce l'ha, completo, in `@layer gr-components`:
   `.gr-piede a { color: color-mix(--scuro-testo 78%, transparent) }` e le sue
   compagne. E c'e' perfino un commento, poche righe sopra, che descrive
   ESATTAMENTE questo difetto — «testo nero su fondo nero… non si nota
   rileggendo il CSS, si nota aprendo il sito». Il difetto e' arrivato lo
   stesso, e la ragione e' istruttiva.

   In `theme.css` convivono DUE piedi: uno scuro
   (`.footer__main{background:var(--bs-dark);color:var(--bs-gray-300)}` con
   `.footer-block a{color:var(--bs-gray-300)}`) e uno chiaro
   (`.footer__main{background:var(--gr-paper)}` con
   `.footer-block a{color:var(--gr-mute)}`), e vince il chiaro perche' viene
   dopo. Il fondo lo scurisce `.gr-piede`, i collegamenti restano agganciati al
   piede CHIARO, e `--gr-mute` e' un grigio pensato per la carta.

   E `.gr-piede a` non lo batte: le due regole hanno la STESSA specificita'
   (0,1,1), quindi decide il livello — e quella di theme.css sta in un livello
   successivo a `gr-components`. Contro un livello successivo la specificita'
   non serve: si puo' scrivere il selettore piu' lungo del mondo e perdere
   comunque.

   Percio' queste stanno FUORI dai livelli, dove una dichiarazione normale
   batte qualunque livello. Nessun `!important`: con l'`!important` l'ordine
   dei livelli si rovescia e fuori dai livelli si perderebbe contro tutti.
   ================================================================== */
.gr-piede a {
  color: color-mix(in srgb, var(--scuro-testo, #F7F5F3) 78%, transparent);
}

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

/* La riga di chiusura: copyright e note legali. Stesso difetto, stessa causa —
   il colore glielo dava una regola pensata per il fondo chiaro. Piu' spenta
   dei collegamenti perche' e' una nota, non una destinazione, ma sopra il
   minimo leggibile: `--scuro-testo` al 62% sul fondo del piede fa 8,2:1. */
.gr-piede .gr-chiusura,
.gr-piede .gr-chiusura p,
.gr-piede .gr-chiusura small {
  color: color-mix(in srgb, var(--scuro-testo, #F7F5F3) 62%, transparent);
}
