/* ============================================================
   SmartImmigrate — strato componenti
   Da aggiungere DOPO variables.css e PRIMA di components.css.

   Metodo preso da adotta.me (assets/styles/app.css), che risolve lo
   stesso problema: un CSS che stila pagine invece di componenti.

   Tre regole che valgono più del contenuto di questo file:

   1. ALIAS, NON SOSTITUZIONI. I nomi dei token esistenti restano e
      puntano ai nuovi valori. Così la palette cambia ovunque senza
      toccare una riga delle 798 di components.css, e senza rompere
      nulla se un template usa ancora il vecchio nome.

   2. CLASSI, NON ELEMENTI. Ogni componente ha la sua classe con
      prefisso `sim-`. Mai regole su `button`, `select`, `a`: una sola
      regola larga su un elemento vince per specificità su tutto il
      resto e costringe a rincorrerla con !important. (Verificato sul
      campo: una regola `button:not(...):not(...):not(...)` ha
      continuato a vincere anche contro !important, e ho dovuto
      cancellarla invece di batterla.)

   3. "MUTED" È INCHIOSTRO PIÙ SCURO, MAI GRIGIO PALLIDO. Regola presa
      di peso da adotta.me. Un grigio chiaro su fondo chiaro non passa
      il contrasto AA: misurato su questa pagina, #8B959E su bianco dà
      3.05 e #DDE2E8 dà 3.92, entrambi sotto il minimo di 4.5.
   ============================================================ */

/* ---------- il carattere, servito da noi ---------- */
/* Substory #706. Public Sans resta il carattere — quello che i clienti vedono
   da #768 — ma smette di arrivare dal CDN di Google.

   Sono gli STESSI tre file che `fonts.googleapis.com/css2?family=Public+Sans`
   serviva finora (Public Sans v21, gli stessi tre sottoinsiemi con gli stessi
   `unicode-range`), scaricati una volta e messi in `static/fonts/`. Quindi il
   byte che arriva al browser è lo stesso di ieri: cambia solo da dove.

   Perché `font-weight: 100 900` e non quattro regole: il file è VARIABILE
   (asse `wght`, tabella `fvar` verificata sui tre file). La richiesta al CDN
   chiedeva `wght@400;500;600;800` e Google rispondeva comunque con il
   variabile e questo stesso intervallo — quattro pesi statici sarebbero quattro
   file al posto di uno, e i pesi intermedi smetterebbero di esistere.

   Tre sottoinsiemi e non uno solo, per la stessa ragione: sono quelli che il
   CDN separava. `latin` copre en/it/fr, `latin-ext` i diacritici, `vietnamese`
   il suo. Con `unicode-range` il browser scarica solo quello che la pagina usa
   — sulla landing è il solo `latin`, 26 KB. Hindi, coreano e cinese non sono
   coperti da Public Sans e non lo erano nemmeno prima: cadono sullo stack di
   sistema come sempre.

   Il link Noto Nastaliq Urdu in base.html resta al CDN: serve un altro
   alfabeto e toglierlo è un cambio a sé (decisione del product owner su #706).

   `font-display: swap` come prima: il testo si legge subito col carattere di
   sistema e viene sostituito all'arrivo, invece di restare invisibile. */
@font-face {
  font-family: 'Public Sans';
  font-style: normal;
  font-weight: 100 900;
  font-display: swap;
  src: url("../fonts/PublicSans-vietnamese.f6cafde7602f.woff2") format('woff2');
  unicode-range: U+0102-0103, U+0110-0111, U+0128-0129, U+0168-0169, U+01A0-01A1,
                 U+01AF-01B0, U+0300-0301, U+0303-0304, U+0308-0309, U+0323,
                 U+0329, U+1EA0-1EF9, U+20AB;
}
@font-face {
  font-family: 'Public Sans';
  font-style: normal;
  font-weight: 100 900;
  font-display: swap;
  src: url("../fonts/PublicSans-latin-ext.d0a5d26ee7e7.woff2") format('woff2');
  unicode-range: U+0100-02BA, U+02BD-02C5, U+02C7-02CC, U+02CE-02D7, U+02DD-02FF,
                 U+0304, U+0308, U+0329, U+1D00-1DBF, U+1E00-1E9F, U+1EF2-1EFF,
                 U+2020, U+20A0-20AB, U+20AD-20C0, U+2113, U+2C60-2C7F,
                 U+A720-A7FF;
}
@font-face {
  font-family: 'Public Sans';
  font-style: normal;
  font-weight: 100 900;
  font-display: swap;
  src: url("../fonts/PublicSans-latin.e4c9b081863a.woff2") format('woff2');
  unicode-range: U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6, U+02DA,
                 U+02DC, U+0304, U+0308, U+0329, U+2000-206F, U+20AC, U+2122,
                 U+2191, U+2193, U+2212, U+2215, U+FEFF, U+FFFD;
}

:root {
  /* --- Palette --- */
  --sim-ink:        #0E1418;  /* testo e azioni primarie */
  --sim-ink-2:      #3C464E;  /* testo secondario */
  --sim-muted:      #5E6872;  /* terziario: 5.68 su bianco, passa AA */
  --sim-line:       #E3E7EC;
  --sim-line-strong:#D5DAE0;
  --sim-surface:    #FFFFFF;
  --sim-soft:       #F4F5F8;  /* fondo di sezione */
  --sim-page:       #F2F3F5;  /* fondo pagina: DEVE differire da surface */

  --sim-red:        #D22B3E;  /* identità e stati d'errore. Non è il colore delle azioni */
  --sim-red-soft:   #FDECEE;
  --sim-red-ink:    #B02334;  /* rosso leggibile su fondo rosa: 5.87 su --sim-red-soft */
  /* Bug #839. L'ACCENTO: l'unico fondo rosso di una schermata, e ce n'è UNO.

     La riga sopra il rosso dice "identità e stati d'errore. Non è il colore
     delle azioni", e da #768 era vero: l'azione era l'inchiostro. Misurato in
     produzione, il risultato erano QUATTRO controlli neri per schermata —
     Accesso, la graffetta, Invia, Analizza — cioè quattro azioni primarie e
     quindi nessuna. L'inchiostro come base è un idioma legittimo, ma regge
     solo finché l'accento è RARO; qui non c'era nessun accento.

     Rimettere il rosso su OGNI bottone — la lettera di ADR-0004 — è l'errore
     opposto e fa più danno: le pagine di servizio di IRCC sono rosse su
     bianco, e un servizio privato che dipinge di rosso ogni azione comincia a
     somigliare al sito governativo che non è. È il vincolo che
     `templates/includes/_brandmark.html` scrive già per la foglia d'acero.

     Quindi: inchiostro come base, UN accento per schermata, e l'accento è un
     rosso che il sistema ha già — nessun quarto rosso. La coppia è la stessa
     forma di --sim-red / --sim-red-ink: il fondo, e la sua versione più
     profonda per lo stato sopra. Misurato: bianco su --sim-accent 5.05:1,
     bianco su --sim-accent-hover 6.70:1, e --sim-accent come TESTO dà 5.05 su
     --sim-surface e 4.64 sul fondo pagina --neutral-100 (#F4F5F8) — il caso
     peggiore è il link di base.css:34, e passa.

     A CHI VA l'accento lo decide `[data-primary-action]` più sotto, non una
     classe di variante. La ragione sta in quella regola. */
  --sim-accent:       var(--sim-red);
  --sim-accent-hover: var(--sim-red-ink);
  /* Substory #706. La sfumatura d'IDENTITÀ, e il rosso è l'unica cosa che può
     esserci dentro. Da #768 l'azione primaria è l'inchiostro --sim-ink e il
     rosso è "identità e stati d'errore" (riga sopra): una sfumatura mescolata
     dall'inchiostro sarebbe una macchia grigia su una pagina già quasi nera,
     cioè il nome "gradient-primary" preso alla lettera e mancato nel senso.
     I due estremi sono i due rossi che esistono già — nessun colore nuovo:
     --sim-red e il suo inchiostro --sim-red-ink, che è lo stesso rosso più
     profondo, quindi la sfumatura scurisce invece di cambiare tinta.
     135deg: diagonale dall'alto a sinistra, la direzione di lettura.
     Nessuno la consuma ancora — la consuma #707 in poi (#706 di suo non
     cambia un pixel, ed è voluto). */
  --sim-gradient:   linear-gradient(135deg, var(--sim-red) 0%, var(--sim-red-ink) 100%);
  --sim-ok:         #1F7A55;
  --sim-ok-soft:    #E4F3EC;  /* --sim-ok su questo fondo: 4.61, passa */
  --sim-warn:       #9A6A0F;
  --sim-warn-soft:  #FBF1DC;
  /* Bug #765. Stessa storia di --sim-red-ink, che esisteva già: il colore di
     stato NON è leggibile sul proprio fondo tenue. Misurato, non stimato:
     --sim-warn su --sim-warn-soft dà 4.21, sotto il minimo di 4.5. Serve un
     inchiostro dedicato, come per il rosso. 5.13 su --sim-warn-soft, 5.75 su
     bianco. Il verde non ne ha bisogno (4.61), quindi non gliene diamo uno:
     un token in più che nessuno deve usare è un token che qualcuno userà. */
  --sim-warn-ink:   #8A5D0A;

  --sim-radius-sm:  9px;
  --sim-radius:     12px;
  --sim-radius-lg:  18px;
  --sim-shadow:     0 1px 2px rgba(14,20,24,.04), 0 8px 24px rgba(14,20,24,.06);
  /* Substory #706. I due gradini che mancavano alla scala, ed è una scala solo
     se sono qui: #768 ha portato --shadow-md/--shadow-lg su --sim-shadow e ha
     lasciato --shadow-sm/--shadow-xl sul nero piatto pre-#768, così la pagina
     dipinge DUE famiglie d'ombra affiancate — --shadow-sm su due superfici di
     pages/chat.css e una di components.css, --shadow-xl sulla modale di
     layout.css.

     La tinta è --sim-ink (14,20,24), la stessa di --sim-shadow e non un grigio
     nuovo: un'ombra nera su una pagina d'inchiostro è l'unica cosa che si vede
     "sporca". Scritta in rgba() e non in esadecimale-con-alfa perché è la
     forma che la riga sopra usa già.

     --sim-shadow-sm tiene la geometria di prima (0 1px 2px): cambia solo la
     tinta, e sono superfici piccole già in produzione.

     --sim-shadow-xl invece cresce davvero, da 24px a 32px di sfocatura, e non
     è un ritocco: --sim-shadow misura 24px, quindi un xl da 24px non è un
     gradino sopra lg, è lg con un altro nome. L'unica cosa che porta xl è la
     MODALE, che galleggia sopra tutta la pagina e deve staccarsi dal velo che
     le sta sotto. Due strati come --sim-shadow, con l'alfa più alta per lo
     stesso motivo (.05/.10 contro .04/.06): più in alto sta una cosa, più
     l'ombra la deve sollevare. */
  --sim-shadow-sm:  0 1px 2px rgba(14,20,24,.06);
  --sim-shadow-xl:  0 2px 4px rgba(14,20,24,.05), 0 12px 32px rgba(14,20,24,.10);
  --sim-tap:        44px;     /* bersaglio touch minimo */
  /* Substory #778. Lo stato PREMUTO, in una dichiarazione sola, perché deve
     essere lo stesso su ogni controllo: un'ombra interna, cioè il controllo
     che rientra. È un'OMBRA e non un fondo di proposito — il fondo è già
     occupato da `:hover` e dalle varianti (`--primary`, `--danger`,
     `[aria-pressed="true"]`), e uno stato premuto che si contende la stessa
     proprietà dello stato sopra il quale arriva o perde per specificità o
     costringe a rincorrerla, che è la regola 2 in testa a questo file una
     scala più in basso. Su una proprietà che nessun altro dichiara per questi
     componenti non c'è gara di specificità da vincere.
     Non è animata: la pressione deve essere immediata — "un tocco su un
     telefono è riconosciuto PRIMA che la pagina cambi" (#778, passo 3) — e
     150ms di ritardo su un tap sono esattamente il ritardo che il tocco vuole
     smentire.

     DUE TOKEN E NON UNO, ed è la correzione della prima stesura di #778.
     L'ombra è `--sim-ink` al 20%: su un fondo chiaro scurisce, ma su un fondo
     che è GIÀ `--sim-ink` non dipinge NIENTE — 0.8x(14,20,24) + 0.2x(14,20,24)
     fa (14,20,24), esattamente il colore di partenza. Non "poco visibile":
     zero pixel. E i fondi `--sim-ink` sono `.sim-btn--primary` (Scarica ZIP,
     Assegna, il primo Carica) e `.sim-btn[aria-pressed="true"]` (il filtro
     selezionato), cioè le azioni PRIMARIE della pagina — proprio quelle per
     cui il passo 3 esiste, visto che su un telefono non c'è nessun hover a
     coprire il buco.
     Quindi la stessa ombra, invertita, per i fondi scuri: è l'idioma che
     `.sim-btn--danger:hover` usa già più sotto — non un colore nuovo, la
     coppia scambiata. Stessa geometria e STESSA alfa, perché il passo che se
     ne ricava è già identico: in aritmetica il 20% di nero porta `--sim-soft`
     (244,245,248) a (198,200,203) e il 20% di bianco porta `--sim-ink`
     (14,20,24) a (62,67,70), cioè 46 e 48 punti per canale. Sullo schermo la
     sfumatura non arriva mai all'alfa pieno e il picco misurato è 34 sul
     primario contro 35 sul `--ghost` (Chromium headless, `:active` forzato
     senza hover, confronto a pixel): la pagina risponde al dito con la stessa
     forza ovunque, che è tutto quello che una dichiarazione sola doveva
     comprare. Prima di questa riga lo stesso confronto dava 1 e 2 punti sul
     primario e sul filtro selezionato — rumore di arrotondamento, non uno
     stato.
     Il nome dice a chi va: `--sim-press` a tutti i fondi chiari,
     `--sim-press-on-dark` ai due che portano `background: var(--sim-ink)`. */
  --sim-press:         inset 0 2px 5px rgba(14,20,24,.20);
  --sim-press-on-dark: inset 0 2px 5px rgba(255,255,255,.20);

  /* Public Sans: disegnato per moduli e testi normativi, quindi porta il
     registro giusto senza sembrare un marchio. Un carattere solo, con una
     scala di pesi usata sul serio — è la scala, non la famiglia, a fare la
     differenza. Nessun serif: qui non c'è testo lungo da leggere. */
  --sim-font: 'Public Sans', -apple-system, BlinkMacSystemFont, 'Segoe UI',
              Roboto, 'Helvetica Neue', Arial, sans-serif;

  /* --- ALIAS: i nomi già usati da components.css puntano qui --- */
  --font-family:   var(--sim-font);
  /* Bug #839. `--primary` faceva DUE mestieri sotto un nome solo: era il
     colore del MARCHIO (i link di base.css:34, gli anelli di fuoco, i bordi
     della drop zone) ed era il FONDO di ogni bottone pieno. Finché i due
     mestieri stanno sullo stesso token, una riga li cambia entrambi — ed è
     successo: #768 ha scritto `--primary: var(--sim-ink)` e ha spento insieme
     il rosso del marchio e la gerarchia dei bottoni, ribaltando ADR-0004
     (Accettata) senza toccarla e lasciando i link di corpo dipinti
     dell'inchiostro del testo che li circonda.

     Ora sono due token con due mestieri, ed è la separazione che impedisce
     alla prossima riga sola di rifare lo stesso danno:

       --primary      il MARCHIO. Torna al rosso, come ADR-0004 chiedeva.
       --action-fill  il FONDO di un bottone pieno. Resta l'inchiostro.

     `--primary-bg` non si muove: era ed è il grigio tenue di sezione, e una
     pagina che si accende di rosa a ogni campo a fuoco è la cosa che questo
     bug viene a togliere, non a spostare. */
  --primary:       var(--sim-accent);
  --primary-hover: var(--sim-accent-hover);
  --action-fill:       var(--sim-ink);
  --action-fill-hover: var(--sim-ink-2);
  --primary-bg:    var(--sim-soft);
  --neutral-900:   var(--sim-ink);
  --neutral-800:   #242C33;
  --neutral-700:   var(--sim-ink-2);
  --neutral-600:   var(--sim-muted);
  /* Bug #765. Era #7A8794, ed è la causa singola di quattro delle tredici
     righe rosse: `.no-docs` (3.67 su bianco), `.drop-zone-hint` (3.37 su
     --sim-soft), la `x` di chiusura delle modali e il toggle
     mostra-password (3.67 entrambi). È la regola 3 in testa a questo file,
     scritta e poi non applicata a questo gradino.

     Perché diventa un alias invece di un grigio un po' più scuro: il 500 deve
     passare 4.5:1 sul fondo di sezione --sim-soft (#F4F5F8), non solo sul
     bianco. Il grigio più chiaro che ci riesce è circa #667080, che dà 4.59 —
     nove millesimi di margine sul fondo pagina #F2F3F5 — ed è comunque
     indistinguibile a occhio da --sim-muted. Un gradino che nessuno vede e che
     passa per un pelo non è un gradino: è un 600 con un altro nome. Meglio
     dirlo. La gerarchia fra testo secondario e terziario resta affidata a
     --neutral-700 / --neutral-600, che sono davvero diversi. */
  --neutral-500:   var(--sim-muted);
  --neutral-400:   #B4BCC4;
  --neutral-300:   var(--sim-line);
  --neutral-200:   #EDEFF3;
  --neutral-100:   var(--sim-soft);
  --neutral-50:    #F9FAFB;
  --error:         var(--sim-red);
  --error-light:   var(--sim-red-soft);
  --success:       var(--sim-ok);
  --success-light: var(--sim-ok-soft);
  --warning:       var(--sim-warn);
  --warning-light: var(--sim-warn-soft);
  /* Bug #765. --text-muted era CITATO da templates/documents/checklist.html in
     sei regole e DEFINITO da nessuna parte, quindi in produzione vinceva
     sempre il fallback scritto a mano dentro ogni `var()`. Tre di quei
     fallback non passavano il contrasto — #adb5bd (1.90, il segnaposto "--"
     ripetuto 342 volte) e #6c757d (3.95 sul pill grigio, 4.45 sull'intestazione).
     Il token ora esiste; i fallback in checklist.html sono stati allineati a
     questo valore, così i due non possono più divergere in silenzio.
     NB: --bg-secondary resta deliberatamente NON definito. I suoi fallback
     erano diversi rule per rule (#f8f9fa per l'intestazione, #e9ecef per il
     pill che ci sta sopra) e un token unico li appiattirebbe, facendo sparire
     il pill dentro la sua intestazione. Substory #777 ha tolto l'ultima
     citazione: checklist.html non lo nomina più da nessuna parte, perché
     quelle regole ora sono `.sim-section-head` e `.sim-chip`. Il token resta
     non definito per la stessa ragione di prima, non perché nessuno lo usi. */
  --text-muted:    var(--sim-muted);
  --radius-sm:     var(--sim-radius-sm);
  --radius-md:     var(--sim-radius);
  --radius-lg:     var(--sim-radius-lg);
  --shadow-sm:     var(--sim-shadow-sm);
  --shadow-md:     var(--sim-shadow);
  --shadow-lg:     var(--sim-shadow);
  --shadow-xl:     var(--sim-shadow-xl);
  /* Substory #706. Questo NON è un alias nel senso della regola 1 in testa al
     file: --gradient-primary non esisteva in variables.css, non c'è niente da
     ri-puntare. Sta qui lo stesso, e col nome nel vecchio spazio, per la
     ragione opposta: chi lo consumerà (#707 in poi) scrive i nomi senza
     prefisso, e un token che si chiama --sim-qualcosa nei template è un
     secondo spazio di nomi da ricordare. La definizione resta --sim-gradient,
     una sola. */
  --gradient-primary: var(--sim-gradient);
}

/* ---------- l'azione primaria ---------- */
/* Bug #839. UNA regola, e non dipinge niente: sposta il token.

   `data-primary-action` è il marcatore di substory #794 e dice QUALE controllo
   della pagina è l'azione primaria — uno per pagina, scritto nel template,
   contato da apps/chat/tests/test_beta_substory794_single_send_action_e2e.py.
   Il fondo dei bottoni pieni lo decide `--action-fill`, e qui viene
   ridefinito sull'elemento marcato: ogni regola che dipinge un bottone pieno
   (`.sim-btn--primary` qui sotto, `.btn-primary` e `.modal .modal-submit` in
   components.css, `.input-area button` in pages/chat.css) risolve
   `var(--action-fill)` SULL'ELEMENTO su cui si trova, quindi legge l'accento
   lì e l'inchiostro dappertutto altrove. Nessuno di quei SELETTORI cambia:
   cambia il nome del token che leggono, e c'è questa riga in più.

   PERCHÉ UN TOKEN E NON UNA REGOLA DI SFONDO. Una `background` qui dovrebbe
   battere `.input-area button` (0,1,1) da un foglio che si carica DOPO questo
   (`{% block extra_css %}`, base.html:38), e l'unico modo sarebbe duplicare
   l'attributo per gonfiare la specificità o inseguire ogni consumatore con un
   selettore più lungo: la rincorsa che la regola 2 in testa a questo file
   descrive e vieta. Le proprietà personalizzate non hanno quella gara —
   la `var()` si risolve sull'elemento, non su chi ha scritto la
   dichiarazione — quindi la cascata resta dov'era e cambia un valore solo.
   È la regola 1 in testa al file (alias, non sostituzioni) un piano più sotto.

   PERCHÉ IL MARCATORE E NON `.sim-btn--primary`. La checklist mostra due
   `.sim-btn--primary` insieme — il primo "Carica" del blocco dei mancanti e
   "Scarica tutti i documenti (ZIP)" — e la landing ne ha uno nel foglio dei
   documenti. Puntare la VARIANTE sull'accento dipingerebbe più accenti per
   schermata: il difetto di partenza con un altro colore. Una pagina ha
   legittimamente più bottoni pieni e UNA sola azione primaria; il marcatore è
   l'unica cosa nel repository che sappia distinguerle. */
[data-primary-action] {
  --action-fill:       var(--sim-accent);
  --action-fill-hover: var(--sim-accent-hover);
}

/* ---------- superfici ---------- */
.sim-card {
  background: var(--sim-surface);
  border: 1px solid var(--sim-line);
  border-radius: var(--sim-radius-lg);
  box-shadow: var(--sim-shadow);
  padding: 22px;
}
/* `clip` e non `hidden`: entrambi tagliano i figli sugli angoli arrotondati,
   ma solo `hidden` rende questa scatola un contenitore di scorrimento, e un
   discendente `position: sticky` si aggancia al contenitore di scorrimento più
   vicino invece che alla pagina. Le intestazioni di gruppo di #776 sono sticky
   dentro questa card: con `hidden` si calcolavano `sticky` e scorrevano via lo
   stesso (misurato: top -400px dopo 400px di scorrimento). `overflow: clip`
   non crea un contenitore di scorrimento (CSS Overflow 3). */
.sim-card--flush { padding: 0; overflow: clip; }
/* Bug #1131. Una scheda che è un ELENCO di righe: a filo come `--flush`, ma
   senza `overflow: clip`. Le righe documento portano un menu ⋮ che si apre
   sotto il bottone e deve poter uscire dalla scheda (quello dell'ultima riga
   lo fa sempre); con `clip` sarebbe tagliato a metà. Gli angoli arrotondati
   restano giusti perché la prima e l'ultima riga ereditano il raggio della
   scheda per i propri fondi (components.css, `.sim-card--list > .doc-row`). */
.sim-card--list { padding: 0; }
/* `min-height` — substory #777. Senza, l'intestazione misura ~42.4px (14+14 di
   padding più una riga da 12px) e resta sotto il bersaglio touch: su questa
   pagina sono 30 `<summary>` cliccabili. Il numero sta QUI e non su
   `.app-fields-group-header`, perché una misura scritta sulla pagina è
   esattamente il difetto che #767 esiste per chiudere. */
.sim-section-head {
  display: flex; align-items: center; justify-content: space-between; gap: 12px;
  min-height: var(--sim-tap);
  padding: 14px 20px; background: var(--sim-soft);
  font-size: 12px; font-weight: 700; letter-spacing: .09em; text-transform: uppercase;
  color: var(--sim-muted); cursor: pointer;
}
/* Substory #778. Gli stati dell'intestazione, e il `summary` davanti alla
   classe è la parte che decide.

   `.sim-section-head` ha DUE usi che si somigliano solo a vedersi: il
   `<summary>` di un gruppo, che è un controllo e apre qualcosa, e
   l'intestazione di una sezione che non fa niente. Le seconde sono QUATTRO, e
   tre stanno su questa stessa pagina: `.unassociated-header`
   (checklist.html:334), `.app-fields-header` (:350), `.person-header` (:582) e
   `.sim-sheet__head` (il foglio di #804, `chat/landing.html:161`, che infatti
   si riprende `cursor: default` più sotto — ed è lo stesso elemento della
   testata di chat, non un quinto caso). Una regola sulla classe nuda darebbe a
   tutte e quattro una risposta al passaggio del mouse: un fondo che cambia su
   una cosa che non si può premere è una promessa falsa, ed è più dannoso del
   nessun segnale che #778 viene a chiudere.

   Il selettore resta una regola sulla CLASSE (è lei il soggetto, il tipo è
   solo il filtro), quindi la regola 2 in testa a questo file regge: non è
   `summary { ... }`, che vincerebbe su tutto per larghezza. E il passo 7 —
   "una pagina successiva le eredita" — è servito meglio così che da un
   modificatore: un `<summary class="sim-section-head">` scritto domani su
   un'altra pagina ha già i suoi stati, senza che nessuno si ricordi di
   aggiungere una seconda classe.

   #778 passo 1 nomina "fondo e colore del bordo" e la banda è 100-200ms; 150ms
   è lo stesso valore che `.sim-btn` usa dal primo giorno, quindi la pagina si
   muove a una velocità sola. */
summary.sim-section-head {
  transition: background .15s ease, border-color .15s ease;
}
/* Il fondo dell'hover è `--sim-line`, cioè il valore che questa intestazione
   aveva già: la regola arriva da `checklist.html:74`, dove #777 l'aveva
   lasciata indietro, e sale qui senza cambiare di un grigio. Il criterio 3
   ("passare sopra un'intestazione di gruppo ne cambia il fondo") continua a
   valere esattamente come prima; quello che cambia è chi lo dichiara. */
summary.sim-section-head:hover { background: var(--sim-line); }
/* Il premuto dell'intestazione è l'OMBRA CONDIVISA e non un terzo grigio.
   La prima stesura di #778 scendeva a `--sim-line-strong` (#D5DAE0) lasciandoci
   sopra `--sim-muted`: 4.04:1 per un'etichetta di 12px/700, che non è "testo
   grande" e quindi vuole 4.5:1. È lo stesso difetto, alla seconda cifra, per
   cui #777 fu rimandata indietro sul drag-over della drop zone (4.03 -> 4.97),
   e nessuna prova lo vede: il giro di #765 legge la pagina a riposo e il
   cancello di #778 non preme mai un'intestazione.
   Con l'ombra il fondo non si muove più: l'etichetta resta sui suoi 5.21:1
   (`--sim-soft`, a riposo) o 4.57:1 (`--sim-line`, sotto il mouse), la domanda
   sul contrasto sparisce invece di essere ricalcolata, e l'intestazione smette
   di essere l'unico controllo della pagina con un premuto tutto suo.
   E l'ombra non riapre la questione da un'altra parte, perché non arriva
   all'etichetta: `inset 0 2px 5px` senza spread sfuma verso l'interno da tutti
   e quattro i bordi e si esaurisce entro ~5px, mentre il padding
   dell'intestazione è 14px sopra e 20px ai lati. Misurato e non dedotto — il
   pixel più scuro ATTORNO ai glifi (riquadro del testo x 20-66, y 32-41 su un
   elemento 420x72) resta (244,245,248) sotto il dito e (227,231,236) sotto il
   dito col mouse sopra, cioè gli stessi 5.21:1 e 4.57:1 di prima. */
summary.sim-section-head:active { box-shadow: var(--sim-press); }
/* `outline-offset` NEGATIVO, e non i +2px degli altri componenti. Questa
   intestazione è a filo della sua scheda e la scheda è `.sim-card--flush`, che
   porta `overflow: clip`: un anello disegnato 2px FUORI dall'elemento viene
   tagliato dalla scheda su tre lati e resta visibile solo dove non serve.
   Disegnato dentro si vede tutto, e sono gli stessi 2px del sistema. */
summary.sim-section-head:focus-visible {
  outline: 2px solid var(--sim-ink); outline-offset: -2px;
}

/* ---------- etichetta di un gruppo di schede (bug #1131) ----------
   Non è `.sim-section-head`. Quella è la TESTATA di una scheda: una fascia
   grigia a filo della scheda, 44px, con un controllo in fondo. Questa è
   l'ETICHETTA sopra un gruppo di schede, sullo sfondo della pagina, come
   l'artboard `MobileDocs.dc.html` la disegna: 11px/700 spaziata in
   `--sim-muted`, il conteggio accanto, una linea sottile fino al bordo. Su beta
   la schermata Documenti usava la fascia grigia per ogni categoria e #1131 la
   misura come uno dei motivi per cui la schermata non è la sua tavola.
   `__count` e `__rule` sono le due parti che la tavola disegna. La linea è un
   elemento e non un `::after` perché così resta un figlio flex che prende lo
   spazio che avanza, in qualunque lingua sia l'etichetta.
   Quando l'etichetta è il `<summary>` di un gruppo che si apre (i documenti
   facoltativi) è un controllo: prende il bersaglio da 44px e gli stati di
   #778 — gli stessi valori di `summary.sim-section-head` più sopra. */
.sim-group-head {
  display: flex; align-items: center; gap: 8px; margin: 0;
  padding: 0 4px 8px;
  font-size: 11px; font-weight: 700; letter-spacing: .09em;
  text-transform: uppercase; color: var(--sim-muted);
}
.sim-group-head__count { font-variant-numeric: tabular-nums; }
.sim-group-head__rule {
  flex: 1 1 auto; min-width: 16px; height: 1px; background: var(--sim-line);
}
summary.sim-group-head {
  min-height: var(--sim-tap); padding-top: 0; padding-bottom: 0;
  border-radius: var(--sim-radius-sm); cursor: pointer; list-style: none;
  transition: background .15s ease;
}
summary.sim-group-head::-webkit-details-marker { display: none; }
summary.sim-group-head::marker { content: ''; }
summary.sim-group-head:hover { background: var(--sim-line); }
summary.sim-group-head:active { box-shadow: var(--sim-press); }
summary.sim-group-head:focus-visible {
  outline: 2px solid var(--sim-ink); outline-offset: 2px;
}

/* ---------- gruppo che si apre ---------- */
/* Substory #778, passo 5: "Animare l'apertura di un gruppo invece di farla
   scattare, così l'utente vede da dove arriva il contenuto." Misurato su beta
   prima di questa riga: da 52.3px a 343.3px fra un fotogramma e il successivo —
   il primo campione dopo `open = true` è già l'altezza finale.

   Si anima `::details-content`, cioè la scatola che il browser genera già per
   il contenuto di un `<details>`, invece di avvolgere il corpo in un `<div>`
   con un `max-height` scritto a mano: un `max-height` è un numero da indovinare
   (troppo basso taglia, troppo alto fa partire l'animazione in ritardo e con
   una velocità che dipende da quante righe ha il gruppo — qui vanno da 3 a 43).
   `interpolate-size: allow-keywords` è ciò che rende interpolabile `auto`, ed è
   ereditato, quindi sta sul componente e non su `:root`: un permesso globale
   per interpolare le parole chiave cambierebbe il comportamento di transizioni
   che nessuno ha scritto pensandoci.

   La transizione è dichiarata SOLO nella regola `[open]`, e non è un caso: una
   transizione si legge dallo stile DOPO il cambio, quindi in apertura c'è e in
   chiusura no. Il gruppo si apre mostrando da dove arriva il contenuto e si
   richiude subito — chi chiude un gruppo ha già visto cosa c'era dentro e sta
   cercando qualcos'altro.

   `content-visibility` viaggia con l'altezza: senza, il browser la commuta a
   metà transizione e il contenuto comparirebbe di colpo dentro una scatola che
   si sta ancora aprendo. `overflow: clip` e non `hidden`, per la stessa ragione
   scritta su `.sim-card--flush`: solo `hidden` fa di questa scatola un
   contenitore di scorrimento, e le intestazioni `position: sticky` di #776 si
   aggancerebbero a lei invece che alla pagina. */
.sim-disclosure { interpolate-size: allow-keywords; }
.sim-disclosure::details-content { block-size: 0; overflow: clip; }
.sim-disclosure[open]::details-content {
  block-size: auto;
  transition: block-size .15s ease, content-visibility .15s allow-discrete;
}

/* ---------- azioni ---------- */
.sim-btn {
  display: inline-flex; align-items: center; justify-content: center; gap: 8px;
  min-height: var(--sim-tap); padding: 11px 18px;
  border: 1px solid transparent; border-radius: var(--sim-radius);
  font: inherit; font-weight: 600; line-height: 1; cursor: pointer;
  /* `color` è entrato nella lista con #778: `--danger:hover` sotto inverte la
     coppia fondo/inchiostro, e senza questo pezzo il fondo sfumerebbe mentre
     il testo scatta. Stessa durata, quindi la banda 100-200ms non si muove. */
  transition: background .15s ease, border-color .15s ease, color .15s ease;
}
/* Bug #839. `--action-fill` e non `--sim-ink` DIRETTO: il valore è lo stesso
   inchiostro su ogni bottone pieno di questa famiglia, tranne su quello che
   porta `data-primary-action`, dove la regola in cima al file lo porta
   all'accento. La variante continua a dire "pieno"; quale dei pieni sia
   l'azione primaria lo dice il marcatore. */
.sim-btn--primary  { background: var(--action-fill); color: #fff; }
/* Bug #1131. Each hover restates its INK as well as its fill. `base.css` says
   `a:hover { color: var(--primary-hover); text-decoration: underline }`, which
   is (0,1,1) and beats a variant's own `color` (0,1,0) — so an `<a>` painted
   as a button (`a.sim-btn`) lost its label under the pointer: on the primary
   one, red-ink text on the red-ink hover fill, i.e. a blank red bar. Measured
   on the checklist's "Carica i N che mancano", which is a link so it works
   without script. `:hover` on the variant is (0,2,0) and wins on specificity,
   whatever the load order. */
.sim-btn--primary:hover { background: var(--action-fill-hover); color: #fff; }
.sim-btn--ghost    { background: var(--sim-surface); color: var(--sim-ink); border-color: var(--sim-line-strong); }
.sim-btn--ghost:hover { background: var(--sim-soft); color: var(--sim-ink); }
/* ...and a control is not underlined when pointed at: the underline is the
   affordance of a link in prose, and a `.sim-btn` is recognised by its shape
   (#839). */
.sim-btn:hover { text-decoration: none; }
.sim-btn--danger   { background: var(--sim-red-soft); color: var(--sim-red-ink); }
/* Substory #778. `--danger` era l'unica variante senza `:hover` (`--primary` e
   `--ghost` ce l'hanno da PR #768), e sono i due controlli distruttivi della
   pagina: lo scollegamento di un documento e il cestino della coda di
   assegnazione. L'hover INVERTE la coppia che la variante già dichiara invece
   di introdurre un quarto rosso: `--sim-red-ink` su `--sim-red-soft` è
   misurato 5.87:1 (vedi il commento del token), e scambiare i due termini
   lascia il rapporto identico — un hover che non può far scendere il contrasto
   perché non introduce nessun colore nuovo. */
.sim-btn--danger:hover { background: var(--sim-red-ink); color: var(--sim-red-soft); }
/* `flex: none` e non solo `width` — substory #777, secondo giro.
   Il contratto di `--icon` è "un quadrato di `--sim-tap`, punto". Ma `width` è
   una *dichiarazione*, non un *pavimento*: dentro una riga flex il valore
   diventa la base da cui si restringe, e con `flex-shrink: 1` (il default) un
   fratello che trabocca se lo mangia. È esattamente quello che è successo su
   `.linked-doc` (components.css) — bottone misurato 41.4 x 44.0 in beta: in
   altezza c'era `min-height` a fare da pavimento, in larghezza c'era solo
   `width`. Il pavimento va QUI e non sulla pagina, perché la pagina è il terzo
   consumatore e non il proprietario: `chat/landing.html:163` mette una
   `--icon` in una `.sim-section-head` accanto a un titolo tradotto e senza
   tetto, quindi la stessa stretta è già disponibile lì oggi. `flex: none` è
   l'idioma che lo strato usa già (:228, :377, :388, :391) e può solo impedire
   che un controllo scenda sotto quello che lo strato dichiara. */
.sim-btn--icon     { width: var(--sim-tap); height: var(--sim-tap); padding: 0;
                     flex: none; }
/* Bug #1131. `--icon` DA SOLO è il bottone-icona silenzioso che l'artboard
   disegna per il ⋮ della riga documento: trasparente, senza bordo, glifo SVG
   nell'inchiostro secondario, 44x44 di bersaglio. Prima non dichiarava né
   fondo né bordo, quindi il ⋮ si faceva disegnare da `--ghost` (fondo bianco,
   1px `--sim-line-strong`, raggio 12px) e su beta si leggeva come "un secondo
   bottone grande accanto al primo" — il contrario di SI-083.
   `:not(.sim-btn--ghost)` e non una regola sulla classe nuda: i tre consumatori
   che c'erano già (la matita dei campi, `checklist.html:703` e `:1961`, e la
   chiusura del foglio, `chat/landing.html:452`) scrivono `--ghost --icon`
   INSIEME e vogliono la cornice; quella combinazione resta esattamente com'era.
   `border-width: 0` e non `border-color: transparent`: `.sim-btn` porta
   `1px solid transparent`, che non si vede ma si misura, e il bordo di un
   bottone-icona è zero. Hover e premuto stanno qui accanto per la regola di
   #778 (gli stati nel livello dei componenti, non sulla pagina); il premuto è
   quello condiviso di `.sim-btn:active` più sotto. */
.sim-btn--icon:not(.sim-btn--ghost) {
  background: transparent; border-width: 0; color: var(--sim-muted);
}
.sim-btn--icon:not(.sim-btn--ghost):hover {
  background: var(--sim-soft); color: var(--sim-ink);
}
/* Bug #1131. La riga intera come bersaglio: "aprire il documento è toccare la
   riga, non un bottone separato col nome del file". È un link che fa da
   controllo, quindi è un `.sim-btn` per la regola di #777 (ogni link che fa da
   bottone porta la classe del componente) e di #839 (un `<a>` con una forma da
   controllo non si riconosce dalla sottolineatura). La forma è la riga che lo
   contiene; questa variante toglie tutto ciò che `.sim-btn` aggiunge per
   disegnarne una propria — fondo, bordo, raggio, riempimento, centratura,
   `line-height: 1` — e lascia il bersaglio da 44px, la transizione, l'anello
   di fuoco e il premuto del componente. `min-width: 0` perché dentro una riga
   flex il testo troncato con i puntini può restringersi solo così. */
.sim-btn--row {
  display: flex; flex-direction: column; align-items: stretch;
  justify-content: center; gap: 2px; min-width: 0;
  padding: 0; border-width: 0; border-radius: var(--sim-radius-sm);
  background: transparent; color: inherit; text-align: start;
  text-decoration: none; font-weight: inherit; line-height: inherit;
}
.sim-btn--row:hover { background: var(--sim-soft); color: inherit; }
.sim-btn--block    { width: 100%; }
/* Substory #796. Un controllo la cui etichetta è una FRASE, non una parola.
   `.sim-btn` dichiara `line-height: 1` e `justify-content: center`: sono i
   valori giusti per "Salva" o "Carica", e sono un'assunzione di UNA riga.
   I quattro chip di avvio della pagina iniziale portano frasi tradotte in
   sette lingue — l'urdu e l'hindi corrono molto più dell'inglese, e a 390px
   vanno a capo per forza — e con `line-height: 1` le righe successive si
   toccano e il nastaliq perde i discendenti.

   Sta QUI e non su `.welcome-chip` in pages/chat.css di proposito: una regola
   di pagina che riscrive `line-height` dello strato è esattamente il difetto
   che #767 esiste per chiudere, e la misura appartiene al componente. Non
   tocca nessuna delle varianti esistenti: è una classe in più che va aggiunta
   esplicitamente, e senza di essa `.sim-btn` si comporta come prima. */
.sim-btn--wrap     { white-space: normal; text-align: start;
                     justify-content: flex-start; line-height: 1.35;
                     padding-top: 10px; padding-bottom: 10px; }
.sim-btn:focus-visible { outline: 2px solid var(--sim-ink); outline-offset: 2px; }
/* Stato premuto di un controllo a segmenti (il filtro di #776). Sta QUI e non
   sulla pagina di proposito: una regola `.app-fields-filter-option.is-active`
   ha specificità (0,2,0) e batterebbe `.sim-btn--ghost`, cioè reintrodurrebbe
   il difetto di #767 una scala più in basso. Il gancio è `aria-pressed`, che
   il filtro già scrive e che è anche quello che uno screen reader annuncia. */
.sim-btn[aria-pressed="true"] {
  background: var(--sim-ink); color: #fff; border-color: var(--sim-ink);
}
/* Substory #778. Il segmento SELEZIONATO si mangiava il proprio hover: la
   regola qui sopra ha specificità (0,2,0) esattamente come
   `.sim-btn--ghost:hover` e arriva dopo, quindi il fondo restava nero sotto il
   mouse e il controllo attivo era l'unico della pagina che non rispondeva. Il
   rimedio è dirlo per la variante, non alzare la voce altrove: stesso passo
   che `--primary:hover` fa (verso `--sim-ink-2`), così i due neri del sistema
   si muovono allo stesso modo. */
.sim-btn[aria-pressed="true"]:hover {
  background: var(--sim-ink-2); border-color: var(--sim-ink-2);
}
/* Lo stato premuto di OGNI bottone, e sta dopo tutte le varianti di proposito:
   dichiara solo `box-shadow`, che nessuna di loro tocca, quindi si somma a
   qualunque fondo il controllo abbia in quel momento invece di contenderglielo
   — un `--danger` premuto mentre lo si passa col mouse mostra l'inversione
   dell'hover E il rientro, che è quello che un dito si aspetta. */
.sim-btn:active { box-shadow: var(--sim-press); }
/* ...tranne le due varianti che portano `background: var(--sim-ink)`, che
   prendono l'ombra invertita (il perché sta sul token, in testa al file): sono
   l'unico caso in cui `--sim-press` compone esattamente il colore che ha
   sotto, cioè dichiara uno stato premuto e non disegna niente. Sono anche le
   azioni primarie della pagina, quindi il passo 3 vive o muore qui.
   L'ORDINE È LA REGOLA, non l'abitudine: `.sim-btn[aria-pressed="true"]:active`
   è (0,3,0) e vince da solo, ma `.sim-btn--primary:active` è (0,2,0) come
   `.sim-btn:active` qui sopra e vince soltanto perché arriva dopo.
   Copre anche i fondi che l'hover porta a `--sim-ink-2`: il 20% di bianco su
   (60,70,78) compone (99,107,113), quindi un primario premuto mentre lo si
   passa col mouse risponde come risponde premuto e basta. Le altre varianti
   restano su `--sim-press` e non serve un terzo token: `--danger:hover` porta
   il fondo a `--sim-red-ink` (176,35,52), dove il nero al 20% compone
   (144,32,46) — scuro su scuro, ma non lo STESSO scuro, e il rientro si vede. */
.sim-btn--primary:active,
.sim-btn[aria-pressed="true"]:active { box-shadow: var(--sim-press-on-dark); }

/* ---------- select ---------- */
/* Substory #777 aprì questa sezione con una `.sim-select` sola, per il select
   di riassegnazione della lista documenti, e #778 le aggiunse hover e stato
   premuto. Substory #805 ha scoperto che il problema era più grande di un
   controllo: mancava lo STRATO: 3 `<select>`, 14 `<input>` e 2 `<textarea>`
   nei template, e nessuna risposta per `input` e `textarea`. Le dichiarazioni
   di base di `.sim-select` sono quindi confluite nella regola raggruppata qui
   sotto, dove valgono per tutti e tre, e questa sezione non tiene più una
   seconda definizione della stessa classe: due blocchi `.sim-select` a pari
   specificità si decidono per ordine di caricamento, che è esattamente il modo
   di perdere di vista chi vince (la regola 2 in testa a questo file).
   Hover e stato premuto di #778 restano, e stanno accanto alla freccia. */

/* ============================================================
   CAMPI — lo strato che mancava (substory #805).

   Fino a qui il design system sapeva disegnare superfici, azioni e stati,
   ma non un campo. Nei template ci sono 3 `<select>`, 14 `<input>` e 2
   `<textarea>`: ognuno era nudo, oppure stilato dove capitava (una regola
   in `layout.css` per la lingua nel pannello, una in `components.css` per
   la riassegnazione). Il risultato si vede in #805: la `<select>` della
   lingua nella barra dell'intestazione non incontrava NESSUNA regola e
   veniva disegnata dal sistema operativo, alta 22px, accanto a un bottone
   interamente progettato.

   Quindi tre classi in un colpo solo, non una. Aggiungere solo `.sim-select`
   avrebbe lasciato il prossimo campo da scoprire allo stesso modo — da uno
   screenshot.

   Due decisioni che valgono per tutte e tre:

   * `font-size: 16px` esatti. Non e' tipografia: sotto i 16px iOS Safari
     ingrandisce la pagina quando il campo prende il fuoco, e una pagina che
     salta al tocco e' lo stesso difetto di una troppo piccola da toccare.
   * Solo proprieta' logiche (`padding-inline`, `padding-block`). In urdu la
     pagina e' in RTL e un `padding-right` resterebbe fisicamente a destra.
     L'unica eccezione e' `background-position`, che una forma logica non ce
     l'ha: e' specchiata a mano sotto, ed e' l'unica riga che lo fa.

   Nessuna larghezza qui dentro: la larghezza e' disposizione, non aspetto,
   e appartiene al posto in cui il campo vive.
   ============================================================ */
.sim-input,
.sim-select,
.sim-textarea {
  display: block;
  min-height: var(--sim-tap);
  padding-block: 10px;
  padding-inline: 13px;
  border: 1px solid var(--sim-line-strong);
  border-radius: var(--sim-radius);
  background-color: var(--sim-surface);
  color: var(--sim-ink);
  font-family: var(--sim-font);
  font-size: 16px;
  line-height: 1.3;
}
.sim-input::placeholder,
.sim-textarea::placeholder { color: var(--sim-muted); }

.sim-input:focus-visible,
.sim-select:focus-visible,
.sim-textarea:focus-visible {
  outline: 2px solid var(--sim-ink);
  outline-offset: 2px;
}

.sim-textarea { min-height: calc(var(--sim-tap) * 2); resize: vertical; }

/* La freccia e' nostra, non quella della piattaforma: `appearance: none`
   toglie la seconda, e senza rimpiazzarla resterebbe un controllo che non
   sembra aprire niente. SVG in linea perche' una freccia da 12px non merita
   una richiesta di rete, e il colore e' scritto per esteso (`#5E6872`, cioe'
   `--sim-muted`) perche' un data URI non legge le variabili CSS. */
.sim-select {
  appearance: none;
  -webkit-appearance: none;
  padding-inline-end: 36px;
  background-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='12' height='12' viewBox='0 0 12 12'%3E%3Cpath d='M2.5 4.5 6 8 9.5 4.5' fill='none' stroke='%235E6872' stroke-width='1.5' stroke-linecap='round' stroke-linejoin='round'/%3E%3C/svg%3E");
  background-repeat: no-repeat;
  background-position: right 12px center;
  background-size: 12px 12px;
  cursor: pointer;
}
[dir="rtl"] .sim-select { background-position: left 12px center; }

/* Substory #778, spostate qui con il resto dell'aspetto del `<select>` (prima
   stavano nella sezione qui sopra, insieme alla seconda definizione di
   `.sim-select` che #805 ha unificato). Il bordo è l'unica cosa che questo
   componente possiede davvero — il fondo di un menù a tendina lo disegna il
   sistema operativo, non noi — quindi è il bordo a rispondere. Il `<select>`
   NON entra nella lista dei soggetti con transizione del passo 1 ("bottoni,
   pastiglie, link e intestazioni di gruppo") e qui non ne prende una: un bordo
   che sfuma su un controllo nativo è la specie di animazione che #778 chiude la
   nota chiedendo di non aggiungere. */
/* Bug #1134: `.sim-input` e `.sim-textarea` ricevono gli stessi due stati.
   #954 ha messo sulla checklist il primo `.sim-input` del prodotto
   (`.dependants-declaration-input`) e il cancello di #778 lo ha trovato senza
   `:hover` né `:active`: il passo 7 di #778 mette quegli stati nello strato dei
   componenti, non nella pagina. Il bordo risponde come sul `<select>`. */
.sim-select:hover,
.sim-input:hover,
.sim-textarea:hover { border-color: var(--sim-ink-2); }
.sim-select:active,
.sim-input:active,
.sim-textarea:active { box-shadow: var(--sim-press); }

/* ---------- scelta singola ---------- */
/* Bug #815, secondo giro. La dichiarazione del rappresentante ha portato sulla
   pagina i primi due `<input type="radio">` del prodotto, e lo strato non
   sapeva disegnarli: `radio` e `checkbox` non comparivano in questo file.
   Nudi, li disegna il sistema operativo — 13x13 — e il cancello di beta li ha
   presi subito, cinque asserzioni in una volta: il bersaglio di #777 a 1280 e
   a 390, e le tre risposte di #778 (`:hover`, `:active`, `:focus-visible`),
   che su un controllo non dichiarato sono solo l'anello `auto 1px` di
   Chromium, cioè niente che questo prodotto abbia deciso.

   NON si poteva riusare `.sim-input`. Quella regola è un campo di TESTO: non
   dichiara nessuna larghezza (e la larghezza è disposizione, lo dice il
   commento della sezione qui sopra), quindi il pallino resterebbe largo 13px
   sull'asse che #777 misura insieme all'altezza; e all'epoca il ramo
   `.sim-input` non aveva né `:hover` né `:active` (li ha dal bug #1134).

   E NON si poteva scrivere la regola nel `<style>` della pagina: una regola
   `.rep-declaration-option input { … }` nomina un elemento, ed è esattamente
   ciò che `test_substory777_component_classes.py` rifiuta nel foglio di
   pagina. Classe sull'elemento, regola qui: è l'unica forma che passa da
   entrambe le parti, ed è la regola 2 in testa a questo file.

   COME È FATTO, e sono quattro decisioni, non una:

   * IL BORDO È IL BERSAGLIO. 44x44 è la scatola da toccare, non il disegno:
     un cerchio nero da 44px accanto a un'etichetta da 0.9rem sarebbe il
     controllo più grande della riga. Quindi la scatola del bordo misura
     `--sim-tap` per intero — è quella che `getBoundingClientRect` riporta e
     che #777 confronta — e 12px per lato di quel bordo sono TRASPARENTI:
     l'inchiostro vive nei 20px del contenuto, il dito ha i 44. `background-
     clip: content-box` tiene il colore dentro quei 20px invece di spanderlo
     sotto la corona.
   * `flex: none`, ed è la lezione di `--icon` un controllo più in là (vedi lì,
     `.sim-btn--icon`): `.rep-declaration-option` è una riga flex, e dentro una
     riga flex una larghezza dichiarata è la base da cui si RESTRINGE. Senza
     questa riga il bersaglio torna sotto i 44 appena l'etichetta tradotta è
     più lunga dello spazio — cioè a 390px, che è uno dei due viewport
     misurati.
   * L'ANELLO E IL PALLINO SONO UN `background-image`, non un `box-shadow`.
     #778 legge l'indicatore di fuoco come le ombre AGGIUNTE rispetto a quelle
     che l'elemento porta già a riposo: un'ombra usata per disegnare entra in
     quel conto e lega il fuoco a quante schegge il browser riporta. Un
     gradiente non entra in nessun conto — e lascia `box-shadow` libero per lo
     stato premuto, che è la proprietà su cui `--sim-press` è stato scritto.
   * NESSUNA TRANSIZIONE. `.sim-radio` non è tra i soggetti del passo 1 di #778
     ("bottoni, pastiglie, link e intestazioni di gruppo") e la nota di
     chiusura chiede di non animare i controlli nativi. Una scelta va
     riconosciuta nell'istante in cui la si fa. */
.sim-radio {
  appearance: none;
  -webkit-appearance: none;
  box-sizing: border-box;
  flex: none;
  inline-size: var(--sim-tap);
  block-size: var(--sim-tap);
  margin: 0;
  /* La corona trasparente: porta il bersaglio a `--sim-tap` senza portarci il
     disegno. `border-color` è anche l'unica proprietà che resta libera per
     l'hover, e lì diventa visibile. */
  border: 12px solid transparent;
  border-radius: 50%;
  background-color: var(--sim-surface);
  background-clip: content-box;
  /* `closest-side`: il raggio del gradiente è metà del contenuto (10px), così
     le misure qui sotto sono leggibili come raggi e non come frazioni di una
     scatola che cambia. Anello di 1.5px sul bordo del disco. */
  background-image: radial-gradient(circle closest-side,
      var(--sim-surface) 0 calc(100% - 1.5px),
      var(--sim-line-strong) calc(100% - 1.5px) 100%);
  cursor: pointer;
}
/* Selezionato: lo stesso anello in inchiostro, più il pallino al centro —
   raggio 50% del disco, cioè 5px. Una dichiarazione sola, perché è lo stesso
   gradiente con altri colori. */
.sim-radio:checked {
  background-image: radial-gradient(circle closest-side,
      var(--sim-ink) 0 50%,
      var(--sim-surface) 50% calc(100% - 1.5px),
      var(--sim-ink) calc(100% - 1.5px) 100%);
}
/* L'hover accende la corona che a riposo è trasparente: un alone di 12px
   intorno al disco, che è il gesto più visibile disponibile senza toccare il
   disegno del controllo e senza ridichiarare il gradiente. `--sim-line` e non
   `--sim-soft` perché il blocco della dichiarazione ha già un fondo chiaro
   (`.rep-declaration`, #f8f9fa) e due grigi quasi uguali non sono uno stato. */
.sim-radio:hover { border-color: var(--sim-line); }
/* Premuto: la stessa ombra interna di ogni altro controllo dello strato — il
   fondo qui è chiaro, quindi `--sim-press` e non `--sim-press-on-dark`. */
.sim-radio:active { box-shadow: var(--sim-press); }
/* Fuoco: 2px di inchiostro, identici a `.sim-btn:focus-visible` più sopra.
   `outline-offset` positivo su una scatola tonda disegna un secondo cerchio
   fuori dalla corona, che è dove si vede contro l'etichetta. */
.sim-radio:focus-visible { outline: 2px solid var(--sim-ink); outline-offset: 2px; }

/* ---------- icone (substory #848) ---------- */
/* Un'icona e' `{% include "includes/_icon.html" with name="..." %}` (o
   `simIcon(name)` nel JavaScript che costruisce markup): un `<svg>` 20x20 che
   disegna un simbolo di static/icons/sim.svg in `currentColor`, quindi prende
   il colore del bottone in cui sta — ghost, danger, primary — senza una regola
   per variante. Sette simboli, un solo spessore, griglia da 24.
   `vertical-align` la mette sulla linea di base di Public Sans quando sta in
   mezzo al testo; `flex: none` le impedisce di restringersi dentro una riga
   flex. */
.sim-icon { display: inline-block; vertical-align: -0.15em; flex: none; }
/* L'unica icona con una direzione. Nient'altro si specchia. */
[dir="rtl"] .sim-icon--chevron { transform: scaleX(-1); }

/* ---------- selettore di lingua compatto ---------- */
/* La barra dell'intestazione e' piena: a 390px il marchio ne prende 164 e
   "Accesso" 91, e restano 12px. Il controllo della lingua deve quindi
   diventare piu' STRETTO mentre diventa piu' alto — mostra il codice ("IT"),
   non il nome ("Italiano"), che resta nell'elenco che si apre.

   Come e' fatto, e perche': la `<select>` nativa disegna nel controllo chiuso
   l'etichetta dell'opzione selezionata, e quella deve restare "Italiano"
   perche' e' la stessa stringa che l'elenco aperto mostra. Le due cose non
   possono essere lo stesso testo. Quindi il codice e' dipinto da un elemento
   vero (`data-lang-label`) e la `<select>` gli sta sopra invisibile: continua
   a ricevere i tocchi, resta nell'albero di accessibilita' con il nome della
   lingua per esteso, e apre l'elenco nativo. E' l'unico modo di avere
   entrambe le stringhe senza riscrivere le opzioni.

   `data-lang-label` e `data-lang-chevron` sono la stessa convenzione di
   marcatura che #804 usa per il pulsante di chiusura del foglio: un
   attributo che sopravvive a un cambio di classe. */
.sim-langswitch {
  position: relative;
  display: inline-flex;
  align-items: center;
  justify-content: center;
  gap: 6px;
  flex: none;
  min-height: var(--sim-tap);
  padding-inline: 10px;
  border-radius: var(--sim-radius);
  background: var(--sim-surface);
  /* Il bordo e' un'ombra interna e non un `border` vero: la `<select>` qui
     sopra e' posizionata su `inset: 0`, che si risolve sulla *padding box*.
     Con un bordo da 1px la sua scatola sarebbe alta 42px invece di 44 —
     sotto il bersaglio touch — e la scatola che si tocca e' la sua. */
  box-shadow: inset 0 0 0 1px var(--sim-line-strong);
}
/* L'anello di fuoco sta sul contenitore perche' il controllo che lo riceve e'
   invisibile: disegnarlo su di lui non si vedrebbe. */
.sim-langswitch:focus-within { outline: 2px solid var(--sim-ink); outline-offset: 2px; }

.sim-langswitch__code {
  /* Larghezza minima fissa, per due ragioni. I sette codici non sono larghi
     uguale, e senza questo la freccia si sposterebbe di un pixel cambiando
     lingua. E il carattere e' ridichiarato perche' `[dir="rtl"]` impone Noto
     Nastaliq Urdu a tutta la pagina: un codice latino di due lettere va
     scritto con il carattere latino. */
  min-width: 26px;
  text-align: center;
  font-family: var(--sim-font);
  font-size: 15px;
  font-weight: 600;
  line-height: 1;
  color: var(--sim-ink);
}

/* La freccia e' un elemento vero, non uno sfondo della `<select>`: la
   `<select>` e' trasparente, e una freccia disegnata su di lei sarebbe
   invisibile. Da elemento, dentro un contenitore flex, si mette dal lato giusto
   in urdu da sola — senza una sola riga di RTL.

   Substory #848: dentro c'e' l'icona `chevron` del sistema
   (includes/_icon.html), non piu' uno sfondo SVG con il colore scritto dentro.
   Il simbolo punta alla FINE della riga (destra in LTR) e in RTL e' specchiato
   da `[dir="rtl"] .sim-icon--chevron`; qui, dove deve puntare in basso, lo
   ruota il contenitore — di +90 gradi la freccia che punta a destra, di -90
   quella specchiata che punta a sinistra: in basso in entrambe le direzioni.
   Resta 12x12 come prima: la barra a 390px ha 12px liberi, e un'icona da 20
   la farebbe traboccare. Il colore e' `--sim-muted`, lo stesso #5E6872 che lo
   sfondo aveva scritto a mano, ora passato all'icona come `currentColor`. */
.sim-langswitch__chevron {
  display: inline-flex;
  width: 12px;
  height: 12px;
  flex: none;
  color: var(--sim-muted);
  transform: rotate(90deg);
}
[dir="rtl"] .sim-langswitch__chevron { transform: rotate(-90deg); }
.sim-langswitch__chevron .sim-icon { width: 12px; height: 12px; }

.sim-langswitch__select {
  position: absolute;
  inset: 0;
  width: 100%;
  padding: 0;
  border: 0;
  border-radius: inherit;
  /* Niente superficie e niente freccia: le disegna il contenitore. */
  background: none;
  /* Invisibile, non assente: `opacity: 0` lascia il controllo nell'albero di
     accessibilita' (dove il lettore di schermo sente "Italiano"), lascia
     l'elenco nativo perfettamente leggibile quando si apre, e continua a
     ricevere i tocchi su tutti i 44px. `color: transparent` no: in Chromium
     l'elenco aperto eredita il colore della `<select>` e sparirebbe anche
     quello. */
  opacity: 0;
  cursor: pointer;
}

/* ---------- stati ---------- */
.sim-chip {
  display: inline-flex; align-items: center; gap: 5px;
  padding: 3px 10px; border-radius: 999px;
  font-size: 11.5px; font-weight: 600; white-space: nowrap;
  background: var(--sim-soft); color: var(--sim-muted);
}
.sim-chip--missing { background: var(--sim-red-soft);  color: var(--sim-red-ink); }
.sim-chip--done    { background: var(--sim-ok-soft);   color: var(--sim-ok); }
/* Bug #765: --sim-warn-ink, not --sim-warn — 4.21 on this ground fails AA.
   Moves in lockstep with .doc-badge.processing (components.css:435). */
.sim-chip--pending { background: var(--sim-warn-soft); color: var(--sim-warn-ink); }

/* ---------- riga campo ---------- */
.sim-field {
  display: grid; grid-template-columns: minmax(0,1.35fr) minmax(0,1fr) var(--sim-tap);
  align-items: center; gap: 18px;
  padding: 14px 20px; border-bottom: 1px solid var(--sim-line);
}
.sim-field:last-child { border-bottom: none; }
.sim-field__label { display: flex; align-items: center; gap: 8px; flex-wrap: wrap;
  font-size: 14px; font-weight: 500; color: var(--sim-ink-2); line-height: 1.35; }
.sim-field__value { font-size: 14px; color: var(--sim-ink); font-variant-numeric: tabular-nums; min-width: 0; }
.sim-field__value--empty { color: var(--sim-muted); }

/* ---------- barra superiore ---------- */
.sim-header {
  position: sticky; top: 0; z-index: 50;
  display: flex; align-items: center; justify-content: space-between; gap: 12px;
  padding: 12px 16px; background: var(--sim-surface); border-bottom: 1px solid var(--sim-line);
}
.sim-header__tile { width: 38px; height: 38px; border-radius: var(--sim-radius);
  background: var(--sim-red-soft); color: var(--sim-red); display: flex;
  align-items: center; justify-content: center; font-size: 18px; flex: none; }
.sim-header__name { font-weight: 800; font-size: 16.5px; letter-spacing: -.02em; color: var(--sim-ink); }

/* ---------- pastiglia di conteggio ---------- */
/* Si appoggia al controllo che conta, quindi il genitore deve essere
   posizionato (`position: relative`). Nessuna scelta di visibilità qui: decide
   chi la usa.

   Bug #839, secondo giro — ADR-0004, Emendamento 2. Il fondo era
   `var(--sim-red)`, che dalla riga :127 (`--sim-accent: var(--sim-red)`) è
   esattamente l'accento. Con due documenti allegati, a 390px lo schermo aveva
   quindi DUE rossi: `#send-btn`, che porta `[data-primary-action]` ed è quello
   giusto, e questa pastiglia, appesa alla graffetta — cioè proprio al
   controllo che l'issue dice di smettere di dipingere come l'azione primaria.
   L'Emendamento 1 l'aveva vista e l'aveva lasciata lì mettendolo per iscritto
   ("known adjacency, deliberately not changed"); il proprietario del prodotto
   l'ha misurata sul proprio telefono e ha respinto la correzione. Sopra il
   breakpoint la pastiglia è `display: none` (chat.css:543), ma la
   dichiarazione è una sola e non sta in nessuna media query: il rosso era
   sulla pastiglia anche a 1280, semplicemente non si vedeva.

   Va all'inchiostro, e non è un ripiego cromatico. Un conteggio non è
   identità né errore — è quello che dice di sé `--sim-red` alla riga :99,
   "Non è il colore delle azioni" — e non è una cosa da fare, quindi non è
   l'accento. È una proprietà del controllo a cui è appesa, e lo dice
   indossandone l'inchiostro rovesciato: la graffetta è `color: var(--sim-ink)`
   su `--sim-soft`, la pastiglia è bianco su `--sim-ink`. Si legge come "la
   graffetta ne ha 2", non come un allarme e non come l'azione successiva.

   `--sim-ink` e non `--action-fill`, e la ragione è meccanica, non di gusto:
   `--action-fill` è il fondo dei controlli e `[data-primary-action]` lo
   ri-punta sull'accento SU DI SÉ, quindi lo eredita tutto il suo sottoalbero.
   Una pastiglia appesa a un controllo primario tornerebbe rossa da sola, il
   giorno in cui qualcuno marca il controllo che la porta.

   Contrasto misurato (WCAG 2.1): bianco su --sim-ink 18.55:1 (era 5.05:1 sul
   rosso). La pastiglia sborda oltre l'angolo del bottone, quindi il suo fondo
   confina con due colori: --sim-soft (17.02:1) e il bianco di `.input-area`
   (18.55:1), entrambi molto oltre il 3:1 che 1.4.11 chiede al non-testo. */
.sim-count {
  position: absolute;
  top: -6px; inset-inline-end: -6px;
  min-width: 18px; height: 18px; padding: 0 5px;
  display: inline-flex; align-items: center; justify-content: center;
  border-radius: 999px;
  background: var(--sim-ink); color: #fff;
  font-size: 11px; font-weight: 700; line-height: 1;
}

/* ============================================================
   FOGLIO INFERIORE (bottom sheet) e BARRA DI STATO — substory #804.

   Sono componenti *del telefono*, e il loro stato di riposo è quello di
   non esistere: sopra il breakpoint `.sim-sheet` è `display: contents`,
   cioè non genera nessuna scatola e quello che contiene tiene esattamente
   il posto che aveva prima. È così che lo stesso identico DOM fa il
   pannello laterale del desktop e il corpo del foglio del telefono, senza
   che nessuno sposti un nodo.

   Il breakpoint è uno solo, quello del design system (760px), lo stesso
   che #792 ha stabilito per questa pagina. Le regole del foglio stanno
   TUTTE dentro `@media (max-width: 760px)` invece che dietro un
   `min-width: 761px` complementare: fra 760 e 761 ci sono larghezze
   frazionarie reali, e una banda di 1px che nessuna delle due query copre
   è esattamente il difetto che #792 ha chiuso.
   ============================================================ */
/* ---------- navigazione: tre destinazioni (#1196; il contenitore mobile è #1075) ----------
   UN solo elenco semantico (Conversazione · Documenti · La tua pratica) e più
   contenitori: la sidebar desktop di #1196 oggi, la tab bar del telefono di
   #1075 domani. La destinazione corrente si dichiara con `aria-current`, il
   fondo è solo un rinforzo. Etichette sempre parole (mai sole icone: in urdu e
   hindi un'icona non si impara). Una voce senza destinazione (nessun caso
   ancora) resta nell'elenco e dice cosa la sblocca: non si nasconde e non si
   sbiadisce sotto il contrasto minimo. Solo proprietà logiche (#840). */
.sim-nav__list {
  list-style: none; margin: 0; padding: 0;
  display: flex; flex-direction: column; gap: 3px;
}
.sim-nav__item {
  display: flex; align-items: center; gap: 12px;
  min-block-size: var(--sim-tap); padding-block: 6px; padding-inline: 12px;
  border-radius: var(--sim-radius); color: var(--sim-ink-2);
  font-size: 14px; font-weight: 500; line-height: 1.3; text-decoration: none;
}
.sim-nav__item .sim-icon { flex: none; inline-size: 19px; block-size: 19px; }
a.sim-nav__item:hover { background: rgba(14, 20, 24, .04); color: var(--sim-ink); }
.sim-nav__item[aria-current="page"] {
  background: rgba(14, 20, 24, .06); color: var(--sim-ink); font-weight: 600;
}
.sim-nav__item:focus-visible { outline: 2px solid var(--sim-ink); outline-offset: 2px; }
.sim-nav__label { flex: 1; min-inline-size: 0; display: flex; flex-direction: column; }
.sim-nav__why { font-size: 12px; font-weight: 400; color: var(--sim-muted); }
.sim-nav__item--locked { cursor: default; }
.sim-nav__item .sim-count { position: static; }

/* ---------- stepper: tre stadi, mai percentuali (#1196) ----------
   Fatto (spunta sul verde), corrente (inchiostro pieno, `aria-current="step"`),
   futuro (bordo). Il numero è decorazione (`aria-hidden`): l'ordine lo dice
   l'<ol>. */
.sim-stepper { list-style: none; margin: 0; padding: 0; display: flex; flex-direction: column; gap: 13px; }
.sim-stepper__step { display: flex; gap: 10px; align-items: flex-start; font-size: 13px; line-height: 1.45; color: var(--sim-muted); }
.sim-stepper__mark {
  flex: none; inline-size: 20px; block-size: 20px; margin-block-start: 1px;
  border-radius: 9999px; border: 2px solid var(--sim-line); box-sizing: border-box;
  display: flex; align-items: center; justify-content: center;
  font-size: 11px; font-weight: 700; color: var(--sim-muted);
}
.sim-stepper__text { display: flex; flex-direction: column; }
.sim-stepper__note { font-weight: 400; color: var(--sim-muted); }
.sim-stepper__step.is-current { color: var(--sim-ink); font-weight: 600; }
.sim-stepper__step.is-current .sim-stepper__mark {
  background: var(--sim-ink); border-color: var(--sim-ink); color: #fff;
}
.sim-stepper__step.is-done .sim-stepper__mark {
  background: var(--sim-ok); border-color: var(--sim-ok); color: transparent;
}
.sim-stepper__step.is-done .sim-stepper__mark::after {
  /* A tick is a GLYPH, not layout: it must not mirror in Urdu (with
     `border-inline-start` it turned into a caret). Physical on purpose, like
     the chevron's own RTL rule above. */
  content: ''; width: 9px; height: 5px; margin-top: -2px;
  border-left: 2px solid #fff; border-bottom: 2px solid #fff;
  transform: rotate(-45deg);
}

.sim-sheet { display: contents; }
.sim-sheet__handle,
.sim-sheet__head,
.sim-sheet__foot,
.sim-sheet__backdrop { display: none; }
.sim-sheet__count { font-variant-numeric: tabular-nums; }

/* ---------- barra di stato di un documento ---------- */
/* Tutta la striscia è il bersaglio, non solo il testo: da qui `min-height`
   pari a `--sim-tap` e il gestore del tap sul contenitore.

   Substory #777. La presentazione sale qui dalla media query, ma `display`
   NO: `display: none` resta il valore di base, esattamente come su `main`.
   La classe ha già un consumatore, ed è una striscia da telefono —
   `templates/chat/landing.html:1312` costruisce un `div.sim-docbar` sopra il
   composer e `:1395` lo chiama senza nessun controllo di larghezza, per ogni
   sessione con almeno un documento. Sopra il breakpoint l'unica cosa che lo
   nascondeva era questo `display: none` (`pages/chat.css:600` lo dice con
   parole sue). Tirare la regola fuori dalla media query metterebbe una seconda
   lista di documenti, ridondante, sopra il composer della chat a larghezza
   desktop, e farebbe diventare rosso il pin
   `test_desktop_document_panel_is_unchanged` di #804.

   Quindi due usi, due selettori, invece di uno solo che significa due cose:
     * `.sim-docbar` — la striscia da telefono. Si accende sotto il breakpoint
       e basta, come prima.
     * `.sim-docbar--always` — la riga sempre presente. È il link col nome del
       file dentro una voce della lista di #777: misurava 88x19.5, il bersaglio
       più piccolo rimasto sulla pagina dopo la migrazione dei bottoni, e non
       è una furniture da telefono, quindi non può stare dietro a un
       breakpoint.
   Per la chat sopra il breakpoint non cambia niente: senza box (`display:
   none`) le dichiarazioni qui sotto non producono nulla, e sotto il breakpoint
   valgono le stesse che valevano prima. */
.sim-docbar {
  display: none;
  flex-direction: column;
  justify-content: center;
  gap: 4px;
  width: 100%;
  min-height: var(--sim-tap);
  padding: 10px 14px;
  border: 1px solid var(--sim-line);
  border-radius: var(--sim-radius);
  background: var(--sim-surface);
  box-shadow: var(--sim-shadow);
  cursor: pointer;
  text-align: start;
}
/* `color` e `text-decoration` stanno sul modificatore e non sulla base perché
   servono a questo caso d'uso e solo a questo: la riga sempre presente è un
   `<a>`, la striscia della chat è un `<div>`. Metterli sulla base cambierebbe
   il colore ereditato dentro la striscia della chat sotto il breakpoint — un
   effetto collaterale su una pagina che questa substory non tocca. */
/* Il comportamento da elemento flex sta sul modificatore e non sulla base, per
   la stessa ragione del colore: la base è la striscia a tutta larghezza della
   chat, che è figlia unica di `.chat-container` e vuole davvero `width: 100%`;
   il modificatore è l'unico selettore che mette una docbar su una riga
   condivisa (`.linked-doc`, accanto al bottone di scollegamento).
   `width: 100%` come base flessibile significa "chiedo tutta la riga", quindi
   la riga trabocca di quanto misura il fratello e il browser distribuisce la
   stretta sugli elementi che possono cedere — che dopo `flex: none` su
   `--icon` è solo questo. `flex: 1 1 auto` lo dice esplicitamente invece di
   lasciarlo al default, e `min-width: 0` toglie il `min-width: auto` che
   altrimenti impedirebbe a un `<a>` con dentro un nome file lungo di scendere
   sotto la propria larghezza di contenuto — che è il modo in cui un nome file
   lungo diventa uno scorrimento laterale a 390px (il difetto che
   `test_no_horizontal_overflow` di #775 blocca).
   `overflow-wrap: anywhere` è la metà mancante: `min-width: 0` permette alla
   scatola di stringersi, non al testo di andare a capo, e un nome file non ha
   spazi dove spezzarsi. È lo stesso idioma di `.missing-block-row-text`
   (components.css:388-395). Va sul modificatore e non sulla base perché nella
   striscia della chat il testo è un conteggio corto ("2 documenti") e non ha
   nulla da spezzare. */
.sim-docbar--always {
  display: flex;
  flex: 1 1 auto;
  min-width: 0;
  overflow-wrap: anywhere;
  color: var(--sim-ink);
  text-decoration: none;
}
.sim-docbar:focus-visible { outline: 2px solid var(--sim-ink); outline-offset: 2px; }
/* Substory #778, e SOLO lo stato premuto. L'hover la striscia ce l'ha già, da
   `a:hover` in base.css — la variante `--always` è un `<a>` — e riscriverlo
   qui sarebbe un secondo hover per un elemento che ne ha uno, cioè non il passo
   2 ("ogni elemento interattivo che NON ce l'ha") ma un ritocco di gusto sotto
   il numero di un'altra storia. Lo stato premuto invece non esiste su niente,
   qui come altrove. */
.sim-docbar:active { box-shadow: var(--sim-press); }
.sim-docbar__count {
  font-size: 14px;
  font-weight: 600;
  color: var(--sim-ink);
}

/* ============================================================
   MOBILE — non è una strizzata del desktop.
   Le uniche due cose che restano nella barra sono il marchio e un
   bottone: tutto il resto (voci, lingua, account, disconnessione)
   va nel pannello. È così che "Disconnetti" smette di uscire dalla
   barra e "I miei casi" smette di andare a capo.
   ============================================================ */
@media (max-width: 760px) {
  .sim-header__links, .sim-header__user { display: none; }
  .sim-field { grid-template-columns: 1fr var(--sim-tap); gap: 5px 10px; padding: 13px 14px; }
  .sim-field__label { grid-column: 1; grid-row: 1; font-size: 13px; }
  .sim-field__value { grid-column: 1; grid-row: 2; font-size: 16px; font-weight: 600; }
  .sim-field > .sim-btn--icon { grid-column: 2; grid-row: 1 / 3; align-self: center; }
  .sim-btn { width: 100%; }
  .sim-btn--icon { width: var(--sim-tap); }

  /* ---------- foglio inferiore ---------- */
  /* `dvh` e non `vh`, per la stessa ragione di pages/chat.css: su iOS `vh` si
     misura con la barra del browser ritratta, quindi un foglio alto in `vh`
     finisce sotto la barra. `70dvh` è il tetto del design; il pavimento serve
     perché un foglio con dentro solo "nessun documento" non si riduca a una
     striscia. Chiuso, il foglio scivola sotto il bordo inferiore — `transform`
     si anima, `display: none` no — e `visibility: hidden` lo toglie dal
     percorso di tabulazione mentre è fuori schermo. */
  .sim-sheet {
    display: flex;
    flex-direction: column;
    position: fixed;
    inset-inline: 0;
    bottom: 0;
    z-index: 71;
    max-height: 70dvh;
    min-height: 30dvh;
    background: var(--sim-surface);
    border-start-start-radius: var(--sim-radius-lg);
    border-start-end-radius: var(--sim-radius-lg);
    box-shadow: var(--sim-shadow);
    overscroll-behavior: contain;
    transform: translateY(100%);
    visibility: hidden;
    transition: transform .22s ease, visibility 0s linear .22s;
  }
  .sim-sheet.is-open {
    transform: translateY(0);
    visibility: visible;
    transition: transform .22s ease;
  }
  .sim-sheet__handle {
    display: block;
    flex: none;
    width: 40px; height: 4px;
    margin: 8px auto;
    border-radius: 999px;
    background: var(--sim-line-strong);
  }
  /* `.sim-section-head` porta già il flex e lo `space-between`, che è quello
     che manda il pulsante di chiusura al lato *logico* di fine: in RTL passa
     dall'altra parte da solo, senza una riga di CSS in più e senza un
     `right: 12px` che finirebbe sotto il titolo urdu. Qui si toglie solo il
     cursore: l'intestazione non è cliccabile, lo è il pulsante. */
  .sim-sheet__head { display: flex; flex: none; cursor: default; }
  .sim-sheet__foot {
    display: flex;
    flex: none;
    padding: 12px 20px calc(12px + env(safe-area-inset-bottom, 0px));
    border-top: 1px solid var(--sim-line);
  }
  /* Il *pattern* di `.modal-backdrop` (components.css:145) — un velo fisso a
     tutto schermo che si chiude al tocco — non la sua classe. `.modal-backdrop`
     è il contenitore del modale e lo centra (`display: flex; align-items:
     center`), mentre il foglio è ancorato in basso e gli è fratello, non
     figlio; e sta a `z-index: 100`, sopra il foglio, che è esattamente dove un
     modale deve restare. Riusare la classe avrebbe voluto dire disfarne metà.

     Sopra la barra sticky (z-index 50) e il suo pannello (60), sotto i modali
     (100): un modale aperto sopra il foglio deve restare sopra. */
  .sim-sheet__backdrop {
    display: block;
    position: fixed;
    inset: 0;
    z-index: 70;
    background: rgba(14, 20, 24, .45);
    opacity: 0;
    pointer-events: none;
    overscroll-behavior: contain;
    transition: opacity .22s ease;
  }
  .sim-sheet__backdrop.is-open { opacity: 1; pointer-events: auto; }

  /* ---------- barra di stato ---------- */
  /* La presentazione sta in cima al file (#777, vedi lì il perché); qui resta
     l'unica cosa che questa media query decideva davvero: sotto il breakpoint
     la striscia da telefono si accende. Sopra, no — ed è così che la chat
     continua a renderizzare come su `main`. */
  .sim-docbar { display: flex; }
}

/* ============================================================
   MOVIMENTO RIDOTTO — substory #778, passo 6.

   "Avvolgere tutto in `@media (prefers-reduced-motion: reduce)` così le
   transizioni sono tolte per chi lo chiede." Prima di questa riga la stringa
   `prefers-reduced-motion` non compariva da nessuna parte nel repository — non
   in django/static/css, non in un template, non in uno script — e a un utente
   che ha chiesto al proprio sistema operativo meno movimento la pagina
   rispondeva con gli stessi 0.15s di tutti.

   TRE COSE SUL PERCHÉ È SCRITTA COSÌ.

   1. È UN SELETTORE UNIVERSALE E HA `!important`, e sono i due strumenti che il
      resto di questo file evita. Qui sono la scelta giusta e non una scorciatoia:
      la regola non aggiunge presentazione a nessun componente, toglie il tempo a
      tutti. Le transizioni che deve spegnere sono dichiarate in cinque fogli —
      questo, `base.css` (`a`), `components.css` (la drop zone, la barra di
      avanzamento, il toast), `layout.css` (la barra di navigazione) e le pagine
      — e tre di quei fogli si caricano DOPO questo, quindi senza `!important`
      una lista di selettori uguali per specificità perderebbe per ordine di
      caricamento su metà di quello che deve spegnere. Elencarli tutti avrebbe
      anche voluto dire che la prossima transizione scritta da qualcuno
      sopravvive a questa media query in silenzio, che è il difetto di #735 in
      un'altra forma.

   2. `.01ms` E NON `0s`. Una durata azzerata non è la stessa cosa di una durata
      quasi-nulla: con `0s` gli eventi `transitionend` e `animationend` non
      vengono emessi affatto, e uno script che aspetta la fine di una
      transizione per fare il passo successivo resterebbe fermo per sempre —
      solo e soltanto per gli utenti che hanno chiesto meno movimento, cioè il
      guasto più difficile da riprodurre che si possa costruire. Nessuno script
      di questa pagina li ascolta oggi; `.01ms` è il prezzo di non doverlo
      riverificare la prossima volta.

   3. `::details-content` STA IN UNA REGOLA SUA. Un selettore non riconosciuto
      dentro una lista separata da virgole invalida TUTTA la regola, non solo la
      sua parte: infilato accanto a `*::before` farebbe scartare l'intero blocco
      qui sopra su ogni browser che non conosce ancora quello pseudo-elemento
      (Firefox e Safari oggi), lasciando senza soppressione proprio chi l'ha
      chiesta. Separata, la regola viene ignorata da sola e là il gruppo si apre
      di scatto, che è il comportamento nativo e quello giusto sotto `reduce`.

   4. LO SPINNER DELL'UPLOAD SI FERMA, ed è dentro la decisione e non un danno
      collaterale. `animation-iteration-count: 1` più `.01ms` spengono anche
      `.upload-progress .spinner` (components.css:617, `animation: spin 0.8s
      linear infinite`), che è l'unica cosa in movimento mentre un caricamento
      è in corso. Lo fermiamo di proposito: un cerchietto che gira senza fine è
      il bersaglio da manuale di `reduce`. E il SEGNALE non se ne va con lui —
      lo spinner è sempre accompagnato dal testo "Classifying..." dentro
      `#uploadProgressList`, che è `aria-live="polite"`
      (checklist.html:330 e :1056), quindi chi ha chiesto meno movimento legge
      che il caricamento è in corso invece di vederlo girare. Se un giorno
      servisse un indicatore di avanzamento non animato sotto `reduce`, è
      un'altra storia e va aperta come tale, non nascosta qui.
   ============================================================ */
@media (prefers-reduced-motion: reduce) {
  *, *::before, *::after {
    transition-duration: .01ms !important;
    animation-duration: .01ms !important;
    animation-iteration-count: 1 !important;
  }
  .sim-disclosure::details-content {
    transition-duration: .01ms !important;
    animation-duration: .01ms !important;
  }
}

/* ============================================================
   Substory #1257 (story #1254) — THE LEGAL FOOTER.
   `includes/_legal_footer.html`, on every page: inside base.html's
   `footer.site-footer` (with the IRCC non-affiliation line beside it), on the
   404/403/500 pages, and inside the chat landing's `.chat-footer` (whose
   inline overrides live in pages/chat.css).

   HERE AND NOT IN layout.css: the error skeleton loads only variables.css,
   this file and pages/error.css (review F13), and the footer has to look the
   same on a 404 as everywhere else.

   * `--text-xs` in `--sim-ink-2` (9.5:1 on white, 8.7:1 on `--sim-soft`),
     links underlined so they read as links without colour.
   * Every link is at least 24x24 CSS px — WCAG 2.2 2.5.8 (Target Size,
     Minimum) — measured by the beta e2e, 404 included.
   * The row wraps; logical properties only (the product ships Urdu, #840).
   * `env(safe-area-inset-bottom)` under the last row, so a notched phone does
     not draw the home indicator over the links.
   ============================================================ */
.site-footer {
  box-sizing: border-box;
  inline-size: 100%;
  margin-block-start: var(--space-6);
  padding-block: var(--space-4) calc(var(--space-4) + env(safe-area-inset-bottom, 0px));
  padding-inline: var(--space-4);
  border-block-start: 1px solid var(--sim-line);
  font-size: var(--text-xs);
  line-height: var(--leading-relaxed);
  color: var(--sim-ink-2);
  text-align: center;
}
.legal-footer__disclosure {
  margin-block: 0 var(--space-1);
  margin-inline: auto;
  max-inline-size: 60ch;
}
.legal-footer {
  display: flex;
  flex-wrap: wrap;
  justify-content: center;
  gap: 0 var(--space-3);
  font-size: var(--text-xs);
}
.legal-footer a {
  display: inline-flex;
  align-items: center;
  justify-content: center;
  min-block-size: 24px;
  min-inline-size: 24px;
  padding-inline: var(--space-1);
  color: var(--sim-ink-2);
  text-decoration: underline;
  text-underline-offset: 2px;
}
/* #778's three answers — hover, pressed, focus ring in the ink token — for
   both the footer links and the notice's Privacy Policy link, here in the
   component layer and not on a page (#778 step 7). */
.legal-footer a:hover,
.privacy-collection-notice a:hover { color: var(--sim-ink); }
.legal-footer a:active,
.privacy-collection-notice a:active {
  color: var(--sim-ink);
  text-decoration-thickness: 2px;
}
.legal-footer a:focus-visible,
.privacy-collection-notice a:focus-visible {
  outline: 2px solid var(--sim-ink);
  outline-offset: 2px;
}

/* Substory #1257 Step 6 — the collection notice, wherever it is placed. */
.privacy-collection-notice {
  font-size: var(--text-xs);
  color: var(--sim-ink-2);
}
/* A full #777 tap target, here and not on a page: inside #dropZone the link is
   outside any <nav>, so #777's gate walks it, and as a bare inline anchor it
   measured 140x14 (web execution 0d9cec6e). The landing's .chat-footer
   override in pages/chat.css resets display and both minimums for its own
   one-line footer, so the landing's #792 / #1074 heights do not change. */
.privacy-collection-notice a {
  display: inline-flex;
  align-items: center;
  justify-content: center;
  min-block-size: var(--sim-tap);
  min-inline-size: var(--sim-tap);
  padding-inline: var(--space-1);
  color: var(--sim-ink-2);
  text-decoration: underline;
  text-underline-offset: 2px;
}
