/* ═══════════════════════════════════════════════════════════════════════════
   SLIDE IN GAMES — il vestito, in un file solo
   v2.0 · agosto 2026 · riconciliazione di `design-tokens.css` v1.0 (brand book)
   con il `:root` di `public/sito/sito.css`.

   È IL FOGLIO DI TUTTE E VENTUNO LE PAGINE. Per tutta la migrazione è stato
   accanto a `sito.css`, e le pagine ci sono passate una per volta — cambiare
   `sito.css` sotto i piedi avrebbe restilizzato in un colpo solo le dieci che lo
   linkavano, e il giorno che una non fosse tornata non ci sarebbe stato modo di
   tornare indietro solo per quella. `sito.css` è sparito con l'ultima.

   ── COSA È SUCCESSO NELLA RICONCILIAZIONE ─────────────────────────────────

   I due sistemi NON si scontravano quasi mai: su 31 nomi vecchi e 138 nuovi,
   ne coincidevano QUATTRO. `--sig-fondo` contro `--sig-sfondo`, `--sig-carta`
   contro `--sig-superficie`, `--sig-sp-1` contro `--sig-spazio-1`: due
   vocabolari per le stesse cose. Tenerli tutti e due avrebbe voluto dire due
   file che convivono in silenzio, ognuno che serve la sua metà delle pagine,
   e nessun errore da nessuna parte — che è peggio di uno scontro, perché uno
   scontro si vede subito.

   Quindi: LA SCALA DEL BRAND È LA SORGENTE, i 31 nomi vecchi diventano RUOLI
   che puntano lì. Le 297 chiamate `var(--sig-…)` sparse in 24 file continuano
   a funzionare e prendono la palette nuova da sole. Si riscrivono 31 righe
   invece di 297 chiamate, e il giorno che si vuole tornare indietro si
   riscrivono le stesse 31.

   ── LE CINQUE COSE CHE NON SONO UNA TRADUZIONE ────────────────────────────

   1. IL LIME NON PUÒ FARE DA LINK. `--sig-accento` era il verde #1f6f5c e
      serviva a due mestieri: fondo dei bottoni e colore dei link. Nel brand
      nuovo l'azione primaria è il lime #8DC63F, che su fondo chiaro dà 1.90
      di contrasto — il brand stesso dice «MAI come testo», e ha ragione.
      I due mestieri si separano: i bottoni prendono il lime, i link il blu.

   2. `--sig-accento-su` SI MUOVE CON L'ACCENTO. Era bianco. Bianco sul lime fa
      2.04. Diventa blu-900, che fa 8.46 — ed è la regola che il brand book
      scrive per esteso: «mai bianco sul lime».

   3. `--sig-bordo-forte` NON PRENDE IL VALORE DEL FILE NUOVO. Lì vale #E4EAF2,
      che su bianco fa 1.21 — cioè MENO di `--sig-bordo` (#DDE6F2, 1.26): un
      bordo "forte" più debole di quello normale. Sembra uno scambio di valori.
      Qui vale #C3D0E0 (1.56). Non è una licenza: quel bordo disegna il
      contorno dei bottoni secondari, e a 1.21 il bottone sparisce.

   4. IL TEMA SCURO NON SEGUE IL SISTEMA. Il file del brand faceva scattare la
      modalità scura su `prefers-color-scheme: dark`. Applicato così, la vetrina
      diventerebbe scura sul telefono di chiunque abbia il tema scuro attivo —
      un restyling che nessuno ha chiesto, e le fasce `.sig-sezione.scura`
      diventerebbero scure su scuro. Qui il tema scuro si chiede: è il
      gestionale a dichiararlo con `data-tema="scuro"` sul suo `<html>`, perché
      è scuro di mestiere e non per preferenza di sistema.

   5. `.sig-etichetta` ESISTEVA GIÀ, E VOLEVA DIRE UN'ALTRA COSA. In `sito.css`
      è la pillola che dice «3 posti liberi» (index e area la usano); nel file
      del brand è una didascalia maiuscoletta. Vince chi ha degli usi: la
      didascalia si chiama `.sig-microtesto`.

   ── IL CARATTERE ──────────────────────────────────────────────────────────
   NON C'È PIÙ NESSUN `@import` QUI. Ogni pagina si porta il proprio `<link>`
   con i due `preconnect`, che è l'unico modo perché il font parta insieme al
   foglio: con l'`@import` il browser deve prendere questo file, scoprire
   l'import, prendere il foglio del font e solo allora il font — tre viaggi in
   fila prima che si veda una lettera.

   L'eccezione è `offline.html`, che di proposito NON lo carica: si vede quando
   la rete non c'è, e tre richieste che non possono riuscire vorrebbero dire una
   pagina mezza vuota proprio nel momento in cui deve funzionare. Si legge con lo
   stack di ripiego qui sotto, che per questo non è decorativo.
   ═══════════════════════════════════════════════════════════════════════════ */


:root {

  /* ══ LA SCALA DEL BRAND ═══════════════════════════════════════════════════
     Valori grezzi. Non si usano direttamente nelle regole: si usano i ruoli. */

  --sig-blu-900: #0C1B30;   /* testo principale, e il navy del marchio */
  --sig-blu-800: #122640;
  --sig-blu-700: #1C3A5E;
  --sig-blu-500: #2A5A8F;   /* la S del logo, sezioni piene, link */
  --sig-blu-400: #3D7BC0;
  --sig-blu-300: #7BA8DC;
  --sig-blu-100: #D6E4F5;

  /* ── LA SCALA DI LUMINOSITÀ DEL TEMA SCURO ───────────────────────────────
     Il tema scuro prendeva tre navy della scala del marchio — 900, 800, 700 —
     e li usava come fondo, superficie e superficie premuta. Non erano nati per
     quel mestiere, e il numero lo diceva: fra il fondo pagina e la superficie
     di una scheda c'era 1,13 a 1. Cioè NIENTE. Il risultato era blu su blu:
     tutto sullo stesso piano, e nessun pannello che si staccasse.

     Un tema scuro fatto bene la profondità la fa con la LUCE, non con la
     tinta: una scala di livelli della stessa tinta, ognuno visibilmente più
     chiaro di quello sotto. Questi sono quattro gradini misurati, non scelti a
     occhio — 1,35 · 1,33 · 1,30 fra un livello e il successivo, cioè un terzo
     di luce in più ogni volta. `fasce-adattive.test.js` li rimisura a ogni
     giro: chi ne schiaccia uno trova il rosso.

       0  il fondo della pagina: il più scuro, e sotto non c'è niente
       1  le superfici: schede, tabelle, il pannello della serata
       2  quelle in evidenza: le fasce, le righe sotto il dito, i pannelli
          che devono staccarsi da una superficie normale
       3  i bordi, che devono vedersi sopra il livello 2

     Sul tema CHIARO questa scala non serve e non si usa: là la carta bianca
     sul fondo azzurrino si stacca da sola, e la profondità la danno i bordi. */
  --sig-livello-0: #070F1E;
  --sig-livello-1: #142B4A;
  --sig-livello-2: #20405F;
  --sig-livello-3: #2B5178;

  --sig-petrolio-500: #1E7A8C;  /* l'incrocio del logo */

  --sig-verde-800: #1B6B2A;  /* il verde QUANDO È TESTO su fondo chiaro */
  --sig-verde-500: #4DAF4F;  /* la G del logo — 2.59 come testo: non è testo */
  --sig-lime-500:  #8DC63F;  /* accento pieno — 1.90 come testo: mai testo */
  /* L'unica eccezione alla regola del lime, e ha un nome suo apposta: la
     CIFRA su fondo scuro. Sul navy il lime sta a 8.5:1 — il divieto vale sul
     chiaro, e chi usa questo token dichiara che il fondo è scuro. */
  --sig-cifra-su-scuro: var(--sig-lime-500);
  --sig-verde-300: #B8DE7A;
  --sig-verde-100: #E9F5D2;
  /* Il gradino che mancava, e che serviva da quando esiste il tema scuro: il
     verde-100 è una superficie da fondo CHIARO, e sul navy diventa una
     targhetta che abbaglia. Questo è il suo gemello — era già scritto a mano
     come fondo degli avvisi «andata bene», e adesso ha un nome. */
  --sig-verde-900: #113A16;

  --sig-oro: #F5A623;        /* punti, premi, vittorie. 1.89: mai testo */
  --sig-oro-300: #FFD66B;    /* l'oro QUANDO È TESTO su un fondo scuro */

  /* ══ I COLORI DEI NUMERI DELLE CHIAMATE ═══════════════════════════════════
     Il titolare, 4 novembre 2026: ogni numero ha il suo colore, forte e fisso,
     per riconoscere a colpo d'occhio chi chiamare. Si cambiano solo qui. Ogni
     numero ha il fondo e il testo scritto sopra (`-su`), a contrasto AA: sono
     gli stessi nei due temi, e `test/colori-numeri.test.js` li rimisura. Dopo
     l'ottavo si ricomincia dal primo (`coloreNumero` in chiamate-in-campo.js). */
  --sig-numero-1: #C8102E;   /* rosso */
  --sig-numero-1-su: var(--sig-bianco);
  --sig-numero-2: #1D4ED8;   /* blu */
  --sig-numero-2-su: var(--sig-bianco);
  --sig-numero-3: #15803D;   /* verde */
  --sig-numero-3-su: var(--sig-bianco);
  --sig-numero-4: #FFD600;   /* giallo */
  --sig-numero-4-su: var(--sig-blu-900);
  --sig-numero-5: #F97316;   /* arancione */
  --sig-numero-5-su: var(--sig-blu-900);
  --sig-numero-6: #7E22CE;   /* viola */
  --sig-numero-6-su: var(--sig-bianco);
  --sig-numero-7: #38BDF8;   /* azzurro */
  --sig-numero-7-su: var(--sig-blu-900);
  --sig-numero-8: #F472B6;   /* rosa */
  --sig-numero-8-su: var(--sig-blu-900);

  /* ══ GLI SPICCHI DELLA RUOTA ══════════════════════════════════════════════
     Fino al 16 settembre 2026 qui c'erano otto fondi chiari che servivano a
     DISTINGUERE e basta — uno spicchio non è «andata bene» né «attenzione», è
     «un altro» — con sopra il nome del bonus scritto in scuro.

     Non stava in piedi sul telefono. Nove spicchi su un disco da 274 px
     lasciano a ogni nome sessantadue pixel di corda: «Squadra oltre i
     cinesini» non ci entra né su una riga né su due, e a 844×390 la corda
     scende a trentacinque e le parole si spezzano a metà. MISURATO, non
     immaginato.

     Quindi lo spicchio non porta più il nome: porta un NUMERO, e il nome per
     esteso si legge sotto la ruota quando si ferma. E siccome il numero è
     l'unica cosa che identifica lo spicchio, il colore è libero di dire
     l'altra cosa — quella che prima non diceva nessuno e che in campo conta
     per prima: VERDE se è un bonus, ROSSO se è un malus. Si vede mentre la
     ruota gira, prima ancora di leggere.

     TRE GRADAZIONI PER FAMIGLIA, non otto colori: servono solo a staccare uno
     spicchio dal suo vicino, e a distinguerli ci pensa il numero. La pagina le
     alterna in modo che due spicchi accanto non siano mai uguali.

     TUTTE E SEI REGGONO UNA CIFRA BIANCA. È il vincolo che le ha scelte: i
     verdi si fermano prima di `--sig-verde-500` (che col bianco sta a 2,8 e
     non basta) e i rossi si scuriscono verso il navy invece di schiarirsi.
     Costruite dai token che ci sono — nessun esadecimale nuovo — e da token
     che NON cambiano col tema: `--sig-errore-testo` nel buio diventa chiaro,
     quindi qui non si usa. */
  --sig-ruota-bonus-1: var(--sig-verde-900);
  --sig-ruota-bonus-2: var(--sig-verde-800);
  /* 68 e non 55: a 55 la cifra bianca ci sta sopra a 4,37, e in orizzontale la
     cifra è alta 16 px — grassetta ma non abbastanza da contare come «testo
     grande», quindi la soglia che le tocca è 4,5 e non 3. A 68 sta a 4,96.
     MISURATO nel browser: `color-mix` lo risolve solo lui. */
  --sig-ruota-bonus-3: color-mix(in srgb, var(--sig-verde-800) 68%, var(--sig-verde-500));
  --sig-ruota-malus-1: color-mix(in srgb, var(--sig-errore) 55%, var(--sig-blu-900));
  --sig-ruota-malus-2: color-mix(in srgb, var(--sig-errore) 78%, var(--sig-blu-900));
  --sig-ruota-malus-3: var(--sig-errore);
  --sig-ruota-cifra: var(--sig-bianco);

  --sig-gradiente-logo-scuro: linear-gradient(96deg,
    color-mix(in srgb, var(--sig-blu-500) 65%, var(--sig-blu-900)),
    color-mix(in srgb, var(--sig-verde-500) 65%, var(--sig-blu-900)));
  --sig-gradiente-logo: linear-gradient(96deg,
      var(--sig-blu-500), var(--sig-petrolio-500) 50%, var(--sig-verde-500));

  /* ══ I GRADIENTI, E A COSA SERVONO ═══════════════════════════════════════
     Non sono decorazione: sono il SOSTITUTO dell'immagine dove l'immagine non
     c'è. Un sito con poche foto o si riempie di rettangoli grigi con scritto
     «immagine qui», oppure impara a stare in piedi senza — e questi tre sono
     il modo.

     IL VELO SOPRA IL VIDEO. Verticale, da trasparente in alto a navy pieno in
     basso: il testo sta sempre nella parte piena, e non c'è nessun fotogramma
     che possa renderlo illeggibile.

     Il navy è LO STESSO NEI DUE TEMI, ed è il livello 0 della scala. Costruito
     sul fondo pagina (`--sig-velo-rgb`) il velo diventava quasi bianco in tema
     chiaro, e il testo dell'eroe — che è bianco, perché sotto c'è una foto —
     spariva. L'eroe non è un pezzo di pagina che si adatta: è una fascia
     SCURA, come `.sig-sezione.scura`, e le fasce scure sono scure in tutti e
     due i temi. Le componenti separate servono perché dentro una `rgba()` un
     colore intero non ci sta.

     LA FASCIA SCURA. Il gradiente del marchio schiarito verso il navy: i tre
     colori del logo restano riconoscibili e il bianco ci sta sopra a
     contrasto pieno su tutti e tre. È diagonale, e va da sinistra in alto a
     destra in basso.

     LA CARTA SENZA FOTO. Tenue, e nella direzione OPPOSTA a quella delle
     fasce: due gradienti che corrono nello stesso verso si leggono come la
     stessa cosa, e la carta finirebbe per sembrare un pezzo di fascia.

     MAI su testo, mai su superfici piccole: un gradiente sotto i cento pixel
     è una banda sporca, non una sfumatura. */
  --sig-eroe-rgb: 7, 15, 30;            /* il livello 0, in componenti */
  /* ══ LA CODA NON ARRIVA PIÙ AL NERO PIENO ═══════════════════════════════
     Il titolare, 13 settembre 2026: «il gradiente copre troppo della foto,
     voglio più immagine visibile — tenendo la sfumatura senza stacchi».

     Gli ultimi due fermi erano .94 e 1 (nero pieno), e costavano l'immagine
     due volte. La prima è ovvia: sotto l'82% dell'altezza la foto non si vede
     più, qualunque cosa faccia il resto. La seconda è indiretta, ed è quella
     che pesava di più: un velo che annerisce OLTRE il colore con cui comincia
     la sezione sotto obbliga la sfumatura dell'eroe a risalire, e per non far
     vedere quella risalita bisognava allungarla su mezza fotografia.

     Misurato, tarando le due cose insieme: con la coda intera lo scatto si
     spegneva a 162 pixel dal fondo e per tenere il passaggio pulito ci voleva
     una rampa alta il 58%; con la coda ammorbidita si spegne a 86, cioè
     arriva quasi il doppio più in basso, e alla rampa ne bastano 26 — e il
     confine resta identico al pixel (1,03 sullo scuro, 1,003 sul chiaro).

     Il velo non smette di fare il suo mestiere: al 68% è ancora .90, che è
     dove sta il titolo. Rimisurato dopo: titolo 16,4 sullo scuro e 15,3 sul
     chiaro, cioè più di prima — la foto sotto è meno schiacciata, ma anche il
     lavaggio chiaro che la rampa alta ci metteva sopra non c'è più. */
  --sig-velo-eroe: linear-gradient(180deg,
      rgba(var(--sig-eroe-rgb), .18) 0%,
      rgba(var(--sig-eroe-rgb), .62) 45%,
      rgba(var(--sig-eroe-rgb), .80) 82%,
      rgba(var(--sig-eroe-rgb), .86) 100%);
  /* ══ TRE STOP ERANO POCHI ═════════════════════════════════════════════
     Il titolare, guardando il sito accanto ad altri dello stesso mestiere:
     «i gradienti sono timidi, sembrano quasi tinte piatte».

     Aveva ragione, e il perché è aritmetico: tre stop equidistanti su una
     diagonale danno una rampa quasi lineare, e l'occhio una rampa lineare la
     legge come un colore solo un po' sporco. Quello che si riconosce come
     «gradiente» è la VARIAZIONE DI VELOCITÀ — un tratto che cambia in fretta
     accanto a uno che quasi non cambia.

     Quindi: cinque stop invece di tre, non equidistanti (18, 42, 68, 88), e
     il navy profondo in coda a chiudere. I tre colori del marchio restano
     tutti e tre riconoscibili — è la stessa scala, letta più lentamente.

     E la LUCE: sopra la rampa c'è un alone radiale caldo che entra da un
     angolo, come una lampada fuori campo. È la cosa che manca alle tinte
     piatte — non un altro colore, una direzione da cui arriva. Sta come
     PRIMO strato perché i background-image si impilano dal primo in su. */
  --sig-gradiente-fascia:
      radial-gradient(120% 90% at 12% 0%,
          rgba(255, 255, 255, .14) 0%,
          rgba(255, 255, 255, .05) 38%,
          rgba(255, 255, 255, 0) 72%),
      linear-gradient(135deg,
      color-mix(in srgb, var(--sig-blu-500) 72%, var(--sig-blu-900)) 0%,
      color-mix(in srgb, var(--sig-blu-500) 52%, var(--sig-blu-900)) 18%,
      color-mix(in srgb, var(--sig-petrolio-500) 68%, var(--sig-blu-900)) 42%,
      color-mix(in srgb, var(--sig-petrolio-500) 46%, var(--sig-blu-900)) 68%,
      color-mix(in srgb, var(--sig-verde-500) 62%, var(--sig-blu-900)) 88%,
      color-mix(in srgb, var(--sig-verde-500) 40%, var(--sig-blu-900)) 100%);
  /* Lo stesso gradiente letto dall'altra parte. Serve a due fasce scure
     vicine: uguali si leggono come una fascia sola ripetuta, specchiate si
     leggono come due momenti diversi della stessa pagina. */
  --sig-gradiente-fascia-rovescio:
      radial-gradient(120% 90% at 88% 0%,
          rgba(255, 255, 255, .14) 0%,
          rgba(255, 255, 255, .05) 38%,
          rgba(255, 255, 255, 0) 72%),
      linear-gradient(225deg,
      color-mix(in srgb, var(--sig-verde-500) 40%, var(--sig-blu-900)) 0%,
      color-mix(in srgb, var(--sig-verde-500) 62%, var(--sig-blu-900)) 12%,
      color-mix(in srgb, var(--sig-petrolio-500) 46%, var(--sig-blu-900)) 32%,
      color-mix(in srgb, var(--sig-petrolio-500) 68%, var(--sig-blu-900)) 58%,
      color-mix(in srgb, var(--sig-blu-500) 52%, var(--sig-blu-900)) 82%,
      color-mix(in srgb, var(--sig-blu-500) 72%, var(--sig-blu-900)) 100%);

  /* La carta senza foto: stessa cura, verso opposto. Quattro stop e una luce
     appena accennata nell'angolo alto — su una superficie piccola l'alone
     dev'essere molto più discreto, o diventa una macchia. */
  --sig-gradiente-carta:
      radial-gradient(90% 70% at 88% 4%,
          rgba(255, 255, 255, .10) 0%, rgba(255, 255, 255, 0) 62%),
      linear-gradient(315deg,
      var(--sig-superficie) 0%,
      color-mix(in srgb, var(--sig-superficie) 60%, var(--sig-superficie-alta)) 38%,
      color-mix(in srgb, var(--sig-superficie-alta) 80%, var(--sig-superficie)) 74%,
      var(--sig-superficie-alta) 100%);

  /* ══ LA GRANA ═════════════════════════════════════════════════════════════
     «I fondi piatti sembrano piatti.» Sono piatti: un colore solo su
     millecinquecento pixel è una superficie che non esiste in natura, e in
     una foto accanto si vede la differenza.

     La grana è rumore, disegnato QUI e non scaricato: un `feTurbulence` di
     SVG dentro una data-URI. Nessun file, nessuna richiesta, nessun host di
     terzi — e resta nitida a qualunque densità di schermo, perché è un
     filtro, non un'immagine ingrandita.

     `baseFrequency` alta (.85) è grana fine, da carta fotografica; più bassa
     sarebbe nuvola. L'opacità è quella che fa la differenza fra «materiale» e
     «sporco»: sotto il 4% non si vede, sopra l'8% si legge come un difetto di
     compressione. Sta a 5, e in tema scuro a 7 — il rumore sul nero si vede
     meno, e la stessa quantità sembra di meno. */
  --sig-grana-forza: .05;
  --sig-grana: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='140' height='140'%3E%3Cfilter id='g'%3E%3CfeTurbulence type='fractalNoise' baseFrequency='.85' numOctaves='3' stitchTiles='stitch'/%3E%3CfeColorMatrix type='saturate' values='0'/%3E%3C/filter%3E%3Crect width='140' height='140' filter='url(%23g)' opacity='0.5'/%3E%3C/svg%3E");

  /* ══ IL BORDO LUMINOSO ════════════════════════════════════════════════════
     La riga di luce sul filo alto di una superficie. È come si dice «questa
     cosa sta SOPRA» senza sfocare niente: la luce arriva dall'alto, il bordo
     superiore la prende, e il resto no. Un'ombra dice «c'è dello spazio
     sotto»; il filo dice «c'è uno spessore qui». Servono tutti e due, e
     costano un `inset` per uno. */
  --sig-luce-alto: inset 0 1px 0 rgba(255, 255, 255, .55);
  --sig-luce-bordo: inset 0 0 0 1px rgba(255, 255, 255, .06);

  /* ── Neutri ─────────────────────────────────────────────────────────────
     Mai bianco puro come fondo pagina: il bianco è la carta che ci sta sopra,
     e serve che si distingua. */
  --sig-bianco: #FFFFFF;
  --sig-base: #F4F7FB;

  /* ══ IL FONDO PAGINA DEL CHIARO, E PERCHÉ NON È PIÙ `--sig-base` ════════
     Il titolare, 12 settembre 2026: «nel tema scuro le sezioni si alternano e
     si distinguono. Nel chiaro sono quasi tutte bianche di fila, e la pagina
     sembra piatta».

     Misurato su 35 pagine, il difetto è UN NUMERO e non il numero di sezioni:

                       fondo → carta     ombra della carta
         scuro             1,34               32%
         chiaro            1,07                6%

     I due strumenti che staccano una carta dal fondo sono cinque volte più
     deboli sul chiaro. E c'è un precedente scritto qui sotto, nel blocco del
     tema scuro: quello è stato rifatto proprio perché «fra il fondo e una
     scheda c'era 1,13 a 1 — cioè niente». Il chiaro stava a 1,07: sotto il
     difetto già bocciato dall'altra parte.

     `--sig-base` resta dov'era perché non è solo il fondo pagina: è anche il
     TESTO sopra le fasce scure (`--sig-scuro-testo`) e la superficie inversa
     del tema scuro. Scurire quello vorrebbe dire spegnere il titolo dell'eroe
     per sistemare un fondo.

     QUANTO GIÙ SI PUÒ ANDARE, e non di più: `--sig-superficie-alta` è il
     blu-100 (1,29 dal bianco), e il fondo gli si avvicina da sotto. A 1,16 i
     due livelli si distinguono ancora (1,12 fra loro); più giù si toccano, e
     il livello «in evidenza» sparisce. Il gradino successivo si compra solo
     riscrivendo anche quello, e quella è un'altra decisione.

     COSA COSTA: il grigio secondario su questo fondo passa da 5,08 a 4,71 e
     l'ambra da 3,53 a 3,28. Restano tutti e due sopra la loro soglia (4,5 per
     il testo, 3 per bordi e testo grande), ma il margine si è ristretto: chi
     tocca quei due colori adesso ha meno spazio di prima. */
  --sig-base-fondo: #E2E9F3;  /* era #E8EFF9: la carta bianca ci stava sopra a 1,16:1, cioè non si staccava (giro grafico, 30 ottobre 2026) */
  /* Un gradino SOTTO il fondo, come prima: `.sig-sezione.tenue` e lo stato
     premuto sono un passo verso il blu, non verso il bianco, e il verso non
     cambia solo perché il fondo si è spostato. Stessa distanza di prima. */
  --sig-base-alt: #DFEAF7;
  --sig-grigio-testo: #475769;  /* 6,06 sul fondo, 7,41 sulle carte (30 ottobre 2026). Era #54657A, 5,16 sul fondo: passava, ma era il grigio che faceva il sito «troppo bianco» insieme ai bordi */   /* 5.16 sul fondo, 4.90 sulla superficie-alt, 4.62 sulle carte delle serate e del quiz: passa AA su tutte e tre. Era #5A6B80, che faceva 4,48 e 4,36 sulle ultime due (misurato nel browser, audit del 13 settembre 2026) */
  --sig-grigio-chiaro: #B8C4D0;  /* secondario su fondo scuro */
  --sig-disabilitato: #A8B4C2;   /* 1.96: è disabilitato, e si deve vedere che lo è */

  /* ── Semantici ──────────────────────────────────────────────────────────*/
  --sig-errore: #B03226;             /* 5.06 su base */
  --sig-errore-sfondo: #FBE9E7;
  --sig-errore-testo: #8E2A20;       /* 7.81 */

  --sig-successo: #1B6B2A;           /* 6.14 */
  --sig-successo-sfondo: #E9F5D2;
  --sig-successo-testo: #14501F;

  /* 3.53 su base: basta per bordi e testo grande, NON per un paragrafo.
     Dove serve testo piccolo si usa `--sig-attenzione-testo`. */
  --sig-attenzione: #B87400;
  --sig-attenzione-sfondo: #FDF0D9;
  --sig-attenzione-testo: #7A4C00;

  --sig-info: #2A5A8F;
  --sig-info-sfondo: #D6E4F5;
  --sig-info-testo: #1A3F66;

  /* ══ QUELLO CHE DISEGNA IL BROWSER, NON NOI ═══════════════════════════════
     `color-scheme` non e' un colore nostro: e' la frase con cui la pagina dice
     al browser di che pasta e', e senza di lei il valore resta `normal` — cioe'
     «pagina chiara», qualunque cosa dicano i nostri token.

     Quello che restava chiaro sono i pezzi che il browser disegna da se' e che
     nessuna nostra regola tocca: le BARRE DI SCORRIMENTO, il calendario che si
     apre da un campo data, l'elenco a tendina di una `select`, il cursore di
     scrittura, l'evidenziazione del riempimento automatico, e il fondo che si
     vede attorno alla pagina prima che il foglio arrivi. Su un gestionale che
     scorre per ore, una barra bianca lungo il fianco di una pagina navy si
     nota piu' di quanto sembri.

     Va dichiarata una volta per tema, come tutto il resto. */
  color-scheme: light;

  /* ══ RUOLI ════════════════════════════════════════════════════════════════
     Quello che le regole usano davvero. Cambiare tema vuol dire riscrivere
     questi, non andare a cercare i valori. */

  --sig-sfondo: var(--sig-base-fondo);
  --sig-superficie: var(--sig-bianco);
  --sig-superficie-alt: var(--sig-base-alt);
  --sig-superficie-premuta: var(--sig-base-alt);
  --sig-superficie-inversa: var(--sig-blu-900);

  /* ══ IL FONDO DELLA FASCIA ALTERNA, E NEL CHIARO NON È PIÙ base-alt ═══════
     Il titolare, 12 settembre 2026, dal telefono: «nel tema chiaro fra "Come
     funziona il format" e "Com'è fatta una serata" non c'è quasi differenza di
     colore: sembrano una cosa sola. Nel tema scuro si distinguono bene».

     MISURATO a 393, sezione per sezione, con il colore che il browser dipinge
     davvero: al confine fra una fascia e la successiva il tema chiaro stava a
     1,039 e il tema scuro a 1,441. Non era un'impressione ed è la stessa
     pagina: lo stesso `tenue` che sullo scuro salta da #070F1E a #20405F, sul
     chiaro andava da #E8EFF9 a #DFEAF7 — nove livelli di rosso, cinque di
     verde, due di blu.

     PERCHÉ È SUCCESSO. `tenue` prendeva `--sig-superficie-alt`, che nel chiaro
     è `--sig-base-alt`: un colore nato per un'altra cosa — lo STATO PREMUTO di
     un bottone, dove il gradino dev'essere appena percettibile perché dura un
     decimo di secondo sotto un dito. Una fascia larga quanto lo schermo che si
     legge scorrendo vuole l'opposto. Un nome solo per due mestieri opposti, e
     ha vinto il mestiere sbagliato.

     Quindi la fascia ha il SUO colore, e `--sig-superficie-alt` torna a fare
     solo il premuto. Nello scuro i due restano lo stesso livello — là il
     gradino andava già bene, e questa correzione non lo tocca.

     QUANTO GIÙ, e perché non di più: a #C9D9ED il confine passa da 1,039 a
     1,158 e la fascia piena contro il fondo da 1,052 a 1,240 — cioè il gradino
     del tema scuro, letto sul chiaro. Il tetto lo mette il TESTO TENUE: su
     questo fondo il grigio secondario di prima (#5A6B80) scenderebbe a 3,9, e
     stava già a 4,48 sulla fascia di ieri — sotto la soglia, da prima di
     questa modifica. Per questo qui sotto la fascia si porta il suo grigio.  */
  --sig-fascia: #C9D9ED;
  /* Il secondario LETTO SULLA FASCIA: 4,62 su #C9D9ED, dove quello di pagina
     ne farebbe 3,9. Non è un secondo grigio nella palette — è lo stesso ruolo
     misurato sul fondo su cui si posa, e vale solo dentro la fascia. */
  --sig-fascia-tenue: #4E5E72;

  /* ── LA CARTA IN EVIDENZA: il livello che mancava ────────────────────────
     Le superfici erano tre — fondo pagina, carta, fascia scura — e in mezzo
     mancava il gradino di quello che deve staccarsi DA UNA CARTA restando
     chiaro: il pannello del quiz, la carta della serata che si sta per
     prendere, il blocco che porta il numero grande.

     ══ SUL CHIARO VA VERSO IL BASSO, SULLO SCURO VERSO L'ALTO ══════════════
     Sullo scuro «in evidenza» vuol dire più chiaro: c'è tutto lo spazio verso
     la luce, ed è così che funziona un tema scuro fatto bene.

     Sul chiaro quello spazio non c'è — sopra la carta bianca non c'è niente,
     il bianco è il tetto — e allora il gradino si prende dall'altra parte: un
     azzurro un filo più carico, che dalla carta si stacca di 1,29 e dal fondo
     di 1,20. In tutti e due i casi il livello si VEDE, che è quello che
     conta; la direzione è quella che il tema concede.

     È il `blu-100` della scala del marchio, non una tinta nuova.

     Il testo sopra ha i suoi due token perché il grigio secondario, su questo
     fondo, scende a 4,23 — sotto la soglia. Qui prende il blu scuro
     dell'info, che fa 7,5. */
  --sig-superficie-alta: var(--sig-blu-100);
  --sig-superficie-alta-testo: var(--sig-testo);
  --sig-superficie-alta-tenue: var(--sig-info-testo);

  --sig-testo: var(--sig-blu-900);
  --sig-testo-secondario: var(--sig-grigio-testo);
  --sig-testo-disabilitato: var(--sig-disabilitato);
  --sig-testo-inverso: var(--sig-bianco);
  /* Il nome di un minigioco o di una challenge FUORI dal verde. Nel chiaro è il
     colore del testo intorno; nello scuro l'oro chiaro, solo sopra fondi scuri. */
  --sig-nome-gioco: currentColor;
  /* La famiglia dei giochi: tessere dell'area e carte del catalogo. Il titolare, 4 novembre 2026:
     «oro sul verde, illeggibile: dove lo sfondo è verde il blu scuro, 8,5 di
     contrasto». Quell'8,5 esiste solo sul lime: sul verde scuro della famiglia
     il blu fa 2,15. Quindi nello scuro il fondo è il lime e il testo è il blu; nel
     chiaro questi valori sono quelli di sempre della famiglia. */
  --sig-gioco-sfondo: var(--sig-successo-sfondo);
  --sig-gioco-testo: var(--sig-successo-testo);
  --sig-gioco-bordo: var(--sig-successo);
  --sig-gioco-corpo: var(--sig-testo);
  --sig-gioco-tenue: color-mix(in srgb, var(--sig-successo-testo) 82%, var(--sig-testo));
  --sig-gioco-secondario: color-mix(in srgb, var(--sig-successo-testo) 88%, var(--sig-testo));
  /* Il pulsante principale su quel fondo. Nel chiaro il lime di sempre; nello
     scuro il fondo È il lime, quindi il pulsante gira: blu col testo lime. */
  --sig-gioco-primario: var(--sig-azione-primaria);
  --sig-gioco-primario-hover: var(--sig-azione-primaria-hover);
  --sig-gioco-primario-su: var(--sig-azione-primaria-testo);
  --sig-testo-link: var(--sig-blu-500);
  --sig-testo-link-hover: var(--sig-verde-800);

  --sig-bordo: #A9BACF;  /* il bordo delle carte: 1,62 sul fondo, 1,98 sul bianco. Era #DDE6F2, PIÙ CHIARO del fondo (1,09): le carte non avevano un contorno (30 ottobre 2026) */
  --sig-bordo-forte: #74879F;     /* vedi nota 3 in cima. Il bordo dei CONTROLLI (bottoni secondari, campi, frecce) e i numeri grandi dei momenti: 3,68 sul bianco, 3,01 sul fondo — la soglia AA dei componenti. Era #C3D0E0, 1,56 (30 ottobre 2026) */
  --sig-bordo-default: var(--sig-bordo);
  --sig-bordo-hover: var(--sig-blu-300);
  --sig-bordo-attivo: var(--sig-blu-500);

  --sig-azione-primaria: var(--sig-lime-500);
  --sig-azione-primaria-hover: #7DB531;
  --sig-azione-primaria-premuta: #6BA027;
  --sig-azione-primaria-testo: var(--sig-blu-900);
  --sig-azione-secondaria: var(--sig-blu-500);
  --sig-azione-distruttiva: var(--sig-errore);
  --sig-azione-distruttiva-hover: #A32E22;
  --sig-azione-distruttiva-premuta: var(--sig-errore-testo);

  --sig-focus: var(--sig-blu-500);
  --sig-focus-tenue: rgba(42, 90, 143, 0.25);

  /* ══ IL PONTE ═════════════════════════════════════════════════════════════
     I 31 nomi di `sito.css`, ripuntati sulla scala nuova. Sono l'unica ragione
     per cui 297 chiamate sparse in 24 file non vanno riscritte una per una.

     Non è un adattatore da togliere appena si può: è il vocabolario con cui
     queste pagine sono scritte, e sono nomi migliori di quelli lunghi per le
     cose che si usano venti volte al giorno. Resta. */

  --sig-fondo:      var(--sig-sfondo);
  --sig-fondo-alt:  var(--sig-superficie-alt);
  --sig-carta:      var(--sig-superficie);
  --sig-testo-tenue: var(--sig-testo-secondario);

  /* L'accento è il FONDO di un'azione, non il colore di un testo — vedi la
     nota 1. Chi scrive `color: var(--sig-accento)` sta sbagliando variabile e
     vuole `--sig-testo-link`. */
  --sig-accento:       var(--sig-azione-primaria);
  --sig-accento-su:    var(--sig-azione-primaria-testo);
  --sig-accento-scuro: rgba(12, 27, 48, .13);

  --sig-ok: var(--sig-successo);
  --sig-no: var(--sig-errore);

  /* Le fasce scure che spezzano la vetrina. Adesso sono blu-navy, e sono lo
     stesso blu del tema scuro del gestionale: due parti dello stesso prodotto
     che finalmente usano lo stesso scuro. */
  --sig-scuro:        var(--sig-blu-900);
  --sig-scuro-testo:  var(--sig-base);
  --sig-scuro-tenue:  var(--sig-grigio-chiaro);
  /* ── LA FASCIA CHE SI STACCA, NEI DUE TEMI ────────────────────────────
     `--sig-scuro` è il fondo delle fasce piene: quelle di «chi siamo», del
     format, del saldo punti in area. Sul sito CHIARO è il navy, e si stacca
     dal fondo di 16 a 1 — si vede dall'altra parte della stanza.

     Sul sito SCURO quel navy È il fondo pagina, e una fascia che ci si
     appoggia sopra sparisce: alzarla di un gradino dà 1,13 a 1. Diventa
     allora il blu dei bordi (1,49) PIÙ un filo che ne dichiara il confine —
     è il filo a fare il lavoro che sul chiaro fa il salto di sedici a uno.
     Il valore scuro sta nei due blocchi del tema, più sotto.

     `--sig-scuro-filo` è trasparente sul chiaro: là la fascia non ha bisogno
     di essere annunciata, si annuncia da sé. */
  --sig-scuro-filo:   transparent;

  /* ── LA FASCIA PRATO ──────────────────────────────────────────────────
     «Tre passi, e sei dentro»: il verde chiarissimo della scala, l'unico
     punto in cui il prato si vede.

     Sul tema scuro diventa un pannello come l'altra fascia, e non è un
     ripiego: un verde acceso a tutta larghezza su fondo scuro stona, e la
     coerenza fra le due fasce vale più del richiamo al campo — che resta
     comunque nelle fotografie. (Decisione del titolare.) */
  --sig-prato:        var(--sig-verde-100);
  --sig-prato-testo:  var(--sig-testo);
  --sig-prato-tenue:  var(--sig-testo-secondario);
  /* Il prato ha un filo SUO, e non quello della fascia scura: là il filo è
     trasparente sul chiaro perché il navy si annuncia da sé, ma il verde
     chiarissimo sul fondo base sta a 1,06 — la stessa luce, un'altra tinta.
     Prima il filo glielo prestava `.sig-sezione + .sig-sezione`, poi la regola
     della fascia gliel'ha spento; per un momento la fascia è stata invisibile
     sul tema chiaro. Adesso è dichiarato, e nei due temi dice due cose.

     Sul chiaro era il verde-300, «che ci sta sopra a 1,34 — più del filo
     standard del sito, che su bianco fa 1,26».

     ══ E 1,34 NON BASTAVA ═══════════════════════════════════════════════════
     Il 12 settembre 2026 le fasce `tenue` hanno preso un fondo loro perché nel
     chiaro non si staccavano. Misurando tutte le fasce della home una dopo
     l'altra è saltato fuori che la peggiore non era una di quelle: era QUESTA.
     Il prato contro il fondo pagina sta a 1,017 — la stessa luce, un'altra
     tinta, come dice la riga qui sopra — e a separarlo c'è solo il filo. Un
     filo da un pixel a 1,34 che divide due colori a 1,017 è l'unica cosa che
     regge il confine, e non regge.

     Il fondo NON si abbassa, e la ragione è geometrica: sopra il prato c'è la
     fascia `community`, che è `tenue` (#C9D9ED). Scurendo il verde ci si
     allontana dalla pagina di sotto ma ci si avvicina alla fascia di sopra —
     a #D2E7A8 diventano 1,153 da una parte e 1,075 dall'altra, cioè un confine
     guadagnato e uno perso. Il prato sta in mezzo agli altri due per luce, e
     da lì non si sposta senza rompere qualcos'altro.

     Quindi a fare il confine è il filo, e allora che lo faccia: verde-500 al
     posto del verde-300 (1,96 sul prato, 1,92 sul fondo pagina invece di
     1,34 e 1,32) e due pixel invece di uno. È il verde dell'accento, quello
     dei pulsanti: su questa fascia non arriva un colore nuovo. */
  --sig-prato-filo:   var(--sig-verde-500);

  /* ── IL VERDE QUANDO DEVE ESSERE TESTO ────────────────────────────────
     Il verde-800 è nato per questo — «il verde QUANDO È TESTO su fondo
     chiaro», dice la scala. Su fondo SCURO la frase si rovescia: là fa 2,6 e
     non si legge, e il verde che regge è il 300 (11,3).

     Serve un nome suo perché è l'unico verde che cambia col tema: gli
     occhielli sono la didascalia del marchio e stanno su tutte le pagine
     pubbliche, quindi è il colore che si sarebbe spento più in vista. */
  --sig-verde-testo:  var(--sig-verde-800);

  /* La superficie verde tenue: la pastiglia della scheda attiva in area, il
     riquadro dell'invito a valutare, l'etichetta dello sport. Piccole, e per
     questo il verde ci resta anche di sera — la decisione di farne un pannello
     riguardava la FASCIA a tutta larghezza, che è un'altra cosa.

     Oggi ha gli stessi valori di `--sig-successo-sfondo`, e non è lo stesso
     token: quello dice «è andata bene», questo dice «è del format». Il giorno
     che uno dei due cambia, l'altro non deve seguirlo. */
  --sig-verde-tenue:  var(--sig-verde-100);

  /* ── LA VELATURA SOPRA LA FOTO D'APERTURA ─────────────────────────────
     In COMPONENTI e non come colore, perché serve dentro delle `rgba()`: la
     scena della home è la foto sotto una velatura che si apre a metà e torna
     piena in fondo, così sfuma nel colore di pagina. Quel colore è il fondo,
     e in tema scuro è un altro — scritto a mano com'era, la home in scuro
     avrebbe avuto un blocco quasi bianco in cima e il titolo chiaro sopra. */
  --sig-velo-rgb:     244, 247, 251;

  /* Quale delle due versioni del segno si vede. È un `display` e non un
     colore, e sta fra i token per la stessa ragione degli altri: così la
     scelta del tema vive tutta in un blocco solo, e le regole qui sotto non
     sanno che esistono due temi. */
  --sig-segno-chiaro: block;
  --sig-segno-scuro:  none;

  /* ══ CARATTERE ════════════════════════════════════════════════════════════*/

  --sig-font: 'Outfit', system-ui, -apple-system, "Segoe UI", Roboto, sans-serif;
  --sig-font-titoli: var(--sig-font);

  --sig-peso-regular: 400;
  --sig-peso-medium: 500;
  --sig-peso-semibold: 600;
  --sig-peso-bold: 700;
  --sig-peso-extrabold: 800;
  --sig-peso-black: 900;

  --sig-peso-titoli: var(--sig-peso-extrabold);
  --sig-traccia-titoli: var(--sig-tracking-sottotitolo);

  --sig-corpo-display: 100px;
  --sig-corpo-h1: 56px;
  --sig-corpo-h2: 40px;
  --sig-corpo-h3: 26px;
  --sig-corpo-testo: 16px;
  --sig-corpo-testo-piccolo: 14px;
  --sig-corpo-etichetta: 11px;
  --sig-corpo-bottone: 16px;
  --sig-corpo-numero: 64px;

  --sig-corpo-display-mobile: 40px;
  --sig-corpo-h1-mobile: 32px;
  --sig-corpo-h2-mobile: 26px;
  --sig-corpo-h3-mobile: 20px;
  --sig-corpo-numero-mobile: 40px;

  --sig-interlinea-display: 0.9;
  --sig-interlinea-titolo: 0.95;
  --sig-interlinea-sottotitolo: 1.15;
  --sig-interlinea-testo: 1.6;
  --sig-interlinea-etichetta: 1.3;
  --sig-interlinea-numero: 0.85;

  --sig-tracking-display: -0.05em;
  --sig-tracking-titolo: -0.04em;
  --sig-tracking-sottotitolo: -0.02em;
  --sig-tracking-testo: 0;
  --sig-tracking-etichetta: 0.08em;

  --sig-obliquo: skewX(-10deg);
  /* La curva dello scatto: parte decisa, supera di un soffio e si pianta.
     È il movimento di chi arriva sul pallone, non di chi scivola in scena. */
  --sig-curva-scatto: cubic-bezier(.22, 1.35, .36, 1);

  /* ══ SPAZIO ═══════════════════════════════════════════════════════════════
     La scala del brand è in pixel, base 4. Quella vecchia era in rem e non
     coincideva con nessun gradino: `--sig-sp-3` valeva 17.6px, cioè fra il
     quarto gradino (16) e il quinto (24). Ogni nome vecchio va sul gradino più
     vicino, e la pagina si stringe o si allarga di uno o due pixel. È il
     restyling, non un errore. */

  --sig-spazio-1: 4px;
  --sig-spazio-2: 8px;
  --sig-spazio-3: 12px;
  --sig-spazio-4: 16px;
  --sig-spazio-5: 24px;
  --sig-spazio-6: 32px;
  --sig-spazio-7: 48px;
  --sig-spazio-8: 64px;
  --sig-spazio-9: 96px;

  --sig-sp-1: var(--sig-spazio-1);   /* era .35rem ≈ 5.6px */
  --sig-sp-2: var(--sig-spazio-3);   /* era .7rem  ≈ 11.2px */
  --sig-sp-3: var(--sig-spazio-4);   /* era 1.1rem ≈ 17.6px */
  --sig-sp-4: var(--sig-spazio-5);   /* era 1.7rem ≈ 27.2px */
  --sig-sp-5: var(--sig-spazio-7);   /* era 2.6rem ≈ 41.6px */
  --sig-sp-6: var(--sig-spazio-8);   /* era 4rem   = 64px */

  /* ══ RAGGI · nessun angolo vivo ═══════════════════════════════════════════
     Gli ~84 `border-radius` in pixel sparsi nelle pagine diventano questi.
     Il salto è grosso: 8→16 e 12→24. È la regola del brand, ed è la cosa che
     si vede di più a colpo d'occhio. */

  --sig-raggio-input: 16px;
  --sig-raggio-card: 24px;
  --sig-raggio-card-grande: 32px;
  --sig-raggio-pillola: 999px;
  --sig-raggio-cerchio: 50%;

  --sig-raggio: var(--sig-raggio-card);          /* era 12px */
  --sig-raggio-piccolo: var(--sig-raggio-input); /* era 8px */
  --sig-raggio-tondo: var(--sig-raggio-pillola);

  /* ══ OMBRE · navy trasparente, mai grigio ════════════════════════════════*/

  /* ══ PESO · i componenti sono oggetti appoggiati ══════════════════════════
     Dal riferimento si prende il SISTEMA, non l'aspetto: bordi spessi sugli
     interattivi, e sotto i bottoni pieni un bordo più scuro che li fa sembrare
     appoggiati sulla pagina — la profondità la fa il bordo, mai l'ombra.
     I colori sono i nostri: l'appoggio è il verde della G del logo. */
  --sig-spessore-bordo: 2px;     /* il bordo degli interattivi: era 1px */
  --sig-spessore-appoggio: 4px;  /* il bordo sotto dei bottoni pieni */
  --sig-appoggio: var(--sig-verde-500);


  /* ══ E L'OMBRA È L'ALTRA METÀ DELLO STESSO DIFETTO ═══════════════════
     Una carta si stacca dal fondo in due modi: il gradino di colore e l'ombra.
     Sul chiaro erano deboli tutti e due — 1,07 di gradino (vedi
     `--sig-base-fondo`) e un'ombra al 6%, contro il 32% del tema scuro.
     Sistemarne uno solo avrebbe lasciato il lavoro a metà.

     Il 6% nasceva dal principio scritto qui sopra — «la profondità la fa il
     bordo, mai l'ombra» — e quel principio resta: queste restano ombre corte,
     non aloni. Ma un'ombra che non si vede non è sobrietà, è un'ombra che non
     c'è, e il bordo da solo su due bianchi vicini non basta.

     Ancora circa la metà del tema scuro, che di luce ne ha da vendere. */
  --sig-ombra-1: 0 2px 8px rgba(12, 27, 48, 0.10);
  /* L'ombra delle carte: nel chiaro le stacca dal fondo insieme al bordo;
     nel tema scuro vale `none`, perché lì le carte si staccano già per luce
     (i livelli). 30 ottobre 2026. */
  --sig-ombra-carta: var(--sig-ombra-1);
  --sig-ombra-2: 0 8px 24px rgba(12, 27, 48, 0.16);
  --sig-ombra-3: 0 20px 48px rgba(12, 27, 48, 0.24);
  --sig-ombra: var(--sig-ombra-1);

  /* ══ MISURE ═══════════════════════════════════════════════════════════════
     `--sig-larghezza` non è `--sig-contenuto-max`: la prima è la COLONNA DI
     LETTURA, la seconda la larghezza massima della pagina. Servono tutte e
     due, e confonderle vuol dire righe di testo da 1200px che nessuno legge. */

  /* DUE LARGHEZZE, e servono tutte e due.
     `--sig-larghezza` è la COLONNA DI LETTURA: 680px, la misura oltre la quale
     una riga di testo diventa faticosa da seguire perché l'occhio perde il capo
     riga. Vale per la prosa, i moduli, le informative.
     `--sig-contenuto` è la larghezza della PAGINA: dove ci sono schede in
     griglia, una colonna da 680 su uno schermo da 1440 lascia 373 pixel di vuoto
     per lato e fa sembrare il sito la versione telefono ingrandita. */
  --sig-larghezza: 680px;
  --sig-contenuto: 1120px;

  --sig-tocco: 44px;
  --sig-tocco-minimo: var(--sig-tocco);
  --sig-focus-spessore: 3px;
  --sig-focus-offset: 3px;

  --sig-bp-mobile: 480px;
  --sig-bp-tablet: 768px;
  --sig-bp-desktop: 1024px;

  /* La barra laterale del gestionale. Era scritta a mano in `gestionale.html`
     e in nessun altro posto. */
  --sig-barra: 220px;

  /* ══ MOVIMENTO ════════════════════════════════════════════════════════════*/

  --sig-durata-istantanea: 100ms;
  --sig-durata-veloce: 180ms;
  --sig-durata-media: 280ms;
  --sig-durata-lenta: 420ms;
  --sig-curva-standard: cubic-bezier(0.4, 0, 0.2, 1);
  --sig-curva-entrata: cubic-bezier(0, 0, 0.2, 1);
  --sig-curva-uscita: cubic-bezier(0.4, 0, 1, 1);
  --sig-curva-rimbalzo: cubic-bezier(0.34, 1.4, 0.64, 1);
}

/* ═══════════════════════════════════════════════════════════════════════════
   TEMA SCURO — chi lo chiede, e chi segue lo schermo (nota 4 in cima)

   Ci sono TRE dichiarazioni possibili sul `<html>`, e sono tre cose diverse:

     (niente)             chiaro, sempre. E' la VETRINA, ed e' una scelta:
                          e' un pezzo di marchio, con le sue fasce
                          `.sig-sezione.scura` che sono scure DI PROPOSITO
                          sopra un fondo chiaro. Ribaltarla col tema del
                          telefono vorrebbe dire un restyling che nessuno ha
                          chiesto, e quelle fasce diventerebbero scure su
                          scuro — cioe' invisibili.
     data-tema="auto"     segue l'impostazione dello schermo di chi guarda.
                          E' il GESTIONALE: e' uno strumento, ci si lavora
                          dentro per ore, e uno strumento che ignora il tema
                          del sistema e' uno strumento che acceca alle sette
                          del mattino o alle undici di sera.
     data-tema="scuro"    scuro sempre, qualunque cosa dica lo schermo.
     data-tema="chiaro"   chiaro sempre.

   ══ PERCHE' L'AUTOMATICO SI CHIEDE, INVECE DI VALERE PER TUTTI ═════════════
   Il file del brand faceva scattare il tema scuro su `prefers-color-scheme:
   dark` a livello di `:root`, e cosi' applicato il problema e' quello scritto
   sopra: la vetrina ribaltata sul telefono di chiunque, e le fasce scure su
   scuro. La decisione di allora era giusta, e la parte che valeva la pena
   tenere non era «mai automatico» — era «non su tutto».

   Quindi l'automatico c'e', e si dichiara: le pagine che sono STRUMENTI lo
   chiedono, quelle che sono VETRINA no. Nessun selettore da cliccare in
   nessuna delle due — e' il documento a dire di che pasta e' fatto, una volta
   sola, e poi decide lo schermo di chi guarda.

   I nove nomi del vecchio sistema del gestionale (`--bg`, `--pannello`, …)
   stanno qui dentro: erano copiaincollati in dieci file, e non erano nemmeno
   uguali fra loro — `informative.html` aveva `--attesa: #d9a441` invece di
   `#d8b24c`, e `gestionale.html` e `staff-accesso.html` non ce l'avevano
   affatto. Un valore solo, in un posto solo.
   ═══════════════════════════════════════════════════════════════════════════ */

[data-tema="scuro"] {
  /* I QUATTRO LIVELLI, in ordine di luce. Vedi la scala in cima: qui
     il tema scuro smette di prendere tre navy del marchio e prende dei
     gradini misurati, perche' fra il fondo e una scheda c'era 1,13 a 1 —
     cioe' niente, ed era tutto blu su blu. */
  --sig-sfondo: var(--sig-livello-0);
  --sig-superficie: var(--sig-livello-1);
  --sig-superficie-alt: var(--sig-livello-2);
  --sig-superficie-premuta: var(--sig-livello-2);
  /* La fascia alterna: QUI resta il livello-2 di sempre, cioè esattamente il
     fondo che aveva prima che diventasse un nome suo. Lo scuro staccava già
     bene (1,441 al confine, misurato) e non è quello che il titolare ha
     segnalato: la correzione del 12 settembre 2026 è tutta nel tema chiaro. */
  --sig-fascia: var(--sig-livello-2);
  --sig-fascia-tenue: var(--sig-grigio-chiaro);
  /* Qui «in evidenza» va verso la LUCE: c'è tutto lo spazio, ed è così che
     funziona un tema scuro fatto bene. Vedi la nota nel blocco chiaro. */
  --sig-superficie-alta: var(--sig-livello-2);
  --sig-superficie-alta-testo: var(--sig-bianco);
  --sig-superficie-alta-tenue: var(--sig-grigio-chiaro);
  --sig-superficie-inversa: var(--sig-base);

  --sig-testo: var(--sig-bianco);
  --sig-testo-secondario: var(--sig-grigio-chiaro);
  --sig-testo-disabilitato: #6B7A8C;
  --sig-testo-inverso: var(--sig-blu-900);
  --sig-nome-gioco: var(--sig-oro-300);
  --sig-gioco-sfondo: var(--sig-lime-500);
  --sig-gioco-testo: var(--sig-blu-900);
  --sig-gioco-bordo: var(--sig-verde-800);
  --sig-gioco-corpo: var(--sig-blu-900);
  --sig-gioco-tenue: var(--sig-verde-900);
  --sig-gioco-secondario: var(--sig-verde-900);
  --sig-gioco-primario: var(--sig-blu-900);
  --sig-gioco-primario-hover: var(--sig-blu-900);
  --sig-gioco-primario-su: var(--sig-lime-500);
  --sig-testo-link: var(--sig-verde-300);
  --sig-testo-link-hover: var(--sig-verde-100);
  /* Vedi la nota su `color-scheme` nel blocco chiaro: e' quello che fa seguire
     il tema anche a quello che disegna il browser. */
  color-scheme: dark;

  --sig-verde-testo: var(--sig-verde-300);
  --sig-verde-tenue: var(--sig-verde-900);

  /* Le fasce: qui il navy è il fondo pagina, e una fascia navy sparirebbe.
     Vedi la nota sopra `--sig-scuro-filo` nel blocco chiaro. */
  --sig-scuro: var(--sig-livello-2);
  --sig-scuro-testo: var(--sig-bianco);
  --sig-scuro-filo: var(--sig-blu-500);
  /* ══ E IL PRATO SCURO SCENDE DI UN GRADINO ════════════════════════════════
     Il titolare, 12 settembre 2026: «le fasce premi e community nel tema scuro
     sono dello stesso colore: non si distinguono. Alternale come le altre».

     Erano LO STESSO COLORE, alla lettera: `--sig-prato` e `--sig-fascia`
     valevano tutti e due il livello-2, e le due fasce sono adiacenti — sopra
     «community», che è `tenue`, sotto «premi», che è `prato`. Fra loro restava
     il filo, a 1,51. Era già venuto fuori misurando le fasce del chiaro, e
     l'avevo lasciato perché il prato scuro = livello-2 era una decisione
     scritta del titolare: «coerenza fra le due fasce vale più del richiamo al
     campo — che resta comunque nelle fotografie».

     Quella decisione NON si tocca, ed è la ragione per cui si sposta il
     LIVELLO e non il colore: il prato scuro resta un pannello navy come la
     fascia scura, niente verde, esattamente come aveva chiesto. Cambia solo di
     quanto è alzato dal fondo.

     Livello-1 e non livello-3: così i tre fondi che si incontrano scorrendo
     stanno su tre gradini diversi e nessuno confina con un uguale —
     1,345 dal fondo pagina e 1,330 dalla fascia `tenue`, cioè più dello stacco
     che nel tema chiaro separa le fasce fra loro (1,240). Il testo ci sta
     sopra largo: il bianco fa 14,25 e il grigio chiaro 8,03. */
  --sig-prato: var(--sig-livello-1);
  --sig-prato-testo: var(--sig-bianco);
  --sig-prato-tenue: var(--sig-grigio-chiaro);
  --sig-prato-filo: var(--sig-blu-500);

  --sig-velo-rgb: 12, 27, 48;

  --sig-segno-chiaro: none;
  --sig-segno-scuro: block;

  --sig-bordo: var(--sig-livello-3);
  --sig-bordo-forte: #3C6796;
  --sig-bordo-hover: var(--sig-blu-500);
  --sig-bordo-attivo: var(--sig-blu-300);

  --sig-azione-secondaria: var(--sig-blu-300);
  --sig-focus: var(--sig-bianco);
  --sig-focus-tenue: rgba(255, 255, 255, 0.30);

  /* Su fondo scuro il verde-800 sparisce e il rosso pieno vibra: gli stati
     prendono le versioni chiare, che è l'inverso esatto del tema chiaro. */
  --sig-ok: var(--sig-verde-300);
  --sig-no: #F5A79E;
  --sig-attenzione: #F0C46B;

  /* I FONDI DEGLI AVVISI SALGONO CON LA SCALA. Erano tarati sul
     fondo pagina di prima, e sopra una superficie del livello 1 stavano a
     1,01–1,14: un badge che non si stacca dalla scheda che lo porta non e'
     un badge. Adesso stanno un gradino sopra, e il testo dentro regge
     ancora — 4,75 il rosso, 5,3 gli altri. */
  --sig-errore-sfondo: #7A3126;
  --sig-errore-testo: #F5A79E;
  --sig-successo-sfondo: #1D5C28;
  --sig-successo-testo: var(--sig-verde-300);
  --sig-attenzione-sfondo: #66450A;
  --sig-attenzione-testo: #F0C46B;
  --sig-info-sfondo: #22497C;
  --sig-info-testo: var(--sig-blu-100);

  /* Sul nero la stessa quantità di rumore sembra di meno, e il filo di luce
     al 55% diventerebbe un bordo bianco: qui la grana sale e la luce scende.
     Sono gli stessi due token, con i valori del buio. */
  --sig-grana-forza: .07;
  --sig-luce-alto: inset 0 1px 0 rgba(255, 255, 255, .10);
  --sig-luce-bordo: inset 0 0 0 1px rgba(255, 255, 255, .05);

  --sig-ombra-1: 0 2px 8px rgba(0, 0, 0, 0.32);
  --sig-ombra-carta: none;
  --sig-ombra-2: 0 8px 24px rgba(0, 0, 0, 0.44);
  --sig-ombra-3: 0 20px 48px rgba(0, 0, 0, 0.56);

  /* ── I nove nomi del gestionale ──────────────────────────────────────────
     Restano perché sono usati in dieci file e riscriverli è un lavoro suo, non
     un pezzo del restyling. Da qui in poi però hanno UNA definizione sola. */
  --bg:       var(--sig-sfondo);
  --pannello: var(--sig-superficie);
  --bordo:    var(--sig-bordo);
  --testo:    var(--sig-testo);
  --tenue:    var(--sig-testo-secondario);
  --ok:       var(--sig-ok);
  --no:       var(--sig-no);
  --attesa:   var(--sig-attenzione);
  --accento:  var(--sig-azione-secondaria);
  --barra:    var(--sig-barra);

  /* I tre fondi degli avvisi, che nelle pagine erano esadecimali nudi
     (#2b1416, #122417, #2a2415) e adesso hanno un nome. */
  --sig-avviso-no:     var(--sig-errore-sfondo);
  --sig-avviso-ok:     var(--sig-successo-sfondo);
  --sig-avviso-attesa: var(--sig-attenzione-sfondo);
}

/* ── E CHI SEGUE LO SCHERMO ─────────────────────────────────────────────────
   Gli stessi identici valori, per chi ha dichiarato `data-tema="auto"`.
   Sono scritti due volte, e la ripetizione e' accettata: il CSS non ha un
   modo di dire «questo blocco, anche dentro questa media query» senza
   riscriverne il selettore, e le alternative — un pezzo di JavaScript che
   sposta un attributo, oppure `light-dark()` su ottanta token — costano
   piu' di quello che risolvono: la prima un lampo di tema sbagliato al
   caricamento, la seconda la riscrittura dell'intera tavolozza.

   La divergenza pero' NON e' accettata, e non dipende da chi ricorda di
   aggiornare tutti e due: `tema-automatico.test.js` confronta i due
   blocchi riga per riga e diventa rosso al primo valore che si scosta.
   E' la stessa regola con cui convivono le due copie di LIVELLI, in
   persone.js e in sessioni.html. */
@media (prefers-color-scheme: dark) {
  [data-tema="auto"] {
    /* I QUATTRO LIVELLI, in ordine di luce. Vedi la scala in cima: qui
     il tema scuro smette di prendere tre navy del marchio e prende dei
     gradini misurati, perche' fra il fondo e una scheda c'era 1,13 a 1 —
     cioe' niente, ed era tutto blu su blu. */
  --sig-sfondo: var(--sig-livello-0);
    --sig-superficie: var(--sig-livello-1);
    --sig-superficie-alt: var(--sig-livello-2);
    --sig-superficie-premuta: var(--sig-livello-2);
    /* La fascia alterna, come nel blocco `scuro` qui sopra: il livello-2 di
       sempre. Il gradino dello scuro non è quello che si stava correggendo. */
    --sig-fascia: var(--sig-livello-2);
    --sig-fascia-tenue: var(--sig-grigio-chiaro);
    /* Qui «in evidenza» va verso la LUCE: c'è tutto lo spazio, ed è così che
       funziona un tema scuro fatto bene. Vedi la nota nel blocco chiaro. */
    --sig-superficie-alta: var(--sig-livello-2);
    --sig-superficie-alta-testo: var(--sig-bianco);
    --sig-superficie-alta-tenue: var(--sig-grigio-chiaro);
    --sig-superficie-inversa: var(--sig-base);

    --sig-testo: var(--sig-bianco);
    --sig-testo-secondario: var(--sig-grigio-chiaro);
    --sig-testo-disabilitato: #6B7A8C;
    --sig-testo-inverso: var(--sig-blu-900);
    --sig-nome-gioco: var(--sig-oro-300);
    --sig-gioco-sfondo: var(--sig-lime-500);
    --sig-gioco-testo: var(--sig-blu-900);
    --sig-gioco-bordo: var(--sig-verde-800);
    --sig-gioco-corpo: var(--sig-blu-900);
    --sig-gioco-tenue: var(--sig-verde-900);
    --sig-gioco-secondario: var(--sig-verde-900);
    --sig-gioco-primario: var(--sig-blu-900);
    --sig-gioco-primario-hover: var(--sig-blu-900);
    --sig-gioco-primario-su: var(--sig-lime-500);
    --sig-testo-link: var(--sig-verde-300);
    --sig-testo-link-hover: var(--sig-verde-100);
    /* Vedi la nota su `color-scheme` nel blocco chiaro: e' quello che fa seguire
       il tema anche a quello che disegna il browser. */
    color-scheme: dark;

    --sig-verde-testo: var(--sig-verde-300);
    --sig-verde-tenue: var(--sig-verde-900);

    /* Le fasce: qui il navy è il fondo pagina, e una fascia navy sparirebbe.
       Vedi la nota sopra `--sig-scuro-filo` nel blocco chiaro. */
    --sig-scuro: var(--sig-livello-2);
    --sig-scuro-testo: var(--sig-bianco);
    --sig-scuro-filo: var(--sig-blu-500);
    /* Livello-1 come nel blocco `scuro` qui sopra: «premi» e «community» sono
       adiacenti, e al livello-2 erano lo stesso identico colore. Il perché per
       esteso sta là. */
    --sig-prato: var(--sig-livello-1);
    --sig-prato-testo: var(--sig-bianco);
    --sig-prato-tenue: var(--sig-grigio-chiaro);
    --sig-prato-filo: var(--sig-blu-500);

    --sig-velo-rgb: 12, 27, 48;

    --sig-segno-chiaro: none;
    --sig-segno-scuro: block;

    --sig-bordo: var(--sig-livello-3);
    --sig-bordo-forte: #3C6796;
    --sig-bordo-hover: var(--sig-blu-500);
    --sig-bordo-attivo: var(--sig-blu-300);

    --sig-azione-secondaria: var(--sig-blu-300);
    --sig-focus: var(--sig-bianco);
    --sig-focus-tenue: rgba(255, 255, 255, 0.30);

    /* Su fondo scuro il verde-800 sparisce e il rosso pieno vibra: gli stati
       prendono le versioni chiare, che è l'inverso esatto del tema chiaro. */
    --sig-ok: var(--sig-verde-300);
    --sig-no: #F5A79E;
    --sig-attenzione: #F0C46B;

    /* I FONDI DEGLI AVVISI SALGONO CON LA SCALA. Erano tarati sul
     fondo pagina di prima, e sopra una superficie del livello 1 stavano a
     1,01–1,14: un badge che non si stacca dalla scheda che lo porta non e'
     un badge. Adesso stanno un gradino sopra, e il testo dentro regge
     ancora — 4,75 il rosso, 5,3 gli altri. */
  --sig-errore-sfondo: #7A3126;
    --sig-errore-testo: #F5A79E;
    --sig-successo-sfondo: #1D5C28;
    --sig-successo-testo: var(--sig-verde-300);
    --sig-attenzione-sfondo: #66450A;
    --sig-attenzione-testo: #F0C46B;
    --sig-info-sfondo: #22497C;
    --sig-info-testo: var(--sig-blu-100);

    /* Sul nero la stessa quantità di rumore sembra di meno, e il filo di luce
       al 55% diventerebbe un bordo bianco: qui la grana sale e la luce scende.
       Sono gli stessi due token, con i valori del buio. */
    --sig-grana-forza: .07;
    --sig-luce-alto: inset 0 1px 0 rgba(255, 255, 255, .10);
    --sig-luce-bordo: inset 0 0 0 1px rgba(255, 255, 255, .05);

    --sig-ombra-1: 0 2px 8px rgba(0, 0, 0, 0.32);
    --sig-ombra-carta: none;
    --sig-ombra-2: 0 8px 24px rgba(0, 0, 0, 0.44);
    --sig-ombra-3: 0 20px 48px rgba(0, 0, 0, 0.56);

    /* ── I nove nomi del gestionale ──────────────────────────────────────────
       Restano perché sono usati in dieci file e riscriverli è un lavoro suo, non
       un pezzo del restyling. Da qui in poi però hanno UNA definizione sola. */
    --bg:       var(--sig-sfondo);
    --pannello: var(--sig-superficie);
    --bordo:    var(--sig-bordo);
    --testo:    var(--sig-testo);
    --tenue:    var(--sig-testo-secondario);
    --ok:       var(--sig-ok);
    --no:       var(--sig-no);
    --attesa:   var(--sig-attenzione);
    --accento:  var(--sig-azione-secondaria);
    --barra:    var(--sig-barra);

    /* I tre fondi degli avvisi, che nelle pagine erano esadecimali nudi
       (#2b1416, #122417, #2a2415) e adesso hanno un nome. */
    --sig-avviso-no:     var(--sig-errore-sfondo);
    --sig-avviso-ok:     var(--sig-successo-sfondo);
    --sig-avviso-attesa: var(--sig-attenzione-sfondo);
  }
}

/* Chi vuole il chiaro esplicito, per riportare indietro un ramo scuro. */
[data-tema="chiaro"] {
  --sig-sfondo: var(--sig-base-fondo);
  --sig-superficie: var(--sig-bianco);
  --sig-testo: var(--sig-blu-900);
  --sig-testo-secondario: var(--sig-grigio-testo);
  /* La fascia alterna e il suo secondario: gli stessi del blocco chiaro in
     cima. Questo blocco serve a riportare indietro un ramo scuro, e una voce
     che qui mancasse lascerebbe la fascia col valore dello scuro. */
  --sig-fascia: #C9D9ED;
  --sig-fascia-tenue: #4E5E72;
}

/* Anche nel tema chiaro i tre fondi degli avvisi hanno un nome: le pagine li
   chiamano allo stesso modo, e cambia il valore. */
:root {
  --sig-avviso-no:     var(--sig-errore-sfondo);
  --sig-avviso-ok:     var(--sig-successo-sfondo);
  --sig-avviso-attesa: var(--sig-attenzione-sfondo);
}

/* ═══════════════════════════════════════════════════════════════════════════
   BASE
   ═══════════════════════════════════════════════════════════════════════════ */

/* L'attributo `hidden` non basta da solo: la regola del browser
   (`[hidden] { display: none }`) perde contro qualunque regola d'autore che
   dichiari `display`, perché le regole d'autore battono sempre quelle del
   browser. È costato due segnalazioni sulla sovrimpressione del registro, che
   per due giorni non si è potuta chiudere in nessun modo.

   NON SI TOGLIE, e non si toglie nemmeno dalle pagine che un domani linkassero
   questo foglio: là dentro c'è per le stesse ragioni, e un test la pretende
   pagina per pagina. */
[hidden] { display: none !important; }

/* E `.nascosto` con lei, per la stessa ragione e con lo stesso peso.

   La classe la mettono e la tolgono gli script di mezzo sistema, e scritta
   `.nascosto { display: none }` vale (0,1,0) — cioè PERDE contro ogni regola
   che dichiari un display con un elemento davanti. `button.sig-bottone`
   vale (0,1,1), e vinceva: nell'area utente si vedevano il pallino degli
   avvisi con dentro «0», «Condividi invito», «Togli la foto» e «Annulla il
   cambio email» — quattro comandi che il codice credeva di aver nascosto.

   La stessa lezione era già stata pagata una volta in home, dove la regola
   sta col `!important` e un commento accanto. Metterla qui la vale per
   tutte le pagine, invece che aspettare che ognuna se la ricopi. */
.nascosto { display: none !important; }

*, *::before, *::after { box-sizing: border-box; }

/* ══ LA GRANA STA SUL FONDO, FISSA ═════════════════════════════════════════
   Il rumore lo porta uno strato suo, `body::before`, invece di un
   `background-image` su body: attaccato al fondo scorrerebbe con la pagina, e
   una grana che scorre si legge come una texture stampata sopra invece che
   come la materia della superficie. Fissa, sta ferma mentre il contenuto le
   passa davanti — che è quello che fa la grana di una fotografia.

   `pointer-events: none` perché non deve intercettare NIENTE: è uno strato
   che copre tutta la finestra, e senza quella riga si mangerebbe ogni clic
   della pagina.

   COME STA SOTTO AL CONTENUTO, e perché non nel modo ovvio. La prima
   versione dava `position: relative; z-index: 1` a tutti i figli di `body`,
   e i figli di `body` comprendono i `<dialog>`: un dialogo modale lo posiziona
   il browser con `position: fixed`, ma le regole d'autore battono quelle del
   browser SEMPRE, anche a specificità più bassa. Cioè: la grana avrebbe
   scentrato ogni finestra modale del sistema.

   Adesso è `body` a fare da contesto di impilamento (`isolation: isolate`) e
   la grana a stare a `z-index: -1`: dentro un contesto, i figli negativi si
   disegnano SOPRA il fondo dell'elemento e SOTTO tutto il resto. Nessun altro
   elemento viene toccato. */
/* ══ LA PAGINA SCORRE SU UN BINARIO ═════════════════════════════════════════
   Il titolare, 5 novembre 2026: «col dito la pagina si sposta a destra e a sinistra:
   deve scorrere solo in verticale». Quello che sbordava è corretto alla fonte; questa
   è la rete sotto. `clip` e non `hidden`: non crea un contenitore che scorre, quindi
   le barre `sticky` restano attaccate alla finestra. `touch-action` lascia passare il
   verticale e lo zoom con due dita; le tabelle e i caroselli con `overflow-x: auto`
   scorrono lo stesso, perché il tocco si ferma al primo contenitore che scorre. */
html, body { overflow-x: clip; overscroll-behavior-x: none; }
html > body { touch-action: pan-y pinch-zoom; }

body::before {
  content: ''; position: fixed; inset: 0; z-index: -1;
  pointer-events: none;
  background-image: var(--sig-grana);
  opacity: var(--sig-grana-forza);
}

body {
  isolation: isolate;
  margin: 0;
  font-family: var(--sig-font);
  font-weight: var(--sig-peso-regular);
  background: var(--sig-sfondo);
  color: var(--sig-testo);
  line-height: var(--sig-interlinea-testo);
  /* Una parola lunghissima — un indirizzo, un nome incollato — non deve
     allargare la pagina: si spezza. È il modo più comune in cui compare uno
     scorrimento orizzontale che nessuno ha chiesto.

     `break-word` e NON `anywhere`: i due spezzano allo stesso modo, ma
     `anywhere` abbassa anche la larghezza MINIMA di ogni scatola a una lettera.
     In una riga flessibile il pulsante si restringeva fino a una lettera
     (Registro: «Ri/m/an/da»), in una tabella le colonne si comprimevano invece
     di far scorrere il riquadro (Istruttori: «TELE/FON/O»). Con `break-word`
     la parola lunga va a capo solo quando non ci sta, e pulsanti e colonne
     tengono la loro larghezza minima. Chi vuole davvero lo spezzare ovunque —
     un nome dentro una cella stretta — lo scrive sul suo elemento. */
  overflow-wrap: break-word;
  -webkit-text-size-adjust: 100%;
  -webkit-font-smoothing: antialiased;
}

img, video { max-width: 100%; height: auto; display: block; }

/* Il link prende il BLU, non l'accento: il lime a 1.90 non si legge. */
a { color: var(--sig-testo-link); text-decoration: none; }
/* ══ IL COLORE AL PASSAGGIO VALE PER I LINK NEL TESTO, NON PER I COMPONENTI ═
   Era `a:hover`, che pesa (0,1,1): più di una classe sola. Così scavalcava
   il colore di ogni componente fatto con un `<a>` — la linguetta della
   Sfida, i bottoni verdi, il bottone fisso — e sul telefono, dove lo stato
   «sotto il dito» resta attaccato dopo il tocco, la scritta diventava il
   verde dei link. Misurato il 30 ottobre 2026 a 375: linguetta premuta 1,06:1
   nel tema scuro (verde chiarissimo su bianco), «Entra nel gruppo WhatsApp»
   1,8:1, bottone fisso 2,1:1 nel chiaro.

   `:where()` porta il peso a quello di `a` nudo: i link nel testo cambiano
   colore come prima (questa riga viene dopo `a`), e un componente che si è
   dato un colore con la sua classe lo tiene anche sotto il dito. */
a:where(:hover) { color: var(--sig-testo-link-hover); }
.sig-sezione.scura a { color: var(--sig-scuro-testo); }
/* …ma non il bottone pieno: quella regola vale per i link nel testo, e un
   `<a class="sig-bottone">` in fascia scura prendeva il bianco sopra il lime
   (2.04:1, in tutti e due i temi). Il testo del bottone è il suo. */
.sig-sezione.scura a.sig-bottone { color: var(--sig-accento-su); }

:focus-visible {
  outline: var(--sig-focus-spessore) solid var(--sig-focus);
  outline-offset: var(--sig-focus-offset);
}

/* ═══════════════════════════════════════════════════════════════════════════
   IMPIANTO
   ═══════════════════════════════════════════════════════════════════════════ */

.sig-colonna {
  max-width: var(--sig-larghezza);
  margin: 0 auto;
  padding: 0 var(--sig-sp-3);
}

/* La colonna larga: per le sezioni che tengono schede in griglia, dove la
   colonna di lettura sarebbe uno spreco. Sul telefono è identica all'altra —
   `max-width` più grande di quanto c'è non cambia niente — e si allarga solo da
   1024 in su, dove lo spazio c'è davvero. */
.sig-colonna.larga { max-width: var(--sig-contenuto); }

/* 32px: era 48 — sommato fra due sezioni faceva quasi 100px di vuoto a ogni
   confine, e sul telefono si scrollava più vuoto che contenuto. */
.sig-sezione { padding: var(--sig-spazio-6) 0; }
/* Il verso si dichiara in pagina, con una classe, e non si calcola con un
   `nth-of-type`: le sezioni della home stanno dentro contenitori diversi — i
   blocchi delle vecchie pagine — e `nth-of-type` conta DENTRO ciascuno. Il
   risultato erano due fasce vicine con lo stesso verso e la pagina che le
   leggeva come una fascia sola ripetuta. Misurato, non temuto. */
.sig-sezione.scura.rovescio { background: var(--sig-gradiente-fascia-rovescio); }

/* ══ E LE SEZIONI CHIARE SMETTONO DI ESSERE TUTTE UGUALI ═════════════════════
   «Scorrendo non si capisce dove finisce una sezione e comincia l'altra: fondi
   piatti e tutti uguali.» Erano tutti lo stesso `--sig-sfondo`, e fra due
   sezioni identiche l'unica differenza era un filo da un pixel.

   `tenue` è il secondo fondo chiaro: una superficie appena sollevata, con la
   sua rampa verticale e i suoi due fili di luce ai bordi. Non è un colore
   nuovo — è lo stesso fondo pagina portato di un gradino verso la superficie
   — e questo è il punto: le sezioni si distinguono senza che la pagina
   diventi una scacchiera. */
/* ══ E IL GRADINO SI SENTE AL CONFINE, NON A META' FASCIA ═══════════════════
   La rampa di prima partiva da un 70% di fascia e 30% di FONDO PAGINA: cioè
   proprio sul bordo — l'unico punto in cui l'occhio decide se sono due fasce o
   una — il colore era per un terzo quello della fascia accanto. Il gradino
   vero (1,052) arrivava a metà altezza, dove non c'è nessun confine da vedere.
   Al confine ne restava 1,039.

   Adesso la rampa sta DENTRO: i due bordi sono al colore pieno e a schiarire è
   il centro. Il gradiente resta — una fascia larga quanto lo schermo tinta
   piatta si vede che è piatta — ma smette di sfumare proprio dove deve
   tagliare. Col fondo nuovo il confine passa da 1,039 a 1,240. */
.sig-sezione.tenue {
  background:
    linear-gradient(180deg,
      var(--sig-fascia) 0%,
      color-mix(in srgb, var(--sig-fascia) 88%, var(--sig-sfondo)) 50%,
      var(--sig-fascia) 100%);
  /* I due fili che chiudono la fascia: una riga di luce sopra e una d'ombra
     sotto, dall'interno. Con la rampa che sfumava erano decorazione; adesso
     sono il taglio, e il velo bianco al 35% non bastava a farsi vedere su un
     fondo che si è abbassato. */
  box-shadow: inset 0 1px 0 rgba(255, 255, 255, .55),
              inset 0 -1px 0 rgba(12, 27, 48, .14);
  position: relative; isolation: isolate;
  /* Il secondario si rilegge sul fondo su cui si posa: dentro la fascia il
     grigio di pagina scenderebbe a 3,9 (e stava già a 4,48 sulla fascia di
     prima, cioè sotto soglia da prima di questa modifica). Si sovrascrive il
     RUOLO e non i singoli selettori, così ogni discendente che già dice
     `--sig-testo-tenue` — le descrizioni dei sette passi, le parole sotto i
     quattro numeri, le didascalie della galleria — si corregge da sé. */
  --sig-testo-tenue: var(--sig-fascia-tenue);
  --sig-testo-secondario: var(--sig-fascia-tenue);
}
/* La grana anche qui: è una superficie larga quanto lo schermo, ed è
   esattamente il caso in cui una tinta piatta si vede che è piatta. */
.sig-sezione.tenue::after {
  content: ''; position: absolute; inset: 0; z-index: -1;
  pointer-events: none;
  background-image: var(--sig-grana);
  opacity: var(--sig-grana-forza);
}
/* Fra una `tenue` e la sezione dopo il filo non serve: il cambio di fondo lo
   fa già, e un tratto in mezzo a due colori diversi è una cucitura di troppo. */
.sig-sezione.tenue + .sig-sezione::before,
.sig-sezione.tenue::before { content: none; }

/* Il filo non è più un bordo: è il tratto che sfuma sui lati, disegnato
   dallo pseudo-elemento più sotto. Un `border-top` arriva ai bordi per
   forza, e quello era il difetto. */
/* La fascia prato: il verde-100 della scala come fondo di sezione. È il
   colore che mancava — il sito era navy su bianco e basta, e una palette con
   un prato dentro non lo faceva mai vedere. */
/* La fascia prato: verde chiarissimo sul chiaro, pannello sullo scuro — e in
   tutti e due i casi il filo la chiude. Vedi `--sig-prato`. */
/* ══ I PASSAGGI FRA UNA SEZIONE E L'ALTRA ══════════════════════════════════
   «Il passaggio da una sezione all'altra è troppo netto.» E il caso peggiore
   non è quello che sembra: non è la fascia colorata — quella si annuncia da
   sé — è il FILO fra due sezioni dello stesso identico colore. Un tratto da
   un pixel che attraversa tutto lo schermo per separare bianco da bianco: non
   divide niente, e si vede solo lui. In una pagina sola, dove le sezioni
   adesso sono sette, sono sette cuciture.

   Il filo resta — serve a dire che si è cambiato argomento — ma smette di
   arrivare ai bordi: sfuma a zero sui due lati, e quello che resta è un tratto
   corto al centro. È la differenza fra una cucitura e un segno di matita.

   PRIMA AVEVO PROVATO IL CONTRARIO, e va scritto perché non lo rifaccia
   nessuno: una sfumatura di venti pixel che portava il colore della PAGINA
   dentro la fascia. Sulla fascia scura, in tema chiaro, quella sfumatura è
   una velatura biancastra sul bordo alto — sembra un errore di stampa, non un
   passaggio. Il colore della pagina non entra nella fascia: la fascia comincia
   dove comincia, e sono i suoi bordi a doversi ammorbidire da dentro. */
.sig-sezione + .sig-sezione { position: relative; }
.sig-sezione + .sig-sezione::before {
  content: ''; position: absolute; top: 0; left: 0; right: 0; height: 1px;
  pointer-events: none;
  background: linear-gradient(90deg,
      transparent 0%, var(--sig-bordo) 22%,
      var(--sig-bordo) 78%, transparent 100%);
}

/* Le fasce colorate il filo non lo vogliono: hanno il loro, che è quello del
   colore. Quello che vogliono è uno SPESSORE ai bordi — una riga di luce sul
   filo alto e un velo scuro su quello basso, dall'interno. La fascia smette
   di essere un rettangolo appoggiato sopra e diventa un pezzo di pagina che
   sta su un altro piano. */
.sig-sezione.scura + .sig-sezione::before,
.sig-sezione.prato + .sig-sezione::before,
.sig-sezione.scura::before, .sig-sezione.prato::before { content: none; }
.sig-sezione.scura, .sig-sezione.prato {
  box-shadow: inset 0 1px 0 rgba(255, 255, 255, .10),
              inset 0 -14px 22px -14px rgba(7, 15, 30, .45);
  /* `isolation` per la grana qui sotto: serve a fare della fascia un contesto
     di impilamento, perché lo strato di rumore possa stare a `z-index: -1` —
     cioè sopra il fondo della fascia e SOTTO il suo contenuto. Senza, il
     rumore si poserebbe anche sopra il testo e le carte. */
  position: relative; isolation: isolate;
}
/* La grana anche sulle fasce, e non è un di più: le fasce sono le superfici
   PIÙ piatte del sito — una tinta o una rampa su tutta la larghezza dello
   schermo — e la grana del fondo pagina non ci arriva, perché il loro colore
   la copre. Restavano l'unica cosa che sembrava stampata. */
.sig-sezione.scura::after, .sig-sezione.prato::after {
  content: ''; position: absolute; inset: 0; z-index: -1;
  pointer-events: none;
  background-image: var(--sig-grana);
  opacity: var(--sig-grana-forza);
}

/* Anche il prato smette di essere una tinta: la stessa cura delle altre, con
   la sua rampa verticale. Il colore è quello — il verde-100 della scala — solo
   letto in tre punti invece che in uno. */
/* La rampa dentro e i bordi al colore pieno, come sulla `tenue`: il prato è
   verde-100 e contro il fondo pagina chiaro sta a 1,017 — cioè niente. A
   tenerlo separato è il suo FILO, che infatti c'è in tutti e due i temi; ma un
   filo che nasce da un bordo già sfumato verso il fondo pagina è un filo che
   divide due colori quasi uguali. Il colore resta quello — qui non si tocca
   nessun verde del marchio — e cambia solo dove sta la sfumatura. */
.sig-sezione.prato {
  background: linear-gradient(180deg,
    var(--sig-prato) 0%,
    color-mix(in srgb, var(--sig-prato) 90%, var(--sig-sfondo)) 45%,
    var(--sig-prato) 100%);
  color: var(--sig-prato-testo);
  /* `--sig-prato-filo`, non quello della fascia scura: qui il filo serve in
     TUTTI E DUE i temi. Due pixel e non uno: su questa fascia il filo non
     accompagna il cambio di fondo — è il cambio di fondo, perché il verde e la
     pagina hanno la stessa luce. Vedi la nota sul token. */
  border-top: 2px solid var(--sig-prato-filo);
  border-bottom: 2px solid var(--sig-prato-filo);
}
.sig-sezione.prato p { color: var(--sig-prato-tenue); }
.sig-sezione.prato h2, .sig-sezione.prato h3 { color: var(--sig-prato-testo); }

/* L'evidenziatore: una pennellata di lime DIETRO il testo, mai come testo.
   Parte dal basso e copre mezzo rigo, come un tratto di marker. */
/* ══ L'EVIDENZIATORE PORTA IL SUO TESTO ══════════════════════════════════════
   Il titolare, 11 settembre 2026: «il testo del contest è illeggibile:
   contrasto troppo basso. È lo stesso difetto delle stelline e dei bollini dei
   gradi.»

   Era un tratto di evidenziatore che copriva solo la parte bassa della riga e
   NON diceva di che colore fosse il testo: se lo teneva dal padre. Nel tema
   chiaro il padre è navy e va bene; nel tema scuro è bianco, e bianco sul lime
   fa 2.04 — sotto anche il 3 dei caratteri grandi. Misurato nel browser, non
   dedotto.

   Il testo scuro da solo non bastava: col tratto basso le aste delle lettere
   restano FUORI dal lime, sul fondo scuro della fascia, e lì lo scuro fa 1.35.
   Non esiste un colore che contrasti con tutti e due — il lime sta a metà
   strada — quindi il tratto sale a coprire la riga intera e il testo diventa
   scuro: la regola dei bollini, «vince il testo che contrasta di più, e lo
   scuro è il nero», applicata a un fondo che qui c'è per davvero.

   Nel tema chiaro si perde il tratto di pennarello e si guadagna un blocco
   pieno: stessa lettura di prima, stesso colore, e una regola sola per tutti
   e due i temi invece di una che funziona a metà. */
.sig-evidenzia {
  background: linear-gradient(transparent 8%, var(--sig-lime-500) 8%, var(--sig-lime-500) 94%, transparent 94%);
  color: var(--sig-blu-900);
  padding: 0 .08em;
}

/* La barra sotto i titoli in display: obliqua come loro, lime come l'azione.
   Con le animazioni attive si disegna da sinistra (le regole del movimento
   stanno con le altre, sotto body.sig-anima). */
.sig-display.con-barra { position: relative; padding-bottom: .18em; }
.sig-display.con-barra::after {
  content: ''; position: absolute; left: .04em; bottom: 0;
  width: 1.6em; height: .09em; background: var(--sig-lime-500);
}
body.sig-anima .sig-display.con-barra::after {
  transform: scaleX(0); transform-origin: left center;
  transition: transform .55s var(--sig-curva-scatto) .35s;
}
body.sig-anima .sig-parole.sig-in-vista.con-barra::after,
body.sig-anima .sig-display.con-barra.sig-in-vista::after { transform: scaleX(1); }

/* ══ LE FASCE SCURE PORTANO IL GRADIENTE DEL MARCHIO ═════════════════════════
   Il titolare: «l'unico blocco fatto bene è la fascia finale "Adesso vieni a
   giocare": quel gradiente funziona. Tienilo, e porta lo stesso livello di
   cura sulle altre sezioni.»

   Quel gradiente era un'eccezione dichiarata sulla sola chiusura. Adesso è il
   fondo di OGNI fascia scura: era già la cosa giusta, e tenerla per una
   sezione sola voleva dire avere una fascia bella e cinque piatte.

   IL VERSO SI ALTERNA, e non è vezzo: due fasce scure a poche schermate di
   distanza con lo stesso gradiente nello stesso verso si leggono come la
   stessa fascia ripetuta. A verso invertito si leggono come due momenti. */
.sig-sezione.scura {
  background: var(--sig-gradiente-fascia);
  color: var(--sig-scuro-testo);
  /* Il filo: trasparente sul chiaro, dove la fascia si annuncia da sé; sullo
     scuro è lui a dire dove comincia e dove finisce. */
  border-top: 1px solid var(--sig-scuro-filo);
  border-bottom: 1px solid var(--sig-scuro-filo);
}
.sig-sezione.scura .sig-occhiello { color: var(--sig-scuro-tenue); }
/* Nelle fasce scure il verde-800 sparirebbe: resta il tenue chiaro, che la
   regola della sezione scura imposta già. */
.sig-sezione.scura p { color: var(--sig-scuro-tenue); }
.sig-sezione.scura h2 { color: var(--sig-scuro-testo); }

/* ═══════════════════════════════════════════════════════════════════════════
   TESTO
   ═══════════════════════════════════════════════════════════════════════════ */

h1, h2, h3 {
  font-family: var(--sig-font-titoli);
  font-weight: var(--sig-peso-titoli);
  letter-spacing: var(--sig-traccia-titoli);
  line-height: var(--sig-interlinea-sottotitolo);
  margin: 0 0 var(--sig-sp-2);
}
h1 { font-size: var(--sig-corpo-h1-mobile); }
h2 { font-size: var(--sig-corpo-h2-mobile); }
h3 { font-size: var(--sig-corpo-h3-mobile); }

p { margin: 0 0 var(--sig-sp-3); }
p:last-child { margin-bottom: 0; }

.sig-occhiello {
  font-size: var(--sig-corpo-etichetta);
  text-transform: uppercase;
  letter-spacing: var(--sig-tracking-etichetta);
  /* Il verde della scala, finalmente in servizio: gli occhielli sono la
     didascalia del brand, e in grigio erano solo freddi. Il token cambia col
     tema — il verde-800 su fondo scuro fa 2,6 e non si legge. */
  color: var(--sig-verde-testo);
  margin: 0 0 var(--sig-sp-2);
  font-weight: var(--sig-peso-semibold);
}
/* ── IL SEGNO CHE CAMBIA COL TEMA ────────────────────────────────────────
   Il lettermark esiste in due versioni — navy e bianca — e su una pagina che
   segue lo schermo ne serve una per tema: navy su navy non si vede, e nemmeno
   bianco su bianco.

   ══ PERCHÉ LA SCELTA LA FA IL CSS, E NON UN <picture> ═════════════════════
   Un <picture> con `media="(prefers-color-scheme: dark)"` sceglierebbe da
   solo, senza JavaScript, e sembra la strada giusta. Ha però un difetto che
   si vede solo il giorno di una pubblicazione: quella scelta sta nell'HTML,
   che è sempre fresco, mentre i colori stanno nel foglio, che il browser
   potrebbe avere ancora vecchio. Per il tempo che passa fra i due, il segno
   sarebbe bianco su una pagina ancora chiara.

   Con le due immagini in pagina e la scelta nel CSS la domanda è una sola:
   se il foglio è vecchio, il segno è quello vecchio — sbagliato insieme al
   resto, che è molto meglio che sbagliato da solo. */
.segno-chiaro { display: var(--sig-segno-chiaro); }
.segno-scuro  { display: var(--sig-segno-scuro); }

.sig-guida { color: var(--sig-testo-tenue); }
.sig-tenue { color: var(--sig-testo-tenue); font-size: var(--sig-corpo-testo-piccolo); }

/* I titoli obliqui del brand: si chiedono per classe, non capitano da soli.
   Un `h1` inclinato in una pagina di modulo sarebbe fuori posto. */
.sig-display, .sig-h1 {
  font-weight: var(--sig-peso-black);
  text-transform: uppercase;
  transform: var(--sig-obliquo);
  margin: 0;
}
.sig-display {
  font-size: var(--sig-corpo-display-mobile);
  line-height: var(--sig-interlinea-display);
  letter-spacing: var(--sig-tracking-titolo);
}
.sig-h1 {
  font-size: var(--sig-corpo-h1-mobile);
  line-height: var(--sig-interlinea-titolo);
  letter-spacing: var(--sig-tracking-titolo);
}
.sig-h2 {
  font-weight: var(--sig-peso-extrabold);
  font-size: var(--sig-corpo-h2-mobile);
  line-height: var(--sig-interlinea-sottotitolo);
  letter-spacing: var(--sig-tracking-sottotitolo);
  margin: 0;
}
.sig-h3 {
  font-weight: var(--sig-peso-bold);
  font-size: var(--sig-corpo-h3-mobile);
  line-height: var(--sig-interlinea-sottotitolo);
  margin: 0;
}

/* La didascalia maiuscoletta del brand. Si chiamava `.sig-etichetta` e il nome
   era già occupato dalla pillola dei posti liberi — vedi la nota 5. */
.sig-microtesto {
  font-weight: var(--sig-peso-medium);
  font-size: var(--sig-corpo-etichetta);
  line-height: var(--sig-interlinea-etichetta);
  letter-spacing: var(--sig-tracking-etichetta);
  text-transform: uppercase;
  color: var(--sig-testo-secondario);
}

.sig-numero {
  font-weight: var(--sig-peso-black);
  font-size: var(--sig-corpo-numero-mobile);
  line-height: var(--sig-interlinea-numero);
  letter-spacing: var(--sig-tracking-display);
  font-variant-numeric: tabular-nums;
}

/* ═══════════════════════════════════════════════════════════════════════════
   COSE DA PREMERE
   L'altezza minima sta sulla regola generale, non sul singolo pulsante: così un
   pulsante aggiunto domani nasce grande abbastanza senza che nessuno debba
   ricordarsene.
   ═══════════════════════════════════════════════════════════════════════════ */

/* Il bottone è un OGGETTO APPOGGIATO, non un rettangolo colorato: sotto il
   fill c'è un bordo più scuro — il verde della G — che gli dà uno spessore, e
   premendolo si schiaccia davvero: l'appoggio si riduce e il bottone scende di
   quel tanto. Niente ombre: la profondità la fa il bordo.

   Il margine sotto compensa l'appoggio: senza, premere il bottone farebbe
   ballare di 3px tutto quello che sta sotto di lui. */
/* ══ I PULSANTI USANO IL CARATTERE DEL SITO ═════════════════════════════
   11 ottobre 2026. Misurato su telefono e computer: 76 controlli su 486 uscivano
   in Arial — il panino del menu, le frecce ‹ › dei caroselli, la × della
   linguetta, l'occhio della password, i numeri nei pallini — perché un
   `<button>` non eredita il carattere della pagina da solo: il browser gli dà il
   suo. `font-family: inherit` e basta (non `font: inherit`): corpo e peso
   restano quelli che ogni pulsante dichiara, cambia solo la famiglia. Con
   specificità zero: ogni regola che sceglie un carattere per un pulsante vince
   ancora. */
:where(button) { font-family: inherit; }

/* ══ UN VERDE SOLO NEI PULSANTI PIENI ═══════════════════════════════════
   11 ottobre 2026. Quattro pagine (home, serata, attesa, valuta) avevano la
   stessa `.cta-verde` scritta a mano — fondo `verde-500` (#4DAF4F) col bordo
   `verde-800` — e accanto al lime di tutti gli altri pulsanti pieni
   (#8DC63F) facevano due verdi diversi: «Vieni a giocare» della home in lime,
   «Vieni a giocare» della serata e «Partecipa alla Sfida» in verde freddo.
   Adesso il fondo, il testo e l'appoggio sono quelli del tema (`--sig-accento`,
   `--sig-accento-su`, `--sig-appoggio`: la regola del `.sig-bottone.pieno`) e
   `.cta-verde` resta solo una MISURA — corpo e altezza più grandi, il peso di
   un'azione principale — scritta qui una volta. */
.sig-bottone.cta-verde { font-size: 1.12rem; min-height: 52px; font-weight: var(--sig-peso-bold); }

.sig-bottone,
button.sig-bottone {
  display: inline-flex;
  align-items: center;
  justify-content: center;
  gap: var(--sig-sp-1);
  min-height: var(--sig-tocco);
  padding: var(--sig-sp-2) var(--sig-sp-4);
  border-radius: var(--sig-raggio-tondo);
  border: var(--sig-spessore-bordo) solid transparent;
  border-bottom: var(--sig-spessore-appoggio) solid var(--sig-appoggio);
  background: var(--sig-accento);
  color: var(--sig-accento-su);
  font: inherit;
  font-weight: var(--sig-peso-semibold);
  text-decoration: none;
  cursor: pointer;
  text-align: center;
  transition: background var(--sig-durata-istantanea) var(--sig-curva-standard),
              border-color var(--sig-durata-istantanea) var(--sig-curva-standard),
              transform var(--sig-durata-istantanea) var(--sig-curva-standard);
}
/* Solo dove un puntatore c'è davvero. La riga nuda `.sig-bottone:hover`
   che stava qui sotto rendeva inutile la guardia: su un telefono il tocco
   lascia lo stato :hover appiccicato al pulsante finché non si tocca altrove,
   e il pulsante restava del colore «sotto il mouse» a mouse inesistente. */
@media (hover: hover) {
  .sig-bottone:hover {
    background: var(--sig-azione-primaria-hover);
    transform: translateY(-1px);
  }
}
.sig-bottone:active {
  background: var(--sig-azione-primaria-premuta);
  border-bottom-width: var(--sig-spessore-bordo);
  transform: translateY(2px);
}
/* Il secondario: il bordo È l'identità. Lime come BORDO — la regola «mai come
   testo» vale per il testo, e infatti il testo resta il nostro navy. */
.sig-bottone.secondario {
  background: transparent;
  color: var(--sig-testo);
  border-color: var(--sig-accento);
  border-bottom-color: var(--sig-accento);
}
.sig-bottone.secondario:hover {
  background: var(--sig-superficie-alt);
  border-color: var(--sig-appoggio);
  border-bottom-color: var(--sig-appoggio);
}
.sig-bottone.secondario:active { transform: translateY(1px); }
/* Nelle fasce scure il testo resta chiaro: il fondo chiaro del hover lo faceva sparire (1,13). */
.sig-sezione.scura .sig-bottone.secondario:hover { background: var(--sig-blu-900); }
.sig-sezione.scura .sig-bottone.secondario {
  color: var(--sig-scuro-testo);
  border-color: var(--sig-accento);
  border-bottom-color: var(--sig-accento);
}
.sig-bottone[disabled]:not([aria-busy="true"]) {
  opacity: .55; cursor: default; background: var(--sig-accento);
  border-bottom-width: var(--sig-spessore-bordo); transform: none;
}
/* Da telefono un pulsante d'azione principale sta bene largo quanto la colonna:
   è più facile da centrare col pollice. */
.sig-bottone.pieno { width: 100%; }

/* Anche i campi di un modulo si toccano col dito, e da telefono un campo basso
   è un campo che si manca. Caselle e pallini restano quelli che sono:
   ingranditi diventerebbero due quadratoni. */
input:not([type="checkbox"]):not([type="radio"]), select, textarea {
  min-height: var(--sig-tocco);
  font-family: var(--sig-font);
  /* ══ UN CAMPO NON PIÙ LARGO DEL SUO CONTENITORE ═════════════════════════
     Giro visivo del 7 ottobre 2026: la select «Istruttore» di «Nuova sessione»
     prendeva la larghezza dell'opzione più lunga (694px con nomi lunghi) e la
     pagina scorreva di 343px di lato, a 375 come a 768. Un solo limite:
     `max-width: 100%`, niente larghezze e niente `min-width`.

     NIENTE `min-width: 0`, provato e tolto: lasciava restringere i campi dentro
     le righe flessibili — la textarea della descrizione nel Catalogo passava da
     256px a 166, più stretta del campo sopra — cioè cambiava l'aspetto di campi
     che con la select non c'entravano. Il campo con la sua misura (`.largo`,
     `min-width: 14rem`) se la tiene: una classe vince su questa regola. */
  max-width: 100%;
}
/* ══ I CAMPI CHE NESSUNA PAGINA HA VESTITO ═════════════════════════════════
   Giro visivo del 9 ottobre 2026: nel tema scuro i campi nati fuori dalle
   classi di una pagina (`.campo`, `.cerca-tendina`, un `input[type=text]`
   scritto per un solo campo) restavano quelli del browser — grigio
   `rgb(59,59,59)`, bordo `inset`, angoli vivi — accanto ai campi blu dello
   stesso modulo: «Aggiungi una persona» nelle Iscrizioni, il filtro del
   Registro, «Cerca amici» nell'area, le select di Regole e Registro.

   Un fondo comune, coi token del tema, e a specificità ZERO (`:where`): la
   pagina che veste i suoi campi vince sempre, e questa regola copre solo
   quello che nessuno ha vestito. NON tocca la misura: bordo da 2 px (quanto
   l'`inset` del browser), niente padding, niente altezza. Caselle, pallini,
   colore e intervalli restano loro. */
:where(input:not([type="checkbox"]):not([type="radio"]):not([type="range"]):not([type="color"]):not([type="file"]):not([type="submit"]):not([type="button"]):not([type="reset"]):not([type="image"]):not([type="hidden"]), select, textarea) {
  background-color: var(--sig-carta);
  color: var(--sig-testo);
  /* Stile e colore, NON lo spessore: il browser dà 2 px ai campi e 1 px alle
     select, e cambiarlo allarga i campi di due pixel. */
  border-style: solid;
  border-color: var(--sig-bordo-forte);
  border-radius: var(--sig-raggio-piccolo);
}
/* Il «Scegli il file» del browser è un pulsante grigio dentro un campo blu. */
:where(input[type="file"])::file-selector-button {
  font: inherit; cursor: pointer; margin-right: var(--sig-sp-2); padding: 0 .7rem;
  color: var(--sig-testo); background-color: var(--sig-carta);
  border: var(--sig-spessore-bordo) solid var(--sig-bordo-forte);
  border-radius: var(--sig-raggio-piccolo);
}
/* La stessa cosa per l'etichetta che avvolge un campo: `max-width: 100%` sulla
   select, da sola, non basta — la percentuale si calcola sulla larghezza
   dell'etichetta, e l'etichetta (un elemento di una riga flessibile) prende
   proprio quella della select. Misurato: la select restava a 694px e a 854px.
   Si limita l'etichetta alla riga, e il campo dentro la segue. */
label:has(> select, > textarea, > input:not([type="checkbox"]):not([type="radio"])) {
  max-width: 100%;
}

/* ══ LE CASELLE, DISEGNATE DA NOI ══════════════════════════════════════════
   Il titolare, 3 ottobre 2026: nell'area comparivano dei «quadrati vuoti».
   Erano le caselle lasciate al browser: tre misure diverse (13, 17,6 e 20px)
   e, da spente, un quadratino col bordo e niente dentro — in tema scuro un
   buco grigio accanto al testo. Una regola sola, 20px, nei colori del tema:
   spenta ha il bordo del testo secondario (il bordo del sito su bianco fa
   1,5:1, e un controllo ne vuole 3), spuntata è il lime del bottone pieno
   con il segno navy sopra, la stessa coppia del bottone.

   Vale dove la pagina la chiede con `caselle-sig` sul body — l'area e la
   registrazione — e non ovunque: il gestionale ha le sue (`accent-color` in
   registro e sessioni), e non era la domanda. I pallini restano del
   browser: sono tondi, e non sono mai sembrati vuoti. I margini li decide
   ogni pagina, accanto al suo testo. */
.caselle-sig input[type="checkbox"] {
  -webkit-appearance: none; appearance: none;
  width: 20px; height: 20px; flex: 0 0 auto;
  border: 2px solid var(--sig-testo-tenue);
  border-radius: 5px;
  background: var(--sig-carta) center / 14px 14px no-repeat;
  vertical-align: middle;
  cursor: pointer;
}
.caselle-sig input[type="checkbox"]:checked {
  border-color: var(--sig-azione-primaria);
  background-color: var(--sig-azione-primaria);
  background-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 14 14'%3E%3Cpath d='M2.5 7.5l3 3 6-7' fill='none' stroke='%230C1B30' stroke-width='2.4' stroke-linecap='round' stroke-linejoin='round'/%3E%3C/svg%3E");
}
.caselle-sig input[type="checkbox"]:focus-visible {
  outline: 2px solid var(--sig-accento); outline-offset: 2px;
}
.caselle-sig input[type="checkbox"]:disabled { opacity: .5; cursor: not-allowed; }

/* I pallini, della stessa famiglia delle caselle: erano 13 px di browser accanto
   a quadrati da 20 («Uso delle immagini» in registrazione, «Pubblicatela in
   forma anonima» in Valuta). Stesso bordo, stesso fondo, stesso verde da
   scelti; il segno è un punto navy al centro. */
.caselle-sig input[type="radio"] {
  -webkit-appearance: none; appearance: none;
  width: 20px; height: 20px; flex: 0 0 auto;
  border: 2px solid var(--sig-testo-tenue);
  border-radius: 50%;
  background: var(--sig-carta);
  vertical-align: middle;
  cursor: pointer;
}
.caselle-sig input[type="radio"]:checked {
  border-color: var(--sig-azione-primaria);
  background: radial-gradient(circle, #0C1B30 0 32%, var(--sig-azione-primaria) 36%);
}
.caselle-sig input[type="radio"]:focus-visible {
  outline: 2px solid var(--sig-accento); outline-offset: 2px;
}
.caselle-sig input[type="radio"]:disabled { opacity: .5; cursor: not-allowed; }

/* Un link dentro una frase non può essere alto 44px senza sfasciare il
   paragrafo — ma l'AREA da premere si può allargare lo stesso: il padding
   verticale su un elemento in linea ingrandisce il bersaglio senza spostare di
   un pixel il testo intorno. */
p a, li a { padding: .85rem 0; }

.sig-elenco-link a {
  display: flex;
  align-items: center;
  min-height: var(--sig-tocco);
  gap: var(--sig-sp-2);
  padding: var(--sig-sp-2) 0;
  text-decoration: none;
  font-weight: var(--sig-peso-semibold);
}

/* ═══════════════════════════════════════════════════════════════════════════
   SCHEDE
   ═══════════════════════════════════════════════════════════════════════════ */

/* La carta è una superficie PIATTA col bordo netto: il confine lo disegna il
   bordo a spessore pieno, non un'ombra. */
.sig-carta {
  background: var(--sig-carta);
  border: var(--sig-spessore-bordo) solid var(--sig-bordo);
  border-radius: var(--sig-raggio);
  padding: var(--sig-sp-3);
  /* ══ LO SPESSORE, NON LA SFOCATURA ═════════════════════════════════════
     «Manca profondità: servono livelli veri.» Non si fanno col blur — che
     costa in resa e non dice niente — si fanno con due righe di luce e
     un'ombra corta.

     Il filo ALTO prende la luce come la prenderebbe uno spigolo rivolto in
     su; il filo tutt'intorno la trattiene appena, e serve a staccare la carta
     dal fondo quando i due colori sono vicini (in tema scuro lo sono
     sempre). L'ombra è corta e stretta: dice «c'è un millimetro sotto», non
     «questa cosa vola».

     Tre `box-shadow` in fila, e nessuno di loro è un `filter`: si compongono
     sullo stesso strato e non creano un contesto nuovo. */
  box-shadow: var(--sig-luce-alto), var(--sig-luce-bordo), var(--sig-ombra-1);
  transition: border-color var(--sig-durata-veloce, .15s) var(--sig-curva-standard),
              box-shadow var(--sig-durata-veloce, .15s) var(--sig-curva-standard),
              transform var(--sig-durata-veloce, .15s) var(--sig-curva-standard);
}
/* La carta risponde al passaggio: bordo che si accende e un accenno di
   sollevamento. Bordo, non ombra — la profondità qui si dice così. */
@media (hover: hover) {
  /* Sollevandosi, l'ombra cresce: è il secondo gradino della scala, non un
     valore inventato per l'occasione. Senza, la carta si alza e l'ombra
     resta dov'era — e si vede che non è vera. */
  .sig-carta:hover { border-color: var(--sig-appoggio); transform: translateY(-2px);
                     box-shadow: var(--sig-luce-alto), var(--sig-luce-bordo),
                                 var(--sig-ombra-2); }
  /* ══ MA UNA CARTA CHE È UN PANNELLO NON SI SOLLEVA ══════════════════════
     Il titolare, 8 settembre 2026: «i pannelli (amici, sessioni, inviti) hanno
     la parte superiore tagliata quando ci passo sopra col mouse».

     MISURATO in pagina: aprendo il pannello degli amici il bordo alto della
     carta passava da 227 a 225 appena il mouse ci entrava sopra. Sono i due
     pixel del sollevamento qui sopra — che su una carta in mezzo a una griglia
     sono un accenno di profondità, e dentro una finestra modale sono la
     finestra che si sposta sotto gli occhi. Quando il pannello è alto quanto
     lo schermo (`max-height: 88vh` e la barra dentro), quei due pixel escono
     dal bordo e mangiano la prima riga del titolo.

     Il sollevamento vuol dire «questa è una fra tante, e si può prendere». Un
     pannello aperto non è una fra tante e non si prende: è già la cosa che si
     sta guardando. Il bordo che si accende sarebbe altrettanto fuori posto —
     accende il bordo di quello che si sta già facendo — quindi qui non
     succede niente, che è il comportamento giusto per una finestra. */
  dialog .sig-carta:hover { transform: none;
                            border-color: var(--sig-bordo);
                            box-shadow: var(--sig-luce-alto), var(--sig-luce-bordo),
                                        var(--sig-ombra-1); }
}
.sig-sezione.scura .sig-carta {
  background: rgba(255, 255, 255, .04);
  border-color: rgba(255, 255, 255, .12);
}

/* Una pila di schede: in colonna sul telefono, sempre. Due colonne strette
   mandano a capo in mezzo alle parole.
   Da 1024 in su diventa una griglia che si riempie da sola: `auto-fit` con un
   minimo di 300px vuol dire due colonne su un portatile e tre su uno schermo
   grande, senza che nessuno debba decidere quante. Sotto quel minimo resta una
   colonna sola, che è la regola di sopra. */
.sig-pila { display: grid; gap: var(--sig-sp-2); }

/* I passi numerati (come funziona una sessione, come iscriversi). */
.sig-passo { display: flex; gap: var(--sig-sp-3); align-items: flex-start; }
/* Il numero del passo: contorno netto e fondo trasparente. Neutro apposta —
   il colore saturo significa «vai», e un numero non è un'azione. */
.sig-passo .numero {
  flex: 0 0 2rem;
  height: 2rem;
  border-radius: var(--sig-raggio-cerchio);
  border: var(--sig-spessore-bordo) solid var(--sig-bordo-forte);
  background: transparent;
  color: inherit;
  display: flex; align-items: center; justify-content: center;
  font-weight: var(--sig-peso-bold); font-size: var(--sig-corpo-testo-piccolo);
}
.sig-sezione.scura .sig-passo .numero {
  border-color: var(--sig-scuro-tenue);
  color: var(--sig-scuro-testo);
}
.sig-passo h3 { margin-bottom: var(--sig-spazio-2); }
.sig-passo p { margin: 0; color: var(--sig-testo-tenue); font-size: var(--sig-corpo-testo-piccolo); }
.sig-sezione.scura .sig-passo p { color: var(--sig-scuro-tenue); }

/* ═══════════════════════════════════════════════════════════════════════════
   ETICHETTE E STATI
   ═══════════════════════════════════════════════════════════════════════════ */

.sig-etichetta {
  display: inline-block;
  font-size: var(--sig-corpo-testo-piccolo);
  font-weight: var(--sig-peso-semibold);
  padding: .1rem var(--sig-sp-2);
  border-radius: var(--sig-raggio-tondo);
  border: 1px solid var(--sig-bordo-forte);
  color: var(--sig-testo-tenue);
}
.sig-etichetta.liberi { color: var(--sig-ok); border-color: var(--sig-ok); }
.sig-etichetta.pieno  { color: var(--sig-no); border-color: var(--sig-no); }

.sig-vuoto { color: var(--sig-testo-tenue); font-size: var(--sig-corpo-testo-piccolo); margin: 0; }

/* ══ LE LINGUETTE ════════════════════════════════════════════════════════════
   Una barra di linguette che divide un muro in parti, una per volta. Nata
   nella scheda persona, usata anche da «Chi ha diritto a cosa» e dalle
   sessioni: sono lo stesso gesto, e tre stili leggermente diversi sulle stesse
   tre pagine si notano — come un difetto, non come una scelta.

   Scorrono in orizzontale invece di andare a capo: sette linguette su un
   telefono starebbero su tre righe, e tre righe di linguette sopra il
   contenuto sono un secondo muro. La barra qui si vede, perché è l'unico segno
   che a destra ce n'è dell'altra.

   La linguetta aperta è PIENA e non sottolineata: una sottolineatura sotto una
   barra che scorre si perde quando la linguetta è mezza fuori dal bordo. */
/* ══ NÉ SCHIACCIATE NÉ CON UNA BARRA CHE NON SERVE ═══════════════════════════
   Il titolare, 10 settembre 2026, sul pannello «Chi ha diritto a cosa»: «i
   pulsanti in alto si vedono schiacciati e hanno una barra laterale che non
   dovrebbero avere».

   Erano due cose insieme, e tutte e due venivano da questa riga:

   · `overflow-x: auto` su una fila di tre pulsanti. Su Windows la barra è
     larga davvero e occupa la sua striscia di altezza SEMPRE, anche quando non
     c'è niente da scorrere: è la «barra laterale che non dovrebbe esserci»;
   · e dentro un pannello, il corpo è una colonna flex — la fila si lasciava
     comprimere dalla tabella sotto, che di spazio ne vuole quanto gliene dai.
     Da lì lo schiacciamento.

   Le linguette adesso VANNO A CAPO invece di scorrere. Con tre voci non
   succede mai; con dieci si leggono su due righe, che è meglio di una fila da
   trascinare — nessuno scopre le linguette nascoste a destra. */
.sig-linguette { display: flex; flex-wrap: wrap; gap: .4rem;
  margin: var(--sig-sp-3) 0; }
/* E dentro un pannello non si comprime: `flex: none` è il permesso di NON
   restringersi che il corpo, essendo una colonna flex, altrimenti si prende. */
.sig-pannello-corpo > .sig-linguette { flex: 0 0 auto; }
.sig-linguette button {
  flex: 0 0 auto; font: inherit; font-family: var(--sig-font);
  color: var(--sig-testo-tenue); background: transparent; cursor: pointer;
  border: var(--sig-spessore-bordo) solid transparent;
  border-radius: var(--sig-raggio-tondo);
  padding: .4rem .9rem; min-height: var(--sig-tocco); white-space: nowrap;
}
.sig-linguette button:hover { color: var(--sig-testo); }
.sig-linguette button[aria-selected="true"],
.sig-linguette button.scelto {
  background: var(--sig-superficie-premuta); color: var(--sig-testo);
  border-color: var(--sig-bordo-attivo); font-weight: var(--sig-peso-semibold);
}
/* Il conto dentro la linguetta: dice quante cose ci sono PRIMA di aprirla. */
.sig-linguette .quanti { color: var(--sig-testo-tenue); margin-left: .4rem;
                         font-size: .85em; font-weight: var(--sig-peso-regular); }

/* ══ GLI ELENCHI CHE CRESCONO SENZA FINE ═════════════════════════════════════
   Il titolare: «lo storico dei punti cresce senza fine. Mostrane un numero
   fisso dentro un riquadro con altezza sua, e il resto si scorre lì dentro
   senza allungare la pagina. Stessa regola ovunque un elenco possa crescere
   all'infinito».

   Una regola sola e non una per pagina: sono tutti lo stesso problema — una
   riga per fatto, e i fatti si accumulano. Chi gioca da un anno ha duecento
   movimenti, e con duecento righe in pagina la scheda Punti diventa un
   chilometro in cui il saldo, che è la cosa che si cercava, sta in cima e non
   si trova più tornando indietro.

   ══ L'ALTEZZA È IN `rem` E NON IN `vh` ═══════════════════════════════════
   `vh` legherebbe il riquadro all'altezza della finestra: su un telefono
   basso diventerebbe una fessura da tre righe, su un monitor alto mangerebbe
   mezzo schermo. `rem` lo lega al TESTO, che è quello che ci sta dentro —
   ventotto righe di corpo, sempre, ovunque.

   ══ E SI VEDE CHE SCORRE ═════════════════════════════════════════════════
   Un riquadro che taglia senza dirlo sembra un elenco finito. La sfumatura in
   basso è il segno che sotto c'è dell'altro: `mask-image` invece di un
   gradiente sovrapposto, così non copre niente e non ha bisogno di conoscere
   il colore dello sfondo — che qui cambia col tema.

   La barra invece resta, ed è deliberato: qui il contenuto NON si muove da
   solo (a differenza dei nastri della vetrina, dove la barra era una bugia),
   quindi è l'unico segno di quanto sia lungo l'elenco. */
.sig-lungo {
  max-height: 28rem;
  overflow-y: auto;
  /* Il pollice ha bisogno di un po' di margine dal bordo che scorre. */
  padding-right: var(--sig-sp-1);
  /* ══ QUI C'ERA UNA SFUMATURA, E MANGIAVA L'ULTIMA RIGA ══════════════════
     `mask-image: linear-gradient(to bottom, #000 calc(100% - 2.5rem), transparent)`
     sbiadiva il fondo del riquadro per dire «c'è dell'altro sotto». La nota
     accanto ammetteva il compromesso: «il browser non sa dirci se scorre,
     quindi si applica sempre e si tiene cortissima — due righe di testo — così
     su un elenco corto non si nota».
     Non si notava sugli elenchi di CARTE, che sono alte due-tre volte tanto.
     Dentro una TABELLA no: 2,5rem sono 32 pixel, e una riga di tabella ne è
     alta 51.
     ══ IL DANNO, MISURATO SUL DATABASE DEL TITOLARE ═══════════════════════
     8 settembre 2026: «la sessione del 10/09 non c'è nell'elenco del
     gestionale, ma la linguetta la conta e i giocatori la vedono». La riga
     c'era — la mandava il server, la disegnava la pagina — ed era l'ULTIMA
     della colonna: 30 dei suoi 51 pixel finivano sotto la sfumatura, cioè il
     59% della riga dissolto fino al trasparente. Con una sola serata in
     colonna, era tutto l'elenco a sembrare mezzo cancellato.
     E il conto della linguetta viene da un'altra strada (`stato.sessioni
     .filter`), quindi continuava a dire il numero giusto mentre la riga
     spariva: «ne conta 2 e quella non c'è» era esattamente questo.
     Sei elenchi stavano in questa trappola, cinque dei quali tabelle: le
     sessioni, la scheda di una persona (tre), il contest, le valutazioni.
     ══ PERCHÉ VIA E NON «SOLO QUANDO SCORRE» ══════════════════════════════
     Perché la sfumatura era decorazione, e diceva una cosa che la barra di
     scorrimento dice già — mentre il prezzo era nascondere dei dati. Su una
     lista di serate che chi organizza deve leggere tutta, non è uno scambio
     che si fa: una riga che sfugge qui mentre i giocatori la vedono nella
     loro area è il difetto peggiore possibile.
     Il tetto di altezza RESTA: quello non nasconde niente — si scorre, e la
     barra lo dice. */
}
/* Chi ha chiesto meno movimento non vuole nemmeno lo scorrimento morbido. */
@media (prefers-reduced-motion: no-preference) {
  .sig-lungo { scroll-behavior: smooth; }
}
/* Sul telefono più corto: lo schermo è meno alto, e ventotto righe sarebbero
   quasi tutta la pagina — cioè di nuovo il problema che si sta togliendo. */
@media (max-width: 520px) {
  .sig-lungo { max-height: 20rem; }
}
/* ══ IL PANNELLO IN SOVRIMPRESSIONE ═════════════════════════════════════════
   Il titolare: «volevo che cliccando si aprisse un pannello in
   sovrimpressione, come fa il catalogo — non tutto sciorinato uno sotto
   l'altro».

   E' la stessa storia delle linguette e dei riquadri lunghi: la forma esisteva
   gia' — il pannello di una voce di catalogo — ma viveva dentro il <style> di
   una pagina sola. Le pagine che ne avevano bisogno erano quattro, e la
   quinta l'avrebbe ricopiata di nuovo, un po' diversa.

   ══ UN <dialog> NATIVO, E NON UN DIV CON UN VETRO SOPRA ═══════════════════
   Esc che chiude, il fondo che si oscura, il fuoco che resta dentro, il resto
   della pagina che sparisce ai lettori di schermo: sono quattro cose che il
   browser fa da solo con `showModal()`, e quattro cose che si reimplementano
   male. La pagina apre e chiude, e non sa altro.

   ══ ALTO QUANTO LA FINESTRA, E DENTRO SCORRE ══════════════════════════════
   «Se l'elenco e' lungo, la barra dentro il pannello». Quindi il pannello ha
   un tetto e il CORPO scorre: testa e piede restano fermi, e chi ha aperto
   duecento righe ha sempre sotto gli occhi il titolo e il tasto per chiudere.
   `min-height: 0` sul corpo non e' un vezzo: senza, dentro una griglia il
   figlio che scorre si allarga oltre il tetto invece di scorrere. */
.sig-pannello {
  width: min(52rem, calc(100vw - 2rem));
  max-height: min(46rem, calc(100vh - 4rem));
  padding: 0; border: var(--sig-spessore-bordo) solid var(--sig-bordo);
  border-radius: var(--sig-raggio);
  background: var(--sig-carta); color: var(--sig-testo);
  /* Griglia e non blocco: le tre fasce si dividono l'altezza, e quella di
     mezzo prende quello che resta. */
  grid-template-rows: auto 1fr auto;
}
/* `open` e non sempre: un <dialog> chiuso non deve diventare una griglia
   visibile — `display` vince su `[hidden]` e sul chiuso di default. */
.sig-pannello[open] { display: grid; }
/* ══ IL PANNELLO CHE CONTIENE UNA TABELLA È LARGO ═══════════════════════════
   Il titolare: «due tabelle sono troppo strette e mi costringono a scendere
   fino in fondo per trovare la barra e spostarmi a destra. Fai i pannelli più
   larghi: sono pannelli in sovrimpressione, possono occupare quasi tutto lo
   schermo».

   Cinquantadue rem sono la misura giusta per un pannello di TESTO — una
   colonna che si legge senza muovere la testa. Una tabella di sette colonne
   non è testo: o ci sta tutta, o si scorre. MISURATO a 1440 prima della
   correzione: «Chi ha diritto a cosa» chiedeva 607 px dentro un riquadro da
   309, e la stessa tabella a 375 ne chiedeva 903 dentro 333.

   Qui la larghezza non è più una scelta di lettura ma una conseguenza: prende
   lo schermo meno un margine. Il tetto alto serve solo perché su un monitor
   da 27 pollici sette colonne larghe duemila pixel avrebbero le celle
   lontanissime fra loro. */
.sig-pannello.largo { width: min(88rem, calc(100vw - 2rem)); }

/* ══ E SUL TELEFONO NESSUN PANNELLO PRENDE LO SCHERMO ════════════════════════
   Il titolare, 13 settembre 2026: «alcuni pannelli prendono quasi tutto lo
   schermo invece della misura che dovrebbero avere — "Invita i tuoi amici" e
   la conferma del "Ci sarò". Fai il giro di tutti e allineali».

   MISURATO a 393, aprendo a forza ogni `<dialog>` del sistema: ventiquattro su
   ventisei stavano fra il 90 e il 92 per cento della larghezza. Non erano
   ventiquattro scelte diverse: era la STESSA scelta scritta ventiquattro
   volte, e scritta in un modo che sul telefono non funziona.

   LA CAUSA È `vw`. `min(92vw, 560px)` e `calc(100vw - 2rem)` dicono cose
   diverse su uno schermo grande e la stessa cosa su uno piccolo: su un monitor
   il pannello si ferma a 560 e intorno resta mezzo schermo, su un telefono da
   393 l'otto per cento fa trentun pixel IN TUTTO — quindici per lato. Una
   cornice di quindici pixel non si legge come «una finestra sopra la pagina»,
   si legge come una pagina nuova: e una domanda di due righe che prende una
   pagina intera sembra una cosa importante mentre è una cosa di servizio.

   Il margine di un pannello va misurato in PIXEL e non in percentuale, perché
   è una distanza che l'occhio giudica in assoluto: quaranta per lato bastano a
   far vedere che sotto c'è ancora la pagina, e sono quaranta a 360 come a 430.

   E in PIXEL anche nella lettera, non in `rem`: il gestionale porta
   `font-size: 80%` sulla radice, quindi lì un `rem` vale 12,8 e non 16. Con
   `5rem` gli stessi quaranta pixel diventavano trentadue, e i pannelli del
   gestionale restavano quattro punti percentuali più larghi di quelli
   dell'area — misurato, 329 contro 313. Un margine non è una misura
   tipografica e non deve seguire il corpo del testo.

   STA QUI E IN UN POSTO SOLO. Scritto in ventiquattro fogli sarebbe un tetto
   che il prossimo pannello non eredita — e il prossimo pannello nascerebbe di
   nuovo al novantadue per cento. `max-width` e non `width`: ogni pannello si
   tiene la sua larghezza da scrivania, e qui si dice solo fin dove può
   arrivare quando lo schermo è piccolo.

   LE DUE ECCEZIONI, e sono eccezioni vere:
     · `.largo` — i pannelli che contengono una TABELLA. Lì la larghezza non è
       una scelta di lettura ma una conseguenza (vedi la nota sopra): stringerli
       vorrebbe dire più scorrimento laterale dentro, cioè spostare il problema.
     · `.sig-schermo` — la foto ingrandita e il post incorporato. Quelli non
       sono pannelli di testo: sono un'immagine da guardare, e un'immagine
       guardata con quaranta pixel di cornice è un'immagine più piccola per
       niente. */
/* ══ E NESSUN PANNELLO NASCE CON LA CORNICE DEL BROWSER ══════════════════════
   Il titolare, 13 settembre 2026: «aprendo i pannelli ci sono righe bianche —
   alcune sulla X, altre intorno al riquadro».

   Quelle intorno al riquadro erano il vestito che il browser mette a ogni
   `<dialog>` e che nessuno gli ha tolto: `border: 2px groove`, `padding: 1em`
   e il fondo di sistema. MISURATO su `#sblocca-scelta` (sessioni): bordo da
   TRE PIXEL, nero nel tema chiaro e BIANCO in quello scuro, più dodici pixel
   di imbottitura del fondo di sistema attorno alla carta. Una cornice che non
   ha scelto nessuno, e che nel buio si vede come una riga bianca.

   Undici pannelli su ventisei se la toglievano a mano, ognuno nel suo foglio.
   Toglierla qui vuol dire che il dodicesimo non se la porta più dietro — ed è
   la stessa ragione per cui il tetto della larghezza sta qui sopra.

   NON ROMPE CHI HA UN VESTITO SUO: `.sig-pannello`, `.lettore`, `#unisci` e
   gli altri dichiarano bordo, imbottitura e fondo con una classe o un id, che
   vincono su `dialog`. Quelli che non dichiarano niente hanno tutti una carta
   dentro — è quella la superficie, non il dialogo. */
dialog { border: 0; padding: 0; background: transparent; }

/* ══ E IL PANNELLO NON PORTA L'ANELLO DEL FUOCO ════════════════════════════
   Il titolare, 13 settembre 2026: «aprendo una sessione dall'app c'è ancora
   la X con l'anello bianco intorno».

   Quell'anello è `:focus-visible`, e compariva perché `showModal()` manda il
   fuoco al primo elemento raggiungibile dentro il pannello — quasi sempre la
   X, che nel markup viene per prima perché graficamente sta in un angolo.
   Misurati: 24 pannelli su 28, e in 16 l'anello era proprio sulla X.

   La correzione sta in `tocco.js`: il fuoco va al PANNELLO invece che a un
   suo pulsante. Questa riga è la sua metà mancante — senza, l'anello non
   sparisce, si allarga a tutto il rettangolo.

   E toglierlo QUI è corretto, mentre toglierlo dalla X non lo sarebbe: un
   anello dice «stai comandando questo», e un pannello non si comanda — è il
   posto in cui ci si trova. Chi naviga da tastiera non perde niente: al
   primo Tab scende sul primo comando, e quello l'anello ce l'ha, perché
   quella volta è vero.

   `[tabindex="-1"]` e non `dialog:focus` liscio: così vale solo per i
   pannelli che il fuoco l'hanno ricevuto da noi. Uno che un domani entrasse
   nel giro del Tab per scelta di qualcuno terrebbe il suo anello. */
dialog[tabindex="-1"]:focus,
dialog[tabindex="-1"]:focus-visible { outline: none; }

/* ══ NÉ IL PULSANTE A CUI IL FUOCO L'ABBIAMO MESSO NOI ═══════════════
   Il titolare, 16 settembre 2026: «sul pannello per togliersi da una serata
   il pulsante ANNULLA ha un anello bianco intorno che non dovrebbe esserci».
   Stesso anello della X qui sopra, stesso colore (`--sig-focus`, bianco in
   tema scuro), un pulsante più in là: `chiedi.js` manda il fuoco su Annulla
   quando la domanda toglie qualcosa, così chi tira un invio per abitudine
   annulla invece di cancellare. Il fuoco serve; l'anello no — l'anello è la
   risposta a un Tab, e qui nessuno ha premuto Tab.

   La classe la mette `chiedi.js`, e SOLO quando chi ha aperto il pannello
   non stava usando la tastiera; la toglie al primo tasto premuto. Quindi
   questa regola non spegne mai un anello che serviva: spegne quello che
   nasce da un dito.

   È la rete sotto a `focus({ focusVisible: false })`, che fa la stessa cosa
   dalla parte del codice: i browser che conoscono l'opzione non arrivano
   nemmeno qui, gli altri passano di qua. */
.fuoco-messo:focus-visible { outline: none; }

@media (max-width: 699.98px) {
  dialog { max-width: calc(100vw - 80px); }
  dialog.largo, dialog.sig-schermo { max-width: calc(100vw - 32px); }
}

/* ══ E SOTTO I 640, OGNI RIQUADRO PRENDE LO SCHERMO MENO DODICI PIXEL ═══════
   Il titolare, 6 ottobre 2026: «sul telefono alcuni riquadri appaiono
   allungati e non stanno bene nello schermo». Approvato dopo il giro: «una
   sola regola sotto i 640 px, margine di 12 px per lato, altezza massima lo
   schermo meno 24, e lo scorrimento dentro il riquadro».

   MISURATO a 375 e a 390, in tutti e due i temi, aprendo ogni `<dialog>` del
   gestionale e dell'area — a forza e dal suo percorso vero: con quaranta pixel
   per lato (la regola qui sopra, del 13 settembre) il riquadro restava al 79
   per cento della larghezza, e tolta l'imbottitura la colonna di testo era
   larga duecentocinquanta pixel. Il testo andava a capo di continuo, e il
   dettaglio di una serata arrivava all'88 per cento dell'altezza: una striscia
   stretta e lunga. È quello che a occhio si legge «allungato».

   Dodici pixel lasciano ancora vedere che sotto c'è la pagina — è la ragione
   per cui il margine c'era — e restituiscono al testo cinquantasei pixel per
   riga. È la stessa regola per tutti: un riquadro di testo, una domanda di
   `chiedi.js`, una tabella. Le tre con la tabella larga (Diritti, Riscatti,
   Quote) restano più strette della loro tabella, che continua a scorrere di
   lato DENTRO il suo riquadro, com'era.

   ══ PERCHÉ `!important`, ED È L'UNICO POSTO ═════════════════════════════════
   I riquadri si vestono con una classe o un id — `.sig-pannello`, `.lettore`,
   `#unisci`, `.cornice-pannello` — e ognuno ha la sua larghezza da scrivania.
   Una regola su `dialog` perde contro tutte: è il motivo per cui quella qui
   sopra può dire solo `max-width`. Questa deve valere su ognuno, anche su
   quello che nascerà domani con una larghezza sua, e sotto i 640 la
   larghezza da scrivania non ha più senso per nessuno. Vale solo dentro la
   media del telefono: sopra, ogni riquadro torna alla sua misura.

   L'altezza in `dvh` dopo quella in `vh`: è la parte di schermo che si vede
   davvero con la barra del browser aperta, e chi non la conosce si ferma alla
   prima riga. Lo scorrimento sta dentro il riquadro: chi ha un corpo che
   scorre per conto suo (`.sig-pannello`, `.cornice-pannello`) non ne ha
   bisogno e non lo vede; chi non ce l'ha non resta tagliato.

   Il dettaglio della serata in Sessioni non è un `<dialog>` (è
   `.modale-riquadro`) e non passa di qui: sta già quasi a schermo pieno, ed è
   giusto così. */
@media (max-width: 639.98px) {
  dialog {
    width: calc(100vw - 24px) !important;
    max-width: calc(100vw - 24px) !important;
    max-height: calc(100vh - 24px) !important;
    max-height: calc(100dvh - 24px) !important;
    overflow-y: auto;
    box-sizing: border-box;
  }
}

/* ══ E QUELLO DI UNA DOMANDA È STRETTO ══════════════════════════
   `.sig-chiedi` è il pannello che ha preso il posto di `confirm` e `prompt`
   (vedi /sito/chiedi.js). Cinquantadue rem sono la misura di un pannello di
   CONTENUTO; una domanda è due righe, e a 832 pixel i due pulsanti finiscono a
   mezzo metro dal testo che spiega cosa fanno.

   Trenta rem è la larghezza a cui una domanda si legge tutta con un colpo
   d'occhio, ed è anche quella delle finestrelle che questo pannello sostituisce
   — chi le conosceva non deve reimparare dove guardare. */
.sig-pannello.sig-chiedi { width: min(30rem, calc(100vw - 2rem)); }

/* ══ E SUL TELEFONO PARLA PIÙ PIANO ═════════════════════════════════════════
   Il titolare, 12 settembre 2026: «premendo "Esci" dall'area, la scritta della
   conferma è troppo grande sul telefono».

   MISURATO a 393: il titolo a 17,6px e la riga sotto a 16px, dentro un
   riquadro largo 355. Sono le misure di un pannello di CONTENUTO — quelle con
   cui è scritto tutto il resto del sistema — e su una domanda di due righe
   diventano un annuncio: «Esci dalla tua area?» arrivava grande quanto il
   titolo di una scheda, per dire una cosa che si legge in un secondo e si
   dimentica subito dopo.

   Le finestrelle che questo pannello ha sostituito (`confirm`) sul telefono
   scrivono sui 13-14 pixel, ed è la misura giusta per quello che sono: una
   domanda di servizio, non un contenuto. Qui il titolo scende a 1rem e il
   corpo al testo piccolo del sistema — nessun numero inventato, sono i due
   gradini che c'erano già.

   I PULSANTI NON SI TOCCANO. Sono l'unica cosa del pannello che si preme, e
   restano al loro bersaglio: rimpicciolire la scritta è leggibilità,
   rimpicciolire un bersaglio su un telefono è un errore di battitura che
   aspetta. Vale solo sotto i 700: sulla scrivania la domanda sta in mezzo a
   uno schermo largo, e lì le misure di prima vanno bene. */
@media (max-width: 699.98px) {
  .sig-pannello.sig-chiedi .sig-pannello-testa h3 { font-size: 1rem; }
  .sig-pannello.sig-chiedi .sig-pannello-corpo {
    font-size: var(--sig-corpo-testo-piccolo);
  }
  .sig-pannello.sig-chiedi .sig-pannello-corpo p { margin: 0 0 var(--sig-sp-1); }
  .sig-pannello.sig-chiedi .sig-pannello-corpo p:last-child { margin-bottom: 0; }

  /* ══ E NON PRENDE LO SCHERMO ═══════════════════════════════════════════
     Il titolare, 13 settembre 2026: «la conferma di uscita è troppo grande
     sul telefono: deve essere un pannello piccolo, non a schermo pieno».

     La scritta era già scesa (il blocco qui sopra, del 12 settembre); quello
     che restava grande era il RIQUADRO. `calc(100vw - 2rem)` a 393 pixel fa
     355: trentotto pixel di sfondo in tutto, cioè diciannove per lato — una
     cornice così sottile non si legge come «una finestra sopra la pagina»,
     si legge come una pagina nuova. E una domanda di due righe che prende
     una pagina intera sembra una cosa importante, mentre è una cosa di
     servizio.

     Sei rem di margine — novantasei pixel, quarantotto per lato — bastano a
     far vedere la pagina intorno, che è quello che dice «sei ancora lì, devi
     solo rispondere a questa». Il tetto scende con la larghezza, o su un
     telefono largo il riquadro resterebbe quello di prima.

     I PULSANTI NON SI TOCCANO, come già la volta scorsa: sono l'unica cosa
     che si preme. L'imbottitura intorno sì — quella è aria, e l'aria in un
     riquadro piccolo va misurata più stretta. */
  .sig-pannello.sig-chiedi { width: min(19rem, calc(100vw - 96px)); }
  .sig-pannello.sig-chiedi .sig-pannello-testa {
    padding: var(--sig-sp-3) var(--sig-sp-3) var(--sig-sp-2);
  }
  .sig-pannello.sig-chiedi .sig-pannello-corpo { padding: var(--sig-sp-3); }
  .sig-pannello.sig-chiedi .sig-pannello-piede {
    padding: var(--sig-sp-2) var(--sig-sp-3) var(--sig-sp-3);
  }
}

/* ══ E DENTRO, A SCORRERE È LA TABELLA — NON IL CORPO ══════════════════════
   La seconda metà della richiesta: «se su schermi stretti lo scorrimento
   laterale resta necessario, la barra deve essere raggiungibile SEMPRE — non
   solo scendendo in fondo alla tabella».

   La barra orizzontale di un riquadro che scorre sta sul suo BORDO INFERIORE.
   Se dentro il pannello a scorrere è il CORPO, il riquadro della tabella è
   alto quanto tutte le sue righe e quel bordo finisce sotto: per toccare la
   barra bisogna prima scendere fino all'ultima riga.

   Quindi si girano i ruoli. Il corpo diventa una colonna che non scorre, la
   tabella prende l'altezza che avanza (`1fr`) e scorre lei, nei due versi. Il
   suo bordo inferiore coincide col fondo del pannello: la barra è lì, sempre,
   qualunque sia il numero di righe.

   `min-height: 0` non è decorazione: senza, un elemento flessibile si rifiuta
   di rimpicciolirsi sotto il suo contenuto, la tabella resta alta quanto
   tutte le righe e il giro non serve a niente. */
.sig-pannello.largo .sig-pannello-corpo {
  display: flex; flex-direction: column; min-height: 0;
}
.sig-pannello.largo .sig-pannello-corpo .tabella-scroll {
  flex: 1 1 auto; min-height: 0; max-height: none; overflow: auto;
}
/* L'intestazione resta ferma rispetto a chi scorre adesso, che è la tabella:
   l'aggancio negativo qui sotto era calcolato sul padding del CORPO. */
.sig-pannello.largo .sig-pannello-corpo table thead th { top: 0; }
.sig-pannello::backdrop { background: rgba(0, 0, 0, .6); }
.sig-pannello-testa {
  display: flex; align-items: flex-start; gap: var(--sig-sp-2);
  padding: var(--sig-sp-3) var(--sig-sp-3) var(--sig-sp-2);
  border-bottom: 1px solid var(--sig-bordo);
}
.sig-pannello-testa h3 { margin: 0; font-size: 1.1rem; flex: 1; min-width: 0; }
.sig-pannello-corpo { padding: var(--sig-sp-3); overflow-y: auto; min-height: 0; }

/* ══ LE COSE CHE SCORRONO: UNA REGOLA SOLA ═════════════════════════════════
   Il titolare, 30 ottobre 2026: «le barre di scorrimento in alcune sezioni
   stanno dentro il riquadro, in altre fuori».

   Erano quattro modi diversi. Il pannello delle recensioni scorreva a filo
   del dialogo e la barra entrava nell'arco di sotto; quelli del premio e di
   «Segnala un problema» scorrevano col dialogo STESSO, raggio compreso, e la
   barra passava sull'arco; l'area aveva già la cornice ferma con dentro un
   riquadro che scorre; il gestionale un po' e un po'.

   La regola adesso è una, ed è quella dell'area:
     · LA CORNICE NON SCORRE (`.sig-cornice`): ha raggio, fondo e bordo, e
       `overflow: hidden` — anche contro il foglio del browser, che a un
       `<dialog>` dà un `overflow: auto` suo;
     · DENTRO, QUELLO CHE SCORRE NON HA ANGOLI (`.sig-scorre`) e sta lontano
       dalle curve: sopra c'è la testa ferma, sotto un rientro della cornice;
     · LA BARRA È SOTTILE E HA UN CANALE FISSO: `scrollbar-gutter: stable`
       tiene il posto anche quando il testo è corto, così il contenuto non
       balla di otto pixel aprendo un pannello più lungo; e
       `overscroll-behavior: contain` impedisce che arrivati in fondo si
       trascini la pagina sotto.

   Il pannello del gestionale (`.sig-pannello`) e quello dell'area
   (`.cornice-pannello` col suo `.scorre`, da cui la regola viene) sono la
   stessa cosa con un nome loro: invece di riscrivere le classi in venti
   pagine e in decine di prove che le citano, i nomi si aggiungono qui
   accanto. Le tabelle e gli elenchi lunghi del
   gestionale prendono la barra sottile ma non il canale: una tabella scorre
   anche di lato, e un canale verticale fisso sarebbe una colonna vuota.

   FANNO ECCEZIONE i nastri orizzontali della vetrina (`.galleria`): lì la
   barra è nascosta apposta, perché ci sono le frecce e il contenuto si muove
   da solo. */
.sig-cornice,
.sig-pannello,
.cornice-pannello { overflow: hidden; }
/* Sopra, la curva la copre la testa. Sotto, quando non c'è un piede, il
   corpo si ferma un raggio prima del fondo: misurato il 30 ottobre 2026, nel
   dettaglio delle valutazioni il corpo arrivava a due pixel dal bordo e la
   barra entrava nell'arco di 24. */
.sig-pannello > .sig-pannello-corpo:last-child { margin-bottom: var(--sig-raggio); }
.sig-scorre { overflow-y: auto; min-height: 0; }
.sig-scorre,
.sig-pannello-corpo,
.cornice-pannello .scorre,
.sig-lungo {
  scrollbar-gutter: stable;
  overscroll-behavior: contain;
}
/* Su una riga: `.tabella-scroll` ha la sua regola più sotto, e due righe che
   cominciano col suo nome sono due posti dove cercarla. */
.sig-scorre, .sig-pannello-corpo, .cornice-pannello .scorre, .sig-lungo, .tabella-scroll {
  scrollbar-width: thin;
}
.sig-pannello-piede {
  display: flex; gap: var(--sig-sp-1); flex-wrap: wrap;
  padding: var(--sig-sp-2) var(--sig-sp-3) var(--sig-sp-3);
  border-top: 1px solid var(--sig-bordo);
}
/* ══ LO STESSO PROBLEMA FUORI DAI PANNELLI ═════════════════════════════════
   Il titolare ha chiesto di fare «il giro di tutte le tabelle del gestionale
   e correggere quelle con lo stesso problema». MISURATO a 375: la tabella dei
   premi in pagina finiva a y=1510 su una finestra alta 812, quella delle
   iscrizioni a y=1233 — ventidue righe da scorrere prima di poter andare a
   destra. (A 1440 non sfonda nessuna delle diciassette pagine.)

   Fuori da un pannello non c'è un'altezza da riempire, quindi la regola è
   l'altra faccia della stessa cosa: il riquadro non supera la finestra. Il
   suo fondo — dove sta la barra — resta dentro, e le righe in più si
   raggiungono scorrendo DENTRO il riquadro, che è il gesto di prima.

   `max-height` morde solo quando la tabella è più alta: una tabella di tre
   righe non si accorge di questa regola. E sta qui e non nelle nove copie di
   `.tabella-scroll` sparse per le pagine, perché è una proprietà del gesto e
   non della pagina. */
.tabella-scroll { overflow: auto; max-height: min(70vh, 42rem); }

/* Una tabella dentro il pannello: le intestazioni restano in vista mentre il
   corpo scorre. Duecento righe senza intestazione ferma sono duecento righe
   in cui si perde quale colonna e' quale. */
.sig-pannello-corpo table thead th {
  position: sticky; top: calc(var(--sig-sp-3) * -1);
  background: var(--sig-carta); z-index: 1;
}

.sig-errore { color: var(--sig-no); font-size: var(--sig-corpo-testo-piccolo); margin: 0; }

/* ═══════════════════════════════════════════════════════════════════════════
   LA LIBRERIA DEL BRAND
   Bottoni, campi, card, badge, chip, avatar, progress. Sono i componenti della
   seconda metà del file originale, tenuti INTERI e con i loro nomi (`.sig-btn`,
   `.sig-card`, …), che non si scontrano con nessuno: le pagine usano
   `.sig-bottone` e `.sig-carta`.

   Non sostituiscono niente oggi. Sono lo scaffale a cui attingere quando una
   pagina viene rifatta, e il posto giusto dove mettere un componente nuovo
   invece di scriverlo un'altra volta dentro un `<style>`.
   ═══════════════════════════════════════════════════════════════════════════ */

.sig-btn {
  display: inline-flex; align-items: center; justify-content: center;
  gap: var(--sig-spazio-2);
  min-height: var(--sig-tocco);
  padding: var(--sig-spazio-3) var(--sig-spazio-5);
  border: 1px solid transparent;
  border-radius: var(--sig-raggio-pillola);
  font: inherit;
  font-family: var(--sig-font);
  font-size: var(--sig-corpo-bottone);
  font-weight: var(--sig-peso-semibold);
  line-height: 1;
  text-decoration: none;
  cursor: pointer;
  transition: background var(--sig-durata-istantanea) var(--sig-curva-standard),
              border-color var(--sig-durata-istantanea) var(--sig-curva-standard),
              color var(--sig-durata-istantanea) var(--sig-curva-standard);
}
.sig-btn:focus-visible {
  outline: var(--sig-focus-spessore) solid var(--sig-focus);
  outline-offset: var(--sig-focus-offset);
}
.sig-btn:disabled:not([aria-busy="true"]), .sig-btn[aria-disabled="true"] {
  cursor: default;
  background: var(--sig-superficie-premuta);
  color: var(--sig-testo-disabilitato);
  border-color: transparent;
}
.sig-btn[aria-busy="true"] { cursor: progress; }

/* ══ IL PULSANTE CHE STA LAVORANDO ═══════════════════════════════════════════
   `aria-busy="true"` lo mette `tocco.js` sul pulsante appena premuto, per il
   tempo della chiamata. Tiene il SUO colore — le regole `:disabled` qui sopra
   e in gestionale.css lo escludono apposta — e ci aggiunge un anello che gira:
   «sta lavorando», non «è spento». Vale per qualunque pulsante, con qualunque
   classe: sono venti pagine e nessuna deve ricordarsene. */
@keyframes sig-gira { to { transform: rotate(1turn); } }
button[aria-busy="true"], a[aria-busy="true"] {
  cursor: progress;
  opacity: .92;
}
button[aria-busy="true"]::after, a[aria-busy="true"]::after {
  content: '';
  display: inline-block;
  flex: none;
  width: .85em; height: .85em;
  margin-inline-start: .45em;
  vertical-align: -.1em;
  border: 2px solid currentColor;
  border-right-color: transparent;
  border-radius: 50%;
  animation: sig-gira .7s linear infinite;
}

.sig-btn--primario {
  background: var(--sig-azione-primaria);
  color: var(--sig-azione-primaria-testo);
}
.sig-btn--primario:hover:not(:disabled) { background: var(--sig-azione-primaria-hover); }
.sig-btn--primario:active:not(:disabled) { background: var(--sig-azione-primaria-premuta); }

.sig-btn--secondario {
  background: transparent;
  color: var(--sig-azione-secondaria);
  border-color: var(--sig-azione-secondaria);
}
.sig-btn--secondario:hover:not(:disabled) { background: var(--sig-info-sfondo); }
.sig-btn--secondario:active:not(:disabled) { background: var(--sig-superficie-premuta); }

.sig-btn--terziario {
  background: transparent;
  color: var(--sig-azione-secondaria);
  border-color: transparent;
}
.sig-btn--terziario:hover:not(:disabled) { background: var(--sig-superficie-alt); }

.sig-btn--distruttivo {
  background: var(--sig-azione-distruttiva);
  color: var(--sig-bianco);
}
.sig-btn--distruttivo:hover:not(:disabled) { background: var(--sig-azione-distruttiva-hover); }
.sig-btn--distruttivo:active:not(:disabled) { background: var(--sig-azione-distruttiva-premuta); }

/* ══ L'ALTEZZA MINIMA È UNA SOLA ════════════════════════════════════════
   11 ottobre 2026. Fuori dalle tabelle i pulsanti con testo andavano da 32 a 59
   px, perché ogni punto scriveva la sua misura (42 nella barra, 32 negli avvisi,
   36 nel premio e qui). Il token c'era già: `--sig-tocco-minimo` (44, il
   bersaglio del dito). Dentro una riga di tabella il «piccolo» resta di 36: una
   riga non deve crescere per un pulsante. */
.sig-btn--piccolo { min-height: var(--sig-tocco-minimo); padding: var(--sig-spazio-2) var(--sig-spazio-4);
                    font-size: var(--sig-corpo-testo-piccolo); }
td .sig-btn--piccolo, th .sig-btn--piccolo { min-height: 36px; }
.sig-btn--grande  { min-height: 56px; padding: var(--sig-spazio-4) var(--sig-spazio-6); }
.sig-btn--icona   { width: var(--sig-tocco); padding: 0; border-radius: var(--sig-raggio-cerchio); }
.sig-btn--blocco  { width: 100%; }

.sig-campo-gruppo { display: grid; gap: var(--sig-spazio-2); }
.sig-campo-etichetta {
  font-size: var(--sig-corpo-testo-piccolo);
  font-weight: var(--sig-peso-semibold);
  color: var(--sig-testo);
}
.sig-campo {
  width: 100%;
  min-height: var(--sig-tocco);
  padding: var(--sig-spazio-3) var(--sig-spazio-4);
  background: var(--sig-superficie);
  border: var(--sig-spessore-bordo) solid var(--sig-bordo);
  border-radius: var(--sig-raggio-input);
  font-family: var(--sig-font);
  font-size: var(--sig-corpo-testo);
  color: var(--sig-testo);
}
.sig-campo::placeholder { color: var(--sig-testo-disabilitato); }
.sig-campo:hover:not(:disabled) { border-color: var(--sig-bordo-hover); }
.sig-campo:focus {
  outline: none;
  border-color: var(--sig-bordo-attivo);
  box-shadow: 0 0 0 var(--sig-focus-spessore) var(--sig-focus-tenue);
}
.sig-campo:disabled { background: var(--sig-superficie-premuta); color: var(--sig-testo-disabilitato); }
.sig-campo[aria-invalid="true"] { border-color: var(--sig-errore); }
.sig-campo--area { min-height: 96px; resize: vertical; }
.sig-campo-aiuto { font-size: var(--sig-corpo-testo-piccolo); color: var(--sig-testo-secondario); }
.sig-campo-errore { font-size: var(--sig-corpo-testo-piccolo); color: var(--sig-errore-testo); }

/* ══ GLI OBBLIGATORI E L'OCCHIO ══════════════════════════════════
   Li mette `/sito/moduli.js`, uguale su ogni modulo del sito: qui c'è solo
   come si vedono. Vestito e regola stanno separati perché la regola è una
   (chi ha `required` prende l'asterisco) e il vestito cambia col tema. */

/* L'asterisco: staccato dall'etichetta di mezzo spazio, e nel colore
   dell'errore — è la stessa tinta con cui il modulo dirà «questo manca», e
   incontrarla prima significa riconoscerla dopo. Non è un errore adesso, per
   questo non è in grassetto. */
/* ══ E IL COLORE VINCE, COME PER `.nascosto` ══════════════════════
   L'asterisco finisce dentro l'etichetta, e le etichette hanno le loro regole
   di pagina: `.aggiungi .campo span { color: var(--sig-testo-tenue) }` in
   iscrizioni.html vale (0,2,1) e sta in un foglio caricato DOPO questo —
   l'asterisco veniva grigio come il resto dell'etichetta, cioè invisibile.

   Alzare la specificità non basterebbe: ogni pagina può scrivere un selettore
   più lungo del nostro, e inseguirli è una rincorsa che si perde. È la stessa
   situazione di `.nascosto` in questo foglio, e si chiude allo stesso modo. */
.obbligatorio { color: var(--sig-errore-testo) !important; margin-left: .15em;
                font-weight: var(--sig-peso-regular); }

/* La riga in cima al modulo. Piccola e tenue: è una legenda, cioè una cosa
   che si legge UNA volta e poi si sa — messa col peso di un'istruzione
   starebbe davanti al modulo ogni volta che ci si torna. */
.riga-obbligatori { margin: 0 0 var(--sig-sp-3);
                    font-size: var(--sig-corpo-testo-piccolo);
                    color: var(--sig-testo-tenue);
                    /* ══ E PRENDE TUTTA LA RIGA, COMUNQUE SIA FATTO IL MODULO
                       Dentro un modulo in colonne la legenda è una cella come
                       le altre, e si prende il posto di un campo: misurata a
                       393 nel gestionale, larga 147 dentro un modulo largo 355
                       — schiacciata accanto a «Nome».

                       Due righe perché i moduli del sito sono fatti in due
                       modi: a griglia (`grid-column`) e a riga che va a capo
                       (`flex-basis`, che è quello di `riga-campi` nel
                       gestionale). Ognuna delle due non fa niente dove non
                       serve, e insieme coprono tutti e due i casi. */
                    grid-column: 1 / -1; flex-basis: 100%; }
/* Dentro un `fieldset` la legenda non ha bisogno di staccarsi: sopra c'è già
   il bordo del gruppo. */
fieldset > .riga-obbligatori { margin-bottom: var(--sig-sp-2); }

/* Il guscio del campo password: esiste solo per dare al bottone qualcosa da
   cui misurarsi. `display: block` e non inline, o il campo dentro non
   prenderebbe la larghezza della riga. */
.con-occhio { position: relative; display: block; }
/* Lo spazio per il bottone lo fa il campo, non il bottone: un padding sul
   campo è l'unico modo perché il testo scritto non gli finisca sotto. */
.con-occhio > input { width: 100%; padding-right: 46px; }
.occhio {
  position: absolute; top: 50%; right: 4px; transform: translateY(-50%);
  width: 38px; height: 38px; padding: 0;
  display: flex; align-items: center; justify-content: center;
  background: none; border: 0; border-radius: var(--sig-raggio-piccolo);
  color: var(--sig-testo-secondario); cursor: pointer;
}
.occhio svg { width: 21px; height: 21px; }

/* ══ BERSAGLI DA 44 PX, SENZA CAMBIARE L'ASPETTO ═══════════════════════════
   Giro visivo del 9 ottobre 2026: sul telefono l'occhio della password
   (38×38), il «?» del grado (22×22), la × dei pannelli (36, 20×24 nella
   linguetta del contest) e i link del piè di pagina (33 px di larghezza) erano
   più piccoli di un dito. Il disegno resta quello: si estende l'area che
   risponde al tocco con un pseudo-elemento trasparente centrato, come già per i
   nomi nelle tabelle (gestionale.css) — non cresce niente intorno. `max()`:
   dove il controllo è già grande non si rimpicciolisce. */
.occhio::after,
.grado-aiuto::after,
.chiudi-dettaglio::after,
.linguetta-contest .chiudi::after,
.piede a::after {
  content: ''; position: absolute; left: 50%; top: 50%;
  width: max(100%, var(--sig-tocco)); height: max(100%, var(--sig-tocco));
  transform: translate(-50%, -50%);
}
/* Quelli che non erano già posizionati (l'occhio e la × sono assoluti). */
.grado-aiuto,
.linguetta-contest .chiudi,
.piede a { position: relative; }
.occhio:hover { color: var(--sig-testo); }
/* Acceso quando la password si vede: il bottone dice in che stato si è, non
   solo cosa fa. Senza, guardando l'icona non si sa se quella barra è «adesso
   è nascosta» o «premi per nascondere». */
.occhio[aria-pressed="true"] { color: var(--sig-verde-testo); }
.occhio:focus-visible { outline: var(--sig-spessore-bordo) solid var(--sig-accento);
                        outline-offset: 2px; }

.sig-card {
  background: var(--sig-superficie);
  border: 1px solid var(--sig-bordo);
  border-radius: var(--sig-raggio-card);
  padding: var(--sig-spazio-5);
  border: var(--sig-spessore-bordo) solid var(--sig-bordo);
}
.sig-card--interattiva { cursor: pointer; transition: border-color var(--sig-durata-veloce) var(--sig-curva-standard); }
.sig-card--interattiva:hover { border-color: var(--sig-bordo-hover); }
.sig-card--grande { border-radius: var(--sig-raggio-card-grande); padding: var(--sig-spazio-6); }
.sig-card--piena { background: var(--sig-gradiente-logo); color: var(--sig-bianco); border-color: transparent; }
/* «Fluttuante» è rimasto il nome, ma niente fluttua: una superficie sopra le
   altre si riconosce dal bordo forte, non dall'ombra. */
.sig-card--fluttuante { border: var(--sig-spessore-bordo) solid var(--sig-bordo-forte); }

/* ══ LE FAMIGLIE DEL CATALOGO ═══════════════════════════════════════════════

   Il titolare, 16 settembre 2026, seconda passata: «il colore deve prendere
   TUTTA la tessera, non solo il titolo. Minigiochi e challenge: il verde del
   logo, quello che usiamo ovunque. Ruota: gialla. Malus: rossi. Fissi: come
   sono. E il nome del gioco deve staccarsi bene dal fondo».

   ══ PERCHÉ LA REGOLA STA QUI E NON NELLE DUE PAGINE ═════════════════════
   Le stesse famiglie si vedono in due posti: le TESSERE dell'area (dove il
   socio sfoglia il repertorio) e le CARTE del gestionale. Sono due riquadri
   diversi con due nomi di classe diversi, ma il colore è lo stesso fatto —
   scritto due volte sarebbe il giorno in cui il giallo dell'area e quello del
   catalogo non sono più lo stesso giallo.

   ══ E PERCHÉ NON IL VERDE PIENO DEL MARCHIO ════════════════════════════
   `--sig-verde-500` è la G del logo, e accanto alla sua riga c'è scritto «2.59
   come testo: non è testo». Come FONDO regge — il navy sopra ci sta — ma una
   tessera porta due testi, non uno: il nome e due righe di descrizione. Il
   secondo è la riga che su un fondo pieno diventa illeggibile, e una
   descrizione che non si legge è una tessera che si guarda invece di leggerla.

   Questi tre fondi sono la versione del marchio fatta per starci sotto: sono
   già nel foglio (`--sig-successo-sfondo` e compagni), sono già definiti nei
   DUE temi, e i loro inchiostri hanno già i contrassegni di contrasto scritti
   accanto (7.81, 6.14). Inventarne altri tre voleva dire rifare quel lavoro e
   rifarlo peggio.

   ══ COME SI USA ════════════════════════════════════════════════════════
   Due classi insieme: `sig-fam` (che è la marcatura — «questa cosa ha una
   famiglia», e serve alle pagine per vestire quello che sta dentro) e una fra
   `sig-fam-gioco`, `sig-fam-ruota`, `sig-fam-malus`. Il bonus FISSO non ha
   classe, ed è la richiesta alla lettera: «come sono». È anche la maggioranza,
   e colorare tutto è non colorare niente. */
.sig-fam-gioco {
  --fam-sfondo: var(--sig-gioco-sfondo);
  --fam-ink: var(--sig-gioco-testo);
  --fam-bordo: var(--sig-gioco-bordo);
}
.sig-fam-ruota {
  --fam-sfondo: var(--sig-attenzione-sfondo);
  --fam-ink: var(--sig-attenzione-testo);
  --fam-bordo: var(--sig-attenzione);
}
.sig-fam-malus {
  --fam-sfondo: var(--sig-errore-sfondo);
  --fam-ink: var(--sig-errore-testo);
  --fam-bordo: var(--sig-errore);
}
/* Il fondo, il bordo e l'inchiostro in una volta. `color` sull'elemento e non
   sul solo nome: così tutto quello che sta dentro e non ha un colore suo lo
   eredita, invece di restare del grigio di una superficie che non c'è più.

   ══ E LA CLASSE È SCRITTA DUE VOLTE, APPOSTA ═══════════════════════════
   `.sig-fam.sig-fam` è lo stesso elemento chiesto due volte: combacia con
   quello che combaciava prima, e pesa il doppio. Serve perché chi la usa
   ha già un fondo suo — `.tessera` nell'area, `.carta` nel catalogo — e
   quelle regole stanno nel `<style>` della pagina, cioè DOPO questo foglio.
   A parità di peso vince l'ultima, e vinceva il bianco: misurato, con le
   tessere che restavano bianche e nessun errore da nessuna parte.

   L'alternativa era ripetere queste tre righe nelle due pagine, cioè due
   gialli che un giorno non sono più lo stesso giallo. */
.sig-fam.sig-fam {
  background: var(--fam-sfondo);
  border-color: var(--fam-bordo);
  color: var(--fam-ink);
}
/* ══ E DENTRO UNA FAMIGLIA I GRIGI DELLA PAGINA NON ESISTONO PIÙ ══════════

   `--sig-testo-tenue` e `--sig-testo-secondario` sono calcolati per la
   superficie NEUTRA — la carta bianca, il navy del tema scuro. Sopra un fondo
   tinto scendono sotto la soglia: misurato, la descrizione di una tessera
   verde col grigio tenue non passava.

   Si potrebbe vestire un pezzo alla volta — la descrizione, l'etichetta, la
   nota, il bordo dell'elenco, la x che chiude — e sarebbero otto regole da
   tenere allineate, più quelle che nascono domani. Invece si ridefiniscono i
   TOKEN qui dentro: chi sta dentro una famiglia e usa il grigio della pagina
   si ritrova l'inchiostro della famiglia, senza sapere di stare dentro una
   famiglia. È lo stesso meccanismo del tema scuro, applicato a una scatola.

   `color-mix` con `--sig-testo` e non con `transparent`: mescolare col
   trasparente vuol dire lasciar passare il fondo, cioè sbiadire — che è
   esattamente il difetto da cui si viene. Mescolare con l'inchiostro normale
   della pagina sposta la TINTA e tiene il peso.

   Il bordo invece sì, col trasparente: un bordo deve essere più leggero di
   quello che separa, e qui ha un fondo tinto dietro che lo tiene. */
.sig-fam {
  --sig-testo-tenue: color-mix(in srgb, var(--fam-ink) 82%, var(--sig-testo));
  --sig-testo-secondario: color-mix(in srgb, var(--fam-ink) 88%, var(--sig-testo));
  --sig-bordo: color-mix(in srgb, var(--fam-ink) 32%, transparent);
  --sig-bordo-forte: color-mix(in srgb, var(--fam-ink) 55%, transparent);
}
/* ══ IL PULSANTE CHE DISTRUGGE SI RIPRENDE LA SUPERFICIE NEUTRA ══════════
   «Elimina» e «Disattiva» sono un contorno rosso su fondo trasparente, e quel
   rosso è stato scelto contro la carta bianca (o il navy del tema scuro).
   Sopra un fondo tinto scende: misurato 4,17 sul verde scuro, sotto il 4,5 che
   serve — ed è proprio il pulsante che non deve essere ambiguo.

   Non si cambia il rosso: gli si ridà il fondo per cui quel rosso è giusto. Il
   pulsante diventa una pastiglia chiara sul colore della famiglia, che è anche
   il modo in cui si stacca dal resto del piede. */
.sig-fam button.pericolo { background: var(--sig-carta); }
/* Sul fondo del gioco i testi vengono tutti dalla sua famiglia di valori: nello
   scuro il fondo è il lime, e il bianco del tema lì non si legge. Vedi
   `--sig-gioco-sfondo`. */
/* I campi dentro una famiglia colorata: blu sul bianco, in tutti e due i temi. Il fondo dei
   campi seguiva il tema e il testo la famiglia, e nel tema scuro veniva blu su blu (1,1):
   è il materiale illeggibile delle schede in modifica. */
.sig-fam.sig-fam input:not([type="checkbox"], [type="radio"], [type="file"]),
.sig-fam.sig-fam textarea, .sig-fam.sig-fam select {
  background: var(--sig-bianco); color: var(--sig-blu-900); border-color: var(--sig-blu-900);
}
.sig-fam.sig-fam .sig-pannello-corpo button:not(.primario, .pericolo),
.sig-fam.sig-fam .sig-pannello-piede button:not(.primario, .pericolo) {
  background: var(--sig-bianco); color: var(--sig-blu-900); border-color: var(--sig-blu-900);
}
.sig-fam.sig-fam input::placeholder, .sig-fam.sig-fam textarea::placeholder { color: var(--sig-grigio-medio, var(--sig-blu-900)); }

.sig-fam.sig-fam-gioco {
  --sig-testo: var(--sig-gioco-corpo);
  --sig-testo-tenue: var(--sig-gioco-tenue);
  --sig-testo-secondario: var(--sig-gioco-secondario);
  --sig-accento: var(--sig-gioco-primario);
  --sig-accento-su: var(--sig-gioco-primario-su);
  --sig-azione-primaria-hover: var(--sig-gioco-primario-hover);
}

.sig-badge {
  display: inline-flex; align-items: center; gap: var(--sig-spazio-1);
  padding: var(--sig-spazio-1) var(--sig-spazio-3);
  border-radius: var(--sig-raggio-pillola);
  font-size: var(--sig-corpo-etichetta);
  font-weight: var(--sig-peso-semibold);
  text-transform: uppercase;
  letter-spacing: var(--sig-tracking-etichetta);
}
.sig-badge--successo   { background: var(--sig-successo-sfondo); color: var(--sig-successo-testo); }
/* Testo normale: rosa su rosso scuro e giallo su marrone si staccavano poco, nel tema scuro. */
.sig-badge--errore     { background: var(--sig-errore-sfondo); color: var(--sig-testo); }
.sig-badge--attenzione { background: var(--sig-attenzione-sfondo); color: var(--sig-testo); }
.sig-badge--info       { background: var(--sig-info-sfondo); color: var(--sig-info-testo); }
.sig-badge--vittoria   { background: var(--sig-oro); color: var(--sig-blu-900); font-weight: var(--sig-peso-bold); }
.sig-badge--contorno   { background: transparent; border: 1px solid var(--sig-bordo); color: var(--sig-testo-secondario); }

.sig-chip {
  display: inline-flex; align-items: center; gap: var(--sig-spazio-2);
  min-height: 36px;
  padding: var(--sig-spazio-2) var(--sig-spazio-4);
  background: var(--sig-superficie);
  border: 1px solid var(--sig-bordo);
  border-radius: var(--sig-raggio-pillola);
  font-size: var(--sig-corpo-testo-piccolo);
  font-family: var(--sig-font);
  color: var(--sig-testo);
  cursor: pointer;
}
.sig-chip:hover { background: var(--sig-superficie-premuta); }
/* Premuto, lo sfondo SEMANTICO dell'informazione e non il blu della tavolozza:
   `--sig-blu-100` è chiaro in tutti e due i temi, mentre `--sig-info-testo`
   nel tema scuro diventa proprio `--sig-blu-100` — testo e sfondo dello
   stesso colore (misurato il 30 ottobre 2026). `--sig-info-sfondo` gira
   insieme al suo testo. */
.sig-chip[aria-pressed="true"] {
  background: var(--sig-info-sfondo);
  border-color: var(--sig-bordo-attivo);
  color: var(--sig-info-testo);
}

.sig-contatore {
  display: inline-flex; align-items: center; justify-content: center;
  min-width: 20px; height: 20px; padding: 0 6px;
  border-radius: var(--sig-raggio-pillola);
  background: var(--sig-errore); color: var(--sig-bianco);
  font-size: var(--sig-corpo-etichetta); font-weight: var(--sig-peso-bold);
  font-variant-numeric: tabular-nums;
}

.sig-avatar {
  display: inline-flex; align-items: center; justify-content: center;
  width: 44px; height: 44px;
  border-radius: var(--sig-raggio-cerchio);
  /* Lo sfondo del tema, non il blu chiaro fisso: in tema scuro `info-testo` è
     un azzurro chiaro, e sul `blu-100` le iniziali sparivano (disco vuoto). */
  background: var(--sig-info-sfondo); color: var(--sig-info-testo);
  font-weight: var(--sig-peso-bold); font-size: 15px;
  overflow: hidden;
  /* Un disco non si schiaccia: con un nome lungo nella testata a 768 si ridusse a
     16 px e le iniziali finivano sopra il marchio. */
  flex: 0 0 auto;
}
.sig-avatar--piccolo { width: 32px; height: 32px; font-size: 12px; }
.sig-avatar--grande { width: 56px; height: 56px; font-size: 19px; }
.sig-avatar--sovrapposto { border: 2px solid var(--sig-superficie); margin-left: calc(var(--sig-spazio-3) * -1); }

.sig-progress {
  height: 8px;
  background: var(--sig-superficie-premuta);
  border-radius: var(--sig-raggio-pillola);
  overflow: hidden;
}
.sig-progress__barra {
  height: 100%;
  background: var(--sig-gradiente-logo);
  border-radius: var(--sig-raggio-pillola);
  transition: width var(--sig-durata-media) var(--sig-curva-standard);
}

/* ═══════════════════════════════════════════════════════════════════════════
   SCHERMI LARGHI — una sola media query, e serve solo a dare aria.
   Mobile-first: tutto quello che sta sopra è il telefono, che è il caso
   normale e non l'eccezione da rimediare in fondo.
   ═══════════════════════════════════════════════════════════════════════════ */

@media (min-width: 640px) {
  /* DENSITÀ: i due gradini alti non salgono più (sp-5 restava 48 e saliva a
     64, sp-6 da 64 a 96). Il titolare: «si scrolla troppo per arrivare da un
     elemento al successivo» — ogni schermata deve portare più contenuto,
     senza comprimersi. Il respiro lo danno i 48 e i 64, non i 96. */
  :root {
    --sig-sp-6: var(--sig-spazio-8);
  }
  h1 { font-size: var(--sig-corpo-h2); }
  h2 { font-size: var(--sig-corpo-h3); }
  .sig-colonna { padding: 0 var(--sig-sp-4); }
  .sig-bottone.pieno { width: auto; }
  .sig-carta { padding: var(--sig-sp-4); }

  .sig-display { font-size: var(--sig-corpo-display); letter-spacing: var(--sig-tracking-display); }
  .sig-h1 { font-size: var(--sig-corpo-h1); }
  .sig-h2 { font-size: var(--sig-corpo-h2); }
  .sig-h3 { font-size: var(--sig-corpo-h3); }
  .sig-numero { font-size: var(--sig-corpo-numero); }
}

/* ═══════════════════════════════════════════════════════════════════════════
   DESKTOP — il secondo scalino, a 1024px

   Fino a qui c'era una sola media query, a 640, e serviva solo a dare aria: il
   sito era la stessa colonna da 680 pixel a qualunque larghezza. Su uno schermo
   da 1440 lasciava 373 pixel di vuoto per lato, e la risposta di chi lo apriva
   era «vedo la versione telefono».

   Da 1024 in su le sezioni che tengono schede si allargano e le schede si
   affiancano. La prosa NO: quella resta nella colonna di lettura, perché una
   riga di testo lunga 1120 pixel non si segue.
   ═══════════════════════════════════════════════════════════════════════════ */

@media (min-width: 1024px) {
  .sig-pila { grid-template-columns: repeat(auto-fit, minmax(300px, 1fr)); }

  /* Grandezze da sito: a schermo grande la carta respira di più. 24px di
     padding sono la misura del telefono; 32 è quella a cui una carta dentro
     una griglia da 1120 smette di sembrare un widget di un'app. */
  .sig-carta { padding: var(--sig-spazio-6); }

  /* Il gradino desktop dei titoli obliqui del brand. I componenti esistevano
     dallo scaffale con la sola misura mobile: il display a 100px e l'h1 a 56
     sono i token del brand book, non numeri presi dal riferimento. */
  .sig-display { font-size: var(--sig-corpo-display); }
  .sig-h1 { font-size: var(--sig-corpo-h1); }

  /* Dentro una colonna larga il titolo della sezione resta leggibile: il testo
     introduttivo non si allarga con le schede. */
  .sig-colonna.larga > h2,
  .sig-colonna.larga > p { max-width: var(--sig-larghezza); }

  h1 { font-size: var(--sig-corpo-h1); }
  h2 { font-size: var(--sig-corpo-h2); }
  h3 { font-size: var(--sig-corpo-h3); }
}

/* ═══════════════════════════════════════════════════════════════════════════
   IL TELAIO DELLE PAGINE
   La testata e il piede che le pagine pubbliche condividono, e il taglio
   editoriale della vetrina. Promossi qui dal campione di index.html dopo
   l'approvazione del layout desktop: prima erano regole locali della pagina.

   Il principio, per tutto il telaio: LA CORNICE USA LA PAGINA, IL CONTENUTO
   TIENE LA SUA MISURA. Sopra i 1024px testata e piede si allargano a
   --sig-contenuto; un modulo resta largo quanto un modulo, la prosa quanto
   la prosa. Sotto i 1024px niente cambia rispetto al telefono.
   ═══════════════════════════════════════════════════════════════════════════ */

/* Il binario largo SENZA padding suo: per le pagine che il respiro orizzontale
   lo danno già al body (le pagine-modulo). Chi usa `.sig-colonna larga` non ne
   ha bisogno — quella il padding ce l'ha. */
.sig-telaio { max-width: var(--sig-contenuto); margin-left: auto; margin-right: auto; }

/* ── Il ritorno alla home ──────────────────────────────────────────────────
   Ogni pagina che non è la home porta questa riga in alto: esplicita, non
   solo il marchio cliccabile — chi arriva da un link esterno non sa che il
   logo è una porta. Nell'area la stessa riga dice «Torna al sito», lontana
   da «Esci» che sta in alto a destra. */
.sig-torna {
  display: flex; align-items: center; gap: .35rem;
  min-height: var(--sig-tocco);
  max-width: var(--sig-contenuto); margin: 0 auto;
  padding: 0 var(--sig-sp-3);
  font-size: var(--sig-corpo-testo-piccolo);
  font-weight: var(--sig-peso-semibold);
  color: var(--sig-testo-tenue); text-decoration: none;
}
.sig-torna::before { content: '←'; font-weight: var(--sig-peso-bold); }
.sig-torna:hover {
  color: var(--sig-testo);
  text-decoration: underline;
  text-decoration-color: var(--sig-accento);
  text-decoration-thickness: var(--sig-spessore-appoggio);
  text-underline-offset: 4px;
}

/* ── «Passa e guarda»: la riga che toglie l'ansia della prima volta ──
   Riquadro verde tenue con TESTO NAVY, ovunque stia. Le regole doppie
   (anche con `.sig-sezione.scura` davanti) esistono per battere in
   specificità quelle delle sezioni scure, che schiarivano il testo fino a
   1.56:1 — e il link a 1.06:1, cioè invisibile. Sul verde chiaro il navy
   regge 15.2:1; il link stacca per peso e sottolineatura, non per colore. */
.sig-passa { background: var(--sig-verde-100); border-radius: var(--sig-raggio);
             padding: var(--sig-sp-3) var(--sig-sp-4); }
.sig-passa p, .sig-sezione.scura .sig-passa p {
  margin: 0; color: var(--sig-blu-900); }
.sig-passa a, .sig-sezione.scura .sig-passa a {
  color: var(--sig-blu-900); font-weight: var(--sig-peso-bold);
  text-decoration: underline; text-decoration-thickness: 2px;
  text-underline-offset: 3px;
}

/* ── La testata: marchio a sinistra, un'azione a destra ── */
/* ══ LA TESTATA È ALTA UGUALE OVUNQUE ═══════════════════════════════════════
   Ce ne sono due versioni: quella STATICA che ogni pagina si porta nell'HTML
   — deve esserci anche senza JavaScript — e quella che `barra.js` promuove a
   barra di navigazione. E la barra non sta su tutte le pagine: sulle pagine di
   flusso (registrazione, accesso, il modulo di valutazione, la risposta a un
   posto libero) sarebbe una fila di voci che porta via da quello che si sta
   facendo.

   Il padding però era diverso — `sp-3` qui, `sp-2` nella barra — e il
   risultato era una testata alta 73 pixel in home e 94 sulle altre: si
   passava da una pagina all'altra e la barra CRESCEVA. Un elemento che sta in
   cima a ogni pagina non può cambiare misura quando si cambia pagina.

   Adesso il valore è uno solo, qui. */
/* ══ E NON TOCCA I BORDI ═══════════════════════════════════════════════════
   Il titolare, 13 settembre 2026: «la barra in alto della home è tagliata ai
   lati e non è curata come quella dell'area riservata, soprattutto dopo il
   login».

   Tagliata lo era davvero, e la causa è una scorciatoia: `padding: sp-2 0`.
   In home la testata È una `.sig-colonna`, che porta `padding: 0 sp-3` — e
   questa riga, scritta per intero, gliela azzerava. Misurato a 393: il segno
   partiva da 0 e la faccia finiva a 393, cioè tutti e due incollati al vetro.

   Adesso il lato si scrive, invece di essere cancellato. `sp-3` e non `sp-4`
   (che è quello dell'area) di proposito: la testata dell'area va da bordo a
   bordo e non ha niente sotto con cui allinearsi, mentre qui sotto c'è la
   colonna della pagina — con `sp-4` il segno partirebbe dieci pixel a destra
   dei titoli delle sezioni, e un disallineamento di dieci pixel si vede
   proprio perché è piccolo. Le PROPORZIONI dell'area restano: padding sp-2
   in verticale, segno 32, nome 1.2rem, 68 pixel d'altezza. */
.sig-testata {
  display: flex; align-items: center; gap: var(--sig-sp-2);
  padding: var(--sig-sp-2) var(--sig-sp-3);
}
/* 28px di altezza: il marchio è largo 2 a 1, quindi occupa 58 pixel dei 375
   della testata — sta accanto al nome senza spingere fuori l'azione a destra.
   `flex: 0 0 auto` perché in un flex il figlio si stira: è la regola che il
   test del marchio pretende, e il perché sta lì. */
/* Proposta A del dimensionamento: il segno sale a 34px (28 era timido), il
   nome a 1.2rem, e il sottotitolo passa al contrasto pieno — era tenue, e la
   prima riga che dice chi siamo non può essere quella sbiadita. */
.sig-testata .segno { height: 38px; width: auto; flex: 0 0 auto; }

/* ══ SUL TELEFONO LA TESTATA PRENDE LE MISURE DI QUELLA DELL'AREA ═══════════
   Il titolare, 12 settembre 2026, seconda passata: «la barra in alto della
   home è piccola e schiacciata. Quella dell'area riservata è bella: logo,
   campanella, esci, ben proporzionati. Rifalla con le proporzioni di quella
   dell'area».

   ══ E QUESTA RIGA RIBALTA QUELLA DI STAMATTINA, DETTO CHIARO ═══════════════
   Poche ore prima, dallo stesso telefono, aveva chiesto il contrario: «la
   barra in alto occupa troppo» — era 72 pixel, e l'avevo portata a 52
   stringendo tre cose: il segno da 38 a 30, il padding da `sp-2` a `sp-1`, il
   nome da 1.2 a 1.05rem.

   Non è un ripensamento e basta: è quello che si scopre guardando le due barre
   una dopo l'altra invece che una sola. Settantadue erano troppi, e a
   cinquantadue la barra non è diventata compatta — è diventata schiacciata,
   cioè ha perso le proporzioni fra il segno e le parole. L'area sta a
   SESSANTOTTO e sembra giusta: la differenza non è l'altezza, è il rapporto.

   Quindi si copiano le misure di là, che sono quelle che gli piacciono:
   padding `sp-2` (12), segno 32, nome 1.2rem. Vengono 68 pixel come nell'area
   — quattro meno dei settantadue di partenza, e con l'aria nel posto giusto.

   Da 641 in su non cambia nulla: lì il segno è 38 e la testata è quella di
   sempre. */
@media (max-width: 640px) {
  /* Il lato resta: era `0`, ed è la riga che incollava il segno al vetro.
     Vedi la nota su `.sig-testata` qui sopra. */
  .sig-testata { padding: var(--sig-sp-2) var(--sig-sp-3); gap: var(--sig-sp-2); }
  .sig-testata .segno { height: 32px; }
  /* ══ E LA BARRA NON CAMBIA ALTEZZA QUANDO SI ENTRA ═════════════════════
     Misurato a 393: 68 pixel da sconosciuto, 73 dopo il login. Non era un
     vestito diverso — erano i due tondi che compaiono, il marchio che si
     stringe per far loro posto, e il sottotitolo che a quel punto va a capo.
     Cinque pixel, ma su una barra che sta in cima a ogni pagina: si passa da
     una pagina pubblica all'area e la barra SALTA.

     Sul telefono, quando c'è la faccia, il sottotitolo esce. Il nome del
     marchio resta — è quello che dice dove sei — e la riga di sotto la si è
     già letta: è la stessa scelta della testata dell'area, che sotto i 640
     toglie il marchio per far posto a chi sei. */
  .sig-barra .sig-testata:has(a.entra.persona) .marchio span { display: none; }
  .sig-dentro .sig-barra .sig-testata .marchio span { display: none; }
  /* E il panino si stacca dal marchio: era appoggiato all'ultima lettera del
     nome, e le tre righe si leggevano come un pezzo del logo. Le azioni
     stanno a destra e il marchio a sinistra — la stessa divisione della
     testata dell'area, dove a spingerle è il margine automatico di `.io`. */
  .sig-barra .sig-panino { margin-left: auto; }
  .sig-testata .marchio { font-size: 1.2rem; line-height: 1.2; }
  .sig-testata .marchio span { font-size: .7rem; letter-spacing: .03em; }
}
/* ══ IL NOME NON TOCCA IL PANINO ════════════════════════════════════════════
   Il titolare, 4 novembre 2026: a 375 con la campanella «Slide In Games» finiva a
   224 e le righe del panino cominciavano a 223. Con tre tondi accanto lo spazio
   non basta: i tondi si avvicinano fra loro e il nome scende appena di corpo.
   L'altezza non cambia: la fa il panino, 44 più il padding. */
@media (max-width: 400px) {
  .sig-barra .sig-testata:has(.campanella-sito) a.entra {
    margin-left: calc(var(--sig-sp-2) / -2);
  }
  .sig-barra .sig-testata:has(.campanella-sito) .marchio strong { font-size: 1.1rem; }
}
/* Sotto i 360 non basta: il nome si taglia al bordo del suo spazio, invece di
   finire sotto il panino. */
@media (max-width: 359px) {
  .sig-barra .sig-testata .marchio { overflow: hidden; }
}
/* `min-width: 0` qui sotto e un fondo vero solo da desktop (in fondo al file,
   nel blocco della barra orizzontale). Sul telefono il marchio DEVE poter
   cedere: accanto ha solo il panino e il tasto di accesso, e a 360px un fondo
   di 9rem spingerebbe fuori proprio quel tasto. Da desktop invece è lui a
   dover reggere, perché lì accanto ha una barra di voci che chiede 760 pixel
   suoi. */
.sig-testata .marchio { flex: 1; min-width: 0;
                        font-weight: var(--sig-peso-black); font-size: 1.2rem; }
/* ══ IL NOME NON GONFIA LA RIGA ═════════════════════════════════════════════
   Il nome del marchio è un LINK sulle pagine interne e un `<strong>` in home,
   e quel link aveva `min-height: var(--sig-tocco)` — 44 pixel. Risultato: il
   blocco del marchio misurava 48 in home e 62 altrove, e la testata cresceva
   di quattordici pixel appena si cambiava pagina.

   I 44 pixel del bersaglio tattile restano, ma li fa il PADDING invece
   dell'altezza minima: l'area cliccabile è la stessa, e la riga non si alza —
   il padding verticale del link sta dentro quello della testata, non si
   somma. E in cima c'è comunque «Torna alla home», che il titolare ha voluto
   proprio perché il marchio da solo non si capisce che è una porta. */
.sig-testata .marchio a { color: inherit; text-decoration: none;
                          display: inline-flex; align-items: center;
                          /* Il padding allarga il bersaglio, il margine
                             negativo lo riassorbe: l'area cliccabile cresce e
                             la riga resta ferma. */
                          padding: var(--sig-sp-2) 0;
                          margin: calc(var(--sig-sp-2) * -1) 0; }
/* Il nome del marchio non va MAI a capo, a nessuna larghezza e in nessun
   punto del sito: «Slide In» sopra e «Games» sotto sono due parole, non un
   marchio. Il sottotitolo che gli sta sotto resta libero di andare a capo —
   quello è una frase, e a 320px deve poterlo fare. */
.sig-testata .marchio strong { display: block; }
.sig-testata .marchio,
.sig-testata .marchio strong,
.sig-testata .marchio a,
.sig-piede .firma { white-space: nowrap; }
.sig-testata .marchio span { white-space: normal; }
.sig-testata .marchio span { display: block; font-size: var(--sig-corpo-etichetta);
                             font-weight: var(--sig-peso-regular);
                             color: var(--sig-testo); letter-spacing: .04em; }
/* Chi è dentro: il bottone diventa la persona — un tondo con la foto o
   l'icona neutra. Lo veste /sito/chi.js quando la sessione c'è.

   ══ E AL PRIMO FOTOGRAMMA LO VESTE IL CSS ═══════════════════════════════
   Il titolare, 14 settembre 2026, la seconda volta: «la barra mostra ancora
   "Accedi" per un istante prima di passare al profilo».

   Il ricordo c'era già — chi è entrato una volta lo sa — ma lo leggeva
   `chi.js`, che è `defer`: gira quando il documento è stato letto tutto,
   cioè DOPO che «Accedi» è stato dipinto. Il ricordo aveva tolto dal
   percorso la chiamata di rete, non il fotogramma sbagliato.

   Adesso il ricordo lo legge una riga sincrona nel `<head>`, che mette
   `sig-dentro` sulla radice prima che il browser dipinga qualunque cosa. Da
   qui in giù è solo CSS: il tondo con l'icona neutra disegnata dentro, e il
   testo «Accedi» che non si vede. `chi.js` arriva dopo e fa quello che
   faceva — la foto vera, e la correzione se il ricordo è vecchio.

   L'icona è un `background` e non un `<svg>` perché deve esserci senza che
   nessuno la costruisca: è la stessa figura di `iconaNeutra()` in chi.js —
   una testa e due spalle — e quando la foto arriva ci finisce sopra. */
/* ══ E LA CAMPANELLA NON È UNA FACCIA ═══════════════════════════════════
   Il titolare, 16 settembre 2026: «non è il pallino: è l'iconcina utente che
   si accavalla alla campanella invece di stare affiancata. Succede sul
   telefono e sul desktop».

   Non si accavallavano: la testa e le spalle erano DISEGNATE DENTRO la
   campanella. Le tre regole qui sotto vestono `a.entra` — il tasto «Accedi»,
   che per chi è già entrato diventa il tondo della faccia — e la campanella
   porta la stessa classe `entra`, perché è un tondo uguale accanto. Quindi
   si prendeva tutto: la figura di sfondo (una faccia sotto una campanella) e
   l'`overflow: hidden`, che serve alla FOTO per stare dentro al tondo e qui
   tagliava il pallino del conteggio — che sta apposta quattro pixel fuori.
   Misurato a 1440: «9+» tagliato a metà sul lato destro, cioè verso la
   faccia. Due difetti che a occhio fanno una cosa sola: due tondi che si
   toccano male.

   La riga è `:not(.campanella-sito)` su tutte e tre: questo vestito è del
   posto dove si entra, non di ogni tondo della testata. E `:not(.persona)`
   sulla versione bianca, che era l'unica a rimettere la figura SOTTO una
   foto già arrivata — la regola due righe più in basso la toglieva, ma con
   una classe in meno e quindi perdeva. */
.sig-dentro .sig-testata a.entra:not(.campanella-sito) {
  font-size: 0;            /* «Accedi» resta nel documento e non si vede */
  background-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24'%3E%3Ccircle cx='12' cy='9' r='4' fill='%231d2b3a'/%3E%3Cpath d='M4 21c0-4 3.6-6.5 8-6.5s8 2.5 8 6.5z' fill='%231d2b3a'/%3E%3C/svg%3E");
  background-repeat: no-repeat;
  background-position: center;
  background-size: 24px 24px;
}
/* Dentro la barra scura la figura è bianca, come l'icona che arriva dopo. */
.sig-dentro .sig-barra .sig-testata a.entra:not(.campanella-sito):not(.persona) {
  background-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24'%3E%3Ccircle cx='12' cy='9' r='4' fill='%23ffffff'/%3E%3Cpath d='M4 21c0-4 3.6-6.5 8-6.5s8 2.5 8 6.5z' fill='%23ffffff'/%3E%3C/svg%3E");
}
/* E appena `chi.js` ha messo la sua icona o la foto, il disegno di sotto non
   serve più: due figure sovrapposte si vedrebbero ai bordi. */
.sig-testata a.entra.persona { background-image: none; }

.sig-dentro .sig-testata a.entra:not(.campanella-sito),
.sig-testata a.entra.persona {
  width: 40px; min-height: 40px; height: 40px; padding: 0;
  border-radius: var(--sig-raggio-pillola); overflow: hidden;
  display: inline-flex; align-items: center; justify-content: center;
  color: var(--sig-testo);
}
.sig-testata a.entra.persona img { width: 100%; height: 100%; object-fit: cover; display: block; }
.sig-testata a.entra.persona svg { width: 24px; height: 24px; }

/* ══ E DENTRO LA BARRA I DUE TONDI SONO BIANCHI, E HANNO L'ANELLO ══════════
   Il titolare, 13 settembre 2026: «non è curata come quella dell'area,
   soprattutto dopo il login».

   Dopo il login la testata prende due tondi — la campanella e la faccia — e
   tutti e due uscivano NERI sul gradiente scuro. Non era una svista di
   colore: `.sig-barra .entra` porta il bianco, ma
   `.sig-testata a.entra.persona` è più specifica e vinceva col suo
   `var(--sig-testo)`, che sul tema chiaro è il navy. Misurato: due icone
   scure su un fondo scuro, e sul telefono nemmeno l'anello che nell'area le
   rende due pulsanti.

   Adesso fanno quello che fanno «Esci» e la campanella dell'area: bianchi,
   dentro un anello chiaro, a QUALUNQUE larghezza. La nota qui sopra diceva
   che l'anello sotto i 1024 non lo mette nessuno «così i due tondi si
   comportano uguale» — e si comportavano uguale, tutti e due senza. Adesso
   si comportano uguale con, che è la forma dell'area. */
.sig-barra .sig-testata a.entra.persona,
.sig-barra .sig-testata a.entra.campanella-sito {
  color: var(--sig-bianco);
  border: 1px solid color-mix(in srgb, var(--sig-bianco) 55%, transparent);
}
/* Lo stesso vestito col solo ricordo, prima che `chi.js` metta `.persona`. */
.sig-dentro .sig-barra .sig-testata a.entra:not(.campanella-sito) {
  color: var(--sig-bianco);
  border: 1px solid color-mix(in srgb, var(--sig-bianco) 55%, transparent);
}
@media (hover: hover) {
  .sig-barra .sig-testata a.entra.persona:hover,
  .sig-barra .sig-testata a.entra.campanella-sito:hover {
    border-color: var(--sig-bianco);
    background: color-mix(in srgb, var(--sig-bianco) 12%, transparent);
  }
}
/* La foto dentro il tondo copre l'anello: il bordo si vede solo su chi non ce
   l'ha, ed è peggio di non averlo. L'anello passa fuori. */
.sig-barra .sig-testata a.entra.persona:has(img) {
  border-color: transparent;
  box-shadow: 0 0 0 1px color-mix(in srgb, var(--sig-bianco) 55%, transparent);
}

/* ══ LA CAMPANELLA, ANCHE IN VETRINA ═══════════════════════════════════
   Il titolare, 10 settembre 2026: «chi è loggato deve vedere la campanella
   anche sul sito, non solo nell'area: uno apre il sito per guardare le serate
   e non scopre mai di aver vinto un contest o che si è liberato un posto».

   È un tondo da 40px come la faccia che le sta accanto — due bersagli della
   stessa taglia, non uno grosso e uno piccolo. La mette /sito/chi.js, e solo
   se c'è qualcosa da leggere: spenta non ci sarebbe.

   Qui NON suona. L'animazione dell'area serve a farsi notare mentre uno sta
   già lì dentro; qui la campanella compare in una testata che prima non
   l'aveva, e comparire è già l'annuncio.

   Il CONTORNO non è scritto qui apposta: sopra i 1024 lo mette la regola di
   `.entra` più in basso, e sotto non lo mette a nessuno. La faccia si comporta
   già così — due tondi accanto devono avere lo stesso vestito a ogni larghezza,
   e un anello solo intorno alla campanella su un telefono si vede subito. */
.sig-testata a.entra.campanella-sito {
  position: relative; width: 40px; height: 40px; min-height: 40px; padding: 0;
  border-radius: var(--sig-raggio-pillola);
  display: inline-flex; align-items: center; justify-content: center;
  color: var(--sig-testo);
}
/* Il margine in più fra i due tondi non c'è più: il `gap` della testata vale
   per tutti, e con quello in più le distanze della barra erano tre diverse —
   12 fra il nome e il panino, 24 fra la campanella e la faccia. Una fila di
   cose spaziate a caso è quello che si legge come «non curata» senza saper
   dire perché. */
.sig-testata a.entra.campanella-sito svg { width: 22px; height: 22px; }
/* ══ IL NUMERO NELL'ANGOLO, E L'ANELLO CHE LO STACCA ══════════════════════
   Dice quante, non solo che ce n'è.

   Il titolare, 15 settembre 2026: «nella home page il pallino si vede ancora
   male sul telefono». Guardato ingrandito, il perché si vede: il disco rosso
   sta APPOGGIATO sull'anello della campanella e ci si fonde — la riga bianca
   del tondo gli entra dentro e ne esce, e sul verde della fascia il rosso
   scuro non stacca. Non sembrava un pallino di notifica: sembrava una
   macchia attaccata al bordo.

   L'anello bianco è la cura, ed è quella di sempre per un pallino appoggiato
   a qualcosa: due pixel del colore di chi sta sotto — qui il bianco, che è
   già il colore della campanella e del suo anello — e il disco torna a
   essere una cosa sopra un'altra invece di una macchia dentro.

   Venti e non diciotto: con `border-box` i due pixel del bordo li paga il
   dentro, e una cifra da 11 in quattordici pixel stava stretta.

   ══ UNA REGOLA SOLA PER TUTTE E DUE LE CAMPANELLE ═══════════════════════
   Erano due copie identiche — questa e `.campanella .conta` in area.html — e
   due copie sono il posto dove un giorno le due campanelle si vestono
   diverso. L'area tiene solo quello che è suo: l'oro di quando suona. */
.sig-testata a.entra.campanella-sito .conta,
.campanella .conta {
  position: absolute; top: -4px; right: -4px;
  min-width: 20px; height: 20px; border-radius: var(--sig-raggio-pillola);
  background: var(--sig-no); color: #fff; font-size: 11px;
  font-weight: var(--sig-peso-bold); display: inline-flex;
  align-items: center; justify-content: center; padding: 0 4px;
  border: 2px solid var(--sig-bianco);
}

.sig-testata a.entra {
  min-height: var(--sig-tocco); display: inline-flex; align-items: center;
  /* Non si stringe e non va a capo: è il tasto di accesso, ed era l'ultimo
     della fila — cioè quello che cedeva quando la testata si stringeva.
     Ridotto, «Accedi» diventava un tondo con tre sillabe impilate dentro. */
  flex: 0 0 auto; white-space: nowrap;
  padding: 0 var(--sig-sp-2); text-decoration: none;
  font-size: var(--sig-corpo-testo-piccolo);
  font-weight: var(--sig-peso-semibold); color: var(--sig-testo);
}

/* ── Il piede: navigazione, non prosa ── */
/* ══ IL GUTTER, CHE MANCAVA DA SEMPRE ═══════════════════════════════════════
   Il titolare, 13 settembre 2026: «tutte le informazioni in fondo alla home
   sul telefono sono messe male: allineamenti storti, spazi irregolari».

   Lo `0` che stava qui azzerava il fianco della colonna che il piede È
   (`.sig-colonna` porta `padding: 0 var(--sig-sp-3)`, e questa scorciatoia lo
   riscriveva per intero). Misurato a 393: i link cominciavano a ZERO, incollati
   al vetro, mentre tutto il resto della pagina comincia a 16. Una riga di testo
   che parte sedici pixel più a sinistra di tutte le altre è esattamente quello
   che si legge come «storto» senza saper dire perché.

   Vale su DIECI pagine, non solo sulla home: otto usano `sig-telaio sig-piede`,
   che di fianchi non ne ha nessuno, e lì il difetto era identico. */
.sig-piede { padding: var(--sig-sp-4) var(--sig-sp-3) var(--sig-sp-5);
             font-size: var(--sig-corpo-testo-piccolo); color: var(--sig-testo-tenue); }
.sig-piede nav { display: flex; flex-wrap: wrap; gap: var(--sig-sp-3); }
.sig-piede a { color: inherit; display: inline-flex; align-items: center;
               min-height: var(--sig-tocco); text-decoration: none;
               font-weight: var(--sig-peso-semibold); }
/* L'evidenziatore: la sottolineatura spessa color accento sotto testo che
   resta navy. È il tratto di pennarello del riferimento, coi nostri colori —
   il lime decora, non scrive. */
.sig-piede a:hover {
  text-decoration: underline;
  text-decoration-color: var(--sig-accento);
  text-decoration-thickness: var(--sig-spessore-appoggio);
  text-underline-offset: 4px;
  color: var(--sig-testo);
}
.sig-piede .firma { margin: 0; }

/* ══ E SUL TELEFONO I LINK STANNO IN DUE COLONNE ════════════════════════════
   «Spazi irregolari, roba schiacciata.»

   Erano dieci link in fila che andavano a capo da soli: misurato a 393, sei
   sulla prima riga e quattro sulla seconda, ognuno largo quanto la sua parola —
   47, 62, 36, 52, 37, 50 — e sedici pixel di distanza fra l'uno e l'altro. Da
   fuori non è un elenco: è un paragrafo di parole slegate, e nessuna comincia
   dove comincia quella di sopra.

   Due colonne, e diventa una tabella: ogni voce parte dalla stessa verticale di
   quella sopra, e la riga che resta spaiata resta a sinistra invece che in
   mezzo al niente. `minmax(0, 1fr)` e non `1fr` secco: senza il minimo a zero
   una voce lunga allarga la sua colonna e le due smettono di essere uguali.

   Solo sul telefono: da 1024 in su il piede è una riga sola con la firma a
   destra, e lì lo spazio c'è. */
@media (max-width: 640px) {
  .sig-piede nav {
    display: grid; grid-template-columns: repeat(2, minmax(0, 1fr));
    gap: 0 var(--sig-sp-3);
  }
  /* La firma si stacca dai link invece di essere l'undicesima voce. */
  .sig-piede .firma { margin-top: var(--sig-sp-3); }
}

/* ── «Salta al contenuto» (lo mette barra.js) ──
   Il primo TAB della pagina: invisibile finché non ha il fuoco, poi una
   pillola in alto a sinistra. Chi naviga col mouse non lo vede mai. */
.sig-salta {
  position: absolute; left: -9999px; top: 0; z-index: 100;
  background: var(--sig-blu-900); color: var(--sig-bianco);
  padding: var(--sig-sp-2) var(--sig-sp-4);
  border-radius: 0 0 var(--sig-raggio-piccolo) 0;
  text-decoration: none; font-weight: var(--sig-peso-semibold);
}
.sig-salta:focus-visible { left: 0; }

/* ── La barra di navigazione (la veste barra.js) ──
   Il guscio a tutta larghezza che barra.js mette attorno alla testata: si
   incolla in alto, e dentro ci arrivano le voci delle pagine, il bottone
   «Voglio giocare» e il panino del telefono. Senza JavaScript non esiste, e
   la testata resta la riga semplice che è. */
/* ══ LA BARRA COL GRADIENTE ═══════════════════════════════════════════════
   Il titolare: «aprendo il sito la barra deve essere sfumata, come quella
   dell'area riservata».

   È lo STESSO gradiente della testata dell'area (`.testata` in area.html):
   quello del marchio scurito del 35% verso navy. Non è una scelta di gusto,
   è una scelta di contrasto — sul verde-500 vero il bianco starebbe a 2,8:1,
   mentre scurito così sta a 5,2 sul punto più chiaro. Copiarlo com'è vuol
   dire che il sito pubblico e l'area si somigliano davvero, invece di
   somigliarsi a occhio.

   La fascia diventa scura in tutti e due i temi, quindi il testo dentro
   prende i token del fondo scuro: senza, in tema chiaro sarebbe navy su
   navy.

   `backdrop-filter` no: la barra è opaca, e sfocare quello che ci passa
   sotto costa un livello di composizione a ogni scorrimento — su un
   telefono si sente. */
/* ══ UN RICHIAMO SI FERMA SOTTO LA BARRA, NON DIETRO ═══════════════════════
   Il titolare, 13 settembre 2026: «cliccando le voci del menu, quello che vedo
   dopo non è centrato: a volte tagliato, a volte comincia a metà».

   Una barra `sticky` in cima e un'ancora sono due cose che non si conoscono:
   il browser porta il bersaglio a zero — che È il bordo di sopra della
   finestra — e la barra ci si posa sopra. Misurato sui dieci richiami della
   home: 68 pixel coperti a 393, 72 a 1440, e a 393 spariva anche il titolo
   della sezione in otto casi su dieci.

   `scroll-padding-top` sulla RADICE e non `scroll-margin-top` su ogni
   bersaglio: una riga per tutta la pagina invece di una per sezione, e vale
   anche per le ancore che nasceranno domani, per i salti da tastiera e per
   ogni `scrollIntoView`.

   L'altezza la misura `barra.js` e la scrive qui dentro: 68 e 72 sono due
   numeri diversi nelle due larghezze, e un numero scritto a mano sarebbe
   storto al primo ritocco della testata. Il fallback è zero, cioè il
   comportamento di prima: sulle pagine senza barra non c'è niente da
   scansare. */
html { scroll-padding-top: calc(var(--sig-barra-alta, 0px) + var(--sig-sp-3)); }

/* ══ E SOTTO L'OROLOGIO NON CI VA ═══════════════════════════════════════════
   Da quando le due app dichiarano `viewport-fit=cover` (14 settembre 2026) la
   pagina arriva ai bordi veri dello schermo: in cima, dentro l'app installata,
   c'è l'orologio dell'iPhone. La barra si tiene il suo spazio sopra il
   contenuto invece di passarci sotto.

   `env(..., 0px)`: dove l'area sicura non c'è — ogni computer, ogni browser
   con la sua barra — questa riga vale zero e non cambia niente. */
.sig-barra {
  position: sticky; top: 0; z-index: 70;
  padding-top: env(safe-area-inset-top, 0px);
  background: linear-gradient(96deg,
    color-mix(in srgb, var(--sig-blu-500) 65%, var(--sig-blu-900)),
    color-mix(in srgb, var(--sig-petrolio-500) 65%, var(--sig-blu-900)) 50%,
    color-mix(in srgb, var(--sig-verde-500) 65%, var(--sig-blu-900)));
  border-bottom: 0;
  color: var(--sig-bianco);
}
/* Quello che sta dentro la barra segue il fondo, non il tema della pagina. */
/* ══ QUELLO CHE STA DENTRO LA BARRA È BIANCO — TUTTO ═══════════════════════
   La fascia è scura in tutti e due i temi, quindi il testo dentro prende i
   token del fondo scuro. `.sig-testata a.entra` è più specifica di
   `.sig-barra .entra` e vinceva col suo `var(--sig-testo)`: il tasto di
   accesso usciva navy su navy, e dopo il login i due tondi uscivano neri.
   Il panino aveva lo stesso difetto in un'altra forma — le sue tre righe
   hanno un `background`, non un `color`, e nessuno gliele aveva girate.

   Le selezioni qui sotto non sono eleganti, e sono quello che serve: la
   regola generale deve poter battere le regole di forma senza che ognuna
   debba ricordarsi del fondo su cui finirà. */
.sig-barra .sig-testata,
.sig-barra .marchio strong,
.sig-barra .marchio span,
.sig-barra .sig-testata a.entra,
.sig-barra .entra { color: var(--sig-bianco); }
.sig-barra .sig-panino span { background: var(--sig-bianco); }
/* Pieno: all'82% sulla parte verde della sfumatura misurava 4,05. */
.sig-barra .marchio span { opacity: 1; }
/* Il segno del marchio: nella barra il fondo è scuro sempre, quindi vale
   sempre la versione bianca — e quella navy non deve comparire nemmeno per
   un fotogramma prima che il tema si applichi. */
.sig-barra .segno-chiaro { display: none; }
.sig-barra .segno-scuro { display: block; }
/* «Accedi»: un contorno chiaro sul fondo scuro, che era navy su navy. */
.sig-barra .entra {
  border-color: color-mix(in srgb, var(--sig-bianco) 55%, transparent);
}
@media (hover: hover) {
  .sig-barra .entra:hover {
    border-color: var(--sig-bianco);
    background: color-mix(in srgb, var(--sig-bianco) 12%, transparent);
  }
}
/* Nessun padding da riscrivere: lo porta `.sig-testata`, uguale ovunque —
   vedi la nota là sopra sul perché è una cosa sola. */

/* Le voci: sul telefono vivono nel pannello sotto la barra, da desktop sono
   la fila accanto al marchio. L'evidenziatore del pennarello (la
   sottolineatura spessa color accento) segna la pagina in cui si è. */
.sig-barra-voci { display: none; }
.sig-barra.menu-aperto .sig-barra-voci {
  display: flex; flex-direction: column;
  position: absolute; left: 0; right: 0; top: 100%;
  /* Il pannello del menu continua la barra: stesso fondo scuro, o
     aprendolo si passerebbe dal navy al bianco a metà gesto. */
  background: var(--sig-blu-900);
  padding: var(--sig-sp-2) var(--sig-sp-4) var(--sig-sp-4);
}
.sig-barra-voci a {
  min-height: var(--sig-tocco); display: inline-flex; align-items: center;
  /* Bianco, perché la barra adesso è scura in tutti e due i temi. */
  text-decoration: none; color: var(--sig-bianco);
  /* Una voce di menu non si spezza a meta parola: «Valutazion / i» non e una
     voce, e non e nemmeno una parola. Senza questo, stretta, la barra andava
     a capo dentro ogni link. */
  white-space: nowrap;
  /* È la navigazione principale del sito: peso pieno e corpo appena sopra
     il testo corrente — semibold qui sembrava sbiadito accanto al bottone
     verde (segnalazione del titolare). */
  font-weight: var(--sig-peso-bold);
  font-size: 1.05rem;
}
.sig-barra-voci a:hover {
  text-decoration: underline;
  text-decoration-color: var(--sig-accento);
  text-decoration-thickness: 3px;
  text-underline-offset: 6px;
}
.sig-barra-voci a[aria-current] {
  text-decoration: underline;
  text-decoration-color: var(--sig-accento);
  text-decoration-thickness: 3px;
  text-underline-offset: 6px;
}
/* ══ IL BOTTONE «VOGLIO GIOCARE», RIFATTO ═════════════════════════════════
   Il titolare: «è brutto».

   Era brutto per una ragione precisa: sul fondo BIANCO della barra vecchia
   il verde-500 col navy sopra funzionava, ma da quando la barra è scura quel
   verde ci finisce dentro — verde su verde scurito — e il bottone smetteva
   di essere un bottone. In più era `align-self: flex-start`, cioè attaccato
   in cima invece che centrato sulla riga: bastava quello a farlo sembrare
   appiccicato.

   Adesso: il LIME pieno, che è il colore più chiaro del sistema e sul fondo
   scuro della barra stacca da solo (13,8:1 col navy sopra); la pillola
   piena invece del rettangolo, che è la forma dell'azione principale in
   tutto il resto del sito; e centrato sulla riga come tutto il resto. */
.sig-barra-cta.sig-bottone {
  background: var(--sig-lime-500); color: var(--sig-blu-900);
  border: 0; border-bottom: 3px solid var(--sig-verde-800);
  border-radius: var(--sig-raggio-pillola);
  min-height: var(--sig-tocco-minimo); padding: 0 var(--sig-sp-4);
  align-self: center;
  font-weight: var(--sig-peso-bold);
  box-shadow: 0 2px 10px rgba(6, 14, 26, .28);
}
@media (hover: hover) {
  .sig-barra-cta.sig-bottone:hover {
    background: var(--sig-lime-500); filter: brightness(1.06);
    transform: translateY(-1px);
  }
}
.sig-barra-cta.sig-bottone:active { transform: translateY(1px); }

/* Il panino: tre righe, tocco pieno. Da desktop sparisce. */
.sig-panino {
  display: inline-flex; flex-direction: column; justify-content: center;
  gap: 4px; width: var(--sig-tocco); height: var(--sig-tocco);
  padding: 12px; background: none; border: 0; cursor: pointer;
  flex: 0 0 auto;
}
.sig-panino span {
  display: block; height: 2px; width: 100%;
  background: var(--sig-testo); border-radius: 2px;
}
/* Aperto, le tre righe diventano una croce: la prima e la terza si portano
   al centro (6px: altezza 2 + spazio 4) e si incrociano, quella di mezzo
   sparisce. Così il tasto dice da solo che adesso chiude. */
.sig-panino span {
  transition: transform var(--sig-durata-istantanea) var(--sig-curva-standard),
              opacity var(--sig-durata-istantanea) var(--sig-curva-standard);
}
.menu-aperto .sig-panino span:nth-child(1) { transform: translateY(6px) rotate(45deg); }
.menu-aperto .sig-panino span:nth-child(2) { opacity: 0; }
.menu-aperto .sig-panino span:nth-child(3) { transform: translateY(-6px) rotate(-45deg); }

/* 1200 e non 900. A 900 la barra passava da panino a voci in fila, ma le voci
   in fila chiedono circa 760 pixel: con il segno, il marchio e il tasto di
   accesso non ci stavano, e qualcosa doveva cedere. Cedeva il marchio.
   Il numero non è scelto a occhio: è la somma di quello che c'è dentro —
   segno 70, marchio almeno 144, voci ~760, accesso ~92, più tre spazi. */
@media (min-width: 1200px) {
  .sig-panino { display: none; }
  /* Il fondo del marchio vale SOLO qui: da qui in su accanto ha la barra
     delle voci, ed e lui che deve reggere invece di essere schiacciato a
     zero. Sotto, il marchio deve poter cedere — vedi la nota sulla regola
     base. */
  .sig-testata .marchio { min-width: 9rem; }
  .sig-barra-voci, .sig-barra.menu-aperto .sig-barra-voci {
    display: flex; flex-direction: row; position: static;
    align-items: center; gap: var(--sig-sp-4);
    border-bottom: 0; padding: 0;
  }
  .sig-barra-cta.sig-bottone { align-self: center; }
  /* Da desktop la barra ha una riga sola: tutto ci si centra sopra. */
  .sig-barra .sig-testata { align-items: center; }
}

@media (min-width: 1024px) {
  /* Il respiro delle sezioni da desktop: 48px per lato. La storia di questa
     riga è una discesa — 96, poi 64, ora 48: ogni giro il titolare ha chiesto
     più contenuto per schermata, e il respiro vero lo danno i confini chiari
     (bordi e fasce), non il vuoto. */
  .sig-sezione { padding: var(--sig-spazio-7) 0; }

  .sig-testata { gap: var(--sig-sp-4); }
  /* «Entra» smette di essere un link timido: su uno schermo largo l'unica
     azione della testata si veste da azione. */
  .sig-testata a.entra {
    border: 1px solid var(--sig-bordo-forte); border-radius: var(--sig-raggio-tondo);
    padding: 0 var(--sig-sp-4);
  }
  .sig-testata a.entra:hover { border-color: var(--sig-testo); }

  .sig-piede { display: flex; align-items: center; gap: var(--sig-sp-4); }
  .sig-piede nav { flex: 1; }
  .sig-piede .firma { margin-left: auto; }

  /* ── Il taglio editoriale: titolo a sinistra, prosa a destra ──
     Il titolo resta in vista mentre si leggono i paragrafi accanto: è la
     colonna che dice di cosa si sta parlando. Sotto i 1024px non esiste:
     è un div qualunque, e la sezione torna una colonna. */
  .sig-taglio { display: grid; grid-template-columns: 5fr 7fr;
                column-gap: var(--sig-sp-6); align-items: start; }
  .sig-taglio .testa { position: sticky; top: var(--sig-sp-4); }
  .sig-taglio .prosa > p { max-width: var(--sig-larghezza); }
}

/* ═══════════════════════════════════════════════════════════════════════════
   IL PODIO DEI PREMI
   Tre piedistalli, il primo al centro e più alto. Lo costruisce
   /sito/podio.js per la pagina pubblica dei contest e per la scheda Contest
   dell'area: la forma sta qui perché i due podi devono essere lo stesso podio.
   L'oro va al primo — come fondo, mai come testo — e il movimento d'ingresso
   esiste solo sotto `.anima`, che lo script aggiunge quando l'animazione può
   davvero partire: senza JS o con meno-movimento il podio è fermo e completo.
   ═══════════════════════════════════════════════════════════════════════════ */

.sig-podio {
  display: flex; align-items: flex-end; justify-content: center;
  gap: var(--sig-sp-2); margin-top: var(--sig-sp-4);
}
.sig-podio .colonna {
  flex: 1 1 0; min-width: 0; max-width: 220px;
  display: flex; flex-direction: column; justify-content: flex-end;
  text-align: center;
}
.sig-podio .premio-sul-podio { padding: 0 var(--sig-sp-1) var(--sig-sp-2); }
/* ══ LA FOTO DEL PREMIO, SUL PODIO ══════════════════════════════════════════
   Il titolare: «i premi del contest vanno mostrati meglio visivamente: anche
   lì servono le immagini».

   Sta sopra il nome perché sul podio l'occhio sale dal piedistallo, e la prima
   cosa che incontra dev'essere l'oggetto. Quadrata e ritagliata al centro: le
   foto le carica una persona da un telefono, e arrivano in tutte le forme.

   Il primo posto la porta più grande degli altri due: è la stessa gerarchia
   che il piedistallo dice con l'altezza, detta anche qui. */
.sig-podio .premio-foto {
  width: 100%; max-width: 96px; margin: 0 auto var(--sig-sp-2);
  aspect-ratio: 1; overflow: hidden;
  border-radius: var(--sig-raggio-piccolo);
  border: var(--sig-spessore-bordo) solid var(--sig-bordo);
  background: var(--sig-superficie);
}
.sig-podio .premio-foto img,
/* Un premio del contest puo' essere anche un VIDEO — decisione del titolare.
   Sta nella stessa cornice quadrata e si ritaglia allo stesso modo: sul podio
   quello che conta e' che l'oggetto si veda, non che formato ha. I comandi li
   mette lo script; qui non parte niente da solo. */
.sig-podio .premio-foto video { width: 100%; height: 100%; object-fit: cover;
  display: block; background: var(--sig-blu-900); }
.sig-podio .posto-1 .premio-foto { max-width: 124px; }
.sig-podio .premio-sul-podio .nome {
  font-weight: var(--sig-peso-extrabold); line-height: 1.2;
  overflow-wrap: anywhere;
}
.sig-podio .premio-sul-podio .descrizione {
  margin: .2rem 0 0; font-size: var(--sig-corpo-etichetta);
  color: var(--sig-testo-tenue); line-height: 1.35;
}
.sig-podio .piedistallo {
  border: var(--sig-spessore-bordo) solid var(--sig-bordo-forte);
  border-bottom: var(--sig-spessore-appoggio) solid var(--sig-bordo-forte);
  border-radius: var(--sig-raggio-piccolo) var(--sig-raggio-piccolo) 0 0;
  background: var(--sig-superficie);
  display: flex; align-items: center; justify-content: center;
}
.sig-podio .piedistallo b {
  font-size: var(--sig-corpo-h2-mobile); font-weight: var(--sig-peso-black);
  transform: var(--sig-obliquo); color: var(--sig-testo-tenue);
}
/* ══ LE ALTEZZE SI CALCOLANO ═══════════════════════════════════════════════
   Il titolare: «tante posizioni quanti sono i premi». Erano tre altezze
   scritte a mano — 96, 64, 46 — e con cinque premi non c'era niente da
   scrivere per il quarto e il quinto.

   Adesso il primo sta a 96 e l'ultimo a 40, sempre, e in mezzo si spalmano
   gli altri: `--gradino` lo conta podio.js e vale (96 − 40) / (premi − 1).
   Dieci premi non fanno una scala che esce dallo schermo, e tre restano un
   podio con la stessa faccia di prima.

   L'oro sta sul primo — fondo e bordo, col navy sopra, mai come testo. */
.sig-podio .piedistallo {
  height: calc(96px - (var(--posto, 1) - 1) * var(--gradino, 28px));
}
.sig-podio .posto-1 .piedistallo {
  background: color-mix(in srgb, var(--sig-oro) 32%, var(--sig-bianco));
  border-color: var(--sig-oro);
}
.sig-podio .posto-1 .piedistallo b { color: var(--sig-blu-900); }

/* ── QUANDO LE COLONNE SONO TANTE ─────────────────────────────────────────
   Cinque premi su un telefono sono cinque colonne da settanta pixel. Niente
   classi per «tante» e niente conteggi dentro il CSS: le colonne si dividono
   lo spazio da sole (`flex: 1 1 0`), e la foto e' larga quanto la sua colonna
   — si restringe con lei senza che nessuno glielo dica.

   Restano il testo e lo spazio in mezzo, che a misura fissa diventerebbero
   illeggibili: vanno a `clamp`, cioe' scendono con la larghezza della
   finestra e si fermano a un minimo. */
.sig-podio { gap: clamp(.25rem, 1.6vw, var(--sig-sp-2)); }
.sig-podio .premio-sul-podio .nome { font-size: clamp(.72rem, 2.2vw, 1rem); }

/* L'ingresso: ogni premio sale al suo posto con un rimbalzo leggero, il
   secondo, poi il primo, poi il terzo. Solo sotto `.anima`, che arriva dallo
   script: qui non si nasconde niente a nessuno per default. */
.sig-podio.anima .colonna {
  opacity: 0; transform: translateY(36px);
  transition: opacity .45s var(--sig-curva-standard),
              transform .6s var(--sig-curva-rimbalzo);
}
/* Il ritardo lo mette podio.js sulla colonna, in ordine di ENTRATA: il centro
   per primo, poi i due accanto, poi i due dopo. Erano tre righe con dentro i
   nomi dei tre posti, e col quarto premio non c'era piu' niente da nominare. */
.sig-podio.anima .colonna { transition-delay: var(--ritardo, 0s); }
.sig-podio.anima.in-scena .colonna { opacity: 1; transform: none; }

/* ═══════════════════════════════════════════════════════════════════════════
   IL MOVIMENTO LEGGERO
   Gli elementi marcati `.sig-appare` entrano scorrendo — ma SOLO sotto
   `body.sig-anima`, che mette `/sito/anima.js`. Senza JS la classe non
   arriva e niente resta nascosto: il movimento è un di più, mai una
   condizione. Con `prefers-reduced-motion` lo script non parte affatto.
   ═══════════════════════════════════════════════════════════════════════════ */

body.sig-anima .sig-appare {
  opacity: 0;
  /* 36px, una strizzata leggera, e la curva dello scatto sul movimento:
     l'elemento ARRIVA e si pianta — con un accenno di sorpasso — invece di
     scivolare in scena. L'opacità resta sulla curva composta: il rimbalzo
     sull'alpha si vedrebbe come sfarfallio. */
  transform: translateY(36px) scale(.97);
  transition: opacity .55s var(--sig-curva-standard),
              transform .7s var(--sig-curva-scatto);
}
body.sig-anima .sig-appare.sig-in-vista { opacity: 1; transform: none; }

/* I titoli che si compongono: ogni parola sale di un soffio, sfalsata dalla
   precedente. Lo split lo fa anima.js — senza JS il titolo è testo normale,
   quindi queste regole non trovano mai niente da nascondere. */
body.sig-anima .sig-parole .parola {
  display: inline-block;
  opacity: 0;
  /* Ogni parola arriva da sotto con un filo di rotazione e si raddrizza
     piantandosi: è il titolo che entra in campo, non che compare. */
  transform: translateY(.7em) rotate(2deg);
  transition: opacity .45s var(--sig-curva-standard),
              transform .6s var(--sig-curva-scatto);
  transition-delay: calc(var(--i, 0) * 90ms);
}
body.sig-anima .sig-parole.sig-in-vista .parola { opacity: 1; transform: none; }

/* La maschera che scorre: l'elemento è già lì, ma si scopre da sinistra come
   una tenda che si apre. Per le foto della galleria e gli spezzoni: un media
   che appare così sembra sviluppato, non caricato. */
body.sig-anima .sig-vela {
  clip-path: inset(0 100% 0 0);
  transition: clip-path var(--sig-durata-lenta, .5s) var(--sig-curva-standard);
}
/* ══ UNA VELA NON PUÒ APRIRSI DA SOLA, E VA SCRITTO ═════════════════════════
   Questa riga sembra ridondante accanto a quella sotto. Non lo è: è l'UNICA
   che funziona, e l'altra non ha mai aperto niente.

   Il difetto, misurato col browser il 31/08/2026: una vela nasce ritagliata a
   larghezza zero, e l'IntersectionObserver CONTA il clip-path quando calcola
   l'intersezione — riporta `intersectionRect` 0x0 e `intersectionRatio` 0
   anche quando l'elemento è in mezzo allo schermo. `anima.js` pretende 0.2
   per accendere `.sig-in-vista`, che è quello che toglierebbe il clip.

   Cioè: per aprirsi deve essere visibile, per essere visibile deve aprirsi.
   Uno stallo, e le foto della galleria restavano invisibili per sempre.

   Quindi la vela la apre il CONTENITORE, che è un `.sig-appare` — opacità, non
   clip, e l'opacità l'observer non la conta. Vale per qualunque antenato in
   vista: il nastro di prima, la griglia di adesso, e quello che verrà.

   La regola c'era già, scritta su `.galleria-nastro`. L'ho cancellata io il
   30/08 pulendo il codice morto: le vele non stanno più in un nastro, quindi
   sembrava una regola che non vestiva più niente. Vestiva l'unica cosa che
   contava. */
body.sig-anima .sig-in-vista .sig-vela { clip-path: inset(0 0 0 0); }
/* E la vela che si accende da sé, se mai qualcuno riuscisse a osservarla. */
body.sig-anima .sig-vela.sig-in-vista { clip-path: inset(0 0 0 0); }

/* Dentro una pila i fratelli si sfalsano di un soffio: arrivare tutti insieme
   è un sipario, arrivare in fila è un ritmo. */
body.sig-anima .sig-pila > .sig-appare:nth-child(2) { transition-delay: .07s; }
body.sig-anima .sig-pila > .sig-appare:nth-child(3) { transition-delay: .14s; }
body.sig-anima .sig-pila > .sig-appare:nth-child(4) { transition-delay: .21s; }

/* Chi ha chiesto meno movimento lo ottiene: le transizioni qui sopra sono
   decorative, e nessuna di esse porta informazione. */
@media (prefers-reduced-motion: reduce) {
  *, *::before, *::after {
    transition-duration: 1ms !important;
    animation-duration: 1ms !important;
  }
}

/* ═══ IL TELAIO CONDIVISO DELLA VETRINA ═══════════════════════════════════════
   Le parti che vivono su PIÙ pagine del sito — manifesto, galleria, spezzoni,
   voci social, carte degli sport, cornici video — stavano nello <style> della
   home quando la home era il sito intero. Con la struttura a pagine sono
   salite qui: una regola sola per tutte, perché due copie divergono al primo
   ritocco. Quello che esiste su UNA pagina sola resta nello <style> di quella
   pagina, come sempre. I colori e le misure stanno in sig.css. */

/* 120px di larghezza: il lockup e' alto quanto largo piu' un terzo
   (1752x1230 nel suo riquadro), quindi occupa 84 pixel di altezza. Piu'
   grande di cosi' sulla colonna da 375 diventa un'insegna. */
.lockup { width: 120px; height: auto; margin-bottom: var(--sig-sp-3); }

/* Le h2 in voce di display: il titolo grande vuole aria sotto, e la sua
   inclinazione non deve far sporgere l'ultima lettera fuori dalla colonna. */
h2.sig-display { margin: 0 0 var(--sig-sp-3); overflow-wrap: anywhere; }

/* Il manifesto: corpo grande, interlinea che respira, strofe distanziate.
   È la voce del sito quando parla dritto. */
.manifesto { display: grid; gap: var(--sig-sp-4); margin-top: var(--sig-sp-3);
             max-width: 34em; }
/* Fuori scala a 1.3/1.65: il manifesto deve entrare in due schermate. Le
   frasi chiave staccano per PESO e per evidenziatore, mai per corpo. */
.manifesto p { margin: 0; font-size: 1.05rem; line-height: 1.6;
               font-weight: var(--sig-peso-medium, 500); }
.manifesto strong { font-weight: var(--sig-peso-black); }
.manifesto .coda { color: var(--sig-testo-tenue); }
@media (min-width: 900px) {
  .manifesto p { font-size: 1.25rem; line-height: 1.55; }
}

.contatti { display: grid; gap: var(--sig-sp-1); margin-top: var(--sig-sp-3); }

/* La galleria: una colonna sola sul telefono, che è come si guardano le
   foto con una mano.

   NIENTE RAPPORTO FORZATO. C'era un 4:3 con `cover`, e dentro quella
   cornice un video verticale mostrava solo una striscia del centro — i
   verticali sembravano «resi orizzontali», tagliati. I media escono con le
   LORO proporzioni: qui non si decide nessun taglio e nessun orientamento,
   i contenuti si mostrano come sono stati girati. */
/* Il nastro: si scorre in orizzontale come un catalogo — il dito sul
   telefono, le frecce (o la rotella) sul desktop. Scroll NATIVO con
   snap, nessuna libreria: il browser sa già fare tutto questo.

   L'ALTEZZA è uniforme e la larghezza la decide ogni foto: le proporzioni
   restano le SUE — un verticale esce stretto e intero, un orizzontale
   largo e intero. Nessun taglio e nessun formato imposto: è layout, non
   un intervento sui file. */
.galleria-nastro { position: relative; margin-top: var(--sig-sp-3); }
/* ══ E IN CIMA C'È POSTO PER QUELLO CHE SPORGE ══════════════════════════════
   Il titolare, 11 settembre 2026: «le carte della home sono tagliate in cima
   quando ci passo sopra — serate, premi, recensioni, galleria».

   Misurato, e la misura dice più della richiesta. Un contenitore che scorre in
   una direzione RITAGLIA l'altra: `overflow-x: auto` fa calcolare `overflow-y`
   ad `auto`, e non è un difetto dei browser, è come è scritta la regola —
   non si può scorrere in orizzontale e lasciar debordare in verticale. Qui il
   bordo alto del nastro coincideva col bordo alto delle tessere, quindi
   qualunque cosa salisse sopra spariva:

     · le tessere delle serate si alzano di 2px sotto il puntatore → tagliati
       tutti e 2, e il movimento che doveva dire «questa è premibile» non si
       vedeva affatto;
     · e con la tastiera, l'anello di fuoco (3px di tratto, 3px di stacco)
       sporgeva di 8px sopra → INVISIBILE. Questa è la cosa grave: chi arriva
       alle tessere con Tab non vedeva dove si trovava. Le altre tre sezioni
       oggi non si alzano — premi, voci e galleria non hanno un `:hover` che
       le muove — ma il giorno che lo avranno troveranno il posto già fatto.

   Il posto si fa con un padding in cima e un margine negativo uguale: dentro
   il nastro c'è spazio non ritagliato, e fuori non si muove niente — le
   tessere restano al pixel dov'erano, e le frecce restano centrate. Sotto il
   posto c'era già (`padding-bottom`), ed è la stessa misura. */
.galleria {
  display: flex; gap: var(--sig-sp-2);
  overflow-x: auto; scroll-snap-type: x mandatory;
  padding-top: var(--sig-sp-2);
  margin-top: calc(-1 * var(--sig-sp-2));
  padding-bottom: var(--sig-sp-2);
}
/* ══ SENZA BARRA DI SCORRIMENTO ══════════════════════════════════════════════
   Il titolare: «togli le barre di scorrimento: quella sotto i nastri e quelle
   sui video sopra. Si trascina col dito o si usano le frecce, la barra non
   serve e sporca».

   Ha ragione e non è solo estetica: sotto un nastro che CAMMINA DA SOLO la
   barra è anche una bugia. Il movimento automatico è una trasformazione, non
   uno scorrimento — quindi la barra resta ferma mentre il contenuto scorre, e
   una barra che non segue quello che si vede è peggio di nessuna barra.

   Lo scorrimento resta tutto: dito, rotella, frecce, e `scroll-snap` come
   prima. Si toglie il DISEGNO della barra, non la possibilità di scorrere —
   che è la ragione per cui questo non è un problema di accessibilità: chi usa
   la tastiera arriva alle tessere con Tab e le frecce funzionano.

   Due proprietà perché i motori si dividono: `scrollbar-width` la capiscono
   Firefox e i Chromium recenti, lo pseudo-elemento i WebKit di prima. */
.galleria { scrollbar-width: none; }
.galleria::-webkit-scrollbar { width: 0; height: 0; display: none; }
/* ══ LA PISTA ════════════════════════════════════════════════════════════════
   Un involucro dentro il nastro, e serve a una cosa sola: dare al movimento
   automatico qualcosa da SPOSTARE che non sia lo scorrimento. Il contenitore
   continua a scorrere come prima — trascinamento, frecce, snap; la pista ci
   cammina dentro con una `transform`, che il compositore anima da sé senza
   passare dal thread principale e senza che lo scroll-snap la veda.

   `display: contents` NON va bene: toglierebbe la pista dal flusso e le
   tessere tornerebbero figlie dirette del nastro, cioè niente da trasformare.
   Quindi è un flex suo, che si porta dietro lo stesso `gap` del nastro.

   `will-change: transform` promette al browser che questa cosa si muove: il
   livello lo prepara prima, invece di scoprirlo al primo fotogramma — che è
   dove si vede lo scatto iniziale. */
.galleria > .nastro-pista {
  display: flex; gap: var(--sig-sp-2);
  will-change: transform;
}
/* ══ IL NASTRO E' RIMASTO, LE FIGURE NO ═════════════════════════════════════
   `.galleria` era la striscia di foto: figure alle loro proporzioni, alte
   240, che scorrevano in orizzontale. Adesso le foto stanno in una griglia
   di caselle quadrate (`.galleria-griglia`, in index.html) e `.galleria` è
   solo il MECCANISMO di scorrimento — lo usano le prossime serate, la scala
   dei premi e le voci di chi ha giocato, ognuna con la sua tessera.

   Le regole che vestivano le figure sono uscite di qui, e una andava tolta
   comunque: `.galleria img { height: 240px; border }` colpiva qualunque
   immagine dentro un `.galleria`, e da oggi le tessere dei premi una foto ce
   l'hanno. Sarebbe stata alta 240 pixel col bordo doppio. */

/* Le frecce: solo dove c'è un puntatore — sul telefono si trascina, e due
   bottoni sovrapposti alle foto sarebbero solo dita più difficili. */
.galleria-freccia {
  display: none; position: absolute; top: 104px; z-index: 1;
  width: 44px; height: 44px; border-radius: var(--sig-raggio-pillola);
  /* Il bordo FORTE: la freccia è un controllo, e il suo contorno deve stare
     a 3:1 (era il bordo delle carte, 1,62 sul fondo; 30 ottobre 2026). */
  border: var(--sig-spessore-bordo) solid var(--sig-bordo-forte);
  background: var(--sig-superficie); color: var(--sig-testo);
  font-size: 22px; line-height: 1; cursor: pointer;
  align-items: center; justify-content: center;
  transition: border-color var(--sig-durata-veloce, .15s) var(--sig-curva-standard),
              opacity var(--sig-durata-veloce, .15s) var(--sig-curva-standard);
}
.galleria-freccia[disabled] { opacity: .35; cursor: default; }
.galleria-freccia:not([disabled]):hover { border-color: var(--sig-appoggio); }
@media (min-width: 700px) {
  .galleria-freccia:not([hidden]) { display: inline-flex; }
}
/* ══ E SUL TELEFONO CI SONO ANCHE LORO ══════════════════════════════════════
   Il titolare, 12 settembre 2026: «le prossime serate, i premi e le parole dal
   campo: su tutti i nastri servono le frecce, e devono scorrere col dito».

   Il dito li scorreva già — misurato con una strisciata vera su tutti e
   quattro: `scrollLeft` si muove — quindi quella metà non era rotta. Rotto era
   il SEGNALE. La riga qui sopra spegneva le frecce sotto i 700 con una ragione
   scritta: «sul telefono si trascina, e due bottoni sovrapposti alle foto
   sarebbero solo dita più difficili». Era un ragionamento su una GALLERIA di
   foto, dove la tessera dopo si affaccia da sé e si vede che c'è dell'altro.
   Sui nastri di CARTE — serate, premi, recensioni — a sporgere è una striscia
   di qualche pixel, che su una fascia dove tutto il resto è a filo si legge
   come un margine.

   Quindi le frecce ci sono su tutti, e il `hidden` resta la regola di prima:
   `nastroAutomatico` le nasconde quando non c'è niente da scorrere, e una
   freccia che non scorre niente non compare né qui né sul desktop. */
@media (max-width: 699.98px) {
  .galleria-freccia:not([hidden]) { display: inline-flex; }
}
.galleria figcaption { font-size: var(--sig-corpo-testo-piccolo); color: var(--sig-testo-tenue);
                       margin-top: var(--sig-sp-1); }

/* Le foto della galleria si aprono: il cursore lo dice prima del clic. */
.galleria img { cursor: zoom-in; }

/* ══ A SCHERMO INTERO IL VIDEO TORNA DELLE SUE PROPORZIONI ═══════════════
   Il titolare, 16 settembre 2026: «in “Guarda com'è andata”, a schermo intero
   un video verticale si vede in orizzontale — zoomato e tagliato».

   La tessera della galleria è un rettangolo 9:16 che RITAGLIA quello che ci
   sta dentro (`aspect-ratio` + `object-fit: cover`), ed è giusto così: in una
   fila di tessere tutte uguali una foto orizzontale si ritaglia, non sfonda la
   riga. Ma a schermo intero l'elemento resta lo stesso elemento — cambia solo
   dove il browser lo dipinge — e quelle regole gli restano addosso: il video
   si prende tutta la larghezza dello schermo con l'altezza fissa della
   tessera, e `cover` riempie quel rettangolo ingrandendo e tagliando. Da qui
   il verticale che si vede orizzontale.

   A schermo intero non c'è nessuna fila da tenere in riga: c'è un video e uno
   schermo, e la cosa giusta è `contain` — tutto il fotogramma dentro, le
   bande nere dove avanza. È quello che fa il browser da solo quando nessuno
   gli scrive sopra.

   ══ PERCHÉ `!important`, CHE QUI NON SI USA MAI ═════════════════════════
   Le regole della tessera sono scritte con un ID (`#galleria-media figure >
   video`), e un ID batte qualunque selettore di classi: `video:fullscreen`
   perderebbe. Riscriverle tutte con l'ID davanti vorrebbe dire una copia di
   questo blocco per ogni galleria del sito — e la prossima nascerebbe senza.
   Questo è il caso per cui `!important` esiste: uno stato che vale su tutto e
   che deve vincere per definizione.

   ══ E DUE REGOLE GEMELLE, NON UNA CON DUE SELETTORI ═════════════════════
   `:fullscreen` è lo standard, `:-webkit-full-screen` la forma vecchia. Un
   browser che non conosce uno dei due butta via TUTTA la regola in cui lo
   trova: scritti insieme, non funzionerebbero né l'uno né l'altro. */
video:fullscreen {
  width: 100% !important; height: 100% !important;
  max-width: none !important; max-height: none !important;
  aspect-ratio: auto !important; object-fit: contain !important;
  border: 0 !important; border-radius: 0 !important; background: #000 !important;
}
video:-webkit-full-screen {
  width: 100% !important; height: 100% !important;
  max-width: none !important; max-height: none !important;
  aspect-ratio: auto !important; object-fit: contain !important;
  border: 0 !important; border-radius: 0 !important; background: #000 !important;
}

/* La foto ingrandita: l'immagine alle SUE proporzioni, mai oltre lo
   schermo. Il dialog è trasparente — la cornice è l'immagine stessa. */
#foto-grande { border: 0; padding: 0; background: transparent;
               max-width: 92vw; max-height: 92vh; cursor: zoom-out; }
#foto-grande::backdrop { background: rgb(0 0 0 / .8); }
#foto-grande img { display: block; max-width: 92vw; max-height: 85vh;
                   width: auto; height: auto;
                   border-radius: var(--sig-raggio); }
#foto-grande p { text-align: center; margin: var(--sig-sp-2) 0 0; }
/* ══ LA X, CHE MANCAVA ═══════════════════════════════════════════════════════
   Il dialogo si chiudeva già toccando ovunque e con Esc, ma nessuna delle due
   si VEDE: chi apre una foto a schermo pieno cerca il pulsante, e se non c'è
   conclude di essere in trappola.

   Fuori dall'immagine, in alto a destra dello schermo: dentro coprirebbe la
   foto, che è la cosa che si è aperta per guardare. Il dialogo è trasparente
   e a tutto schermo, quindi le coordinate sono quelle della finestra. */
.foto-grande-chiudi {
  position: fixed; top: var(--sig-sp-3); right: var(--sig-sp-3); z-index: 2;
  width: var(--sig-tocco); height: var(--sig-tocco); border-radius: 50%;
  border: 2px solid rgb(255 255 255 / .7);
  background: rgb(0 0 0 / .55); color: var(--sig-bianco);
  font-size: 1.6rem; line-height: 1; cursor: pointer;
  display: flex; align-items: center; justify-content: center;
}
@media (hover: hover) {
  .foto-grande-chiudi:hover { background: rgb(0 0 0 / .8);
                              border-color: var(--sig-bianco); }
}

/* Le voci social: icona + nome, bersagli pieni col bordo del sistema.
   In colonna sul telefono, a pillole affiancate da desktop. */
.social { display: grid; gap: var(--sig-sp-2); }
.voce-social {
  display: inline-flex; align-items: center; gap: var(--sig-sp-2);
  min-height: var(--sig-tocco); padding: 0 var(--sig-sp-3);
  border: var(--sig-spessore-bordo) solid var(--sig-scuro-tenue);
  border-radius: var(--sig-raggio-tondo);
  color: inherit; text-decoration: none;
  font-weight: var(--sig-peso-semibold); font-size: var(--sig-corpo-testo-piccolo);
}
.voce-social:hover { border-color: var(--sig-accento); }
/* ══ LE ICONE, TUTTE DELLA STESSA MISURA E CENTRATE ═══════════════════════
   Il titolare: «non sono state né ingrandite né centrate rispetto allo
   spazio che hanno. Sono piccole e sbilanciate».

   ══ IL COMMENTO DI PRIMA DICEVA UNA COSA CHE IL CODICE NON FACEVA ══════
   Diceva «un riquadro fisso che li contiene tutti, e dentro ognuno si
   adatta». Il riquadro fisso c'era — `width` e `height` a 22 — ma dentro
   NON si adattava niente: tutti e sei i disegni dichiaravano
   `viewBox="0 0 24 24"`, cioè il riquadro nominale, mentre il segno vero
   ne occupava una frazione diversa in ognuno. Fissare il riquadro non
   pareggia i disegni: pareggia le cornici, che era il problema.

   ══ MISURATO NEL BROWSER, CON getBBox() ═══════════════════════════════
   Quanto del riquadro da 24 occupa davvero il segno, e dove sta il suo
   centro verticale (12 sarebbe l'asse):

     Instagram   82% × 82%   alto 18.1px   centro 12.00
     WhatsApp    75% × 75%   alto 16.5px   centro 12.00
     TikTok      65% × 72%   alto 15.9px   centro 11.70
     email       82% × 66%   alto 14.5px   centro 12.00
     Facebook    36% × 68%   alto 14.9px   centro 13.35  ← basso di 1.35
     YouTube     83% × 60%   alto 13.2px   centro 12.00

   Le altezze disegnate andavano da 13.2 a 18.1 pixel: il 37% di scarto
   fra la più piccola e la più grande, a parità di riquadro. E la «f» di
   Facebook, che nel suo tracciato scende più di quanto salga, sedeva
   un pixel e un quarto sotto la linea delle altre.

   ══ LA CORREZIONE ═════════════════════════════════════════════════════
   Ogni icona dichiara come `viewBox` il proprio CONTORNO misurato invece
   del riquadro nominale. Da lì in poi lo fa il browser: `preserveAspect-
   Ratio` vale `xMidYMid meet` per difetto, quindi ogni segno si allarga
   fino a toccare il riquadro e ci sta in mezzo — nei due versi.

   Non si pareggiano le ALTEZZE ma gli INGOMBRI, ed è voluto: un marchio
   largo e basso come YouTube deve prendere tutta la larghezza, uno alto
   e stretto come la «f» tutta l'altezza. Pareggiare le altezze
   spingerebbe YouTube fuori dalla riga.

   26 e non 22 perché erano piccole: sono i due pixel che si vedono
   accanto a un testo da 0.875rem. */
.voce-social svg { width: 26px; height: 26px; flex: 0 0 auto;
  display: block;
  transition: transform var(--sig-durata-veloce, .15s) var(--sig-curva-standard); }
/* L'icona saluta al passaggio: due pixel, non un balletto. */
@media (hover: hover) { .voce-social:hover svg { transform: translateY(-2px); } }
.voce-social span { overflow-wrap: anywhere; }

/* La cornice del video: 16:9 fisso perché la pagina non sobbalzi al
   caricamento, bordo pieno come ogni superficie. Larghezza da lettura
   comoda anche dentro la colonna larga. */
.cornice-video { max-width: 880px; margin-top: var(--sig-sp-3); }
.cornice-video video {
  width: 100%; aspect-ratio: 16 / 9; display: block;
  background: var(--sig-superficie-inversa);
  border: var(--sig-spessore-bordo) solid var(--sig-bordo);
  border-radius: var(--sig-raggio);
}

/* Le carte degli sport. La differenza fra attivo e in arrivo NON è un
   colore da interpretare: la carta attiva ha il bordo pieno del sistema,
   quelle in arrivo il tratteggio del cantiere e il testo attenuato. */
/* ══ LE CARTE DEGLI SPORT ═══════════════════════════════════════════════════
   Il titolare, due richieste in una: «troppa distanza fra il testo e le carte
   sotto, avvicinali» e «le carte sono brutte, rifalle: compatte e
   riconoscibili, con lo stato evidente».

   ── LA DISTANZA ──
   Il testo sta in un `.apertura-pagina` e le carte in una `.sig-sezione`
   subito sotto: fra i due correvano 32 pixel di padding della sezione più il
   `margin-top` della griglia — una sessantina in tutto, che è lo stacco fra
   due ARGOMENTI, mentre qui la riga sopra («oggi si gioca a calcio, sugli
   altri stiamo lavorando») è la didascalia delle carte. Adesso la sezione
   delle carte non porta padding sopra, e restano solo i 17 pixel della
   griglia: sono una cosa sola, e si vede.

   ── LE CARTE ──
   Erano tre rettangoli identici — titolo, riga, etichetta in fondo — e per
   sapere quale sport si gioca bisognava LEGGERE tre etichette e
   confrontarle. Lo stato era un dettaglio tipografico in fondo alla carta.

   Adesso lo stato si vede senza leggere:
     · il SEGNO dello sport in grande, che è la cosa che si riconosce da
       lontano — pallone, palla da volley, palla da basket;
     · l'attiva col bordo pieno, il segno nel verde del sistema e il pallino
       acceso accanto a «Si gioca»;
     · quelle in arrivo tenui e tratteggiate, col pallino spento.
   Il colore non è mai da solo: il tratteggio, il peso del segno e la parola
   dicono la stessa cosa tre volte, e chi non distingue i colori le legge
   tutte e tre. */
/* ══ SUL TELEFONO SONO TRE STRISCE, NON SEI QUADRATI E MEZZO ════════════════
   Il titolare, 12 settembre 2026: «gli altri sport: tutto spostato verso
   sinistra e si vede male. E le tre carte: falle più piccole e orizzontali,
   non quadrate».

   Le due cose erano la stessa. Tre carte in una griglia da DUE colonne fanno
   una riga piena e una mezza: la terza restava sola a sinistra con un buco
   della sua misura accanto — ed è quello «spostato verso sinistra». Non c'era
   modo di sistemarlo tenendo due colonne: tre non si divide per due.

   Una per riga, e allora la carta cambia verso: con tutta la larghezza a
   disposizione, impilare il segno sopra il nome vorrebbe dire una carta alta
   il doppio del necessario con mezzo schermo di vuoto a destra. Il segno va
   a sinistra, il nome e lo stato gli si mettono accanto: una striscia, che è
   esattamente la parola che ha usato.

   Da 700 in su non cambia niente: lì le tre colonne ci stanno e le carte in
   piedi vanno bene come stanno. */
.sport-carte { display: grid; gap: var(--sig-sp-2); margin-top: var(--sig-sp-3);
  grid-template-columns: 1fr; }
@media (min-width: 700px) { .sport-carte { grid-template-columns: repeat(3, 1fr); } }
/* La fascia delle carte si attacca al testo che le introduce. */
.apertura-pagina + .sig-sezione { padding-top: 0; }

.sport-carta { border: var(--sig-spessore-bordo) solid var(--sig-bordo);
  border-radius: var(--sig-raggio-card); padding: var(--sig-sp-3);
  display: flex; flex-direction: column; gap: var(--sig-sp-1);
  align-items: flex-start; background: var(--sig-superficie); }
/* Il segno: un quadrato col disegno dentro, in cima alla carta. */
.sport-carta .segno { display: flex; align-items: center; justify-content: center;
  width: 44px; height: 44px; border-radius: var(--sig-raggio-piccolo);
  margin-bottom: var(--sig-sp-1);
  background: var(--sig-fondo-alt); color: var(--sig-testo-tenue);
  /* La misura del PALLONE, e non c'è più nessun svg a cui darla: adesso il
     segno è un'emoji, cioè testo, e la sua grandezza è la dimensione del
     carattere. Senza questa riga eredita il corpo del paragrafo e viene un
     pallino da sedici pixel in mezzo a un riquadro da quarantaquattro —
     misurato, e si vedeva. `line-height: 1` perché l'interlinea del corpo
     sposterebbe l'emoji in basso nel suo riquadro. */
  font-size: 26px; line-height: 1; }
.sport-carta h3 { margin: 0 0 var(--sig-spazio-2); font-size: var(--sig-corpo-testo);
  line-height: 1.2; }
.sport-carta p { margin: 0; color: var(--sig-testo-tenue);
  font-size: var(--sig-corpo-testo-piccolo); }
/* Lo stato: pallino più parola, in fondo alla carta e allineato in basso
   anche quando una carta ha una riga in meno dell'altra. */
.sport-carta .stato { display: flex; align-items: center; gap: .4rem;
  margin-top: auto; padding-top: var(--sig-sp-2);
  font-size: var(--sig-corpo-etichetta);
  text-transform: uppercase; letter-spacing: var(--sig-tracking-etichetta);
  font-weight: var(--sig-peso-semibold); color: var(--sig-testo-tenue); }
.sport-carta .stato i { width: 8px; height: 8px; border-radius: 50%;
  background: currentColor; flex: 0 0 auto; }

/* L'attiva: bordo pieno e più marcato, il segno nel verde, lo stato acceso. */
.sport-carta.attiva { border-color: var(--sig-verde-500); }
.sport-carta.attiva .segno { background: var(--sig-verde-tenue);
  color: var(--sig-verde-testo); }
.sport-carta.attiva .stato { color: var(--sig-verde-testo); }

/* Quelle in arrivo: il tratteggio del cantiere, e il pallino vuoto — un
   cerchio col bordo invece che pieno, che è «non ancora» detto con la forma. */
.sport-carta.in-arrivo { border-style: dashed; }
.sport-carta.in-arrivo h3 { color: var(--sig-testo-tenue); }
.sport-carta.in-arrivo .stato i { background: transparent;
  border: 2px solid currentColor; }

/* ══ LA STRISCIA, SOTTO I 700 ═══════════════════════════════════════════════
   Il segno a sinistra, il nome e la riga sotto al centro, lo stato in fondo a
   destra. Tre righe di contenuto diventano due colonne, e la carta passa da
   circa centosessanta pixel d'altezza a settanta.

   `grid` e non `flex`: lo stato deve stare sulla stessa riga del NOME quando
   c'è spazio e andare sotto quando non ce n'è, e con la griglia lo si dice
   una volta. `align-items: center` allinea il segno al blocco di testo, che è
   come si legge una striscia — il segno non è un titolo sopra, è un'insegna
   accanto. */
@media (max-width: 699.98px) {
  .sport-carta {
    display: grid; align-items: center;
    grid-template-columns: auto 1fr auto;
    gap: 0 var(--sig-sp-3);
    padding: var(--sig-sp-2) var(--sig-sp-3);
  }
  .sport-carta .segno { grid-row: 1 / span 2; margin-bottom: 0;
                        width: 38px; height: 38px; font-size: 22px; }
  .sport-carta h3 { grid-column: 2; }
  .sport-carta p { grid-column: 2; }
  /* Lo stato perde il `margin-top: auto` — qui non c'è un fondo verso cui
     spingerlo, c'è una colonna sua — e si mette a destra, dove l'occhio lo
     trova uguale su tutte e tre senza doverlo cercare in fondo a una carta. */
  .sport-carta .stato { grid-column: 3; grid-row: 1 / span 2;
                        margin-top: 0; padding-top: 0; text-align: right; }
}

/* ── Il layout desktop delle parti condivise ── */
@media (min-width: 1024px) {
  /* Chi siamo: il racconto a sinistra, i social a destra. */
  .chi-siamo {
    display: grid; grid-template-columns: 7fr 4fr;
    column-gap: var(--sig-sp-6); align-items: start;
  }
  .chi-siamo .chi > p { max-width: var(--sig-larghezza); }
  .chi-siamo .contatti { margin-top: 0; align-self: end; }

  /* I contatti diretti: pillole affiancate. */
  #contatti .contatti.social { display: flex; flex-wrap: wrap; }
}

/* Sui monitor larghi la galleria cresce ancora: 340px dentro 1440 sono
   una striscia da telefono, non una vetrina di foto. */
@media (min-width: 1280px) {
  .galleria img, .galleria video { height: 420px; }
  .galleria-freccia { top: 188px; }
}

/* ── Il passaggio fra le pagine ──
   View Transitions fra documenti: cambiando pagina il contenuto si dissolve
   in fretta, mentre barra e piede — identici su ogni pagina — restano fermi.
   Dove il browser non le supporta non succede NIENTE: navigazione normale,
   nessun trucco. E chi ha chiesto meno movimento non vede transizioni:
   l'opt-in vive dentro la media query. */
/* L'opt-in sta A LIVELLO ALTO, non dentro una media query. Annidata,
   `@view-transition` è la parte piu' giovane della specifica e i browser
   che non la leggono lì ignorano l'opt-in del tutto — e siccome una
   transizione fra documenti pretende l'opt-in su TUTTI E DUE (quello che
   esce e quello che entra), basta un documento che non ce l'ha perché il
   passaggio torni secco. Fuori dalla media query non ci sono se. */
@view-transition { navigation: auto; }

::view-transition-old(root), ::view-transition-new(root) {
  animation-duration: .18s;
}

/* Chi ha chiesto meno movimento non vede transizioni: le animazioni si
   azzerano tutte, e il passaggio diventa uno scambio istantaneo. Prima
   l'opt-in stesso viveva dentro `no-preference`; il risultato per chi
   chiede meno movimento è lo stesso, ma adesso non dipende piu' da
   un'at-rule annidata. */
@media (prefers-reduced-motion: reduce) {
  ::view-transition-group(*),
  ::view-transition-old(*),
  ::view-transition-new(*) { animation: none !important; }
}
/* Barra e piede hanno il loro strato con un nome: escono dal cross-fade del
   contenuto e la copia nuova (identica) compare subito, senza animarsi. */
.sig-barra { view-transition-name: sig-barra; }
.sig-piede { view-transition-name: sig-piede; }
::view-transition-group(sig-barra), ::view-transition-group(sig-piede),
::view-transition-image-pair(sig-barra), ::view-transition-image-pair(sig-piede),
::view-transition-old(sig-barra), ::view-transition-new(sig-barra),
::view-transition-old(sig-piede), ::view-transition-new(sig-piede) {
  animation: none;
}

/* ─── Le stelle di una media ─────────────────────────────────────────────────
   «4.8» e' un numero giusto e non dice niente a colpo d'occhio. Le stelle si
   leggono senza fare niente, e si riempiono PER DAVVERO: quattro piene e una
   all'80%, non cinque arrotondate — 4,8 e 4,6 devono vedersi diverse.

   Due file sovrapposte, quella sotto vuota e quella sopra piena tagliata alla
   percentuale giusta. Il disegno sta qui e non nella pagina perche' la stessa
   media si legge in tre posti, e tre copie di una scala sono tre scale che un
   giorno raccontano la stessa media in tre modi. Il codice sta in
   /sito/stelle.js, accanto a questo. */
.stelle { display: inline-flex; align-items: center; gap: .35rem;
          white-space: nowrap; }
.stelle-fila { position: relative; display: inline-block;
               font-size: 1em; line-height: 1; letter-spacing: .05em; }
.stelle-vuote { color: var(--sig-bordo-forte); }
/* Le stelle sono un disegno, non un testo: restano nell'ambra pieno (3:1 basta
   a un segno, e un marrone le farebbe sembrare cioccolato). */
.stelle-piene { position: absolute; inset: 0 auto 0 0; overflow: hidden;
                color: var(--sig-attenzione); }
.stelle-numero { font-size: var(--sig-corpo-etichetta);
                 color: var(--sig-testo-tenue);
                 font-variant-numeric: tabular-nums; }
.stelle-senza { color: var(--sig-testo-tenue); }

/* ══ LE LINGUETTE CHE VANNO A CAPO, SUL TELEFONO ══════════════════════════
   Giro visivo del 9 ottobre 2026. Cinque linguette a 375 non stanno in una
   riga e vanno a capo (è voluto: scorrere nasconde quello che sta a destra),
   ma la seconda riga restava sbilenca — due voci a sinistra e il vuoto a
   destra — e la linea sotto stava solo in fondo alla fila, come se le due
   righe fossero un'unica barra.

   Una regola sola, per tutte le file che vanno a capo (le pillole di
   `.sig-linguette`, le linguette a sottolineatura dell'area e le schede del
   catalogo): ogni riga si riempie in larghezza, con le voci centrate, e ogni
   riga ha la SUA linea sotto. Solo sotto i 640 px: su uno schermo largo le
   voci stanno in fila e restano com'erano. */
@media (max-width: 640px) {
  body .sig-linguette button,
  body .linguette > .linguetta { flex: 1 1 auto; text-align: center; justify-content: center; }
  body .linguette > .linguetta {
    padding-inline: var(--sig-sp-2);
    background-image: linear-gradient(var(--sig-bordo), var(--sig-bordo));
    background-size: 100% 1px; background-position: 0 100%; background-repeat: no-repeat;
    background-origin: border-box;
  }
  body .linguette > .linguetta[aria-selected="true"],
  body .linguette > .linguetta.scelta { background-image: none; }
  /* La linea sta su ogni voce: quella sotto tutta la fila sarebbe doppia. */
  body .linguette { border-bottom: 0; column-gap: 0; }
}

/* La pagina dietro un pannello aperto resta ferma: la classe la mette tocco.js.
   Il solco della barra di scorrimento resta, così da computer non si sposta niente. */
html.pagina-ferma { overflow: hidden; overscroll-behavior: none; scrollbar-gutter: stable; }
dialog, .modale-riquadro, .ms-foglio-dentro, .sig-barra-voci { overscroll-behavior: contain; }
