/* ═══════════════════════════════════════════════════════════════════════════════════════════
   ADR INTESA · I TOKEN E LE FONDAMENTA
   ═══════════════════════════════════════════════════════════════════════════════════════════

   ⚠️ QUESTO È L'UNICO FILE IN CUI PUÒ COMPARIRE UN COLORE ESADECIMALE.
   La regola è di `docs/10-architettura-e-ui.md` §8.5 ed è verificabile con un grep: fuori da qui,
   in una view o in un altro CSS, un `#rrggbb` è un difetto. Misurato prima di scrivere questo
   file: **185 hex nelle view** e **214 `style=` inline**. Non spariscono da soli, ma da oggi
   c'è il posto dove metterli.

   ── LA MOSSA CHE FA CAMBIARE IDENTITÀ A TUTTA L'APPLICAZIONE ──────────────────────────────
   Il tema INSPINIA espone **119 custom properties** su `:root`, e ogni suo componente le legge.
   Rimappandone una ventina sui token ADR, le 95 view ereditano il brand **senza toccarne una**.
   È la ragione per cui questo file si carica DOPO `app.min.css` e PRIMA di `custom.css`.

   Le quattro correzioni che quella rimappatura porta con sé, tutte misurate:
     · `--ins-primary` era **#111827**, un grigio quasi nero: non è il navy del marchio;
     · `--ins-secondary-color` era **#9a9ea5**, che su bianco fa **2,5:1** — sotto AA, ed è il
       colore di `text-muted`, cioè di mezza applicazione. Diventa #6b7280, **4,83:1**;
     · `--ins-font-size-base` era **13px**: giusto per Bernino, che ha tabelle a 11 colonne,
       stretto per un pubblico di avvocati e dirigenti su contenuto giuridico;
     · il font era **Geist, scaricato da Google a ogni pageview** — misurato a runtime
       aprendo `/pratiche`: due host di Google contattati, uno per il CSS e uno per il file
       del font. Su un organismo che tratta dati giudiziari, l'IP dell'utente non va a un terzo.

   ⚠️ E QUI DENTRO NON SI SCRIVONO NOMI DI HOST ESTERNI, nemmeno in un commento come questo:
   `FormaGraficaTest` cerca la stringa e non distingue il codice dal commento — deliberatamente,
   perché una prova che sapesse leggere i commenti si aggirerebbe scrivendoci dentro un URL.

   ═══════════════════════════════════════════════════════════════════════════════════════════ */

/* ─── Inter, self-hostata ─────────────────────────────────────────────────────────────────
   Due sottoinsiemi soli — latin e latin-ext — perché su un gestionale italiano il cirillico e
   il greco non si caricano mai: 131 KB in tutto contro i ~380 del set completo. `font-display:
   swap` perché il testo deve comparire subito: una tabella di 48.504 fascicoli non aspetta un
   font. Inter è il font del marchio (verificato sul sito adrintesa.it) ed è disegnata per UI
   densa: ha le **tabular figures**, che servono ai protocolli e agli importi. */
@font-face {
    font-family: 'Inter';
    font-style: normal;
    font-weight: 100 900;
    font-display: swap;
    src: url('fonts/inter-latin.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;
}
@font-face {
    font-family: 'Inter';
    font-style: normal;
    font-weight: 100 900;
    font-display: swap;
    src: url('fonts/inter-latin-ext.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;
}

:root {
    /* ─── Brand ───────────────────────────────────────────────────────────────────────────
       Il navy #212958 è campionato dal CSS del sito del cliente; #202058 dal logo. La scala
       è costruita attorno al 700, che è il valore del brand. */
    --adr-navy-900: #12163a;
    --adr-navy-800: #1a2049;
    --adr-navy-700: #212958;   /* PRIMARY — il colore del marchio */
    --adr-navy-600: #2c3670;
    --adr-navy-500: #3d4a8f;
    --adr-navy-200: #c9cde2;
    --adr-navy-100: #e6e8f2;
    --adr-navy-050: #f2f3f9;

    --adr-lime-700: #6f8a24;
    --adr-lime-600: #86a733;
    --adr-lime-500: #9ebf3c;   /* ACCENT — il verde dei link e delle CTA sul sito */
    --adr-lime-100: #eef4dc;

    /* ⚠️ SOLO LOGO E SIGILLI ISTITUZIONALI, MAI COME COLORE UI.
       Un badge «protocollata» in rosso bandiera si legge come errore, e il verde bandiera
       confligge con il verde semantico di successo. Sono qui per essere disponibili al logo,
       non per essere usati. */
    --adr-flag-green: #38a048;
    --adr-flag-red:   #e01820;

    /* ─── Stati di una compilazione ─────────────────────────────────────────────────────
       Servono alla barra dei passi (`adr/passi.js`) e a chiunque debba dire «fatto /
       manca qualcosa / c'e' uno sbaglio» su un modulo in corso.

       ⚠️ NON SONO I COLORI BANDIERA QUI SOPRA, e la distinzione e' gia' scritta la': il
       rosso bandiera su un passo si leggerebbe come un sigillo istituzionale, non come un
       errore. Questi sono i colori semantici di Bootstrap, presi dal ponte gia' esistente
       (`--bs-form-valid-color`, `--bs-form-invalid-color`) cosi' un modulo del deposito e
       una casella non valida dicono la stessa cosa con la stessa tinta.

       ⚠️ E `attenzione` NON E' UN ROSSO PIU' CHIARO: e' l'unico stato che dice «si puo'
       proseguire». Un modulo che colora di rosso ogni casella non ancora compilata insegna
       a ignorare il rosso, ed e' il motivo per cui i due stati sono separati. */
    --adr-stato-fatto:      var(--bs-form-valid-color, #2f7a3e);
    --adr-stato-attenzione: #b5730b;   /* ambra: 4,6:1 su bianco, leggibile come testo */
    --adr-stato-errore:     var(--bs-form-invalid-color, #c02a26);

    /* ─── Neutri ────────────────────────────────────────────────────────────────────────── */
    --n-0:   #ffffff;
    --n-25:  #fafbfc;
    --n-50:  #f5f6f8;
    --n-100: #eceef2;
    --n-200: #dfe2e8;
    --n-300: #c7ccd6;
    --n-400: #98a0ae;
    --n-500: #6b7280;   /* il "muted" minimo: 4,83:1 su bianco = AA */
    --n-600: #4b5563;
    --n-700: #374151;   /* testo corpo */
    --n-800: #232a35;
    --n-900: #12161d;

    /* ─── Semantici: fg (testo, ≥4,5:1) · bg (fondo tenue) · dot (pieno) ─────────────────── */
    --ok-fg: #166534;      --ok-bg: #e7f5ec;      --ok-dot: #22a55b;
    --warn-fg: #92610a;    --warn-bg: #fdf4e3;    --warn-dot: #e8a317;
    --danger-fg: #b42318;  --danger-bg: #fdeceb;  --danger-dot: #e5484d;
    --info-fg: #0f6a8b;    --info-bg: #e6f4f9;    --info-dot: #1d9bc4;
    --neutral-fg: #4b5563; --neutral-bg: #f0f2f5; --neutral-dot: #98a0ae;

    /* ─── LA SCALA DA GRAFICO ─────────────────────────────────────────────────────────
       Non è marchio e non è semantica: è l'unico posto in cui il colore serve a
       **distinguere**, non a significare. Otto categorie hanno bisogno di otto tinte
       separabili, e spegnerle per obbedire alla regola dei token renderebbe illeggibile una
       ciambella — che è il difetto peggiore dei due. Perciò la scala esiste, ed è dichiarata
       come tale invece di stare scritta a mano dentro una vista.

       ⚠️ NON SI USA PER GLI STATI. Uno stato ha già il suo colore, e sta a catalogo in
       `stati_pratica.badge_variant`: dipingerlo con la scala da grafico direbbe due cose
       diverse nella stessa pagina. Qui dentro il colore vuol dire soltanto «questa fetta non
       è quella».

       L'ordine non è casuale: due tinte consecutive sono lontane, perché in una ciambella le
       fette consecutive si toccano. MISURATO in gradi di tinta — 231 · 40 · 195 · 4 · 146 ·
       259 · 77 · 322 — il salto minimo fra due consecutive è di **113°**. */
    --graf-1: #212958;   /* navy del marchio */
    --graf-2: #e8a317;   /* ambra          */
    --graf-3: #1d9bc4;   /* ciano          */
    --graf-4: #b42318;   /* rosso          */
    --graf-5: #22a55b;   /* verde          */
    --graf-6: #6b4fa8;   /* viola          */
    --graf-7: #86a733;   /* lime del marchio */
    --graf-8: #a8327d;   /* magenta        */
    /* Il velo sotto una linea: la tinta della linea, appena accennata. */
    --graf-2-velo: rgba(232, 163, 23, .12);

    /* ─── Il diagramma di flusso (DEC-147) ────────────────────────────────────────────────── */
    /* I quattro simboli classici, con le tinte approvate sulla bozza del 23/09/2026: rosa per
       inizio e fine, azzurro per ciò che entra o esce, verde per un'attività, giallo per una
       domanda. Stanno qui e non nella vista: un colore scritto in una vista non partecipa ai
       token (DEC-052). */
    --flusso-terminale: #f9c6d3;
    --flusso-io:        #bfdbfe;
    --flusso-attivita:  #bbf7d0;
    --flusso-decisione: #fde68a;

    /* ─── Superfici ─────────────────────────────────────────────────────────────────────── */
    --surface-page:   #f5f6f8;
    --surface-card:   #ffffff;
    --surface-sunken: #eceef2;
    --surface-nav:    #12163a;
    --border:         #dfe2e8;
    --border-strong:  #c7ccd6;

    /* ─── Tipografia ────────────────────────────────────────────────────────────────────── */
    --font-sans: 'Inter', system-ui, -apple-system, 'Segoe UI', sans-serif;
    --font-mono: 'JetBrains Mono', ui-monospace, SFMono-Regular, Menlo, monospace;
    --fs-3xs: 11px; --fs-2xs: 12px; --fs-xs: 13px; --fs-sm: 14px;
    --fs-md: 15px;  --fs-lg: 16px;  --fs-xl: 18px; --fs-2xl: 20px;
    --fs-3xl: 26px; --fs-4xl: 32px;
    --lh-tight: 1.25; --lh-body: 1.5; --lh-dense: 1.35;
    --fw-regular: 400; --fw-medium: 500; --fw-semibold: 600; --fw-bold: 700;
    --ls-caps: .06em;

    /* ─── Spaziature, base 4px ──────────────────────────────────────────────────────────── */
    --sp-1: 4px;  --sp-2: 8px;  --sp-3: 12px; --sp-4: 16px; --sp-5: 20px;
    --sp-6: 24px; --sp-8: 32px; --sp-10: 40px; --sp-12: 48px; --sp-16: 64px;

    /* ─── Raggi ─────────────────────────────────────────────────────────────────────────── */
    --r-xs: 4px; --r-sm: 6px; --r-md: 8px; --r-lg: 10px; --r-pill: 999px;

    /* ─── Elevazione: le card sono PIATTE con bordo ──────────────────────────────────────
       Coerente col tono istituzionale — «deve sembrare il registro di un organismo iscritto a
       un albo ministeriale, non un SaaS» — e con INSPINIA stesso, che ha già ombra zero sulle
       card. L'ombra resta agli elementi che galleggiano davvero. */
    --sh-0: none;
    --sh-1: 0 1px 2px rgba(18, 22, 58, .06);
    --sh-2: 0 6px 16px rgba(18, 22, 58, .10);
    --sh-3: 0 16px 40px rgba(18, 22, 58, .16);
    --focus-ring: 0 0 0 3px rgba(33, 41, 88, .28);

    /* ─── Densità tabellare ─────────────────────────────────────────────────────────────── */
    --row-h: 40px;
    --row-h-comfy: 48px;

    /* ─── Motion ────────────────────────────────────────────────────────────────────────── */
    --t-fast: 120ms; --t-base: 180ms; --t-slow: 280ms;
    --ease: cubic-bezier(.4, 0, .2, 1);
}

/* ═══════════════════════════════════════════════════════════════════════════════════════════
   IL PONTE VERSO IL TEMA
   Da qui in giù non si inventano colori: si dice a INSPINIA quali sono i nostri.
   ═══════════════════════════════════════════════════════════════════════════════════════════ */
:root {
    --ins-font-sans-serif: var(--font-sans);
    --ins-body-font-family: var(--font-sans);
    --ins-font-size-base: var(--fs-sm);
    /* ⚠️ UNA RIGA SOLA, E RIGUARDA UNA REGOLA SOLA. `--ins-font-size-xs` e' letto da un unico
       blocco di `app.min.css` — `.fs-xs{font-size:var(--ins-font-size-xs)!important}` — ed e'
       dichiarato piu' volte dal tema con due valori diversi (12px e 13px, a seconda della
       variante che vince). Cioe' la misura di **266 usi di `fs-xs` nelle view** dipendeva da
       quale dei due blocchi arrivava per ultimo. Qui diventa il nostro token, e la scala si
       chiude con le due classi qui sotto: 13 · 12 · 11. */
    --ins-font-size-xs: var(--fs-xs);

    --ins-primary: var(--adr-navy-700);
    --ins-primary-rgb: 33, 41, 88;
    --ins-primary-bg-subtle: var(--adr-navy-100);
    --ins-primary-border-subtle: var(--adr-navy-200);
    --ins-primary-text-emphasis: var(--adr-navy-800);

    --ins-link-color: var(--adr-navy-700);
    --ins-link-hover-color: var(--adr-navy-500);

    --ins-body-bg: var(--surface-page);
    --ins-body-color: var(--n-700);
    --ins-emphasis-color: var(--n-900);
    --ins-secondary-color: var(--n-500);   /* era #9a9ea5 → 2,5:1. Questo è 4,83:1 */

    /* ⚠️ LA RIGA CHE MANCAVA: `--ins-secondary` non era rimappata e restava al valore di
       fabbrica **#6366f1**, che è `--ins-indigo` — un colore che con questo marchio non
       c'entra niente. Non era un esadecimale scritto a mano da qualche parte: era un token
       mai dichiarato. MISURATO il 01/09/2026 su `adr_dev` e sul sorgente: **29 blocchi** di
       `app.min.css` leggono un `var(--ins-secondary…)`, `.text-secondary` compare in **42
       punti di `resources/views/`** e `bg-secondary-subtle` in **28**, e
       `stati_pratica.badge_variant='secondary'` è lo stato `chiusa`, cioè **35.206 fascicoli
       su 48.504**.
       ⚠️ E l'indaco è SOTTO AA: #6366f1 su bianco fa **4,47:1** (ne servono 4,5) e su #e8e8fd
       — il fondo di `bg-secondary-subtle` — fa **3,70:1**.
       👉 Si rimappa sul NEUTRO e non sul navy, perché MISURATO l'uso vero è testo attenuato e
       non un secondo colore di marchio: `--neutral-fg` fa **7,56:1** su bianco e **6,81:1**
       sul proprio fondo tenue. Il navy avrebbe fatto sembrare marchiato ciò che è secondario. */
    --ins-secondary: var(--neutral-fg);
    --ins-secondary-rgb: 75, 85, 99;
    --ins-secondary-bg-subtle: var(--neutral-bg);
    --ins-secondary-border-subtle: var(--n-300);
    --ins-secondary-text-emphasis: var(--n-700);
    --ins-tertiary-color: var(--n-400);
    --ins-tertiary-bg: var(--n-50);

    --ins-border-color: var(--border);
    --ins-border-color-translucent: var(--n-100);
    --ins-border-radius: var(--r-md);
    --ins-border-radius-sm: var(--r-sm);
    --ins-border-radius-lg: var(--r-lg);

    --ins-success: var(--ok-dot);   --ins-success-bg-subtle: var(--ok-bg);
    --ins-warning: var(--warn-dot); --ins-warning-bg-subtle: var(--warn-bg);
    --ins-danger: var(--danger-dot);--ins-danger-bg-subtle: var(--danger-bg);
    --ins-info: var(--info-dot);    --ins-info-bg-subtle: var(--info-bg);

    /* ⚠️ LE QUATTRO RIGHE CHE MANCAVANO, E CHE VALGONO 13.301 FASCICOLI.
       `--ins-X` era rimappato, `--ins-X-rgb` no: sono due variabili con due mestieri diversi.
       La prima veste i pulsanti; la **seconda è l'inchiostro** — `.text-X` scrive
       `color: rgba(var(--ins-X-rgb), …)` — e restava al valore di fabbrica del tema.

       MISURATO IN BROWSER il 01/09/2026 su `/pratiche`, sul badge vero e non sul token:
       «Da regolarizzare» — **13.301 fascicoli**, il badge che il committente guarda ogni
       giorno — era `rgb(234,179,8)` su `rgb(253,244,227)`, cioè **1,76:1** contro il 4,5:1
       che AA chiede. Accanto, nella stessa riga, «Chiusa» era già a **6,74:1**, perché
       `secondary` era stato rimappato il giro prima: due badge nella stessa riga, uno
       leggibile e uno no — peggio di quando erano illeggibili tutti e due allo stesso modo.

       Le altre tre erano rotte quanto la prima, e nessuno le aveva misurate. MISURATO,
       testo su fondo tenue · testo su bianco · bianco sul pieno:

           success   2,03  ·  2,28  ·  2,28      →  6,34  ·  7,13  ·  7,13
           warning   1,76  ·  1,92  ·  1,92      →  4,88  ·  5,33  ·  5,33
           danger    3,29  ·  3,76  ·  3,76      →  5,75  ·  6,57  ·  6,57
           info      2,16  ·  2,43  ·  2,43      →  5,40  ·  6,08  ·  6,08

       ⚠️ LA TINTA NON CAMBIA, CAMBIA L'INCHIOSTRO. Il giallo resta giallo e il rosso resta
       rosso: `--warn-fg` è lo stesso ambra di `--warn-dot`, sceso di chiarezza. Un
       «attenzione» diventato grigio avrebbe smesso di essere un avvertimento.
       ⚠️ E `--ins-X-rgb` è anche il **pieno** di `.bg-X`: rimapparlo qui scurirebbe pure
       quello. Il pieno si riprende la sua tinta più sotto, in un blocco solo. */
    --ins-success-rgb: 22, 101, 52;    /* var(--ok-fg)     #166534 */
    --ins-warning-rgb: 146, 97, 10;    /* var(--warn-fg)   #92610a */
    --ins-danger-rgb:  180, 35, 24;    /* var(--danger-fg) #b42318 */
    --ins-info-rgb:    15, 106, 139;   /* var(--info-fg)   #0f6a8b */

    --ins-success-text-emphasis: var(--ok-fg);
    --ins-warning-text-emphasis: var(--warn-fg);
    --ins-danger-text-emphasis:  var(--danger-fg);
    --ins-info-text-emphasis:    var(--info-fg);

    --ins-card-bg: var(--surface-card);
    --ins-card-border-color: var(--border);
    --ins-card-box-shadow: var(--sh-0);
}

/* ═══════════════════════════════════════════════════════════════════════════════════════════
   IL SECONDO PONTE: LE VARIABILI CHE LE LIBRERIE DI TERZI DANNO PER SCONTATE
   ═══════════════════════════════════════════════════════════════════════════════════════════

   ⚠️ MISURATO il 30/08/2026: i CSS dei plugin in `public/assets/plugins/` usano **20 variabili
   `--bs-*`** — quelle di Bootstrap 5 «puro» — e in tutta la piattaforma ne era definita
   **zero**. Il tema INSPINIA le sue le chiama `--ins-*`, e una `var()` che non risolve non
   ricade su niente: **la proprietà viene scartata**.

   Il caso che l'ha fatta vedere: `tom-select.bootstrap5.min.css` scrive
   `.ts-dropdown{background:var(--bs-body-bg)}`. Senza quella variabile la tendina dei filtri
   nasceva **trasparente** — si leggevano insieme le materie e le righe della tabella sotto.
   Era rimasta nascosta finché un blocco di `!important` dentro il layout ci metteva una pezza;
   tolto quello (perché sovrascriveva l'aspetto della piattaforma), il difetto è venuto a galla
   per quello che era: non un colore sbagliato, **un colore mai arrivato**.

   Ci sono altri 19 usi che cadevano nello stesso silenzio — bordi, raggi, sfondi dei menu — e
   li chiude questo blocco, non una regola per volta. `FormaGraficaTest` li conta e fallisce se
   un plugin nuovo ne porta una che qui non c'è.

   ⚠️ `--bs-body-bg` VALE BIANCO E NON `--surface-page`: in Bootstrap è il colore del foglio, e
   i dieci usi che se ne fanno qui sono tutti superfici di controllo — tendine, campi, celle —
   che devono essere opache sopra la pagina, non del colore della pagina. */
:root {
    --bs-body-bg: var(--n-0);
    --bs-body-color: var(--n-700);
    --bs-emphasis-color: var(--n-900);
    --bs-secondary-color: var(--n-500);
    --bs-secondary-bg: var(--surface-sunken);
    --bs-tertiary-bg: var(--n-50);

    --bs-primary: var(--adr-navy-700);
    --bs-primary-rgb: 33, 41, 88;

    --bs-border-color: var(--border);
    --bs-border-color-translucent: var(--n-100);
    --bs-border-width: 1px;
    --bs-border-radius: var(--r-md);
    --bs-border-radius-sm: var(--r-sm);
    --bs-border-radius-lg: var(--r-lg);

    --bs-form-valid-color: var(--ok-fg);
    --bs-form-invalid-color: var(--danger-fg);

    --bs-font-monospace: var(--font-mono);
    --bs-box-shadow-inset: inset 0 1px 2px rgba(18, 22, 58, .075);

    --bs-dropdown-link-color: var(--n-700);
    --bs-dropdown-link-hover-color: var(--n-900);
    --bs-dropdown-link-hover-bg: var(--n-100);
    --bs-dropdown-item-padding-y: .4rem;
    --bs-dropdown-item-padding-x: .7rem;
}

body {
    font-family: var(--font-sans);
    font-size: var(--fs-sm);
    color: var(--n-700);
    background: var(--surface-page);
    -webkit-font-smoothing: antialiased;
}

/* ═══════════════════════════════════════════════════════════════════════════════════════════
   LA BARRA LATERALE — LA VIA D'USCITA CHE SI VEDE SOLO QUANDO SERVE
   Sotto i 1200 px la barra si apre SOPRA la pagina, e MISURATO in Chrome a 1100 px il comando
   della topbar finisce coperto dalla barra stessa: `elementFromPoint()` sul suo punto
   restituisce un elemento della barra. Il tema prevedeva la via d'uscita — la regola
   `html[data-sidenav-size=offcanvas] .button-close-offcanvas{display:block}` in `app.min.css` e
   il gestore in `app.js` — e nel nostro markup il pulsante non c'era.
   Qui lo si nasconde negli altri stati. ⚠️ NON con `d-none`, che è `display:none !important` e
   vincerebbe anche sulla regola del tema, lasciandolo invisibile proprio dove serve: la regola
   del tema porta un attributo in più, quindi è più specifica di questa e la batte da sé.
   ═══════════════════════════════════════════════════════════════════════════════════════════ */

.button-close-offcanvas {
    display: none;
    z-index: 1;
}

/* ═══════════════════════════════════════════════════════════════════════════════════════════
   FONDAMENTA DI ACCESSIBILITÀ
   Misurato prima: 0 skip-link, 3 `<h1>` su 95 view, focus lasciato al default del browser.
   ═══════════════════════════════════════════════════════════════════════════════════════════ */

/* Il focus si vede sempre, ed è lo stesso ovunque: il flusso «verifica → protocolla → convoca»
   deve essere percorribile senza mouse, e senza un anello visibile non lo è. */
:focus-visible {
    outline: 2px solid var(--adr-navy-700);
    outline-offset: 2px;
    border-radius: var(--r-xs);
}

/* «Salta al contenuto»: primo elemento focusabile della pagina, invisibile finché non serve.
   Senza, chi naviga da tastiera attraversa le 30 voci del menu a ogni cambio di pagina. */
.adr-salta {
    position: absolute;
    left: var(--sp-4);
    top: -100px;
    z-index: 2000;
    padding: var(--sp-2) var(--sp-4);
    background: var(--adr-navy-700);
    color: var(--n-0);
    border-radius: var(--r-sm);
    font-weight: var(--fw-semibold);
    text-decoration: none;
    transition: top var(--t-fast) var(--ease);
}
.adr-salta:focus { top: var(--sp-4); color: var(--n-0); }

/* Chi ha chiesto meno movimento lo ottiene ovunque, non solo dove qualcuno si è ricordato. */
@media (prefers-reduced-motion: reduce) {
    *, *::before, *::after {
        animation-duration: .001ms !important;
        animation-iteration-count: 1 !important;
        transition-duration: .001ms !important;
        scroll-behavior: auto !important;
    }
}

/* ═══════════════════════════════════════════════════════════════════════════════════════════
   TIPOGRAFIA APPLICATA — le classi di dominio
   ═══════════════════════════════════════════════════════════════════════════════════════════ */

/* Il numero di protocollo è la chiave di tutto il dominio e si legge **cifra per cifra**:
   monospaziato, tabulare, leggermente spaziato. `5035/2026` non è una parola, è un indirizzo. */
.adr-protocollo {
    font-family: var(--font-mono);
    font-weight: var(--fw-semibold);
    font-variant-numeric: tabular-nums;
    letter-spacing: .02em;
}

/* ⚠️ LE DUE CLASSI CHE 66 PUNTI DELLA PIATTAFORMA USAVANO E CHE NON ESISTEVANO.
   MISURATO il 07/09/2026 sul sorgente: `fs-2xs` compare **53 volte in 11 file** di
   `resources/views/` e `fs-3xs` **13 volte in 2 file**, piu' 5 usi negli script di casa — e
   nessuno dei due CSS le definiva. Il tema porta `.fs-xs` e `.fs-sm`; i token `--fs-2xs` e
   `--fs-3xs` stavano gia' qui sopra dalla prima riga di questo file, ma **nessuna regola li
   leggeva**.
   👉 Non produceva un errore ne' un avviso: quel testo ereditava semplicemente la misura del
   genitore, cioe' compariva grande quanto il testo accanto a cui doveva essere piccolo. E'
   la forma piu' silenziosa del difetto grafico — una classe scritta, letta da nessuno, e una
   schermata che sembra soltanto un po' meno curata delle altre.
   ⚠️ `!important` NON E' UN CAPRICCIO: e' la stessa forza con cui il tema dichiara `.fs-xs` e
   `.fs-sm`. Senza, una qualunque regola piu' specifica del tema — e ce ne sono — vincerebbe su
   `fs-2xs` e non su `fs-xs`, e le due misure accanto tornerebbero a divergere. */
.fs-2xs { font-size: var(--fs-2xs) !important; }
.fs-3xs { font-size: var(--fs-3xs) !important; }

/* Importi, date e conteggi: incolonnati. Senza tabular-nums una colonna di importi balla. */
.adr-num { font-variant-numeric: tabular-nums; }
.adr-num-end { font-variant-numeric: tabular-nums; text-align: right; }

/* L'etichetta di sezione: maiuscoletto spaziato, con la linea che riempie la riga. */
.adr-sezione {
    display: flex;
    align-items: center;
    gap: var(--sp-3);
    font-size: var(--fs-3xs);
    font-weight: var(--fw-bold);
    text-transform: uppercase;
    letter-spacing: var(--ls-caps);
    color: var(--n-500);
    margin-bottom: var(--sp-3);
}
.adr-sezione::after {
    content: '';
    flex: 1;
    height: 1px;
    background: var(--border);
}

/* La citazione di norma. Il tono del brand è istituzionale-giuridico e la norma si cita di
   continuo: darle una forma stabile evita che ogni pagina se la inventi. */
.adr-norma {
    font-size: var(--fs-2xs);
    line-height: var(--lh-dense);
    color: var(--n-500);
    border-left: 3px solid var(--adr-navy-200);
    padding-left: var(--sp-3);
}

/* ═══════════════════════════════════════════════════════════════════════════════════════════
   STAMPA
   Misurato: **0 occorrenze** di `@media print` nelle view. In un organismo di mediazione si
   stampa il fascicolo, i conteggi, le fatture — e oggi esce anche la sidenav.
   ═══════════════════════════════════════════════════════════════════════════════════════════ */
@media print {
    .app-sidebar, .app-topbar, .navbar, .footer,
    .adr-salta, .btn, .dt-length, .dt-search, .dt-paging,
    [data-azione], .no-print { display: none !important; }

    body, .card, .page-content {
        background: #fff !important;
        color: #000 !important;
        box-shadow: none !important;
    }
    .card { border: 1px solid #999 !important; break-inside: avoid; }
    .page-content, .content-page { margin: 0 !important; padding: 0 !important; }
    table { break-inside: auto; }
    tr, td, th { break-inside: avoid; }
    thead { display: table-header-group; }

    /* Gli URL si espandono: un fascicolo stampato deve dire da dove viene. */
    a[href^="http"]::after { content: ' (' attr(href) ')'; font-size: 10px; color: #555; }
}

/* ═══════════════════════════════════════════════════════════════════════════════════════════
   IL MARCHIO
   ═══════════════════════════════════════════════════════════════════════════════════════════

   ⚠️ L'ALTEZZA È IL VINCOLO, E VIENE DAL FILE. Il logo è un PNG di **145×70**: il vettoriale
   non è mai stato consegnato dal cliente, ed è una domanda aperta che blocca anche il motore
   documentale — i PDF generati (convocazioni, verbali, fatture) uscirebbero sgranati.

   Il calcolo, perché chi tocca queste misure sappia dove sta il limite:

       h = 28px → 58×28   su retina servono 116×56   ✓ dentro i 145×70 nativi
       h = 34px → 70×34   su retina servono 140×68   ✓ al limite
       h = 40px → 83×40   su retina servono 166×80   ✗ mancano 21 pixel di larghezza

   **Sopra i 34px il marchio sgrana.** Chi vuole alzarlo deve prima avere il file vettoriale.
   ═══════════════════════════════════════════════════════════════════════════════════════════ */

.adr-marchio {
    height: 28px;
    width: auto;
    display: block;
    /* Il lettering ha tratti sottili: senza questo, il ridimensionamento del browser li impasta. */
    image-rendering: -webkit-optimize-contrast;
}

/* ⚠️ `display: block` E `text-center` NON SI PARLANO. Il contenitore del login ha
   `text-center`, che allinea il **testo**: un elemento di blocco largo quanto il suo contenuto
   resta a sinistra, e il marchio risultava sfalsato rispetto alla scritta sotto. Il centraggio
   di un blocco lo fa `margin-inline: auto`, non l'allineamento del testo. */
.adr-marchio--grande { margin-inline: auto; }

/* Nel login il marchio è l'unica cosa in pagina che dica di chi è il sistema: sta al limite
   della nitidezza, non oltre. */
.adr-marchio--grande { height: 34px; }

/* ⚠️ SU FONDO SCURO IL LETTERING NAVY SPARISCE. Non abbiamo una versione chiara del marchio —
   e non si inventa schiarendo il file, perché il rosso e il verde della bandiera sono colori
   del marchio e vanno resi come sono. Il fondo chiaro dietro è la soluzione che rispetta il
   file che abbiamo. */
.adr-marchio--su-scuro {
    background: var(--n-0);
    border-radius: var(--r-sm);
    padding: 3px 6px;
    height: 34px;   /* 28 di marchio più il respiro sopra e sotto */
    box-sizing: content-box;
}

/* ═══════════════════════════════════════════════════════════════════════════════════════════
   L'ULTIMO INDACO: IL PULSANTE SPENTO
   ═══════════════════════════════════════════════════════════════════════════════════════════

   Rimappare `--ins-secondary` (sopra) spegne l'indaco quasi ovunque, perché il tema
   ridichiara una seconda volta `.btn-secondary` e `.btn-outline-secondary` in termini di
   `var(--ins-secondary)`, e la seconda dichiarazione vince sulla prima. **Quasi.**

   ⚠️ MISURATO IN BROWSER il 01/09/2026, subito dopo la rimappatura: di tutta la famiglia
   `secondary` resta indaco **un caso solo** — `.btn-outline-secondary` **disabilitato**, che
   legge `rgb(99, 102, 241)` su testo e bordo. Il perché sta in `app.min.css`: il secondo blocco
   ridichiara colore, bordo, hover e attivo, ma **non** i due `--ins-btn-disabled-*`, che
   restano quelli del primo blocco, dove sono scritti a mano come `#6366f1`. `.btn-secondary`
   disabilitato invece è coperto, perché il secondo blocco il suo `--ins-btn-disabled-bg` lo
   ridichiara: serve **una** regola, non due, e riguarda **due** letterali, non quattro.

   ⚠️ E non è un caso di laboratorio: `.btn-outline-secondary` compare in **38 punti di
   `resources/views/`**, e un pulsante spento è proprio quello che si guarda per capire perché
   non si può premere. Senza questa regola la correzione sembrerebbe completa e lascerebbe l'indaco
   esattamente dove si vede di più.

   Restano quattro `#6366f1` letterali dentro `app.min.css` sulle regole
   `.fc-*.bg-secondary-subtle` di FullCalendar: **non sono raggiungibili oggi** — nessuna vista
   del calendario assegna `bg-secondary-subtle` a un evento — e si chiuderanno quando lo farà,
   non prima. È un fatto misurato, non una svista lasciata lì.
   ═══════════════════════════════════════════════════════════════════════════════════════════ */
.btn-outline-secondary {
    --ins-btn-disabled-color: var(--ins-secondary);
    --ins-btn-disabled-border-color: var(--ins-secondary);
}

/* ═══════════════════════════════════════════════════════════════════════════════════════════
   IL BADGE CHE SI LEGGE
   ═══════════════════════════════════════════════════════════════════════════════════════════

   Il ponte qui sopra ha sistemato l'INCHIOSTRO. Restano due cose che il ponte non raggiunge,
   e che si vedono solo misurando la pagina, non il token.

   ── ① IL PIENO SI RIPRENDE LA SUA TINTA ───────────────────────────────────────────────────
   `.bg-X` e `.text-bg-X` disegnano il fondo con `rgba(var(--ins-X-rgb), …)`, cioè con la
   STESSA variabile che è l'inchiostro di `.text-X`. Rimappandola per il testo si scuriva anche
   il pieno, e un badge «Da fatturare» color ocra non è più il giallo di prima: la regola era
   scurire il testo, non cambiare la famiglia. Qui il pieno torna al proprio `--X-dot`, cioè
   ESATTAMENTE alla tinta che aveva prima di questo giro.

   ── ② SOPRA UN PIENO CI VA L'INCHIOSTRO CHE MISURA DI PIÙ ─────────────────────────────────
   Il tema mette bianco su tutto (`--ins-badge-color: #fff`, e `.text-bg-X` lo forza con
   `!important`). Su navy il bianco è la scelta giusta; su ambra è illeggibile. MISURATO, sul
   pieno di ciascuna famiglia, bianco contro `--n-900`:

       primary   #212958   bianco 13,79  ·  n-900  1,29   → bianco
       secondary #4b5563   bianco  7,56  ·  n-900  2,29   → bianco
       success   #22a55b   bianco  3,18  ·  n-900  5,70   → n-900
       warning   #e8a317   bianco  2,17  ·  n-900  8,36   → n-900
       danger    #e5484d   bianco  3,91  ·  n-900  4,63   → n-900
       info      #1d9bc4   bianco  3,21  ·  n-900  5,64   → n-900

   Nessuna tinta si muove: si sceglie l'inchiostro. `danger` passa per 0,13 — è il margine più
   sottile della tavola, e sta scritto qui perché chi un giorno schiarisce `--danger-dot` sappia
   che sta togliendo l'ultimo decimo.

   ── ③ E IL FONDO TENUE PORTA UN LETTERALE CHE NESSUN TOKEN RAGGIUNGE ──────────────────────
   `app.min.css` scrive `.bg-X-subtle{color:#eab308!important}` — l'inchiostro del fondo tenue
   è un esadecimale a mano, non una variabile. Oggi perde contro `.text-X`, che arriva dopo nel
   foglio: MISURATO, «Chiusa» è `rgb(75,85,99)` e non `#6366f1`. Ma è una vittoria di ordine di
   riga, non una difesa — e MISURATO sul sorgente le due classi vanno sempre in coppia (0 usi
   di `bg-X-subtle` senza il proprio `text-X`, su 83). Il giorno in cui una nasce da sola —
   `stati_pratica.badge_variant` compone la classe da un dato — il letterale si riaccende. Qui
   si spegne per sempre.
   ═══════════════════════════════════════════════════════════════════════════════════════════ */

/* ① il pieno torna alla tinta che aveva */
.bg-success, .text-bg-success { background-color: var(--ok-dot)     !important; }
.bg-warning, .text-bg-warning { background-color: var(--warn-dot)   !important; }
.bg-danger,  .text-bg-danger  { background-color: var(--danger-dot) !important; }
.bg-info,    .text-bg-info    { background-color: var(--info-dot)   !important; }

/* ② sopra il pieno, l'inchiostro che misura di più */
.badge.bg-success, .text-bg-success,
.badge.bg-warning, .text-bg-warning,
.badge.bg-danger,  .text-bg-danger,
.badge.bg-info,    .text-bg-info    { color: var(--n-900) !important; }

/* ⚠️ ③bis LA SETTIMA FAMIGLIA, TROVATA MISURANDO E NON LEGGENDO. Un giro di misura su sette
   schermate ha contato **36 badge e avvisi**: dopo le sei famiglie ne restava uno sotto AA, e
   non era in elenco perché non è una famiglia semantica — è `badge bg-light text-body-secondary`,
   cioè il badge «in lavorazione» che sta in cima a **sei pagine su sette** e, su `/anagrafiche/sedi`,
   anche «Inattiva · da confermare». MISURATO: `--ins-secondary-color` (#6b7280, il muted minimo)
   sopra `--ins-light` (#e5e7eb) fa **3,90:1**. Il muted è tarato su bianco, dove fa 4,83:1: su un
   fondo che bianco non è, non basta più. Il fondo resta quello, scende l'inchiostro di un
   gradino — `--n-600` fa **6,10:1**. */
.badge.bg-light { color: var(--n-600) !important; }

/* ③ il fondo tenue prende l'inchiostro del proprio token, e non il letterale del tema */
.bg-primary-subtle   { color: var(--adr-navy-800) !important; }
.bg-secondary-subtle { color: var(--neutral-fg)   !important; }
.bg-success-subtle   { color: var(--ok-fg)        !important; }
.bg-warning-subtle   { color: var(--warn-fg)      !important; }
.bg-danger-subtle    { color: var(--danger-fg)    !important; }
.bg-info-subtle      { color: var(--info-fg)      !important; }

/* ⚠️ FullCalendar ridichiara l'inchiostro dei propri titoli DENTRO `.bg-X-subtle`, con un
   letterale e una specificità più alta: senza queste righe un evento tenue tornerebbe al
   giallo di fabbrica proprio dove la riga sopra lo ha appena spento. */
.bg-success-subtle .fc-event-title, .bg-success-subtle .fc-list-event-title > a { color: var(--ok-fg)      !important; }
.bg-warning-subtle .fc-event-title, .bg-warning-subtle .fc-list-event-title > a { color: var(--warn-fg)    !important; }
.bg-danger-subtle  .fc-event-title, .bg-danger-subtle  .fc-list-event-title > a { color: var(--danger-fg)  !important; }
.bg-info-subtle    .fc-event-title, .bg-info-subtle    .fc-list-event-title > a { color: var(--info-fg)    !important; }
.bg-secondary-subtle .fc-event-title, .bg-secondary-subtle .fc-list-event-title > a { color: var(--neutral-fg) !important; }

/* L'evento di calendario dell'incontro. ⚠️ Il colore stava in PHP — `'color' => '#6366f1'` in
   `mediatori/show.php` — cioè dentro il JSON degli eventi, dove nessun token arriva. FullCalendar
   accetta `classNames` su ogni evento: la vista dice CHE COS'È l'evento, questo file dice di che
   colore si vede. */
.fc .fc-event.adr-evento-incontro,
.fc .fc-event.adr-evento-incontro .fc-event-main {
    background-color: var(--adr-navy-700);
    border-color: var(--adr-navy-700);
    color: var(--n-0);
}

/* ═══════════════════════════════════════════════════════════════════════════════════════════
   LA PAGINA DI ACCESSO
   ═══════════════════════════════════════════════════════════════════════════════════════════

   ⚠️ VENIVA DA UN `<style>` INLINE IN `layouts/auth.php`, e portava con sé un difetto che si
   poteva vedere solo da sloggati: usava `var(--bs-primary)`, `var(--bs-body-bg)`,
   `var(--bs-border-color)` e `var(--bs-font-monospace)`. **In questa build quelle variabili non
   esistono** — il prefisso del tema è `--ins-` — quindi cadevano tutte sui fallback scritti a
   mano, e `#6366f1` è un indaco, non il navy `#212958` del marchio.

   Risultato: la prima pagina che chiunque incontra aveva una palette sua, diversa da tutto il
   resto dell'applicazione. Qui i colori sono i token, e la regola sull'altezza del marchio non
   c'è più: la decide `.adr-marchio`, che sa dove sta il limite di nitidezza.
   ═══════════════════════════════════════════════════════════════════════════════════════════ */

.auth-sfondo {
    min-height: 100vh;
    display: flex;
    align-items: center;
    justify-content: center;
    padding: var(--sp-6);
    /* Un velo navy appena accennato in alto: dà profondità senza diventare decorazione, che il
       tono istituzionale non ammette. */
    background:
        radial-gradient(1200px 600px at 50% -10%, rgba(33, 41, 88, .08), transparent 60%),
        var(--surface-page);
}

.auth-scheda { width: 100%; max-width: 26rem; }

/* Il portale del privato (DEC-131). La scena è quella dell'accesso — una scheda sola al centro,
   niente barra laterale — ma il modulo di iscrizione ha quattro campi e un consenso da leggere,
   e in 26rem le righe si spezzano. Un modificatore, non un secondo guscio da tenere allineato. */
.auth-scheda--larga { max-width: 34rem; }

.auth-passi {
    display: flex;
    gap: var(--sp-1);
    justify-content: center;
    margin-bottom: var(--sp-5);
}
.auth-passo {
    height: 4px;
    width: 36px;
    border-radius: var(--r-pill);
    background: var(--border);
}
.auth-passo.fatto    { background: var(--ok-dot); }
.auth-passo.corrente { background: var(--adr-navy-700); }

/* Il codice a più cifre si legge meglio spaziato: è l'unico campo che si trascrive da uno
   schermo a un altro, e una cifra letta male costa un secondo fattore rifiutato. */
.auth-codice {
    font-size: var(--fs-3xl);
    letter-spacing: .5rem;
    text-align: center;
    font-variant-numeric: tabular-nums;
}

.auth-segreto {
    font-family: var(--font-mono);
    letter-spacing: .08rem;
    word-break: break-all;
}

/* Il separatore «oppure» fra due strade di accesso: la riga, la parola in maiuscoletto, la riga.
   ⚠️ È una classe e non uno `style=` perché `FormaGraficaTest` conta gli stili inline con un
   cricchetto che può solo scendere — e ha fermato proprio questo, quando i due blocchi delle
   passkey ne avevano aggiunti due. */
.adr-oppure {
    display: flex;
    align-items: center;
    gap: var(--sp-2);
    margin: var(--sp-4) 0;
}
.adr-oppure hr { flex: 1; margin: 0; }
.adr-oppure span {
    font-size: var(--fs-2xs);
    text-transform: uppercase;
    letter-spacing: var(--ls-caps);
    color: var(--n-500);
}

/* I codici di recupero, mostrati una volta sola dopo la registrazione di una passkey.
   Monospaziati e spaziati: si trascrivono a mano o si stampano, e una lettera letta male è un
   codice bruciato. ⚠️ È una classe e non uno `style=` perché il cricchetto degli stili inline
   può solo scendere. */
.adr-codici-recupero {
    font-family: var(--font-mono);
    font-size: var(--fs-xs);
    line-height: 1.7;
    letter-spacing: .04em;
    background: var(--n-0);
    border: 1px solid var(--border);
    border-radius: var(--r-sm);
    padding: var(--sp-3);
    margin-bottom: var(--sp-2);
}

/* L'impronta grande delle pagine di conferma: dice cosa sta per succedere senza una parola.
   ⚠️ Classe e non `style=`: il cricchetto degli stili inline può solo scendere, e l'ha già
   fermato una volta su questa stessa pagina. */
.adr-impronta {
    font-size: 3rem;
    opacity: .35;
    color: var(--adr-navy-700);
}

/* ═══════════════════════════════════════════════════════════════════════════════════════════
   LE TABELLE: DICHIARARE CHE UNA COLONNA SI PUÒ ORDINARE
   ═══════════════════════════════════════════════════════════════════════════════════════════

   ⚠️ IL DIFETTO, MISURATO glifo per glifo il 30/08/2026 su `/pratiche`. Tutte e dieci le
   intestazioni sono ordinabili, ma **una sola lo mostrava**: la colonna già ordinata. Le altre
   nove disegnavano il carattere **U+eaa5**, che nel webfont Tabler è `ti-filter` — **un imbuto,
   non una freccia**. Un residuo ereditato da un'altra regola del tema, che per le colonne
   ordinabili-ma-non-ordinate non dichiara niente.

   Da qui la sensazione, giusta, che «le tabelle non sono tabelle»: una tabella che non dichiara
   quali colonne si possono ordinare **non si prova nemmeno a ordinare**. La funzione c'era ed
   era invisibile — 48.504 fascicoli ordinabili per otto criteri, e nessuno lo sapeva.

   Tre stati, tre segni, e nessuno lasciato al caso:
     · ordinabile, non ordinata  → doppia freccia tenue: «si può»
     · ordinata                  → freccia piena nel navy del marchio: «è ordinata così»
     · non ordinabile            → niente, perché non c'è niente da promettere
   ═══════════════════════════════════════════════════════════════════════════════════════════ */

/* Il marcatore di DataTables 2.x resta nascosto — il segno lo mette il `::after`, uno solo. */
table.dataTable thead th .dt-column-order { display: none; }

/* ⚠️ SI AZZERA PRIMA. Senza questa riga il carattere ereditato — l'imbuto — resta sotto tutto
   il resto, e ricompare su ogni intestazione che le regole qui sotto non nominano. */
table.dataTable thead th::after,
table.dataTable thead th::before { content: none; }

/* «Questa colonna si può ordinare»: doppia freccia, tenue, e non salta all'occhio. */
table.dataTable thead th.dt-orderable-asc::after,
table.dataTable thead th.dt-orderable-desc::after {
    content: "\eb5a";                    /* ti-arrows-sort */
    font-family: 'tabler-icons', sans-serif;
    font-size: .95em;
    margin-left: .4rem;
    color: var(--n-400);
    opacity: .75;
    vertical-align: -.1em;
    display: inline-block;
    transition: color var(--t-fast) var(--ease), opacity var(--t-fast) var(--ease);
}

/* Al passaggio del mouse il segno si accende: è l'invito a cliccare. */
table.dataTable thead th.dt-orderable-asc:hover::after,
table.dataTable thead th.dt-orderable-desc:hover::after {
    color: var(--adr-navy-700);
    opacity: 1;
}

/* «È ordinata così»: freccia piena, nel colore del marchio, e resta accesa. */
table.dataTable thead th.dt-ordering-asc::after,
table.dataTable thead th[aria-sort="ascending"]::after {
    content: "\eb26";                    /* ti-sort-ascending */
    color: var(--adr-navy-700);
    opacity: 1;
}
table.dataTable thead th.dt-ordering-desc::after,
table.dataTable thead th[aria-sort="descending"]::after {
    content: "\eb27";                    /* ti-sort-descending */
    color: var(--adr-navy-700);
    opacity: 1;
}

/* Una colonna che non si può ordinare non promette niente. */
table.dataTable thead th.dt-orderable-none::after { content: none; }

/* E l'intestazione ordinabile si comporta da comando: il cursore lo dice prima del clic. */
table.dataTable thead th.dt-orderable-asc,
table.dataTable thead th.dt-orderable-desc { cursor: pointer; user-select: none; }

/* ═══════════════════════════════════════════════════════════════════════════════════════════
   LE PILLOLE DI FILTRO
   Una tendina dice quali stati esistono; una fila di pillole dice **dove sono i fascicoli**.
   Il numero è parte della pillola, non un'aggiunta: senza, non risponde alla domanda per cui
   esiste.
   ═══════════════════════════════════════════════════════════════════════════════════════════ */

.adr-pillole {
    display: flex;
    flex-wrap: wrap;
    gap: var(--sp-2);
    align-items: center;
}

.adr-pillola {
    display: inline-flex;
    align-items: center;
    gap: var(--sp-2);
    padding: .3rem .5rem .3rem .75rem;
    border: 1px solid var(--border);
    border-radius: var(--r-pill);
    background: var(--surface-card);
    color: var(--n-600);
    font-size: var(--fs-xs);
    font-weight: var(--fw-medium);
    line-height: 1.4;
    cursor: pointer;
    transition: border-color var(--t-fast) var(--ease),
                background var(--t-fast) var(--ease),
                color var(--t-fast) var(--ease);
}

.adr-pillola:hover { border-color: var(--border-strong); background: var(--n-25); }

/* Il conteggio è il motivo per cui la pillola esiste: tabulare, così le cifre si incolonnano
   fra pillole diverse, e in un tondo che lo stacca dall'etichetta. */
.adr-pillola-n {
    font-variant-numeric: tabular-nums;
    font-weight: var(--fw-semibold);
    font-size: var(--fs-2xs);
    padding: .05rem .4rem;
    border-radius: var(--r-pill);
    background: var(--n-100);
    color: var(--n-600);
}

/* ⚠️ LA PILLOLA ATTIVA SI VEDE DA LONTANO. Un filtro applicato che non si distingue è la
   ragione per cui qualcuno legge «1.060 fascicoli» e crede che l'archivio ne abbia 1.060. */
.adr-pillola.attiva {
    background: var(--adr-navy-700);
    border-color: var(--adr-navy-700);
    color: var(--n-0);
}
.adr-pillola.attiva .adr-pillola-n {
    background: rgba(255, 255, 255, .22);
    color: var(--n-0);
}

/* Il tono viene dal catalogo degli stati, come per i badge di riga: una pillola «Da
   regolarizzare» ambra accanto a un badge ambra è la stessa cosa detta due volte, e va detta
   allo stesso modo. Sul non attivo si tinge solo il pallino del conteggio, per non farne una
   fila di bottoni colorati che gridano tutti insieme. */
.adr-pillola--warning:not(.attiva)   .adr-pillola-n { background: var(--warn-bg);    color: var(--warn-fg); }
.adr-pillola--danger:not(.attiva)    .adr-pillola-n { background: var(--danger-bg);  color: var(--danger-fg); }
.adr-pillola--success:not(.attiva)   .adr-pillola-n { background: var(--ok-bg);      color: var(--ok-fg); }
.adr-pillola--info:not(.attiva)      .adr-pillola-n { background: var(--info-bg);    color: var(--info-fg); }

.adr-pillola:focus-visible { outline: 2px solid var(--adr-navy-700); outline-offset: 2px; }

/* ═══════════════════════════════════════════════════════════════════════════════════════════
   LA RIGA CHE SI APRE
   Le colonne che non entrano nello schermo non spariscono: si raccolgono e si aprono con un
   clic. ⚠️ MISURATO su `/pratiche` a 1440px: la tabella è larga 1.585 px in un contenitore di
   1.098 — mediatore, sede e materia stanno oltre il bordo. Lo scorrimento c'è, ma su un
   portatile stretto il gesto giusto è leggere una riga per intero, non scorrere di lato.
   ═══════════════════════════════════════════════════════════════════════════════════════════ */

/* ⚠️ IL PULSANTE HA UNA COLONNA SUA, e prima stava dentro quella del protocollo. Due difetti
   in uno: il «+» risultava appiccicato al numero, e cliccare sul numero apriva il dettaglio
   invece del fascicolo — il gesto principale dell'elenco sostituito da quello secondario.
   La colonna la costruisce `querytable.js`; qui si dice quanto è larga e come si presenta. */
table.dataTable th.qt-controllo,
table.dataTable td.qt-controllo {
    width: 2.25rem;
    padding-left: .5rem;
    padding-right: .25rem;
    text-align: center;
}

/* Il pulsante che apre: un più che diventa meno, nel navy del marchio. */
table.dataTable td.dtr-control::before,
table.dataTable th.dtr-control::before {
    content: "\eb0b";                       /* ti-plus */
    font-family: 'tabler-icons', sans-serif;
    display: inline-flex;
    align-items: center;
    justify-content: center;
    width: 1.25rem;
    height: 1.25rem;
    border-radius: var(--r-xs);
    background: var(--adr-navy-100);
    color: var(--adr-navy-700);
    font-size: .7rem;
    line-height: 1;
    /* Il tema disegna un proprio pallino sul controllo: qui il segno è uno solo. */
    box-shadow: none;
    border: 0;
}
table.dataTable tr.dt-hasChild td.dtr-control::before {
    content: "\eaf2";                       /* ti-minus */
    background: var(--adr-navy-700);
    color: var(--n-0);
}
table.dataTable td.dtr-control { cursor: pointer; }
table.dataTable td.dtr-control:hover::before { background: var(--adr-navy-200); }
/* ⚠️ Il tema di Responsive per Bootstrap 5 disegna il proprio tondo verde/rosso con un
   `background-image` sul `::before`: senza questa riga se ne vedrebbero due, il suo e il
   nostro, sovrapposti. */
table.dataTable.dtr-column td.dtr-control::before,
table.dataTable.dtr-column th.dtr-control::before { background-image: none; }
/* L'intestazione della colonna del pulsante non porta il «+»: lì non c'è niente da aprire. */
table.dataTable thead th.qt-controllo::before { content: none; }

/* ═══════════════════════════════════════════════════════════════════════════════════════════
   IL SUGGERIMENTO AL PASSAGGIO DEL MOUSE
   Lo disegna la piattaforma, non il sistema operativo: `adr/tooltip.js` sposta ogni `title` in
   un tooltip Bootstrap. ⚠️ `pre-line` NON È COSMESI: i `title` del fascicolo contengono già
   `&#10;` per separare la data dalla qualità del dato — «Data dell'evento / Qualità: ricostruita» —
   e senza questa riga le due frasi si stampano incollate su una riga sola.
   ═══════════════════════════════════════════════════════════════════════════════════════════ */
.tooltip.adr-tooltip { --bs-tooltip-max-width: 22rem; }
.tooltip.adr-tooltip .tooltip-inner {
    background: var(--adr-navy-900);
    color: var(--n-0);
    font-size: var(--fs-2xs);
    line-height: 1.45;
    text-align: left;
    white-space: pre-line;
    padding: var(--sp-2) var(--sp-3);
    border-radius: var(--r-sm);
    box-shadow: var(--sh-2);
}
.tooltip.adr-tooltip .tooltip-arrow::before { border-top-color: var(--adr-navy-900); }
.tooltip.adr-tooltip.bs-tooltip-bottom .tooltip-arrow::before,
.tooltip.adr-tooltip[data-popper-placement^="bottom"] .tooltip-arrow::before {
    border-bottom-color: var(--adr-navy-900);
}

/* ⚠️ LE RIGHE DEL GUSCIO NON DEVONO SBORDARE. `dom` di DataTables compone il guscio con le
   `.row` di Bootstrap, che portano margini orizzontali negativi (metà della gutter per lato):
   dentro un `.card-body p-0` quei margini escono dal riquadro — misurati **10 px** di debordo
   sul contenitore di `/pratiche`, cioè una barra di scorrimento che compare per niente. */
.dt-container > .row,
.dataTables_wrapper > .row { margin-left: 0; margin-right: 0; }

/* ═══════════════════════════════════════════════════════════════════════════════════════════
   LA PAGINAZIONE BATTE A DESTRA
   ⚠️ `text-end` sul contenitore NON la sposta: `ul.pagination` è `display: flex`, e
   `text-align` su un contenitore flex non muove i figli — restava centrata sotto la tabella
   mentre l'informazione «Da 1 a 25 di 48.504» stava a sinistra. Le due cose vanno ai due
   estremi della riga, come in ogni elenco della piattaforma.
   ═══════════════════════════════════════════════════════════════════════════════════════════ */
.dt-container .dt-paging .pagination,
.dataTables_wrapper .dt-paging .pagination {
    justify-content: flex-end;
    margin-bottom: 0;
    flex-wrap: wrap;
}

/* ⚠️ E VALE ANCHE PER LE PAGINAZIONI SCRITTE IN PHP. Non tutte le tabelle della piattaforma
   hanno un motore nel browser: il componente CRUD e il registro degli accessi impaginano dal
   server, e le loro `ul.pagination` non stanno dentro un `.dt-paging`. Erano centrate mentre
   quelle accanto battevano a destra — la stessa pagina con due convenzioni. La regola generale
   le prende tutte; le classi di Bootstrap nel markup restano perché si leggano guardando la
   vista, non solo il foglio di stile. */
.card .pagination { justify-content: flex-end; }

/* Il dettaglio: le colonne nascoste, ciascuna con la propria etichetta — un valore senza il
   nome della colonna non si legge. */
/* ⚠️ NIENTE PIÙ `sticky` NÉ `100vw`. Servivano a compensare una tabella più larga dello
   schermo: il dettaglio si apriva dentro una cella larga quanto la tabella, e i valori
   finivano oltre il bordo visibile. Da quando l'elenco non scorre più di lato (vedi
   `sganciaScorrimento` in `querytable.js`) la cella è larga quanto lo schermo, e ancorare il
   blocco a `100vw` lo farebbe invece sbordare della larghezza della barra di scorrimento. */
.qt-dettaglio {
    width: auto;
    max-width: 100%;
    box-sizing: border-box;
    padding: var(--sp-3) var(--sp-4);
    background: var(--surface-sunken);
    border-radius: var(--r-sm);
    margin: var(--sp-2) 0;
}

/* ⚠️ ETICHETTA E VALORE AFFIANCATI, NON AI DUE ESTREMI. `space-between` su una riga larga
   spinge il valore lontano dalla sua etichetta, e su una riga sola l'occhio non li ricollega:
   qui il valore sta subito dopo, e la riga va a capo se non ci sta. */
.qt-riga-aperta {
    display: flex;
    flex-wrap: wrap;
    align-items: baseline;
    gap: var(--sp-1) var(--sp-3);
    padding: .25rem 0;
    font-size: var(--fs-xs);
}
.qt-riga-aperta + .qt-riga-aperta { border-top: 1px solid var(--border); }
.qt-riga-aperta-etichetta {
    color: var(--n-500);
    font-size: var(--fs-2xs);
    text-transform: uppercase;
    letter-spacing: var(--ls-caps);
    white-space: nowrap;
    /* Le etichette incolonnate rendono la riga aperta leggibile in verticale, come una scheda. */
    flex: 0 0 8.5rem;
}
.qt-riga-aperta-valore { flex: 1 1 auto; min-width: 0; }

/* ═══════════════════════════════════════════════════════════════════════════════════════════
   LA RIGA CHE PORTA DA QUALCHE PARTE LO DEVE DIRE
   ⚠️ Due classi esistevano nel JavaScript e non nel CSS: `qt-riga` (la mette `querytable.js`
   sulle righe dei cinque elenchi) e `qt-tabella-cliccabile` (la mette `tabella.js` quando la
   dichiarazione porta `"riga"`). Il clic apriva la scheda e il puntatore restava una freccia:
   l'unico modo di scoprire che una riga era cliccabile era cliccarla. Le regole c'erano solo
   dentro i `<style>` di due viste — cioè per cinque tabelle su ventotto.
   ═══════════════════════════════════════════════════════════════════════════════════════════ */
table.dataTable tbody tr.qt-riga,
table.qt-tabella-cliccabile tbody tr { cursor: pointer; }

/* La colonna delle azioni sta stretta: sono due icone, e ogni pixel che prende lo toglie alla
   colonna che dice di che riga si tratta. `width: 1%` in una tabella `auto` significa «il
   minimo che ti basta». */
table.dataTable th.qt-col-azioni,
table.dataTable td.qt-col-azioni { width: 1%; white-space: nowrap; text-align: right; }

/* ⚠️ QUESTE TRE NON SONO MISURATE IN BROWSER, e lo dichiaro: vengono dalla lettura del markup.
   Sono tre casi dello stesso difetto — un'intestazione più larga del dato che porta si prende
   spazio alla colonna identità — e un intervallo di date spezzato a metà dal ritorno a capo.
   Se una di queste stringesse troppo, si vede subito e si toglie. */
#cataloghi-tribunali .qt-col-codice,
#cataloghi-tribunali .qt-col-provincia { width: 1%; white-space: nowrap; }
#cataloghi-registro .qt-col-periodo    { white-space: nowrap; }
#cataloghi-modelli .qt-col-visibilita  { max-width: 12rem; }

/* ═══════════════════════════════════════════════════════════════════════════════════════════
   RIGHE ZEBRATE
   ⚠️ La zebratura si applica alle righe **dispari** e l'hover deve restare più forte di
   entrambe, altrimenti su una riga già grigia il passaggio del mouse non si vede — e su una
   tabella di 48.504 fascicoli sapere su quale riga si è è la differenza fra aprire il fascicolo
   giusto e quello sopra.
   ═══════════════════════════════════════════════════════════════════════════════════════════ */
table.dataTable.table-striped > tbody > tr:nth-of-type(odd) > * {
    box-shadow: none;                        /* Bootstrap usa un'ombra interna: si toglie */
    background-color: var(--n-25);
}
table.dataTable.table-striped > tbody > tr:hover > * {
    background-color: var(--adr-navy-050) !important;
}

/* ═══════════════════════════════════════════════════════════════════════════════════════════
   UN TESTO CHE SCRIVE L'UTENTE NON DEVE POTER SFONDARE IL SUO RIQUADRO

   ⚠️ MISURATO IN BROWSER il 01/09/2026 (Chromium, finestra 1440 px) sulla scheda del fascicolo
   48560: una motivazione di **500 caratteri senza spazi** — e un URL incollato basta, il campo
   arriva a 500 — rendeva il `<div>` dello storico largo **3.372 px** dentro una riga di **725
   px**, spingendo il suo bordo destro a **x = 3.669** cioè ben oltre il riquadro dello storico,
   che finisce a **x = 1.006**: il testo passava sopra la colonna di destra. E lo `scrollWidth`
   del documento saliva a **3.835 px** contro i **1.440** della finestra, cioè tutta la pagina
   scorreva in orizzontale.

   ⚠️ CORREZIONE DEL 01/09/2026 — QUI C'ERA SCRITTO CHE «NESSUNA DELLE DUE BASTA DA SOLA» E CHE
   `.text-break` non chiude il difetto. È FALSO, ed è stato rimisurato in browser (Chrome
   headless, pagina servita via HTTP, fascicolo 48560, stessa stringa di 500 caratteri senza
   spazi) a 1440, 820 e 390 px. `scrollWidth` del documento contro la finestra:

     · senza nessuna delle due proprietà  → 3835 / 1440, 3575 / 820, 3575 / 500  (il difetto)
     · con `.adr-testo-libero`            → nessun debordo a nessuna delle tre larghezze
     · con il solo `.text-break`          → nessun debordo  ⚠️ CHIUDE il difetto
     · con il solo `overflow-wrap:anywhere` → nessun debordo ⚠️ CHIUDE il difetto

   Il motivo è che `.text-break` di Bootstrap 5 **non** è solo `word-wrap: break-word`: è
   `word-wrap: break-word !important; word-break: break-word !important`, e il secondo valore
   riduce davvero la larghezza minima intrinseca — che è la proprietà che serve. Quindi:

     · `overflow-wrap: anywhere` — riduce la larghezza minima intrinseca, ed è ciò che permette
       all'elemento flessibile di stringersi. `word-wrap: break-word` da solo manderebbe a capo
       senza ridurla; `anywhere` la riduce, ed è la differenza fra le due parole del CSS.
     · `min-width: 0` — l'elemento è figlio di un `d-flex` e nasce con `min-width: auto`. MISURATO:
       con `anywhere` già presente questa riga non è ciò che salva la pagina. Si tiene perché è
       la difesa che regge anche dove il testo NON è spezzabile (una `<pre>`, una tabella, un
       `<img>` largo), e lì `anywhere` non può niente — ma la si tiene sapendo che cosa fa, non
       credendo che sia lei a chiudere questo caso.

   `overflow-wrap` e `word-break` si ereditano: la classe si mette sull'elemento flessibile e
   vale per tutto ciò che porta dentro.

   ⚠️ Il secondo uso — il corpo di una nota di fascicolo — **non è misurato in browser**, e lo
   dichiaro: viene dalla lettura del markup, ed è lo stesso testo scritto da una persona dentro
   un riquadro a larghezza fissa. Se stringesse troppo, si vede subito e si toglie.
   ═══════════════════════════════════════════════════════════════════════════════════════════ */
.adr-testo-libero {
    min-width: 0;
    overflow-wrap: anywhere;
    word-break: break-word;
}

/* ═══════════════════════════════════════════════════════════════════════════════════════════
   `hidden` DEVE NASCONDERE — la regola che mancava, e che ha lasciato in pagina una voce
   bloccante che il server non chiedeva
   ═══════════════════════════════════════════════════════════════════════════════════════════

   ⚠️⚠️ MISURATO l'11/09/2026 in un browser vero, sul difetto segnalato dal committente: «*se
   inserisco come "Caricamento online (portale ADR)" mi da anche "Domanda di mediazione firmata"
   come documento obbligatorio*».

   Il catalogo era giusto (`canali_ingresso.domanda_firmata_attesa = 0` sul portale), la checklist
   del fascicolo era giusta (MISURATO depositando: 3 voci, e quella non c'è), e il JavaScript
   faceva la cosa giusta — `li.hidden = true`. Ma la voce **restava a schermo**, e il motivo è una
   riga di CSS che non esisteva:

       l'attributo `hidden` lo nasconde lo user-agent con `display: none`, che ha specificita'
       ZERO ed e' battuto da QUALUNQUE classe. `.d-flex` di Bootstrap e' `display: flex !important`.

   👉 Quindi `elemento.hidden = true` su un elemento con `d-flex` non nasconde niente, e non lo
      dice: nel DOM l'attributo c'e', nell'ispettore si legge `hidden`, e la voce si vede. E' la
      stessa forma del `required` sull'`<input type="file">` dentro un `d-none` (DEC-063) e della
      `var()` che non risolve e fa scartare la proprieta': **una dichiarazione che c'e' e non
      produce l'effetto che il suo nome promette**.

   ⚠️ E il rimedio sta QUI e non nel JavaScript. Aggiungere `d-none` accanto a `hidden` in
   `deposito-carta.js` avrebbe chiuso QUESTO punto e lasciato aperto ogni altro uso di `.hidden`
   nella piattaforma — che oggi sono tre, e domani non si sa. Una riga di CSS rende vera, ovunque,
   la promessa dell'attributo. */
[hidden] { display: none !important; }

/* La riga sotto il titolo di una schermata non si allarga oltre la misura in cui si legge.
   ⚠️ Serve al deposito (DEC-094): con l'interruttore «Test» acceso quella riga diventa tre volte
   più lunga, prendeva tutta la larghezza disponibile e spingeva «Torna all'elenco» sotto il testo,
   in mezzo alla pagina. 62 caratteri sono la misura oltre cui l'occhio perde la riga successiva. */
.adr-testata-nota { max-width: 62ch; }

/* ═══════════════════════════════════════════════════════════════════════════════════════════
   LA BARRA DEI PASSI — la forma di `adr/passi.js`
   ═══════════════════════════════════════════════════════════════════════════════════════════

   ⚠️ IL COLORE STA QUI E SOLO QUI. Il modulo JS non ne nomina nemmeno uno: assegna classi
   (`adr-passo-fatto`, `adr-passo-ora`, `adr-passo-chiuso`) e la tinta la decide questo file.
   E' DEC-052 applicata a un pezzo nuovo, non un'eccezione concessa perche' e' piccolo.
   ═══════════════════════════════════════════════════════════════════════════════════════════ */

.adr-passi {
    display: flex;
    align-items: stretch;
    gap: 0;
    /* ⚠️⚠️ ERA `max-width: 46rem`, E IL TETTO ERA STATO SCRITTO PER QUATTRO PASSI — 11/09/2026.
       Il deposito ne ha SEI da DEC-092, e quel tetto dava a ciascuno poco piu' di sette
       caratteri: il committente leggeva «1 · Parte i…», «2 · Parte …», «4 · La me…» sul proprio
       MacBook, cioe' una barra che dice in che punto sei senza dire di che punto si tratta.
       👉 Il tetto resta — serve ancora a non sparpagliare quattro passi su un monitor largo — ma
          si misura sul contenuto: `min()` prende il piu' stretto fra la larghezza disponibile e
          72rem, quindi su uno schermo piccolo la barra non sborda e su uno grande non sprawla. */
    max-width: min(100%, 72rem);
    margin: 0 auto 1.25rem;
    flex-wrap: wrap;
}

.adr-passo-voce {
    flex: 1 1 0;
    min-width: 0;
    display: flex;
    align-items: center;
    justify-content: center;
    gap: 0.45rem;
    padding: 0.35rem 0.6rem;
    background: none;
    border: 0;
    cursor: pointer;
    text-align: left;
}

.adr-passo-segno {
    flex: 0 0 auto;
    width: 1.6rem;
    height: 1.6rem;
    border-radius: 50%;
    display: flex;
    align-items: center;
    justify-content: center;
    font-size: 0.78rem;
    font-weight: 700;
    background: var(--n-0);
    border: 2px solid var(--n-400);
    color: var(--n-600);
    transition: transform .12s ease, box-shadow .12s ease, background-color .12s ease;
}

.adr-passo-testo {
    min-width: 0;
    font-size: 0.82rem;
    font-weight: 600;
    line-height: 1.15;
    color: var(--n-500);
    /* ⚠️ SI MANDA A CAPO, NON SI TAGLIA — 11/09/2026. Qui c'erano `white-space: nowrap` e
       `text-overflow: ellipsis`: un'etichetta troppo lunga per lo spazio spariva dietro tre
       puntini, e tre puntini non sono un'informazione piu' corta — sono un'informazione assente.
       Andare a capo costa una riga di altezza e non toglie niente a nessuno. */
    white-space: normal;
    overflow-wrap: anywhere;
    hyphens: auto;
}

/* Il dettaglio («materia scelta», «3 parti») sta nel DOM ma non a schermo: su una riga sola
   non ci sta, e il modulo lo mette gia' nel `title` del passo. Resta leggibile agli assistivi. */
.adr-passo-nota { display: none; }

.adr-passo-voce:hover .adr-passo-segno { border-color: var(--n-500); transform: translateY(-1px); }

.adr-passo-fatto      .adr-passo-segno { background: var(--adr-stato-fatto);      border-color: var(--adr-stato-fatto);      color: var(--n-0); }
.adr-passo-attenzione .adr-passo-segno { background: var(--adr-stato-attenzione); border-color: var(--adr-stato-attenzione); color: var(--n-0); }
.adr-passo-errore     .adr-passo-segno { background: var(--adr-stato-errore);     border-color: var(--adr-stato-errore);     color: var(--n-0); }

.adr-passo-ora .adr-passo-segno {
    background: var(--adr-navy-800);
    border-color: var(--adr-navy-800);
    color: var(--n-0);
    box-shadow: 0 0 0 3px var(--adr-navy-100);
}

.adr-passo-ora .adr-passo-testo,
.adr-passo-fatto .adr-passo-testo { color: var(--adr-navy-900); }

/* Un passo chiuso non e' `disabled`: riceve il click e spiega. Si vede che e' chiuso, e il
   cursore non promette che si apra. */
.adr-passo-chiuso { cursor: help; }
.adr-passo-chiuso .adr-passo-segno { border-style: dashed; }
.adr-passo-chiuso .adr-passo-testo { color: var(--n-400); }

/* Il piede resta in fondo alla finestra: nei passi che scorrono, Indietro/Avanti finivano
   sotto la piega e sembravano non esserci. */
.adr-passi-piede {
    display: flex;
    /* ⚠️ NON PIÙ `space-between` QUI, ma sul figlio della navigazione. La striscia ha ora due
       figli — la navigazione che `passi.js` riscrive, e i bottoni di invio — e con
       `space-between` sul contenitore i due si sarebbero spinti ai bordi lasciando un vuoto in
       mezzo. La navigazione prende lo spazio (`flex: 1`), l'invio resta attaccato a destra. */
    align-items: center;
    gap: 0.75rem;
    flex-wrap: wrap;
    position: sticky;
    bottom: 0.75rem;
    z-index: 20;
    /* I bottoni non toccano più i bordi: 1,25rem di respiro a sinistra e a destra. Prima
       «Indietro» partiva dal filo della fascia e sembrava tagliato. */
    padding: 0.85rem 1.25rem;
    margin-top: 1.25rem;
    background: var(--bs-body-bg, var(--n-0));
    border: 1px solid var(--n-200);
    border-radius: var(--bs-border-radius-lg, 0.75rem);
    box-shadow: 0 2px 10px rgba(15, 23, 42, .06);
}

@media (max-width: 991.98px) {
    /* Fra 576 e 992 le sei etichette ci stanno solo strette: si riducono invece di sparire, e
       la barra puo' andare su due righe. Meglio due righe leggibili di una riga tagliata. */
    .adr-passo-testo { font-size: 0.76rem; }
    .adr-passo-voce  { gap: 0.35rem; padding: 0.35rem 0.4rem; flex: 1 1 8rem; }
}

@media (max-width: 575.98px) {
    /* Sotto i 576px le etichette non ci stanno comunque: restano i pallini, che portano gia'
       il numero, la spunta e il colore. L'etichetta resta nella nota accessibile. */
    .adr-passo-testo { display: none; }
    .adr-passo-voce  { flex: 0 0 auto; padding: 0.35rem 0.5rem; }
    .adr-passi       { justify-content: center; }
}

/* ═══════════════════════════════════════════════════════════════════════════════════════════
   IL CAMPO CHE MANCA SI VEDE — la vibrazione, e il segno che resta
   ═══════════════════════════════════════════════════════════════════════════════════════════

   ⚠️ DIRE «MANCA LA MATERIA» NON BASTA, e il difetto era misurabile: il messaggio diceva il
   CHE COSA e non il DOVE. Chi legge «manca la materia» su un modulo di ventotto campi deve
   ancora cercarla, e la cerca in un passo che magari non è quello che sta guardando.

   La vibrazione dura un attimo e poi resta il bordo: il movimento serve a farsi trovare,
   il bordo a restare trovato. Un campo che vibra e torna identico agli altri si perde di
   nuovo appena l'occhio si sposta.
   ═══════════════════════════════════════════════════════════════════════════════════════════ */

@keyframes adr-scossa {
    0%, 100% { transform: translateX(0); }
    15%      { transform: translateX(-6px); }
    30%      { transform: translateX(5px); }
    45%      { transform: translateX(-4px); }
    60%      { transform: translateX(3px); }
    80%      { transform: translateX(-2px); }
}

.adr-campo-manca {
    animation: adr-scossa .45s cubic-bezier(.36, .07, .19, .97) both;
}

/* Il segno che resta dopo la scossa. Vale anche sul guscio di TomSelect, che disegna un
   proprio contenitore sopra il `<select>` vero: senza questa riga il selettore vibrerebbe
   e resterebbe grigio come prima. */
.adr-campo-manca,
.adr-campo-manca + .ts-wrapper .ts-control,
.adr-campo-manca .ts-control {
    border-color: var(--adr-stato-errore) !important;
    box-shadow: 0 0 0 .2rem rgba(192, 42, 38, .18) !important;
}

/* L'etichetta del campo che manca si accende con lui: sui selettori il bordo lo disegna
   TomSelect e può passare inosservato. */
.adr-etichetta-manca {
    color: var(--adr-stato-errore);
    font-weight: 600;
}

@media (prefers-reduced-motion: reduce) {
    /* Chi ha chiesto meno movimento riceve il bordo e basta: l'informazione è la stessa,
       ed è l'unica cosa che conta. */
    .adr-campo-manca { animation: none; }
}

/* ═══════════════════════════════════════════════════════════════════════════════════════════
   IL TOAST — in alto a destra, e vestito qui
   ═══════════════════════════════════════════════════════════════════════════════════════════

   ⚠️ Prima usava le utility di Bootstrap (`text-bg-warning`): un giallo di libreria con
   testo scuro, uguale su ogni progetto che monta Bootstrap. Il toast è una delle poche cose
   che si guardano da vicino, e vestirlo è compito di questo file (DEC-052).
   ═══════════════════════════════════════════════════════════════════════════════════════════ */

.adr-toast-zona {
    /* Sotto la barra in alto, non sopra: un messaggio che copre la navigazione toglie la via
       d'uscita proprio mentre dice che qualcosa non va. */
    margin-top: 3.5rem;
    max-width: min(26rem, calc(100vw - 2rem));
}

.adr-toast {
    --adr-toast-tinta: var(--adr-navy-800);
    position: relative;
    overflow: hidden;
    background: var(--n-0);
    color: var(--n-800);
    border-radius: var(--bs-border-radius-lg, 0.75rem);
    box-shadow: 0 8px 28px rgba(15, 23, 42, .16), 0 2px 6px rgba(15, 23, 42, .08);
    /* La striscia di colore sta a sinistra e non invade il testo: il tipo si legge di
       traverso, il messaggio resta su fondo chiaro e quindi leggibile. */
    border-left: 4px solid var(--adr-toast-tinta);
}

.adr-toast-successo { --adr-toast-tinta: var(--adr-stato-fatto); }
.adr-toast-errore   { --adr-toast-tinta: var(--adr-stato-errore); }
.adr-toast-avviso   { --adr-toast-tinta: var(--adr-stato-attenzione); }
.adr-toast-info     { --adr-toast-tinta: var(--adr-navy-800); }

.adr-toast-corpo {
    display: flex;
    align-items: flex-start;
    gap: 0.7rem;
    padding: 0.85rem 0.9rem;
}

.adr-toast-segno {
    flex: 0 0 auto;
    width: 1.5rem;
    height: 1.5rem;
    margin-top: 0.05rem;
    border-radius: 50%;
    display: flex;
    align-items: center;
    justify-content: center;
    font-size: 0.8rem;
    font-weight: 700;
    color: var(--n-0);
    background: var(--adr-toast-tinta);
}

.adr-toast-colonna { min-width: 0; flex: 1 1 auto; }

.adr-toast-titolo {
    font-size: 0.72rem;
    font-weight: 700;
    letter-spacing: .04em;
    text-transform: uppercase;
    color: var(--adr-toast-tinta);
    line-height: 1.1;
    margin-bottom: 0.15rem;
}

.adr-toast-testo {
    font-size: 0.86rem;
    line-height: 1.35;
    color: var(--n-700);
    overflow-wrap: anywhere;
}

.adr-toast-chiudi {
    flex: 0 0 auto;
    margin-top: 0.1rem;
    font-size: 0.65rem;
    opacity: .45;
}
.adr-toast-chiudi:hover { opacity: .9; }

/* Quanto tempo resta prima che sparisca. Si ferma sotto il mouse: chi sta leggendo non
   deve rincorrere il messaggio. */
.adr-toast-tempo {
    position: absolute;
    left: 0;
    bottom: 0;
    height: 3px;
    width: 100%;
    background: var(--adr-toast-tinta);
    opacity: .5;
    transform-origin: left center;
    animation-name: adr-toast-scorre;
    animation-timing-function: linear;
    animation-fill-mode: forwards;
}

.adr-toast:hover .adr-toast-tempo { animation-play-state: paused; }

@keyframes adr-toast-scorre {
    from { transform: scaleX(1); }
    to   { transform: scaleX(0); }
}

@media (prefers-reduced-motion: reduce) {
    .adr-toast-tempo { display: none; }
}

/* ═══════════════════════════════════════════════════════════════════════════════════════════
   IL FASCICOLO DOCUMENTALE — che cosa serve, e che cosa si può già allegare
   ═══════════════════════════════════════════════════════════════════════════════════════════

   L'elenco distingue due cose che sembrano una sola: il documento che si può allegare ADESSO
   (ne serve una per pratica, e la pratica sta nascendo) e quello che aspetta le parti, che al
   deposito non ci sono ancora. Un elenco che li mescolasse sarebbe un elenco che non si può
   spuntare — e un elenco che non si può spuntare smette di essere letto.
   ═══════════════════════════════════════════════════════════════════════════════════════════ */

.adr-attesi > li:last-child { border-bottom: 0 !important; }

.adr-atteso-segno {
    flex: 0 0 auto;
    width: 1.35rem;
    height: 1.35rem;
    margin-top: 0.1rem;
    border-radius: 50%;
    display: flex;
    align-items: center;
    justify-content: center;
    font-size: 0.8rem;
    font-weight: 700;
    background: var(--n-100);
    color: var(--n-500);
}

/* Quello che si può allegare adesso porta il colore del marchio: è l'unica cosa, in questa
   schermata, su cui si può agire subito. */
.adr-atteso-ora {
    background: var(--adr-navy-800);
    color: var(--n-0);
}

.adr-atteso-obbligo {
    display: inline-block;
    margin-left: 0.35rem;
    padding: 0.05rem 0.4rem;
    border-radius: 999px;
    font-size: 0.66rem;
    font-weight: 600;
    letter-spacing: .01em;
    text-transform: none;
    background: var(--adr-navy-050);
    color: var(--adr-navy-700);
    vertical-align: 0.08em;
}

.adr-file-scelto {
    border: 1px solid var(--n-200);
    border-radius: var(--bs-border-radius, 0.5rem);
    padding: 0.35rem 0.55rem;
    margin-bottom: 0.35rem;
    background: var(--n-25);
}

.adr-scelti:empty { display: none; }

/* L'asterisco dei campi obbligatori. `abbr` porta la spiegazione nel `title`, che
   `adr/tooltip.js` trasforma in un tooltip della piattaforma: il segno si vede da lontano e
   il perché si legge passandoci sopra, senza allungare l'etichetta. */
.adr-obbligo {
    color: var(--adr-stato-errore);
    font-weight: 700;
    text-decoration: none;
    cursor: help;
    margin-left: 0.1rem;
}

/* La navigazione dentro la striscia: Indietro a sinistra, Avanti a destra. È l'elemento che
   `adr/passi.js` riscrive con `innerHTML` a ogni cambio di passo — e per questo i bottoni di
   invio gli stanno ACCANTO e non dentro: il primo ridisegno li cancellerebbe. */
.adr-passi-navigazione {
    display: flex;
    justify-content: space-between;
    align-items: center;
    gap: 0.75rem;
    flex: 1 1 auto;
    min-width: 0;
}

/* All'ultimo passo «Avanti» non c'è e compaiono questi: restano dentro la striscia, in fondo
   a destra, dove l'occhio ha appena lasciato il pulsante che li ha portati qui. */
#adr-deposito-invio {
    flex: 0 0 auto;
}


/* ═══════════════════════════════════════════════════════════════════════════════════════════
   «MANCA QUALCOSA» — la sezione in cui si rimedia, segnata per un istante
   ═══════════════════════════════════════════════════════════════════════════════════════════

   DEC-104, 12/09/2026. Il committente: «*ti esce la notifica a tempo e ti manda nella sezione
   dove sistemare le cose*». Il toast dice, questa classe mostra dove.

   ⚠️ IL COLORE STA QUI E SOLO QUI, come ogni altro colore della piattaforma (DEC-052): il
   JavaScript accende e spegne la classe, non scrive lo stile.
   ⚠️⚠️ E SI USA `--ins-warning-rgb`, NON `--bs-warning-rgb`. La prima stesura usava la seconda,
   che **in questo foglio non è definita**: il ponte dichiara `--bs-primary-rgb` e basta. Una
   `var()` che non risolve fa **scartare la proprietà**, quindi l'evidenza non sarebbe comparsa —
   senza un errore, senza un avviso, e con il commento qui accanto a giurare il contrario. È il
   difetto per cui la tendina dei filtri nasceva trasparente (DEC-052), ed è la 31ª lezione. */
.adr-manca-qui {
    animation: adr-manca-qui 2.4s ease-out 1;
}

@keyframes adr-manca-qui {
    0%   { box-shadow: 0 0 0 0 rgba(var(--ins-warning-rgb), .55); }
    35%  { box-shadow: 0 0 0 .5rem rgba(var(--ins-warning-rgb), .18); }
    100% { box-shadow: 0 0 0 0 rgba(var(--ins-warning-rgb), 0); }
}

/* ⚠️ CHI CHIEDE DI NON ESSERE MOSSO NON VIENE MOSSO: un lampeggio è animazione, e per chi ha
   `prefers-reduced-motion` diventa un bordo fermo — visibile lo stesso, senza il movimento. */
@media (prefers-reduced-motion: reduce) {
    .adr-manca-qui {
        animation: none;
        box-shadow: 0 0 0 .25rem rgba(var(--ins-warning-rgb), .35);
    }
}

/* ═══════════════════════════════════════════════════════════════════════════════════════════
   LA LISTA DI CONTROLLO DELL'AMBIENTE DI VERIFICA — DEC-105, 14/09/2026
   ═══════════════════════════════════════════════════════════════════════════════════════════

   Il committente, guardando la lista: «*il rosso non mi piace, rendiamolo elegante come tutta la
   piattaforma*». Le voci aperte avevano lo sfondo `table-danger` su tutta la riga: due voci
   mancanti bastavano a tingere di rosa mezzo schermo, e il colore diceva «errore» dove il fatto
   è «da fare».

   👉 Ora una voce aperta si riconosce da un filo sul bordo sinistro, nel colore dell'attenzione
      — lo stesso che la piattaforma usa per i passi da completare — e il resto della riga resta
      bianco. Il rosso resta per ciò che è davvero sbagliato: un documento non conforme. */
.adr-voce-aperta > td:first-child {
    box-shadow: inset 3px 0 0 var(--adr-stato-attenzione);
}

/* La zona su cui si trascina il documento di una voce. ⚠️ Solo token: un colore scritto qui a
   mano non partecipa ai due ponti verso `--ins-*` e `--bs-*` (DEC-052). */
.adr-dropzone-voce {
    display: flex;
    flex-direction: column;
    align-items: center;
    justify-content: center;
    gap: .15rem;
    text-align: center;
    padding: .9rem .75rem;
    border: 1.5px dashed var(--border);
    border-radius: var(--r-md);
    background: var(--n-50);
    color: var(--n-500);
    cursor: pointer;
    transition: border-color .15s ease, background-color .15s ease;
}

.adr-dropzone-voce:hover,
.adr-dropzone-voce.adr-dropzone-voce-sopra {
    border-color: var(--adr-navy-700);
    background: var(--n-0);
}

.adr-dropzone-voce:focus-visible {
    outline: 2px solid var(--adr-navy-700);
    outline-offset: 2px;
}

.adr-dropzone-voce-icona { font-size: 1.3rem; line-height: 1; opacity: .6; }
.adr-dropzone-voce-testo { font-size: .8rem; font-weight: 500; color: var(--n-700); }
.adr-dropzone-voce-nota  { font-size: .72rem; color: var(--n-500); }
.adr-dropzone-voce-avviso .adr-dropzone-voce-nota { color: var(--adr-stato-attenzione); }
.adr-dropzone-voce[aria-busy="true"] { cursor: progress; opacity: .75; }

/* L'elenco dentro un toast: una riga per motivo, con aria fra le righe. Il committente: «*si
   legge male, è tutto appiccicato*». */
.adr-toast-voci {
    margin: .4rem 0 0;
    padding-left: 1rem;
}

.adr-toast-voci li {
    font-size: .82rem;
    line-height: 1.35;
    color: var(--n-700);
    margin-bottom: .3rem;
    overflow-wrap: anywhere;
}

.adr-toast-voci li:last-child { margin-bottom: 0; }

@media (prefers-reduced-motion: reduce) {
    .adr-dropzone-voce { transition: none; }
}

/* ═══════════════════════════════════════════════════════════════════════════════════════════
   IL FASCICOLO — il riquadro unico in testa alla scheda (DEC-121, 15/09/2026)
   ═══════════════════════════════════════════════════════════════════════════════════════════
   Fino a quel giorno le regole `pfa-*` stavano in un blocco `<style>` dentro
   `components/pratiche/percorso-fasi.php`, dichiarato come debito, e «A che punto è» aveva le sue.
   ⚠️ `container-type` fa parlare le soglie della larghezza del RIQUADRO, non della finestra: la
   colonna sinistra della scheda, a 1440 px di finestra, è larga circa 700 (MISURATO il 01/09/2026),
   e una media query sulla finestra lasciava i nodi stringersi fino a incolonnare le parole. */
.pfa {
    border-radius: var(--r-lg);
    overflow: hidden;
    container-type: inline-size;
    container-name: percorso;
}

.pfa::before {
    content: '';
    display: block;
    height: 3px;
    background: linear-gradient(90deg, var(--adr-navy-700) 0%, var(--adr-navy-500) 55%, var(--adr-lime-500) 100%);
}

.pfa-testa {
    display: flex;
    align-items: center;
    justify-content: space-between;
    flex-wrap: wrap;
    gap: var(--sp-2);
    padding: var(--sp-4) var(--sp-5) 0 var(--sp-5);
}

.pfa-occhiello {
    display: flex;
    align-items: center;
    gap: var(--sp-2);
    margin: 0;
    font-size: var(--fs-3xs);
    font-weight: var(--fw-bold);
    text-transform: uppercase;
    letter-spacing: var(--ls-caps);
    color: var(--n-500);
}

.pfa-occhiello .ti { font-size: var(--fs-lg); color: var(--adr-navy-700); }
.pfa-testa-lato { display: flex; align-items: center; gap: var(--sp-2); flex-wrap: wrap; }

/* Lo stato col colore che il catalogo dichiara: la vista traduce la variante, non la sceglie. */
.pfa-stato {
    display: inline-flex;
    align-items: center;
    gap: var(--sp-1);
    padding: 3px var(--sp-3);
    border-radius: var(--r-pill);
    background: var(--adr-navy-050);
    color: var(--adr-navy-800);
    font-size: var(--fs-2xs);
    font-weight: var(--fw-semibold);
    line-height: var(--lh-tight);
    white-space: nowrap;
}

.pfa-stato .ti { font-size: var(--fs-sm); }
.pfa-stato.pfa-t-ok     { background: var(--ok-bg);     color: var(--ok-fg); }
.pfa-stato.pfa-t-warn   { background: var(--warn-bg);   color: var(--warn-fg); }
.pfa-stato.pfa-t-danger { background: var(--danger-bg); color: var(--danger-fg); }
.pfa-stato.pfa-t-info   { background: var(--info-bg);   color: var(--info-fg); }

.pfa-protocollo {
    font-family: var(--font-mono);
    font-size: var(--fs-2xs);
    color: var(--n-500);
    background: var(--surface-sunken);
    border-radius: var(--r-sm);
    padding: 2px var(--sp-2);
}

.pfa-corpo { padding: var(--sp-4) var(--sp-5) var(--sp-4) var(--sp-5); }

.pfa-vuoto {
    display: flex;
    align-items: center;
    justify-content: center;
    gap: var(--sp-2);
    padding: var(--sp-4);
    font-size: var(--fs-sm);
    color: var(--n-500);
}

.pfa-riga-vuota { margin: 0; font-size: var(--fs-xs); color: var(--n-500); }

/* La fila: quanti nodi, lo decide `ServicePercorso::spina()`. Si impila invece di stringersi. */
.pfa-fila {
    display: flex;
    align-items: stretch;
    flex-wrap: wrap;
    list-style: none;
    margin: 0;
    padding: 0;
}

.pfa-nodo { flex: 1 1 150px; min-width: 0; display: flex; align-items: stretch; }

.pfa-scheda {
    flex: 1 1 auto;
    min-width: 0;
    display: flex;
    flex-direction: column;
    gap: var(--sp-2);
    padding: var(--sp-2) var(--sp-3);
    border: 1px solid var(--border);
    border-radius: var(--r-lg);
    background: var(--n-0);
}

.pfa-vai {
    flex: 0 0 auto;
    width: var(--sp-5);
    display: flex;
    align-items: center;
    justify-content: center;
    color: var(--n-300);
}

.pfa-vai .ti { font-size: var(--fs-lg); }
.pfa-capo { display: flex; align-items: flex-start; gap: var(--sp-2); }
.pfa-testi { flex: 1 1 auto; min-width: 0; display: flex; flex-direction: column; gap: 1px; }

.pfa-eti {
    font-size: var(--fs-3xs);
    font-weight: var(--fw-bold);
    text-transform: uppercase;
    letter-spacing: var(--ls-caps);
    color: var(--n-500);
}

.pfa-titolo {
    font-size: var(--fs-sm);
    font-weight: var(--fw-semibold);
    line-height: var(--lh-tight);
    color: var(--n-500);
    overflow-wrap: break-word;
}

.pfa-segno {
    flex: 0 0 auto;
    width: 20px;
    height: 20px;
    border-radius: var(--r-pill);
    display: inline-flex;
    align-items: center;
    justify-content: center;
    background: var(--adr-navy-700);
    color: var(--n-0);
    font-size: var(--fs-2xs);
}

.pfa-qui {
    flex: 0 0 auto;
    padding: 2px var(--sp-2);
    border-radius: var(--r-pill);
    background: var(--adr-lime-500);
    color: var(--adr-navy-900);
    font-size: var(--fs-3xs);
    font-weight: var(--fw-bold);
    text-transform: uppercase;
    letter-spacing: var(--ls-caps);
    white-space: nowrap;
}

.pfa-piede {
    margin-top: auto;
    font-size: var(--fs-3xs);
    line-height: var(--lh-tight);
    color: var(--n-500);
}

.pfa-data { font-variant-numeric: tabular-nums; font-weight: var(--fw-semibold); color: var(--n-700); }

.pfa-buco {
    display: flex;
    align-items: flex-start;
    gap: var(--sp-1);
    margin: 0;
    padding: var(--sp-1) var(--sp-2);
    border-radius: var(--r-sm);
    background: var(--warn-bg);
    color: var(--warn-fg);
    font-size: var(--fs-3xs);
    line-height: var(--lh-tight);
}

.pfa-buco .ti { font-size: var(--fs-2xs); flex: 0 0 auto; }

.pfa-nodo.is-percorsa .pfa-scheda { background: var(--adr-navy-050); border-color: var(--adr-navy-200); }
.pfa-nodo.is-percorsa .pfa-titolo { color: var(--adr-navy-800); }
.pfa-nodo.is-percorsa .pfa-eti    { color: var(--adr-navy-500); }

.pfa-nodo.is-corrente .pfa-scheda { background: var(--adr-navy-700); border-color: var(--adr-navy-700); box-shadow: var(--sh-2); }
.pfa-nodo.is-corrente .pfa-titolo { color: var(--n-0); }
.pfa-nodo.is-corrente .pfa-eti    { color: var(--adr-navy-200); }
.pfa-nodo.is-corrente .pfa-piede  { color: var(--adr-navy-200); }
.pfa-nodo.is-corrente .pfa-data   { color: var(--n-0); }

/* La fase futura: tratteggio e niente colore del marchio. Il titolo resta a `--n-500`, 4,67:1. */
.pfa-nodo.is-futura .pfa-scheda { background: var(--n-25); border-style: dashed; border-color: var(--n-200); }

/* Le righe sotto la fila: ciascuna c'è solo se ha qualcosa da dire. */
.pfa-righe {
    display: grid;
    grid-template-columns: max-content 1fr;
    gap: var(--sp-1) var(--sp-4);
    margin: var(--sp-3) 0 0 0;
    padding-top: var(--sp-3);
    border-top: 1px dashed var(--border);
    font-size: var(--fs-xs);
}

.pfa-righe dt {
    padding-top: 2px;
    font-size: var(--fs-3xs);
    font-weight: var(--fw-bold);
    text-transform: uppercase;
    letter-spacing: var(--ls-caps);
    color: var(--n-500);
}

.pfa-righe dd { margin: 0; color: var(--n-700); overflow-wrap: anywhere; }
.pfa-scaduto { color: var(--danger-fg); font-weight: var(--fw-semibold); }
.pfa-manca { list-style: none; margin: 0; padding: 0; }
.pfa-manca li { display: flex; align-items: baseline; justify-content: space-between; gap: var(--sp-2); }
.pfa-manca li + li { margin-top: var(--sp-1); }
.pfa-manca a { flex: 0 0 auto; font-size: var(--fs-2xs); font-weight: var(--fw-semibold); white-space: nowrap; }

@container percorso (max-width: 560px) {
    .pfa-fila { flex-direction: column; }
    .pfa-vai { width: auto; height: var(--sp-4); transform: rotate(90deg); }
    .pfa-righe { grid-template-columns: 1fr; }
}

/* L'ADESIONE DEI CHIAMATI — la colonna delle azioni porta la dropzone del modulo (DEC-121). */
.adr-adesione-azioni { min-width: 15rem; }

/* ═══════════════════════════════════════════════════════════════════════════════════════════
   IL CALENDARIO DELLE DISPONIBILITÀ — DEC-124, 16/09/2026
   ═══════════════════════════════════════════════════════════════════════════════════════════

   Il committente: «sulla sinistra il calendario per inserire le disponibilità», nella pagina della
   parte e in quella dell'avvocato. Sette colonne, un pulsante per giorno, tre stati.

   ⚠️ I COLORI VENGONO DAI TOKEN, come tutto il resto (DEC-052): «posso» usa il verde di stato,
   «non posso» il rosso, il silenzio resta neutro. Un terzo stato reso con la sola assenza di
   colore è voluto: chi non ha indicato non deve sembrare «indisponibile».
   ⚠️ E IL GIORNO È UN PULSANTE VERO, non un `div` cliccabile: si raggiunge col tasto di
   tabulazione e si preme con la barra spaziatrice, perché questo modulo lo compilano le parti. */
.adr-calendario-mese { text-transform: capitalize; margin-bottom: var(--sp-2); }

.adr-calendario-griglia {
    display: grid;
    grid-template-columns: repeat(7, 1fr);
    gap: var(--sp-1);
    max-width: 22rem;
}

.adr-calendario-testa { text-align: center; }

.adr-calendario-giorno {
    aspect-ratio: 1;
    border: 1px solid var(--n-300);
    border-radius: .35rem;
    background: var(--n-0);
    color: var(--n-700);
    font-size: .8rem;
    line-height: 1;
    cursor: pointer;
    transition: background-color .12s ease, border-color .12s ease;
}

.adr-calendario-giorno:hover:not(:disabled) { border-color: var(--n-500); }

.adr-calendario-giorno:focus-visible {
    outline: 2px solid var(--adr-navy-700);
    outline-offset: 1px;
}

.adr-calendario-giorno:disabled { opacity: .35; cursor: default; }

/* ⚠️ I NOMI DEI TOKEN SI COPIANO DALLA LORO DICHIARAZIONE, NON SI INDOVINANO: la prima versione
   di queste due regole usava `--adr-stato-ok` e `--adr-stato-errore-sfondo`, che **non esistono**,
   e una `var()` che non risolve fa scartare la proprietà — i due stati sarebbero stati
   indistinguibili, in silenzio. Sono le triplette semantiche `fg/bg/dot` di questo stesso file. */
.adr-cal-si {
    background: var(--ok-bg);
    border-color: var(--ok-dot);
    color: var(--ok-fg);
    font-weight: 600;
}

.adr-cal-no {
    background: var(--danger-bg);
    border-color: var(--danger-dot);
    color: var(--danger-fg);
    text-decoration: line-through;
}

.adr-cal-legenda {
    display: inline-block;
    width: .9rem;
    height: .9rem;
    border: 1px solid var(--n-300);
    border-radius: .35rem;
    vertical-align: -.15rem;
    margin-right: .15rem;
}

@media (prefers-reduced-motion: reduce) {
    .adr-calendario-giorno { transition: none; }
}

/* ═══════════════════════════════════════════════════════════════════════════════════════════
   IL FLUSSO DELLA PRATICA — DEC-147, 23/09/2026
   ═══════════════════════════════════════════════════════════════════════════════════════════
   Il diagramma è SVG in linea: le forme si vestono con queste classi, e il dettaglio di un blocco
   si apre con `:target`, senza JavaScript. */
.flusso-intro { max-width: 72ch; }
.flusso-legenda { display: flex; flex-wrap: wrap; gap: var(--sp-4); align-items: center; font-size: var(--fs-xs); margin: var(--sp-3) 0 var(--sp-6); }
.flusso-legenda svg { vertical-align: middle; margin-right: var(--sp-1); }
.flusso-panoramica { display: grid; grid-template-columns: minmax(0, 1fr) minmax(260px, 360px); gap: var(--sp-6); align-items: start; margin-bottom: var(--sp-8); }
.flusso-fase { margin-bottom: var(--sp-10); scroll-margin-top: var(--sp-8); }
.flusso-corpo { display: grid; grid-template-columns: minmax(0, 1fr) minmax(280px, 380px); gap: var(--sp-6); align-items: start; }
@media (max-width: 991.98px) {
    .flusso-panoramica, .flusso-corpo { grid-template-columns: 1fr; }
}
.flusso-disegno { overflow-x: auto; }
/* Larghezza naturale, stretta solo se non ci sta: la scala resta la stessa fra i diagrammi. Sul
   telefono non si stringe affatto, e il contenitore scorre in orizzontale. */
.flusso-svg { display: block; max-width: 100%; height: auto; }
@media (max-width: 575.98px) {
    .flusso-svg { max-width: none; }
}
.flusso-forma { stroke: var(--n-700); stroke-width: 1.4; }
.flusso-forma--terminale { fill: var(--flusso-terminale); }
.flusso-forma--io { fill: var(--flusso-io); }
.flusso-forma--attivita, .flusso-forma--sottoprocesso { fill: var(--flusso-attivita); }
.flusso-forma--decisione { fill: var(--flusso-decisione); }
.flusso-forma--connettore { fill: var(--surface-card); }
.flusso-bordo { stroke: var(--n-700); stroke-width: 1.4; fill: none; }
.flusso-freccia { stroke: var(--n-400); stroke-width: 1.8; fill: none; }
.flusso-punta { fill: var(--n-400); }
.flusso-testo { font-family: var(--font-sans); font-size: 13px; fill: var(--n-900); }
.flusso-testo--nota { font-size: 11px; fill: var(--n-700); }
.flusso-testo--stato { font-size: 10.5px; fill: var(--info-fg); }
.flusso-testo--tag { font-size: 10px; font-weight: var(--fw-semibold); letter-spacing: .03em; fill: var(--ok-fg); }
.flusso-testo--aperta { font-size: 10.5px; font-weight: var(--fw-semibold); fill: var(--danger-fg); }
.flusso-testo--etichetta { font-size: 12px; font-weight: var(--fw-semibold); fill: var(--n-700); }
.flusso-testo--didascalia { font-size: 11px; font-style: italic; fill: var(--n-600); }
.flusso-testo--avviso { font-size: 11px; font-style: italic; fill: var(--warn-fg); }
.flusso-nodo { cursor: pointer; }
.flusso-nodo:hover .flusso-forma { stroke: var(--adr-navy-500); stroke-width: 3; }
.flusso-nodo:focus { outline: none; }
.flusso-nodo:focus-visible .flusso-forma { stroke: var(--adr-navy-700); stroke-width: 3.5; }
.flusso-dettagli { position: sticky; top: var(--sp-4); }
.flusso-dettaglio { display: none; scroll-margin-top: var(--sp-8); background: var(--surface-card); border: 1px solid var(--border); border-radius: var(--r-md); padding: var(--sp-4); }
.flusso-dettaglio:target { display: block; }
.flusso-dettagli:has(.flusso-dettaglio:target) .flusso-suggerimento { display: none; }
.flusso-dettaglio h4 { font-size: var(--fs-3xs); text-transform: uppercase; letter-spacing: var(--ls-caps); color: var(--n-500); margin: var(--sp-4) 0 var(--sp-1); }
.flusso-dettaglio ul { padding-left: 1.1rem; margin: 0; }
.flusso-avviso { color: var(--warn-fg); }
.flusso-aperta { color: var(--danger-fg); font-weight: var(--fw-semibold); }
.flusso-riquadro { border: 1px dashed var(--border-strong); border-radius: var(--r-md); padding: var(--sp-4); margin-bottom: var(--sp-4); background: var(--surface-card); }
.flusso-chi-vede dt { font-weight: var(--fw-semibold); margin-top: var(--sp-2); }
.flusso-chi-vede dd { margin-left: 0; }
/* I modelli da scaricare dei blocchi (richiesta del 23/09/2026). */
.flusso-testo--modello { font-size: 10.5px; font-weight: var(--fw-semibold); fill: var(--adr-navy-500); }
.flusso-modelli { list-style: none; padding-left: 0; }
.flusso-modelli li { margin-bottom: var(--sp-1); }
