/* =============================================================================
   comune.css — sistema grafico di portale e pannello

   Un solo foglio per le due app: stessi gettoni, stessi componenti, stessi
   nomi. La guida con ogni componente e' guida-stile.html, accanto.

   Regole in breve:
   - Il colore del marchio arriva da /marchio/tema.css (--marchio e varianti
     calcolate dal core). Riempimenti grandi: --accento. Tratti sottili, testo
     e icone nel colore del marchio: --accento-inchiostro (sempre leggibile).
   - Gli stati (ok, attenzione, pericolo, info) non usano mai il marchio e non
     si affidano al solo colore: hanno sempre la spia e una parola.
   - Il giallo (attenzione) solo per avvisi veri.
   - Densita' (ondata 6): strumento di lavoro, non vetrina. Misure del testo
     13 (note, etichette, intestazioni di tabella, pillole), 14 (testo,
     celle, controlli, pulsanti), 16 (titoli di riquadro e di finestra),
     18 (titoli di sezione), 20 (titoli di pagina, cifre delle misure),
     24 (massimo, solo cifre o frasi rare). Mai sotto 13.
   - Griglia di 4 px: spazi 4, 8, 12, 16, 20, 24, 32, 40, 48, 64.
   - Altezze: controlli e pulsanti 32 px col mouse, 44 e 40 px al tocco
     (telefono o puntatore grossolano); righe di tabella 37 px su una riga.
   - Niente stili in linea: le pagine del pannello hanno style-src 'self'.
     Le posizioni calcolate (linea del giorno) si impostano da JS con
     element.style.setProperty("--pos", ...).
   ========================================================================== */


/* ---------------------------------------------------------------------------
   Caratteri (licenza OFL, vedi caratteri/README.md)
   ------------------------------------------------------------------------ */

@font-face {
  font-family: "Saira";
  src: url("/caratteri/saira-latino.woff2") format("woff2");
  font-weight: 100 900;
  font-stretch: 50% 125%;
  font-style: normal;
  font-display: swap;
  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: "Saira";
  src: url("/caratteri/saira-latino-esteso.woff2") format("woff2");
  font-weight: 100 900;
  font-stretch: 50% 125%;
  font-style: normal;
  font-display: swap;
  unicode-range: U+0100-02BA, U+02BD-02C5, U+02C7-02CC, U+02CE-02D7, U+02DD-02FF, U+0304, U+0308, U+0329, U+1D00-1DBF, U+1E00-1E9F, U+1EF2-1EFF, U+2020, U+20A0-20AB, U+20AD-20C0, U+2113, U+2C60-2C7F, U+A720-A7FF;
}
@font-face {
  font-family: "Atkinson Hyperlegible Next";
  src: url("/caratteri/atkinson-next-latino.woff2") format("woff2");
  font-weight: 200 800;
  font-style: normal;
  font-display: swap;
  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: "Atkinson Hyperlegible Next";
  src: url("/caratteri/atkinson-next-latino-esteso.woff2") format("woff2");
  font-weight: 200 800;
  font-style: normal;
  font-display: swap;
  unicode-range: U+0100-02BA, U+02BD-02C5, U+02C7-02CC, U+02CE-02D7, U+02DD-02FF, U+0304, U+0308, U+0329, U+1D00-1DBF, U+1E00-1E9F, U+1EF2-1EFF, U+2020, U+20A0-20AB, U+20AD-20C0, U+2113, U+2C60-2C7F, U+A720-A7FF;
}
@font-face {
  font-family: "Atkinson Hyperlegible Mono";
  src: url("/caratteri/atkinson-mono-latino.woff2") format("woff2");
  font-weight: 200 800;
  font-style: normal;
  font-display: swap;
  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: "Atkinson Hyperlegible Mono";
  src: url("/caratteri/atkinson-mono-latino-esteso.woff2") format("woff2");
  font-weight: 200 800;
  font-style: normal;
  font-display: swap;
  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;
}


/* ---------------------------------------------------------------------------
   Gettoni: misure, caratteri, tempi (uguali nei due temi)
   ------------------------------------------------------------------------ */

:root {
  /* Marchio predefinito: /marchio/tema.css lo sostituisce con il colore
     scelto nel pannello e le varianti calcolate dal core (_colori_marchio). */
  --marchio: #0D6B59;
  --marchio-testo: #FFFFFF;
  --marchio-pieno: #0D6B59;
  --marchio-verso: #000000;
  --marchio-inchiostro: #0D6B59;
  --marchio-inchiostro-scuro: #7AAEA4;
  /* Pieno e testo sulle superfici scure: per un marchio quasi neutro (quasi
     nero, grigio) il core da' un riempimento chiaro con il testo scuro, che
     si stacca dal fondo; per gli altri colori sono pieno e testo di sempre. */
  --marchio-pieno-scuro: #0D6B59;
  --marchio-testo-scuro: #FFFFFF;

  --f-titoli: "Saira", "Atkinson Hyperlegible Next", ui-sans-serif, system-ui, sans-serif;
  --f-testo: "Atkinson Hyperlegible Next", ui-sans-serif, system-ui, -apple-system, "Segoe UI", Roboto, sans-serif;
  --f-cifre: "Atkinson Hyperlegible Mono", ui-monospace, "SF Mono", Menlo, Consolas, monospace;

  /* Scala del testo. --t-nota e --t-piccolo hanno la stessa misura: la
     nota e' anche secondaria di colore, il piccolo no. --t-campo e' il testo
     dei controlli: 16 px al tocco, perche' Safari su iPhone ingrandisce la
     pagina sui campi sotto i 16 px. */
  --t-nota: 0.8125rem;
  --t-piccolo: 0.8125rem;
  --t-testo: 0.875rem;
  --t-campo: 0.875rem;
  --t-sottotitolo: 1rem;
  --t-titolo: 1.125rem;
  --t-pagina: 1.25rem;
  --t-mostra: 1.5rem;

  --s-1: 4px;
  --s-2: 8px;
  --s-3: 12px;
  --s-4: 16px;
  --s-5: 20px;
  --s-6: 24px;
  --s-7: 32px;
  --s-8: 40px;
  --s-9: 48px;
  --s-10: 64px;

  --raggio-piccolo: 4px;
  --raggio: 6px;
  --raggio-riquadro: 8px;
  --raggio-finestra: 12px;
  --raggio-pillola: 999px;

  /* Il Super Admin puo' sostituire solo questi gettoni con uno dei profili
     verificati dal Core; i valori qui sotto sono l'aspetto equilibrato. */
  --spazio-pagina-sopra: var(--s-6);
  --spazio-pagina-lati: var(--s-7);
  --spazio-pagina-sotto: var(--s-9);
  --spazio-sezioni: var(--s-7);
  --spazio-pila: var(--s-4);
  --spazio-riquadro: var(--s-4);

  /* Campioni fissi del selettore palette: il foglio del pannello usa solo
     gettoni, mai codici colore propri. */
  --palette-smeraldo: #0D6B59;
  --palette-oceano: #1F5FAD;
  --palette-viola: #6D3FD1;
  --palette-corallo: #C2410C;
  --palette-grafite: #374151;

  --durata-breve: 100ms;
  --durata: 160ms;
  --durata-lunga: 240ms;
  --curva: cubic-bezier(0.2, 0.8, 0.2, 1);

  /* Altezze dei comandi: col mouse; al tocco le ridefinisce il blocco
     «Tocco» qui sotto. */
  --altezza-controllo: 32px;
  --altezza-pulsante: 32px;
  --altezza-piccolo: 28px;

  --altezza-barra: 48px;
  --altezza-schede: 56px;
  --larghezza-lato: 216px;
  --larghezza-contenuto: 1440px;
  --larghezza-modulo: 760px;
  --larghezza-lato-finestra: 720px;
}

/* Tocco: telefono, o tablet e schermi con il dito. Campi alti 44 px e
   pulsanti 40 px (bersagli da dito), testo dei campi a 16 px. */
@media (max-width: 679px), (pointer: coarse) {
  :root {
    --altezza-controllo: 44px;
    --altezza-pulsante: 40px;
    --altezza-piccolo: 36px;
    --t-campo: 1rem;
  }
}


/* ---------------------------------------------------------------------------
   Gettoni: colori del tema chiaro
   I valori --base-* sono neutri; i colori usati (--carta, --linea, ...) li
   mescolano con un filo di marchio piu' sotto, cosi' ogni installazione ha
   neutri intonati al suo colore.
   ------------------------------------------------------------------------ */

:root,
[data-theme="light"] {
  color-scheme: light;
  --base-carta: #F6F6F4;
  --base-superficie: #FFFFFF;
  --base-superficie-2: #F8F8F6;
  --base-superficie-3: #EDEDEA;
  --base-incavo: #E8E8E5;
  --base-rilievo: #FFFFFF;
  --base-linea: #E1E2DE;
  --base-linea-forte: #C9CBC6;
  --linea-campo: #8A8D87;
  --inchiostro: #17191C;
  --secondario: #585C62;
  --terziario: #666A71;
  --verso: #000000;
  --orlo-verso: #000000;
  --tinta-superficie: 0%;
  --pomello: #FFFFFF;

  --accento-base: var(--marchio-pieno);
  --accento-testo-base: var(--marchio-testo);
  --accento-luce-min: 0;
  --accento-luce-max: 0.9;
  --accento-inchiostro: var(--marchio-inchiostro);

  --ok: #1D7442;
  --ok-fondo: #E3F2E8;
  --ok-bordo: #A8D5B9;
  --ok-spia: #22A45A;
  --attenzione: #874800;
  --attenzione-fondo: #FDF1D6;
  --attenzione-bordo: #EDC77F;
  --attenzione-spia: #E69F0B;
  --pericolo: #B3261E;
  --pericolo-fondo: #FCE8E6;
  --pericolo-bordo: #F1B2AB;
  --pericolo-spia: #E4463B;
  --pericolo-pieno: #B3261E;
  --info: #2B4E72;
  --info-fondo: #E7EEF5;
  --info-bordo: #B3C6DB;
  --info-spia: #5A86B6;
  --neutro-spia: #9A9EA5;
  --spia-su-inchiostro: #F5B43A;
  /* Luci delle serie dei grafici (--grafico-*), dalla prima all'ultima:
     tutte con almeno 3:1 col fondo delle barre e con la superficie. */
  --grafico-luce-1: 0.29;
  --grafico-luce-2: 0.35;
  --grafico-luce-3: 0.41;
  --grafico-luce-4: 0.47;
  --grafico-luce-5: 0.53;
  --grafico-luce-6: 0.58;

  --ombra-1: 0 1px 2px rgb(20 22 26 / 7%);
  --ombra-2: 0 12px 32px -10px rgb(20 22 26 / 24%), 0 2px 6px rgb(20 22 26 / 8%);
  --ombra-3: 0 32px 80px -20px rgb(20 22 26 / 40%), 0 4px 14px rgb(20 22 26 / 10%);
  --velo: rgb(17 18 21 / 48%);

  /* Superfici invertite (notifiche, barra di pubblicazione, lato
     dell'accesso) quando la pagina e' chiara. */
  --inverso-carta: #1B1D21;
  --inverso-superficie: #25272B;
  --inverso-superficie-2: #2B2D32;
  --inverso-superficie-3: #34373C;
  --inverso-incavo: #141518;
  --inverso-rilievo: #3A3D43;
  --inverso-linea: #383B41;
  --inverso-linea-forte: #4A4E55;
}


/* ---------------------------------------------------------------------------
   Gettoni: colori del tema scuro
   Il primo blocco decide le superfici invertite di una pagina scura; il
   secondo vale per la pagina scura e per ogni superficie invertita. Lo
   stesso contenuto e' ripetuto per chi non ha scelto un tema e ha il
   dispositivo in scuro (test_comune.py controlla che i blocchi coincidano).
   ------------------------------------------------------------------------ */

[data-theme="dark"] {
  --inverso-carta: #26282D;
  --inverso-superficie: #2E3136;
  --inverso-superficie-2: #34373C;
  --inverso-superficie-3: #3C3F45;
  --inverso-incavo: #1C1E21;
  --inverso-rilievo: #45484F;
  --inverso-linea: #43464D;
  --inverso-linea-forte: #555960;
}

[data-theme="dark"],
.inverso,
.notifica,
.barra-pubblica,
.ingresso-lato {
  color-scheme: dark;
  --base-carta: #0F1012;
  --base-superficie: #17181B;
  --base-superficie-2: #1D1F22;
  --base-superficie-3: #26282C;
  --base-incavo: #0B0C0E;
  --base-rilievo: #2A2D31;
  --base-linea: #2B2E32;
  --base-linea-forte: #3A3D42;
  --linea-campo: #80848B;
  --inchiostro: #EDEEEF;
  --secondario: #A9ADB4;
  --terziario: #969AA1;
  --verso: #FFFFFF;
  --orlo-verso: var(--marchio-inchiostro-scuro);
  --tinta-superficie: 2%;
  --pomello: #C9CCD1;

  --accento-base: var(--marchio-pieno-scuro);
  --accento-testo-base: var(--marchio-testo-scuro);
  --accento-luce-min: 0.5;
  --accento-luce-max: 1;
  --accento-inchiostro: var(--marchio-inchiostro-scuro);

  --ok: #72D49D;
  --ok-fondo: #132A1D;
  --ok-bordo: #2A5B3E;
  --ok-spia: #3DCF7E;
  --attenzione: #F1BE5E;
  --attenzione-fondo: #2F2309;
  --attenzione-bordo: #6B4B12;
  --attenzione-spia: #F5B43A;
  --pericolo: #FF9A90;
  --pericolo-fondo: #381411;
  --pericolo-bordo: #7C2D25;
  --pericolo-spia: #FF6B5E;
  --pericolo-pieno: #C8352B;
  --info: #9FC0E2;
  --info-fondo: #16222F;
  --info-bordo: #2E4762;
  --info-spia: #6FA1D8;
  --neutro-spia: #7D828A;
  --spia-su-inchiostro: #B86E00;
  --grafico-luce-1: 0.92;
  --grafico-luce-2: 0.84;
  --grafico-luce-3: 0.76;
  --grafico-luce-4: 0.68;
  --grafico-luce-5: 0.61;
  --grafico-luce-6: 0.54;

  --ombra-1: 0 1px 2px rgb(0 0 0 / 40%);
  --ombra-2: 0 14px 36px -10px rgb(0 0 0 / 60%), 0 2px 6px rgb(0 0 0 / 35%);
  --ombra-3: 0 32px 80px -16px rgb(0 0 0 / 70%), 0 4px 14px rgb(0 0 0 / 40%);
  --velo: rgb(0 0 0 / 62%);
}

@media (prefers-color-scheme: dark) {
  :root:not([data-theme]) {
    --inverso-carta: #26282D;
    --inverso-superficie: #2E3136;
    --inverso-superficie-2: #34373C;
    --inverso-superficie-3: #3C3F45;
    --inverso-incavo: #1C1E21;
    --inverso-rilievo: #45484F;
    --inverso-linea: #43464D;
    --inverso-linea-forte: #555960;
  }

  :root:not([data-theme]) {
    color-scheme: dark;
    --base-carta: #0F1012;
    --base-superficie: #17181B;
    --base-superficie-2: #1D1F22;
    --base-superficie-3: #26282C;
    --base-incavo: #0B0C0E;
    --base-rilievo: #2A2D31;
    --base-linea: #2B2E32;
    --base-linea-forte: #3A3D42;
    --linea-campo: #80848B;
    --inchiostro: #EDEEEF;
    --secondario: #A9ADB4;
    --terziario: #969AA1;
    --verso: #FFFFFF;
    --orlo-verso: var(--marchio-inchiostro-scuro);
    --tinta-superficie: 2%;
    --pomello: #C9CCD1;

    --accento-base: var(--marchio-pieno-scuro);
    --accento-testo-base: var(--marchio-testo-scuro);
    --accento-luce-min: 0.5;
    --accento-luce-max: 1;
    --accento-inchiostro: var(--marchio-inchiostro-scuro);

    --ok: #72D49D;
    --ok-fondo: #132A1D;
    --ok-bordo: #2A5B3E;
    --ok-spia: #3DCF7E;
    --attenzione: #F1BE5E;
    --attenzione-fondo: #2F2309;
    --attenzione-bordo: #6B4B12;
    --attenzione-spia: #F5B43A;
    --pericolo: #FF9A90;
    --pericolo-fondo: #381411;
    --pericolo-bordo: #7C2D25;
    --pericolo-spia: #FF6B5E;
    --pericolo-pieno: #C8352B;
    --info: #9FC0E2;
    --info-fondo: #16222F;
    --info-bordo: #2E4762;
    --info-spia: #6FA1D8;
    --neutro-spia: #7D828A;
    --spia-su-inchiostro: #B86E00;
    --grafico-luce-1: 0.92;
    --grafico-luce-2: 0.84;
    --grafico-luce-3: 0.76;
    --grafico-luce-4: 0.68;
    --grafico-luce-5: 0.61;
    --grafico-luce-6: 0.54;

    --ombra-1: 0 1px 2px rgb(0 0 0 / 40%);
    --ombra-2: 0 14px 36px -10px rgb(0 0 0 / 60%), 0 2px 6px rgb(0 0 0 / 35%);
    --ombra-3: 0 32px 80px -16px rgb(0 0 0 / 70%), 0 4px 14px rgb(0 0 0 / 40%);
    --velo: rgb(0 0 0 / 62%);
  }
}

/* Le superfici invertite prendono i fondi dal tema che le contiene. */
.inverso,
.notifica,
.barra-pubblica,
.ingresso-lato {
  --base-carta: var(--inverso-carta);
  --base-superficie: var(--inverso-superficie);
  --base-superficie-2: var(--inverso-superficie-2);
  --base-superficie-3: var(--inverso-superficie-3);
  --base-incavo: var(--inverso-incavo);
  --base-rilievo: var(--inverso-rilievo);
  --base-linea: var(--inverso-linea);
  --base-linea-forte: var(--inverso-linea-forte);
}


/* ---------------------------------------------------------------------------
   Gettoni derivati: ricalcolati in ogni radice di tema, perche' dipendono
   dai valori del tema in cui stanno.
   ------------------------------------------------------------------------ */

:root,
[data-theme],
.inverso,
.notifica,
.barra-pubblica,
.ingresso-lato {
  --tinta: var(--marchio);
  --carta: color-mix(in oklab, var(--tinta) 2.5%, var(--base-carta));
  --superficie: color-mix(in oklab, var(--tinta) var(--tinta-superficie), var(--base-superficie));
  --superficie-2: color-mix(in oklab, var(--tinta) 2%, var(--base-superficie-2));
  --superficie-3: color-mix(in oklab, var(--tinta) 3%, var(--base-superficie-3));
  --incavo: color-mix(in oklab, var(--tinta) 3%, var(--base-incavo));
  --rilievo: var(--base-rilievo);
  --linea: color-mix(in oklab, var(--tinta) 5%, var(--base-linea));
  --linea-forte: color-mix(in oklab, var(--tinta) 5%, var(--base-linea-forte));
  /* Il pieno del marchio: nel tema chiaro quello del core, sulle superfici
     scure (tema scuro, notifiche, barra di pubblicazione, lato dell'accesso)
     la sua variante per il fondo scuro. */
  --accento: var(--accento-base);
  --accento-testo: var(--accento-testo-base);
  --accento-tenue: color-mix(in oklab, var(--accento) 11%, var(--superficie));
  --accento-tenue-forte: color-mix(in oklab, var(--accento) 22%, var(--superficie));
  --accento-bordo: color-mix(in oklab, var(--accento) 45%, var(--base-linea));
  /* Passaggio e pressione si allontanano dal testo (--marchio-verso, dal
     core): il contrasto del pulsante non scende mai sotto quello del pieno.
     Sulle superfici scure un marchio neutro ha il testo scuro: la direzione
     si ricava dal testo nel blocco @supports qui sotto. */
  --accento-verso: var(--marchio-verso);
  --accento-sopra: color-mix(in oklab, var(--accento) 88%, var(--accento-verso));
  --accento-premuto: color-mix(in oklab, var(--accento) 78%, var(--accento-verso));
  --accento-orlo: color-mix(in oklab, var(--accento) 72%, var(--orlo-verso));
  --fuoco: var(--accento-inchiostro);
  --fondo-locale: var(--carta);
  /* Le serie dei grafici (le voci dei costi del pannello): la tinta
     dell'inchiostro del marchio. Qui solo mescolata con la superficie; con i
     colori relativi (sotto) alle luci fisse --grafico-luce-*. */
  --grafico-1: var(--accento-inchiostro);
  --grafico-2: color-mix(in oklab, var(--accento-inchiostro) 80%, var(--superficie));
  --grafico-3: color-mix(in oklab, var(--accento-inchiostro) 62%, var(--superficie));
  --grafico-4: color-mix(in oklab, var(--accento-inchiostro) 46%, var(--superficie));
  --grafico-5: color-mix(in oklab, var(--accento-inchiostro) 32%, var(--superficie));
  --grafico-6: color-mix(in oklab, var(--accento-inchiostro) 20%, var(--superficie));
}

/* Il riempimento del marchio resta distinguibile dal fondo: un marchio quasi
   nero nel tema scuro (o quasi bianco nel chiaro) si schiarisce (o si scurisce)
   quanto basta, con la stessa tinta. Il testo sopra resta leggibile: il pieno
   del core ha gia' 4,5:1 col suo testo, un colore scuro ha il testo bianco, e
   a luce 0,5 il bianco ha ancora 6:1.
   La tinta dei neutri ha la croma limitata: un marchio caldo (arancio, rosso)
   non porta la carta verso il crema, uno freddo non la porta verso l'azzurro.
   --accento-verso e' il nero se il testo del pulsante e' chiaro, il bianco se
   e' scuro (la luce fuori da 0-1 si ferma ai bordi): con i colori del core e'
   sempre --marchio-verso, salvo il marchio neutro sulle superfici scure. */
@supports (color: oklch(from red l c h)) {
  :root,
  [data-theme],
  .inverso,
  .notifica,
  .barra-pubblica,
  .ingresso-lato {
    --accento: oklch(from var(--accento-base) clamp(var(--accento-luce-min), l, var(--accento-luce-max)) c h);
    --accento-verso: oklch(from var(--accento-testo-base) calc((0.5 - l) * 1000) 0 0);
    --tinta: oklch(from var(--marchio) l min(c, 0.06) h);
    /* Luci fisse: con la sola mescolanza le due serie piu' chiare stavano a
       1,3:1 col fondo delle barre, e dipendevano dal marchio. */
    --grafico-1: oklch(from var(--accento-inchiostro) var(--grafico-luce-1) c h);
    --grafico-2: oklch(from var(--accento-inchiostro) var(--grafico-luce-2) c h);
    --grafico-3: oklch(from var(--accento-inchiostro) var(--grafico-luce-3) c h);
    --grafico-4: oklch(from var(--accento-inchiostro) var(--grafico-luce-4) c h);
    --grafico-5: oklch(from var(--accento-inchiostro) var(--grafico-luce-5) c h);
    --grafico-6: oklch(from var(--accento-inchiostro) var(--grafico-luce-6) c h);
  }
}

/* Browser senza color-mix: neutri puri, niente sfumature del marchio. */
@supports not (color: color-mix(in oklab, #000 50%, #fff)) {
  :root,
  [data-theme],
  .inverso,
  .notifica,
  .barra-pubblica,
  .ingresso-lato {
    --carta: var(--base-carta);
    --superficie: var(--base-superficie);
    --superficie-2: var(--base-superficie-2);
    --superficie-3: var(--base-superficie-3);
    --incavo: var(--base-incavo);
    --linea: var(--base-linea);
    --linea-forte: var(--base-linea-forte);
    --accento-tenue: var(--base-superficie-2);
    --accento-tenue-forte: var(--base-superficie-3);
    --accento-bordo: var(--base-linea-forte);
    --accento-sopra: var(--accento);
    --accento-premuto: var(--accento);
    --accento-orlo: var(--accento);
    --grafico-2: var(--accento-inchiostro);
    --grafico-3: var(--accento-inchiostro);
    --grafico-4: var(--accento-inchiostro);
    --grafico-5: var(--accento-inchiostro);
    --grafico-6: var(--accento-inchiostro);
  }
}


/* ---------------------------------------------------------------------------
   Fondamenta
   ------------------------------------------------------------------------ */

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

html {
  font-family: var(--f-testo);
  font-size: 100%;
  line-height: 1.45;
  -webkit-text-size-adjust: 100%;
  text-size-adjust: 100%;
  font-synthesis-weight: none;
  -webkit-font-smoothing: antialiased;
  -moz-osx-font-smoothing: grayscale;
  text-rendering: optimizeLegibility;
  background: var(--carta);
  color: var(--inchiostro);
}

body {
  margin: 0;
  min-height: 100vh;
  min-height: 100dvh;
  font-size: var(--t-testo);
  background: var(--carta);
  color: var(--inchiostro);
}

h1,
h2,
h3,
h4,
p,
figure,
blockquote,
dl,
dd {
  margin: 0;
}

h1,
h2,
h3,
h4 {
  font-size: inherit;
  font-weight: 600;
}

ul[class],
ol[class] {
  margin: 0;
  padding: 0;
  list-style: none;
}

img {
  display: block;
  max-width: 100%;
}

button,
input,
select,
textarea {
  font: inherit;
  color: inherit;
  letter-spacing: inherit;
}

button {
  cursor: pointer;
}

a {
  color: var(--accento-inchiostro);
  text-decoration-line: underline;
  text-decoration-thickness: 1px;
  text-underline-offset: 0.2em;
}

a:hover {
  text-decoration-thickness: 2px;
}

:focus-visible {
  outline: 2px solid var(--fuoco);
  outline-offset: 2px;
}

::selection {
  background: var(--accento-tenue-forte);
  color: var(--inchiostro);
}

hr {
  height: 0;
  margin: var(--s-4) 0;
  border: 0;
  border-top: 1px solid var(--linea);
}

strong,
b {
  font-weight: 700;
}

[hidden] {
  display: none !important;
}


/* ---------------------------------------------------------------------------
   Tipografia
   Saira, larghezza normale, solo per titoli e cifre delle misure; tutto il
   resto in Atkinson. Orari, numeri di telefono, durate e codici in Atkinson
   Mono. Pesi: 600 per titoli, etichette e pulsanti; 700 solo per il
   grassetto nel testo.
   ------------------------------------------------------------------------ */

/* Non piu' frasi grandi in testa alle pagine: al massimo 24 px (l'accesso,
   una cifra sola). Dove c'era la frase va .titolo-pagina. */
.titolo-mostra {
  font-family: var(--f-titoli);
  font-weight: 600;
  font-size: var(--t-mostra);
  line-height: 1.25;
  letter-spacing: -0.01em;
  text-wrap: balance;
}

.titolo-pagina {
  font-family: var(--f-titoli);
  font-weight: 600;
  font-size: var(--t-pagina);
  line-height: 1.4;
  letter-spacing: -0.005em;
  text-wrap: balance;
}

/* Titolo di una sezione fuori da un riquadro: come il titolo di un riquadro
   (14 px), cosi' sotto il titolo della pagina (20 px) c'e' un livello solo. */
.titolo-sezione {
  font-size: var(--t-testo);
  font-weight: 600;
  line-height: 1.43;
}

.titolo-riquadro {
  font-size: var(--t-testo);
  font-weight: 600;
  line-height: 1.43;
}

.testo-piccolo {
  font-size: var(--t-piccolo);
  line-height: 1.4;
}

.nota {
  font-size: var(--t-nota);
  line-height: 1.4;
  color: var(--secondario);
}

.secondario {
  color: var(--secondario);
}

.testo-pericolo {
  color: var(--pericolo);
}

.testo-lungo {
  max-width: 68ch;
}

/* Solo cifre (orari, durate, numeri, codici): le parole restano in Atkinson. */
.cifre {
  font-family: var(--f-cifre);
  font-size: max(0.94em, 13px);
  font-variant-numeric: tabular-nums;
  letter-spacing: -0.01em;
}

/* Un importo: <span class="importo">39,00 €</span>. Tutto nel carattere del
   testo con le cifre tabellari: la spaziatura fissa staccava la virgola e il
   simbolo («39 , 00  €»), anche dentro una colonna di cifre. */
.importo {
  font-family: var(--f-testo);
  font-variant-numeric: tabular-nums;
  letter-spacing: 0;
  white-space: nowrap;
}

/* Etichetta sopra un dato o un gruppo: come l'intestazione di una colonna,
   niente maiuscole spaziate. */
.etichetta-dato {
  font-size: var(--t-nota);
  font-weight: 600;
  line-height: 1.4;
  color: var(--secondario);
}

.numero-telefono {
  font-family: var(--f-cifre);
  font-variant-numeric: tabular-nums;
  white-space: nowrap;
}

.numero-telefono-prefisso {
  margin-right: 0.35em;
  color: var(--terziario);
}


/* ---------------------------------------------------------------------------
   Icone: <svg class="icona" aria-hidden="true"><use href="/icone.svg#i-phone"/></svg>
   ------------------------------------------------------------------------ */

/* 16 px accanto al testo di 14 (menu, pulsanti, schede); -grande per le
   voci della barra in basso e gli stati vuoti. */
.icona {
  display: inline-block;
  flex: none;
  width: 16px;
  height: 16px;
  vertical-align: -0.2em;
  fill: none;
  stroke: currentColor;
  stroke-width: 1.9;
  stroke-linecap: round;
  stroke-linejoin: round;
}

.icona-piccola {
  width: 14px;
  height: 14px;
  stroke-width: 2;
}

.icona-grande {
  width: 20px;
  height: 20px;
  stroke-width: 1.75;
}


/* ---------------------------------------------------------------------------
   Stato della linea
   Una spia piatta e una parola: dicono se il telefono e' coperto. La spia
   usa i colori di stato, mai il marchio. Niente riflessi, aloni o fili che
   corrono: si muove solo la spia di una chiamata in corso.
   ------------------------------------------------------------------------ */

.spia {
  --spia: var(--neutro-spia);
  position: relative;
  display: inline-block;
  flex: none;
  width: 8px;
  height: 8px;
  border-radius: 50%;
  background: var(--spia);
}

.spia-grande {
  width: 10px;
  height: 10px;
}

.spia-ok { --spia: var(--ok-spia); }
.spia-attenzione { --spia: var(--attenzione-spia); }
.spia-pericolo { --spia: var(--pericolo-spia); }
.spia-info { --spia: var(--info-spia); }
.spia-accento { --spia: var(--accento-inchiostro); }

.spia-spenta {
  background: transparent;
  box-shadow: inset 0 0 0 2px var(--spia);
}

.spia-viva::after {
  content: "";
  position: absolute;
  inset: -4px;
  border: 1.5px solid var(--spia);
  border-radius: 50%;
  opacity: 0;
  animation: spia-onda 1.8s var(--curva) infinite;
}

@keyframes spia-onda {
  0% { transform: scale(0.55); opacity: 0.7; }
  100% { transform: scale(1.5); opacity: 0; }
}

/* Stato della linea, nella barra in alto: data-stato decide la spia. Un
   comando basso, non una pillola: spia, parola, numero. */
.linea-stato {
  display: inline-flex;
  align-items: center;
  gap: 8px;
  min-width: 0;
  height: 28px;
  padding: 0 10px;
  border: 1px solid var(--linea);
  border-radius: var(--raggio);
  background: var(--superficie);
  color: var(--inchiostro);
  font-size: var(--t-piccolo);
  font-weight: 600;
  line-height: 1.2;
  text-decoration: none;
  white-space: nowrap;
}

a.linea-stato:hover {
  border-color: var(--linea-forte);
  text-decoration: none;
}

.linea-stato-breve {
  display: none;
}

.linea-stato-dettaglio {
  padding-left: 8px;
  border-left: 1px solid var(--linea);
  color: var(--secondario);
  font-weight: 400;
}

.linea-stato[data-stato="attiva"] .spia,
.linea-stato[data-stato="in-chiamata"] .spia,
.linea-giorno[data-stato="attiva"] .spia,
.linea-giorno[data-stato="in-chiamata"] .spia { --spia: var(--ok-spia); }
.linea-stato[data-stato="pausa"] .spia,
.linea-giorno[data-stato="pausa"] .spia { --spia: var(--attenzione-spia); }
.linea-stato[data-stato="guasto"] .spia,
.linea-giorno[data-stato="guasto"] .spia { --spia: var(--pericolo-spia); }
.linea-stato[data-stato="da-completare"] .spia,
.linea-giorno[data-stato="da-completare"] .spia {
  background: transparent;
  box-shadow: inset 0 0 0 2px var(--neutro-spia);
}

.linea-stato[data-stato="in-chiamata"] .spia::after,
.linea-giorno[data-stato="in-chiamata"] .linea-giorno-adesso .spia::after {
  content: "";
  position: absolute;
  inset: -4px;
  border: 1.5px solid var(--spia);
  border-radius: 50%;
  opacity: 0;
  animation: spia-onda 1.8s var(--curva) infinite;
}

/* La linea del giorno: il filo delle 24 ore di oggi. IN USCITA (ondata 6):
   decorativa, esce da Panoramica, Situazione, Clienti e scheda del cliente
   al posto delle chiamate vere; le regole restano finche' le pagine non la
   tolgono. --da, --a e --pos (fra 0 e 1) si impostano da JS. */
.linea-giorno {
  display: grid;
  gap: var(--s-2);
}

.linea-giorno-filo {
  position: relative;
  height: 24px;
}

.linea-giorno-filo::before {
  content: "";
  position: absolute;
  left: 0;
  right: 0;
  top: 50%;
  height: 1px;
  background: repeating-linear-gradient(90deg, var(--linea-campo) 0 3px, transparent 3px 7px);
}

.linea-giorno-orario {
  position: absolute;
  top: 50%;
  left: calc(var(--da, 0) * 100%);
  width: calc((var(--a, 0) - var(--da, 0)) * 100%);
  height: 3px;
  margin-top: -1.5px;
  border-radius: 2px;
  background: var(--inchiostro);
}

.linea-giorno-segno {
  position: absolute;
  top: 50%;
  left: calc(var(--pos, 0) * 100%);
  width: 2px;
  height: 14px;
  margin: -7px 0 0 -1px;
  border-radius: 1px;
  background: var(--secondario);
}

.linea-giorno-segno[data-esito="da-richiamare"] {
  height: 24px;
  margin-top: -12px;
  background: var(--accento-inchiostro);
}

.linea-giorno-segno[data-esito="da-richiamare"]::after {
  content: "";
  position: absolute;
  top: -4px;
  left: -2px;
  width: 6px;
  height: 6px;
  border-radius: 50%;
  background: var(--accento-inchiostro);
}

.linea-giorno-adesso {
  position: absolute;
  top: 50%;
  left: calc(var(--pos, 0) * 100%);
  display: grid;
  place-items: center;
  width: 16px;
  height: 16px;
  margin: -8px 0 0 -8px;
  border-radius: 50%;
  background: var(--fondo-locale);
}

.linea-giorno-adesso[data-ora]::after {
  content: attr(data-ora);
  position: absolute;
  bottom: calc(100% + 2px);
  left: 50%;
  padding: 0 4px;
  border-radius: 4px;
  background: var(--fondo-locale);
  color: var(--inchiostro);
  font-family: var(--f-cifre);
  font-size: var(--t-nota);
  font-weight: 600;
  line-height: 1.2;
  white-space: nowrap;
  transform: translateX(-50%);
}

.linea-giorno-scala {
  display: flex;
  justify-content: space-between;
  color: var(--terziario);
  font-family: var(--f-cifre);
  font-size: var(--t-nota);
  line-height: 1;
}

.linea-giorno-piede {
  display: flex;
  flex-wrap: wrap;
  align-items: center;
  gap: var(--s-1) var(--s-3);
  color: var(--secondario);
  font-size: var(--t-piccolo);
}

/* Versione piccola, per una riga di tabella (pannello: Situazione). */
.linea-mini {
  height: 18px;
  min-width: 120px;
}

.linea-mini .linea-giorno-orario {
  height: 2px;
  margin-top: -1px;
}

.linea-mini .linea-giorno-segno {
  height: 10px;
  margin-top: -5px;
}

.linea-mini .linea-giorno-segno[data-esito="da-richiamare"] {
  height: 14px;
  margin-top: -7px;
}

.linea-mini .linea-giorno-segno[data-esito="da-richiamare"]::after {
  display: none;
}


/* ---------------------------------------------------------------------------
   Pulsanti
   <button class="pulsante pulsante-primario">Pubblica</button>
   Varianti: -primario (uno per schermata), -secondario, -quieto,
   -pericolo (solo per confermare), -pericolo-quieto (Rimuovi).
   Misure: -piccolo, -grande, -icona (quadrato, serve aria-label).
   Stati: :disabled o aria-disabled="true"; aria-busy="true" = in corso.
   ------------------------------------------------------------------------ */

.pulsante {
  --p-fondo: var(--superficie);
  --p-testo: var(--inchiostro);
  --p-bordo: var(--linea-forte);
  --p-sopra: var(--superficie-2);
  position: relative;
  display: inline-flex;
  align-items: center;
  justify-content: center;
  gap: 6px;
  min-height: var(--altezza-pulsante);
  padding: 0 12px;
  border: 1px solid var(--p-bordo);
  border-radius: var(--raggio);
  background: var(--p-fondo);
  color: var(--p-testo);
  font-family: var(--f-testo);
  font-size: var(--t-testo);
  font-weight: 600;
  line-height: 1.1;
  text-align: center;
  text-decoration: none;
  white-space: nowrap;
  cursor: pointer;
  user-select: none;
  -webkit-tap-highlight-color: transparent;
  box-shadow: var(--ombra-1);
  transition:
    background-color var(--durata-breve) var(--curva),
    border-color var(--durata-breve) var(--curva);
}

.pulsante:hover {
  background: var(--p-sopra);
  color: var(--p-testo);
  text-decoration: none;
}

.pulsante:active {
  box-shadow: none;
}

.pulsante-primario {
  --p-fondo: var(--accento);
  --p-testo: var(--accento-testo);
  --p-bordo: var(--accento-orlo);
  --p-sopra: var(--accento-sopra);
}

.pulsante-primario:active {
  background: var(--accento-premuto);
}

.pulsante-secondario {
  --p-fondo: var(--superficie);
}

.pulsante-quieto {
  --p-fondo: transparent;
  --p-bordo: transparent;
  --p-sopra: var(--superficie-3);
  box-shadow: none;
}

.pulsante-pericolo {
  --p-fondo: var(--pericolo-pieno);
  --p-testo: #FFFFFF;
  --p-bordo: color-mix(in oklab, var(--pericolo-pieno) 80%, #000000);
  --p-sopra: color-mix(in oklab, var(--pericolo-pieno) 88%, #000000);
}

.pulsante-pericolo-quieto {
  --p-fondo: transparent;
  --p-testo: var(--pericolo);
  --p-bordo: transparent;
  --p-sopra: var(--pericolo-fondo);
  box-shadow: none;
}

.pulsante-piccolo {
  min-height: var(--altezza-piccolo);
  padding: 0 10px;
  font-size: var(--t-piccolo);
}

/* Solo per l'azione di una pagina a se' (accesso, pagamento). */
.pulsante-grande {
  min-height: 40px;
  padding: 0 16px;
}

.pulsante-icona {
  width: var(--altezza-pulsante);
  padding: 0;
}

.pulsante-icona.pulsante-piccolo {
  width: var(--altezza-piccolo);
}

.pulsante:disabled,
.pulsante[aria-disabled="true"] {
  --p-fondo: var(--superficie-3);
  --p-testo: var(--terziario);
  --p-bordo: transparent;
  --p-sopra: var(--superficie-3);
  box-shadow: none;
  cursor: not-allowed;
}

.pulsante-quieto:disabled,
.pulsante-quieto[aria-disabled="true"],
.pulsante-pericolo-quieto:disabled,
.pulsante-pericolo-quieto[aria-disabled="true"] {
  --p-fondo: transparent;
  --p-sopra: transparent;
}

.pulsante[aria-busy="true"] {
  cursor: progress;
  pointer-events: none;
}

.pulsante[aria-busy="true"] > .icona {
  display: none;
}

.pulsante[aria-busy="true"]::before {
  content: "";
  width: 12px;
  height: 12px;
  flex: none;
  border: 2px solid currentColor;
  border-right-color: transparent;
  border-radius: 50%;
  animation: gira 0.7s linear infinite;
}

@keyframes gira {
  to { transform: rotate(360deg); }
}

/* Gruppo di pulsanti; -fine li allinea a destra. */
.azioni {
  display: flex;
  flex-wrap: wrap;
  align-items: center;
  gap: var(--s-2);
}

.azioni-fine {
  justify-content: flex-end;
}

/* Comando non disponibile: il motivo sta accanto, non in un avviso. */
.comando {
  display: flex;
  flex-wrap: wrap;
  align-items: center;
  gap: var(--s-2) var(--s-3);
}

.comando-motivo {
  display: inline-flex;
  align-items: flex-start;
  gap: 6px;
  max-width: 48ch;
  color: var(--secondario);
  font-size: var(--t-nota);
  line-height: 1.45;
}

.comando-motivo > .icona {
  margin-top: 1px;
}


/* ---------------------------------------------------------------------------
   Moduli
   <div class="campo">
     <label class="campo-etichetta" for="x">Nome</label>
     <input class="controllo" id="x">
     <p class="campo-aiuto">...</p>
   </div>
   ------------------------------------------------------------------------ */

.campi {
  display: grid;
  grid-template-columns: repeat(auto-fit, minmax(min(100%, 240px), 1fr));
  gap: var(--s-3) var(--s-4);
}

.campo {
  display: grid;
  align-content: start;
  gap: 4px;
  min-width: 0;
}

.campo-largo {
  grid-column: 1 / -1;
}

.campo-etichetta {
  color: var(--inchiostro);
  font-size: var(--t-piccolo);
  font-weight: 600;
  line-height: 1.35;
}

.campo-facoltativo {
  color: var(--secondario);
  font-weight: 400;
}

.campo-aiuto {
  color: var(--secondario);
  font-size: var(--t-nota);
  line-height: 1.4;
}

.campo-errore {
  display: flex;
  align-items: flex-start;
  gap: 6px;
  color: var(--pericolo);
  font-size: var(--t-nota);
  font-weight: 600;
  line-height: 1.4;
}

.controllo {
  display: block;
  width: 100%;
  min-height: var(--altezza-controllo);
  margin: 0;
  padding: 5px 10px;
  border: 1px solid var(--linea-campo);
  border-radius: var(--raggio);
  background: var(--superficie);
  color: var(--inchiostro);
  font-size: var(--t-campo);
  line-height: 20px;
  -webkit-appearance: none;
  appearance: none;
  transition: border-color var(--durata-breve) var(--curva), box-shadow var(--durata-breve) var(--curva);
}

.controllo::placeholder {
  color: var(--terziario);
  opacity: 1;
}

.controllo:hover {
  border-color: var(--secondario);
}

.controllo:focus {
  outline: none;
  border-color: var(--fuoco);
  box-shadow: 0 0 0 1px var(--fuoco), 0 0 0 4px var(--accento-tenue-forte);
}

.controllo[aria-invalid="true"] {
  border-color: var(--pericolo);
}

.controllo[aria-invalid="true"]:focus {
  box-shadow: 0 0 0 1px var(--pericolo), 0 0 0 4px var(--pericolo-fondo);
}

.controllo:disabled,
.controllo[readonly] {
  border-color: var(--linea-forte);
  background: var(--superficie-2);
  color: var(--secondario);
}

.controllo:disabled {
  cursor: not-allowed;
}

/* Una sola altezza per i controlli di una riga (--altezza-controllo, la
   stessa dei pulsanti col mouse): data, ora e numero nelle cifre mono
   crescevano e disallineavano le file dei filtri. Il codice di accesso
   (carattere grande) e le aree di testo restano alti quanto il loro
   contenuto. :where() tiene bassa la specificita': le regole dei gruppi e
   delle app vincono ancora. */
input.controllo:where(:not([type="checkbox"], [type="radio"], [type="range"], [type="file"], [type="color"], .controllo-codice)),
select.controllo:where(:not([multiple], [size])) {
  height: var(--altezza-controllo);
}

textarea.controllo {
  min-height: 88px;
  padding-block: 7px;
  resize: vertical;
  line-height: 1.45;
}

.controllo[type="time"],
.controllo[type="date"],
.controllo[type="number"],
.controllo[type="tel"] {
  font-family: var(--f-cifre);
  font-variant-numeric: tabular-nums;
}

/* Codice di accesso a sei cifre. */
.controllo-codice {
  max-width: 13ch;
  padding-left: 0.55em;
  font-family: var(--f-cifre);
  font-size: var(--t-mostra);
  font-weight: 600;
  letter-spacing: 0.35em;
  text-align: center;
}

/* Tendina: <div class="selettore"><select class="controllo">...</select></div> */
.selettore {
  position: relative;
  display: block;
  min-width: 0;
}

.selettore > .controllo {
  padding-right: 30px;
  cursor: pointer;
}

.selettore::after {
  content: "";
  position: absolute;
  top: 50%;
  right: 10px;
  width: 14px;
  height: 14px;
  margin-top: -7px;
  background: var(--secondario);
  -webkit-mask: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='%23000' stroke-width='2.4' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpath d='m6 9 6 6 6-6'/%3E%3C/svg%3E") center / contain no-repeat;
  mask: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='%23000' stroke-width='2.4' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpath d='m6 9 6 6 6-6'/%3E%3C/svg%3E") center / contain no-repeat;
  pointer-events: none;
}

/* Controllo con icona davanti o unita' di misura dietro. */
.controllo-gruppo {
  display: flex;
  align-items: stretch;
  min-width: 0;
  border: 1px solid var(--linea-campo);
  border-radius: var(--raggio);
  background: var(--superficie);
  transition: border-color var(--durata-breve) var(--curva), box-shadow var(--durata-breve) var(--curva);
}

.controllo-gruppo:hover {
  border-color: var(--secondario);
}

.controllo-gruppo:focus-within {
  border-color: var(--fuoco);
  box-shadow: 0 0 0 1px var(--fuoco), 0 0 0 4px var(--accento-tenue-forte);
}

.controllo-gruppo > .controllo {
  flex: 1;
  min-width: 0;
  height: calc(var(--altezza-controllo) - 2px);
  min-height: calc(var(--altezza-controllo) - 2px);
  border: 0;
  background: transparent;
  box-shadow: none;
}

.controllo-gruppo > .controllo:focus {
  box-shadow: none;
}

.controllo-gruppo > .icona {
  align-self: center;
  margin-left: 10px;
  color: var(--secondario);
}

.controllo-gruppo > .icona + .controllo {
  padding-left: 8px;
}

.controllo-unita {
  display: flex;
  align-items: center;
  padding: 0 10px;
  border-left: 1px solid var(--linea);
  border-radius: 0 var(--raggio) var(--raggio) 0;
  background: var(--superficie-2);
  color: var(--secondario);
  font-size: var(--t-piccolo);
  white-space: nowrap;
}

/* Spunta e scelta: <input type="checkbox" class="spunta">, <input type="radio" class="scelta"> */
.spunta,
.scelta {
  display: inline-grid;
  place-content: center;
  flex: none;
  width: 16px;
  height: 16px;
  margin: 0;
  border: 1.5px solid var(--linea-campo);
  background: var(--superficie);
  cursor: pointer;
  -webkit-appearance: none;
  appearance: none;
  transition: background-color var(--durata-breve) var(--curva), border-color var(--durata-breve) var(--curva);
}

.spunta {
  border-radius: var(--raggio-piccolo);
}

.scelta {
  border-radius: 50%;
}

.spunta:hover,
.scelta:hover {
  border-color: var(--secondario);
}

.spunta::before {
  content: "";
  width: 11px;
  height: 11px;
  background: var(--accento-testo);
  -webkit-mask: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='%23000' stroke-width='3.2' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpath d='M20 6 9 17l-5-5'/%3E%3C/svg%3E") center / contain no-repeat;
  mask: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='%23000' stroke-width='3.2' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpath d='M20 6 9 17l-5-5'/%3E%3C/svg%3E") center / contain no-repeat;
  transform: scale(0);
  transition: transform var(--durata-breve) var(--curva);
}

.spunta:indeterminate::before {
  -webkit-mask: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='%23000' stroke-width='3.2' stroke-linecap='round'%3E%3Cpath d='M6 12h12'/%3E%3C/svg%3E") center / contain no-repeat;
  mask: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='%23000' stroke-width='3.2' stroke-linecap='round'%3E%3Cpath d='M6 12h12'/%3E%3C/svg%3E") center / contain no-repeat;
}

.scelta::before {
  content: "";
  width: 6px;
  height: 6px;
  border-radius: 50%;
  background: var(--accento-testo);
  transform: scale(0);
  transition: transform var(--durata-breve) var(--curva);
}

.spunta:checked,
.spunta:indeterminate,
.scelta:checked {
  border-color: var(--accento-orlo);
  background: var(--accento);
}

.spunta:checked::before,
.spunta:indeterminate::before,
.scelta:checked::before {
  transform: scale(1);
}

.spunta:disabled,
.scelta:disabled {
  opacity: 0.45;
  cursor: not-allowed;
}

/* Spunta o scelta con il suo testo. */
.opzione {
  display: flex;
  align-items: flex-start;
  gap: 8px;
  font-size: var(--t-testo);
  line-height: 20px;
  cursor: pointer;
}

.opzione > .spunta,
.opzione > .scelta {
  margin-top: 2px;
}

.opzione-nota {
  display: block;
  color: var(--secondario);
  font-size: var(--t-nota);
  line-height: 1.4;
}

.opzioni {
  display: grid;
  gap: var(--s-2);
  margin: 0;
  padding: 0;
  border: 0;
  min-width: 0;
}

/* Interruttore: per le impostazioni che si accendono e si spengono.
   <input type="checkbox" role="switch" class="interruttore-controllo">
   32 x 18 col mouse, 40 x 24 al tocco (blocco «Tocco» in fondo). */
.interruttore {
  display: inline-flex;
  align-items: center;
  gap: 8px;
  font-size: var(--t-testo);
  line-height: 1.4;
  cursor: pointer;
}

.interruttore-controllo {
  position: relative;
  flex: none;
  width: 32px;
  height: 18px;
  margin: 0;
  border: 1.5px solid var(--linea-campo);
  border-radius: var(--raggio-pillola);
  background: var(--incavo);
  cursor: pointer;
  -webkit-appearance: none;
  appearance: none;
  transition: background-color var(--durata) var(--curva), border-color var(--durata) var(--curva);
}

.interruttore-controllo::before {
  content: "";
  position: absolute;
  top: 1.5px;
  left: 1.5px;
  width: 12px;
  height: 12px;
  border-radius: 50%;
  background: var(--pomello);
  box-shadow: 0 1px 2px rgb(0 0 0 / 28%);
  transition: transform var(--durata) var(--curva), background-color var(--durata) var(--curva);
}

.interruttore-controllo:checked {
  border-color: var(--accento-orlo);
  background: var(--accento);
}

.interruttore-controllo:checked::before {
  background: var(--accento-testo);
  transform: translateX(14px);
}

.interruttore-controllo:disabled {
  opacity: 0.45;
  cursor: not-allowed;
}

/* Elenco di impostazioni: titolo e descrizione a sinistra, controllo a destra. */
.impostazioni {
  container-type: inline-size;
  display: grid;
}

.impostazione {
  display: grid;
  grid-template-columns: minmax(0, 1fr) auto;
  align-items: center;
  gap: var(--s-2) var(--s-6);
  padding: var(--s-3) 0;
  border-top: 1px solid var(--linea);
}

.impostazione:first-child {
  border-top: 0;
}

/* Dentro un riquadro la riga ha i margini del riquadro. */
.riquadro > .impostazioni > .impostazione {
  padding-inline: var(--s-4);
}

.impostazione-titolo {
  display: block;
  font-size: var(--t-testo);
  font-weight: 600;
  line-height: 1.43;
}

.impostazione-descrizione {
  max-width: 68ch;
  margin-top: 2px;
  color: var(--secondario);
  font-size: var(--t-nota);
  line-height: 1.4;
}

.impostazione-controllo {
  justify-self: end;
  min-width: 0;
}

.impostazione-impilata {
  grid-template-columns: minmax(0, 1fr);
}

.impostazione-impilata .impostazione-controllo {
  justify-self: stretch;
}

@container (max-width: 520px) {
  .impostazione:not(:has(> .interruttore-controllo)) {
    grid-template-columns: minmax(0, 1fr);
  }

  .impostazione:not(:has(> .interruttore-controllo)) .impostazione-controllo {
    justify-self: stretch;
  }
}


/* ---------------------------------------------------------------------------
   Schede, segmenti, filtri
   ------------------------------------------------------------------------ */

/* Schede di una pagina (role="tablist"): il filo si accende sotto la scelta. */
.schede {
  display: flex;
  gap: var(--s-5);
  margin: 0;
  padding: 0;
  border-bottom: 1px solid var(--linea);
  overflow-x: auto;
  overscroll-behavior-x: contain;
  scroll-snap-type: x proximity;
  scrollbar-width: none;
}

.schede::-webkit-scrollbar {
  display: none;
}

/* Schede e filtri rapidi che non ci stanno (telefono): la sfumatura solo
   dal lato dove la fila continua, cosi' l'ultima voce si legge intera e una
   fila che ci sta non si sfuma. data-sfuma lo mette app.js (sfumaSchede) a
   ogni scorrimento, cambio di pagina e cambio della fila. */
.schede[data-sfuma="destra"],
.filtri-rapidi[data-sfuma="destra"] {
  -webkit-mask-image: linear-gradient(90deg, #000 calc(100% - 28px), transparent);
  mask-image: linear-gradient(90deg, #000 calc(100% - 28px), transparent);
}

.schede[data-sfuma="sinistra"],
.filtri-rapidi[data-sfuma="sinistra"] {
  -webkit-mask-image: linear-gradient(90deg, transparent, #000 28px);
  mask-image: linear-gradient(90deg, transparent, #000 28px);
}

.schede[data-sfuma="entrambe"],
.filtri-rapidi[data-sfuma="entrambe"] {
  -webkit-mask-image: linear-gradient(90deg, transparent, #000 28px, #000 calc(100% - 28px), transparent);
  mask-image: linear-gradient(90deg, transparent, #000 28px, #000 calc(100% - 28px), transparent);
}

.scheda {
  position: relative;
  display: inline-flex;
  flex: none;
  align-items: center;
  gap: 6px;
  min-height: 36px;
  padding: 0;
  border: 0;
  border-radius: var(--raggio-piccolo) var(--raggio-piccolo) 0 0;
  background: none;
  color: var(--secondario);
  font-size: var(--t-testo);
  font-weight: 500;
  line-height: 1.3;
  text-decoration: none;
  white-space: nowrap;
  cursor: pointer;
  scroll-snap-align: start;
}

.scheda:hover {
  color: var(--inchiostro);
  text-decoration: none;
}

.scheda:focus-visible {
  outline-offset: -2px;
}

.scheda[aria-selected="true"],
.scheda[aria-current="page"] {
  color: var(--inchiostro);
  font-weight: 600;
}

.scheda[aria-selected="true"]::after,
.scheda[aria-current="page"]::after {
  content: "";
  position: absolute;
  left: 0;
  right: 0;
  bottom: -1px;
  height: 2px;
  border-radius: 2px 2px 0 0;
  background: var(--accento-inchiostro);
}

/* Segmenti: due-quattro scelte che si escludono (filtro, tema, periodo). */
/* Alti quanto un controllo: stanno in fila con campi e pulsanti. */
.segmenti {
  display: inline-flex;
  gap: 2px;
  max-width: 100%;
  margin: 0;
  padding: 2px;
  border: 1px solid var(--linea);
  border-radius: var(--raggio);
  background: var(--incavo);
  overflow-x: auto;
  scrollbar-width: none;
}

.segmenti::-webkit-scrollbar {
  display: none;
}

.segmento {
  position: relative;
  display: inline-flex;
  flex: none;
  align-items: center;
  justify-content: center;
  gap: 6px;
  min-height: calc(var(--altezza-controllo) - 6px);
  padding: 0 10px;
  border: 0;
  border-radius: var(--raggio-piccolo);
  background: transparent;
  color: var(--secondario);
  font-size: var(--t-piccolo);
  font-weight: 600;
  line-height: 1.1;
  white-space: nowrap;
  cursor: pointer;
  transition: background-color var(--durata-breve) var(--curva), color var(--durata-breve) var(--curva);
}

.segmento:hover {
  color: var(--inchiostro);
}

.segmento[aria-pressed="true"],
.segmento[aria-selected="true"],
.segmento:has(> input:checked) {
  background: var(--rilievo);
  color: var(--inchiostro);
  box-shadow: var(--ombra-1), 0 0 0 1px var(--linea);
}

.segmento > input {
  position: absolute;
  inset: 0;
  width: 100%;
  height: 100%;
  margin: 0;
  opacity: 0;
  cursor: pointer;
}

.segmento:has(> input:focus-visible) {
  outline: 2px solid var(--fuoco);
  outline-offset: 1px;
}

/* Filtri rapidi: si accendono e spengono, anche piu' di uno. Comandi bassi
   a spigoli morbidi, non pillole. */
.filtri-rapidi {
  display: flex;
  flex-wrap: wrap;
  gap: 6px;
}

.filtro-rapido {
  display: inline-flex;
  align-items: center;
  gap: 6px;
  min-height: var(--altezza-piccolo);
  padding: 0 10px;
  border: 1px solid var(--linea-forte);
  border-radius: var(--raggio);
  background: var(--superficie);
  color: var(--inchiostro);
  font-size: var(--t-piccolo);
  font-weight: 600;
  line-height: 1.1;
  white-space: nowrap;
  cursor: pointer;
}

.filtro-rapido:hover {
  border-color: var(--linea-campo);
}

.filtro-rapido[aria-pressed="true"] {
  border-color: var(--inchiostro);
  background: var(--inchiostro);
  color: var(--superficie);
}

.filtro-rapido[aria-pressed="true"] .conteggio {
  background: color-mix(in oklab, var(--superficie) 22%, transparent);
  color: var(--superficie);
}

/* Scelta del tema: segmenti con tre radio (Chiaro, Scuro, Automatico). */
.scelta-tema {
  min-width: 0;
  margin: 0;
  padding: 0;
  border: 0;
}

/* Nel menu dell'utente: tre colonne uguali, senza icone. */
.menu-tendina .scelta-tema .segmenti {
  display: grid;
  grid-template-columns: repeat(3, minmax(0, 1fr));
  width: 100%;
}

.menu-tendina .scelta-tema .segmento {
  padding: 0 6px;
}

.menu-tendina .scelta-tema .segmento > .icona {
  display: none;
}

.tema-rapido > .icona {
  transition: transform var(--durata) var(--curva);
}

.tema-rapido:active > .icona {
  transform: rotate(-25deg);
}

.tema-rapido-sole {
  display: none;
}

[data-theme="dark"] .tema-rapido-sole {
  display: inline-block;
}

[data-theme="dark"] .tema-rapido-luna {
  display: none;
}

@media (prefers-color-scheme: dark) {
  :root:not([data-theme]) .tema-rapido-sole {
    display: inline-block;
  }

  :root:not([data-theme]) .tema-rapido-luna {
    display: none;
  }
}


/* ---------------------------------------------------------------------------
   Riquadri, sezioni, elenchi
   I riquadri solo per gli elenchi di cose; il resto sta sulla carta.
   ------------------------------------------------------------------------ */

/* Testata della pagina: titolo di 20 px, una riga di descrizione (o di
   dati: .intestazione-pagina-dati), le azioni a destra sulla linea del
   titolo. Alta 48-56 px, non una copertina. */
.intestazione-pagina {
  display: grid;
  grid-template-columns: minmax(0, 1fr) auto;
  align-items: center;
  gap: var(--s-2) var(--s-4);
  margin-bottom: var(--s-4);
}

.intestazione-pagina > .percorso {
  grid-column: 1 / -1;
}

.intestazione-pagina-descrizione {
  max-width: 80ch;
  margin-top: 2px;
  color: var(--secondario);
  font-size: var(--t-piccolo);
}

/* Dati del soggetto sotto il titolo: codice, stato, piano, numero. */
.intestazione-pagina-dati {
  display: flex;
  flex-wrap: wrap;
  align-items: center;
  gap: 4px var(--s-3);
  margin-top: 4px;
  color: var(--secondario);
  font-size: var(--t-piccolo);
}

.intestazione-pagina-azioni {
  display: flex;
  flex-wrap: wrap;
  gap: var(--s-2);
}

/* Le schede subito sotto la testata: la testata non aggiunge altro spazio. */
.intestazione-pagina + .schede {
  margin-top: calc(-1 * var(--s-1));
}

.sezione {
  display: grid;
  gap: var(--s-3);
  min-width: 0;
}

.sezione + .sezione {
  margin-top: var(--spazio-sezioni);
}

/* Dentro una pila lo spazio fra due sezioni resta 32 px: la pila ne da'
   gia' una parte. Affiancate in una griglia non si spostano in basso. */
.pila > .sezione + .sezione {
  margin-top: calc(var(--spazio-sezioni) - var(--pila-spazio, var(--spazio-pila)));
}

.griglia > .sezione + .sezione {
  margin-top: 0;
}

.sezione-testata {
  display: flex;
  flex-wrap: wrap;
  align-items: flex-end;
  justify-content: space-between;
  gap: var(--s-1) var(--s-4);
}

.sezione-descrizione {
  max-width: 80ch;
  margin-top: 2px;
  color: var(--secondario);
  font-size: var(--t-piccolo);
}

.riquadro {
  --fondo-locale: var(--superficie);
  min-width: 0;
  border: 1px solid var(--linea);
  border-radius: var(--raggio-riquadro);
  background: var(--superficie);
}

/* Testata di un riquadro: 44 px, titolo (.titolo-riquadro) e un
   collegamento o un conteggio a destra. */
.riquadro-testata {
  display: flex;
  flex-wrap: wrap;
  align-items: center;
  justify-content: space-between;
  gap: var(--s-1) var(--s-3);
  min-height: 44px;
  padding: var(--s-2) var(--s-4);
  border-bottom: 1px solid var(--linea);
}

/* Un collegamento da solo nella testata («Apri l'agenda», «Tutti i
   clienti»): alto almeno 24 px, da toccare anche sul telefono. */
.riquadro-testata > a,
.sezione-testata > a {
  display: inline-flex;
  align-items: center;
  min-height: 24px;
}

.riquadro-corpo {
  padding: var(--spazio-riquadro);
}

.riquadro-piede {
  display: flex;
  flex-wrap: wrap;
  align-items: center;
  justify-content: space-between;
  gap: var(--s-2) var(--s-4);
  padding: var(--s-2) var(--s-4);
  border-top: 1px solid var(--linea);
  border-radius: 0 0 var(--raggio-riquadro) var(--raggio-riquadro);
  background: var(--superficie-2);
  font-size: var(--t-piccolo);
}

/* Elenco di cose (messaggi, appuntamenti di oggi): una riga per cosa, due
   righe di testo al massimo, 52-56 px. */
.elenco {
  container-type: inline-size;
  display: grid;
}

.elenco-voce {
  display: grid;
  grid-template-columns: auto minmax(0, 1fr) auto;
  align-items: center;
  gap: 2px var(--s-3);
  padding: var(--s-2) var(--s-4);
  border-top: 1px solid var(--linea);
  color: inherit;
  text-decoration: none;
}

.elenco-voce:first-child {
  border-top: 0;
}

a.elenco-voce:hover,
.elenco-voce-apribile:hover {
  background: var(--superficie-2);
  text-decoration: none;
  cursor: pointer;
}

a.elenco-voce:focus-visible {
  outline-offset: -2px;
}

/* L'ora sta in alto, sulla riga del titolo, anche quando il corpo della
   voce va su tre o quattro righe (i messaggi): come nell'agenda. */
.elenco-voce-ora {
  align-self: start;
  min-width: 6ch;
  padding-top: 1px;
  color: var(--secondario);
  font-size: var(--t-nota);
  line-height: 1.35;
}

.elenco-voce-ora > strong {
  display: block;
  color: var(--inchiostro);
  font-family: var(--f-cifre);
  font-size: var(--t-testo);
  font-variant-numeric: tabular-nums;
  font-weight: 500;
  letter-spacing: -0.01em;
}

.elenco-voce-corpo {
  display: grid;
  gap: 0;
  min-width: 0;
}

.elenco-voce-titolo {
  display: flex;
  flex-wrap: wrap;
  align-items: center;
  gap: 2px 8px;
  min-width: 0;
  font-weight: 600;
  line-height: 1.43;
}

.elenco-voce-dettaglio {
  display: -webkit-box;
  overflow: hidden;
  color: var(--secondario);
  font-size: var(--t-piccolo);
  line-height: 1.4;
  -webkit-box-orient: vertical;
  -webkit-line-clamp: 2;
  line-clamp: 2;
}

.elenco-voce-fine {
  display: flex;
  align-items: center;
  gap: var(--s-2);
  color: var(--secondario);
}

@container (max-width: 480px) {
  .elenco-voce > .pillola {
    grid-column: 2;
    justify-self: start;
  }
}

/* Coppie chiave-valore (dettaglio di una chiamata, di un cliente). */
.chiave-valore {
  display: grid;
  grid-template-columns: minmax(120px, max-content) minmax(0, 1fr);
  gap: 6px var(--s-4);
  margin: 0;
  font-size: var(--t-testo);
  line-height: 1.43;
}

.chiave-valore dt {
  color: var(--secondario);
  font-size: var(--t-piccolo);
  line-height: 20px;
}

.chiave-valore dd {
  min-width: 0;
  margin: 0;
  color: var(--inchiostro);
  font-weight: 500;
  overflow-wrap: anywhere;
}

/* Due colonne di coppie affiancate sopra i 960 px (scheda del cliente). */
.chiave-valore-doppia {
  grid-template-columns: minmax(120px, max-content) minmax(0, 1fr) minmax(120px, max-content) minmax(0, 1fr);
}

@media (max-width: 959px) {
  .chiave-valore-doppia {
    grid-template-columns: minmax(120px, max-content) minmax(0, 1fr);
  }
}


/* ---------------------------------------------------------------------------
   Tabelle: sotto i 680 px del contenitore ogni riga diventa una scheda.
   <div class="tabella-contenitore"><table class="tabella">...
   Ogni <td> ha data-etichetta="..." (il nome della colonna, per la scheda).
   Con .tabella-apribile il collegamento della cella principale copre tutta
   la scheda e la colonna con la sola freccia (.col-apri) sparisce.
   Con .tabella-a-voci la scheda diventa una voce d'elenco su due righe, come
   i Messaggi: l'ora a sinistra (.cella-ora), il nome in alto
   (.cella-principale), una misura a destra (.cella-fine), il resto sotto
   senza etichette; .cella-tecnica e .col-azioni si nascondono, .cella-solo-voce
   compare solo qui.
   ------------------------------------------------------------------------ */

.tabella-contenitore {
  position: relative;
  container-type: inline-size;
  min-width: 0;
  overflow-x: auto;
  border: 1px solid var(--linea);
  border-radius: var(--raggio-riquadro);
  background: var(--superficie);
}

/* Righe da 37 px su una riga (8 + 20 + 8 + il filo), 55 px su due (nome e
   codice). Intestazione da 33 px in 13 px, nel colore secondario. */
/* Una tabella dentro un riquadro (sotto la sua testata): niente secondo
   bordo, niente angoli. */
.tabella-contenitore-interna {
  border: 0;
  border-radius: 0 0 var(--raggio-riquadro) var(--raggio-riquadro);
}

.tabella-contenitore-interna .tabella thead th:is(:first-child, :last-child) {
  border-radius: 0;
}

.tabella {
  width: 100%;
  border-collapse: collapse;
  font-size: var(--t-testo);
  line-height: 20px;
}

.tabella th {
  height: 32px;
  padding: 0 var(--s-3);
  border-bottom: 1px solid var(--linea);
  background: var(--superficie-2);
  color: var(--secondario);
  font-size: var(--t-piccolo);
  font-weight: 600;
  line-height: 1.2;
  text-align: left;
  white-space: nowrap;
}

.tabella thead th:first-child {
  border-top-left-radius: var(--raggio-riquadro);
}

.tabella thead th:last-child {
  border-top-right-radius: var(--raggio-riquadro);
}

.tabella td {
  padding: var(--s-2) var(--s-3);
  border-bottom: 1px solid var(--linea);
  vertical-align: middle;
}

/* La prima e l'ultima colonna hanno il margine del riquadro (non nelle
   schede sotto i 680 px). */
@container (min-width: 680px) {
  .tabella th:first-child,
  .tabella td:first-child {
    padding-left: var(--s-4);
  }

  .tabella th:last-child,
  .tabella td:last-child {
    padding-right: var(--s-4);
  }

  /* Con una colonna di riassunto (che prende tutto lo spazio) le altre
     celle non vanno a capo: sarebbe «Mario / Rossi», pillole una sotto
     l'altra. */
  .tabella:has(.cella-testo) td:not(.cella-testo) {
    white-space: nowrap;
  }

  .tabella:has(.cella-testo) td:not(.cella-testo) > * {
    flex-wrap: nowrap;
  }
}

.tabella tbody tr:last-child td {
  border-bottom: 0;
}

.tabella tbody tr:hover {
  background: var(--superficie-2);
}

.tabella .cella-principale {
  font-weight: 600;
}

/* Seconda riga di una cella (codice del cliente, piano, numero). */
.cella-sotto {
  display: block;
  color: var(--secondario);
  font-size: var(--t-piccolo);
  font-weight: 400;
  line-height: 18px;
}

/* Larghezze delle colonne ricorrenti: la tabella non si allarga a caso. */
.tabella .col-ora { width: 8.5rem; white-space: nowrap; }
.tabella .col-stato { width: 9.5rem; }
.tabella .col-durata { width: 5rem; }
.tabella .col-stretta { width: 1%; white-space: nowrap; }

/* Testo lungo in una cella (riassunto): una riga sola, i puntini; la
   colonna prende lo spazio che resta, le altre stanno su una riga. */
.tabella .cella-testo {
  width: 100%;
  max-width: 0;
  overflow: hidden;
  color: var(--secondario);
  text-overflow: ellipsis;
  white-space: nowrap;
}

.tabella .cella-principale a {
  color: inherit;
  text-decoration: none;
}

.tabella .cella-principale a:hover {
  text-decoration: underline;
}

.tabella .col-numero {
  font-family: var(--f-cifre);
  font-variant-numeric: tabular-nums;
  text-align: right;
  white-space: nowrap;
}

.tabella th.col-numero {
  font-family: var(--f-testo);
}

.tabella .col-azioni {
  width: 1%;
  text-align: right;
  white-space: nowrap;
}

/* Pulsanti con e senza icona sulla stessa linea. Col mouse un pulsante in
   una cella non allunga la riga: sborda nel margine della cella. */
.tabella .col-azioni > .pulsante {
  vertical-align: middle;
}

@media (hover: hover) and (pointer: fine) {
  .tabella td > .pulsante-piccolo {
    margin-block: -4px;
  }
}

@container (max-width: 679px) {
  .tabella thead {
    position: absolute;
    width: 1px;
    height: 1px;
    overflow: hidden;
    clip-path: inset(50%);
    white-space: nowrap;
  }

  .tabella,
  .tabella tbody,
  .tabella tr,
  .tabella td {
    display: block;
    width: 100%;
  }

  .tabella tr {
    padding: var(--s-3) var(--s-4);
    border-top: 1px solid var(--linea);
  }

  .tabella tbody tr:first-child {
    border-top: 0;
  }

  /* Solo .tabella td: con «tbody tr:last-child td» l'ultima scheda aveva
     anche la cella principale allineata a destra. */
  .tabella td {
    display: flow-root;
    padding: 2px 0;
    border: 0;
    text-align: right;
  }

  .tabella td[data-etichetta]::before {
    content: attr(data-etichetta);
    float: left;
    margin-right: var(--s-4);
    color: var(--secondario);
    font-family: var(--f-testo);
    font-size: var(--t-piccolo);
    font-weight: 400;
    text-align: left;
  }

  .tabella .cella-principale {
    display: block;
    padding-bottom: 4px;
    font-size: var(--t-testo);
    text-align: left;
  }

  .tabella .cella-testo {
    width: 100%;
    max-width: none;
    white-space: normal;
  }

  .tabella .col-ora,
  .tabella .col-stato,
  .tabella .col-durata,
  .tabella .col-stretta {
    width: 100%;
  }

  .tabella .cella-principale::before {
    display: none;
  }

  .tabella .col-numero {
    text-align: right;
  }

  .tabella .col-azioni {
    padding-top: var(--s-2);
    text-align: left;
  }

  .tabella .cella-principale a {
    display: inline-block;
    padding-block: 2px;
  }

  /* Un collegamento in una cella della scheda (il cliente di un numero, di
     una segnalazione): alto almeno 24 px, da toccare col dito. */
  .tabella td > a:not(.pulsante) {
    display: inline-flex;
    align-items: center;
    min-height: 24px;
  }

  /* Schede apribili: il collegamento della cella principale copre tutta la
     scheda, e la colonna con la sola freccia (.col-apri) sparisce. */
  .tabella-apribile tr {
    position: relative;
  }

  .tabella-apribile .cella-principale a::after {
    content: "";
    position: absolute;
    inset: 0;
  }

  .tabella-apribile .cella-principale a:focus-visible {
    outline: none;
  }

  .tabella-apribile .cella-principale a:focus-visible::after {
    border-radius: var(--raggio-piccolo);
    outline: 2px solid var(--fuoco);
    outline-offset: -3px;
  }

  /* I controlli dentro la scheda restano cliccabili sopra il collegamento. */
  .tabella-apribile td:not(.cella-principale) a,
  .tabella-apribile td button {
    position: relative;
    z-index: 1;
  }

  .tabella .col-apri {
    display: none;
  }

  /* Voce d'elenco su due righe. */
  .tabella-a-voci tr {
    display: grid;
    grid-template-columns: minmax(0, 1fr) auto;
    column-gap: var(--s-4);
    row-gap: 0;
    align-items: start;
    padding: var(--s-3) var(--s-4);
  }

  /* Lo spazio fra le righe della voce sta sulle celle, non nella griglia:
     l'ora occupa piu' righe e quelle vuote non aggiungono spazio. */
  .tabella-a-voci tr > td:not(.cella-ora):not(.cella-principale):not(.cella-fine) {
    margin-top: 2px;
  }

  .tabella-a-voci tr:has(> .cella-ora) {
    grid-template-columns: auto minmax(0, 1fr) auto;
  }

  .tabella-a-voci tbody tr:hover {
    background: var(--superficie-2);
  }

  .tabella-a-voci td {
    grid-column: 1 / -1;
    padding: 0;
    text-align: left;
  }

  .tabella-a-voci tr:has(> .cella-ora) > td {
    grid-column: 2 / -1;
  }

  .tabella-a-voci td[data-etichetta]::before {
    display: none;
  }

  /* <td class="cella-ora"><span>oggi</span> <strong>16:40</strong></td>:
     sulla voce l'ora sta sopra e il giorno sotto. */
  .tabella-a-voci tr > .cella-ora,
  .tabella-a-voci tr:has(> .cella-ora) > .cella-ora {
    display: flex;
    flex-direction: column-reverse;
    justify-content: flex-end;
    grid-column: 1;
    grid-row: 1 / span 6;
    min-width: 52px;
    padding-top: 2px;
    color: var(--secondario);
    font-size: var(--t-nota);
    line-height: 1.35;
  }

  .tabella-a-voci tr > .cella-ora strong {
    color: var(--inchiostro);
    font-size: var(--t-piccolo);
    font-weight: 500;
  }

  .tabella-a-voci tr > .cella-principale {
    grid-column: 1;
    grid-row: 1;
    padding: 0;
    font-size: var(--t-testo);
  }

  .tabella-a-voci tr > .cella-fine {
    grid-column: 2;
    grid-row: 1;
    padding-top: 3px;
    color: var(--secondario);
    font-size: var(--t-nota);
    text-align: right;
  }

  .tabella-a-voci tr:has(> .cella-ora) > .cella-principale {
    grid-column: 2;
  }

  .tabella-a-voci tr:has(> .cella-ora) > .cella-fine {
    grid-column: 3;
  }

  .tabella-a-voci .cella-testo {
    display: -webkit-box;
    overflow: hidden;
    color: var(--secondario);
    -webkit-box-orient: vertical;
    -webkit-line-clamp: 2;
    line-clamp: 2;
  }

  .tabella-a-voci .cella-tecnica,
  .tabella-a-voci .col-azioni,
  .tabella-a-voci td:empty {
    display: none;
  }

  /* Una cella che esiste solo nella voce (un riassunto di colonne tecniche). */
  .tabella-a-voci td.cella-solo-voce:not(:empty) {
    display: block;
  }
}

/* Tabella compatta (tabelle di numeri e impostazioni: costi, listino, soglie,
   numeri, accessi): sotto i 680 px niente scheda con una coppia per riga.
   In alto il nome (.cella-principale) e a destra la misura (.cella-fine);
   sotto, le altre coppie «etichetta valore» una dopo l'altra, in piccolo,
   finche' c'e' posto; le azioni in fondo a destra, sulla stessa riga se ci
   stanno. .cella-tecnica sparisce. */
@container (max-width: 679px) {
  .tabella-compatta tr {
    display: flex;
    flex-wrap: wrap;
    align-items: baseline;
    gap: 2px var(--s-4);
    padding: var(--s-2) var(--s-4);
  }

  .tabella-compatta td {
    display: inline-flex;
    flex-wrap: wrap;
    order: 2;
    align-items: baseline;
    gap: 0 6px;
    width: auto;
    max-width: 100%;
    min-width: 0;
    padding: 0;
    font-size: var(--t-piccolo);
    line-height: 20px;
    text-align: left;
  }

  /* Nessuna larghezza di colonna nella scheda: .col-azioni (1%) faceva
     uscire i pulsanti dal bordo, .col-stato e .col-ora (100%) andavano a
     capo da sole. */
  .tabella.tabella-compatta td,
  .tabella.tabella-compatta th {
    width: auto;
  }

  .tabella-compatta td[data-etichetta]::before {
    float: none;
    margin-right: 0;
  }

  .tabella-compatta tr > .cella-principale {
    display: block;
    flex: 1 1 55%;
    order: 0;
    padding: 0;
    font-size: var(--t-testo);
  }

  /* Un a capo dopo nome e misura: le coppie cominciano sempre sulla
     seconda riga, mai accanto alla misura. */
  .tabella-compatta tbody tr::after {
    content: "";
    flex-basis: 100%;
    order: 1;
    height: 0;
  }

  /* La misura sta sulla prima riga, accanto al nome, dovunque sia la sua
     colonna. */
  .tabella-compatta tr > .cella-fine {
    order: 1;
    margin-left: auto;
    font-size: var(--t-testo);
    text-align: right;
  }

  .tabella-compatta tr > .cella-fine::before {
    display: none;
  }

  .tabella-compatta tbody th {
    flex-basis: 100%;
    padding: 0;
  }

  .tabella-compatta .col-azioni {
    flex-wrap: wrap;
    align-items: center;
    gap: var(--s-2);
    margin-left: auto;
    padding-top: 0;
  }

  .tabella-compatta .cella-tecnica,
  .tabella-compatta td:empty {
    display: none;
  }
}

/* Fuori dalla voce la cella solo-voce non c'e'. */
.tabella .cella-solo-voce {
  display: none;
}

/* Sopra i 680 px le celle d'ora stanno su una riga: «oggi 16:40». */
.tabella .cella-ora {
  white-space: nowrap;
}

.tabella .cella-ora strong {
  font-family: var(--f-cifre);
  font-variant-numeric: tabular-nums;
  font-weight: 400;
}


/* ---------------------------------------------------------------------------
   Stati: pillole, conteggi, misuratori
   ------------------------------------------------------------------------ */

/* Stato di una riga: un'etichetta bassa (20 px), a spigoli morbidi, con la
   spia e la parola. Il fondo tenue basta: il bordo resta solo dove il fondo
   e' quello della superficie (Messaggio). */
.pillola {
  --pillola-testo: var(--secondario);
  --pillola-fondo: var(--superficie-3);
  --pillola-bordo: transparent;
  --spia: var(--neutro-spia);
  display: inline-flex;
  align-items: center;
  gap: 5px;
  height: 20px;
  padding: 0 6px;
  border: 1px solid var(--pillola-bordo);
  border-radius: var(--raggio-piccolo);
  background: var(--pillola-fondo);
  color: var(--pillola-testo);
  font-size: var(--t-nota);
  font-weight: 600;
  line-height: 1;
  vertical-align: middle;
  white-space: nowrap;
}

.pillola::before {
  content: "";
  flex: none;
  width: 6px;
  height: 6px;
  border-radius: 50%;
  background: var(--spia);
}

.pillola-ok {
  --pillola-testo: var(--ok);
  --pillola-fondo: var(--ok-fondo);
  --spia: var(--ok-spia);
}

.pillola-attenzione {
  --pillola-testo: var(--attenzione);
  --pillola-fondo: var(--attenzione-fondo);
  --spia: var(--attenzione-spia);
}

.pillola-pericolo {
  --pillola-testo: var(--pericolo);
  --pillola-fondo: var(--pericolo-fondo);
  --spia: var(--pericolo-spia);
}

.pillola-info {
  --pillola-testo: var(--info);
  --pillola-fondo: var(--info-fondo);
  --spia: var(--info-spia);
}

/* Due esiti che non usano il marchio (un marchio verde sembrerebbe «ok», uno
   blu «info»): «Da richiamare» e' piena d'inchiostro, tocca a qualcuno;
   «Messaggio» e' chiara con il bordo e la spia quadrata di un foglietto. */
.pillola-richiamo {
  --pillola-testo: var(--superficie);
  --pillola-fondo: var(--inchiostro);
  --pillola-bordo: var(--inchiostro);
  --spia: var(--spia-su-inchiostro);
}

.pillola-messaggio {
  --pillola-testo: var(--inchiostro);
  --pillola-fondo: var(--superficie);
  --pillola-bordo: var(--linea-campo);
  --spia: var(--inchiostro);
}

.pillola-messaggio::before {
  border-radius: 2px;
}

/* Piena: non si confonde con info nemmeno quando il marchio e' blu. */
.pillola-accento {
  --pillola-testo: var(--accento-testo);
  --pillola-fondo: var(--accento);
  --pillola-bordo: var(--accento-orlo);
  --spia: var(--accento-testo);
}

.pillola-viva {
  --pillola-testo: var(--ok);
  --pillola-fondo: var(--ok-fondo);
  --spia: var(--ok-spia);
}

.pillola-viva::before {
  box-shadow: 0 0 0 3px color-mix(in oklab, var(--spia) 30%, transparent);
  animation: pillola-battito 1.4s ease-in-out infinite;
}

@keyframes pillola-battito {
  50% { box-shadow: 0 0 0 1px color-mix(in oklab, var(--spia) 30%, transparent); opacity: 0.55; }
}

.pillola-senza-spia::before {
  display: none;
}

.conteggio {
  display: inline-grid;
  place-items: center;
  min-width: 18px;
  height: 18px;
  padding: 0 5px;
  border-radius: var(--raggio-pillola);
  background: var(--superficie-3);
  color: var(--inchiostro);
  font-family: var(--f-cifre);
  font-size: var(--t-nota);
  font-weight: 600;
  font-variant-numeric: tabular-nums;
  line-height: 1;
}

/* Il conteggio dentro un titolo («Messaggi da gestire 3»): staccato dal testo. */
.titolo-riquadro > .conteggio,
.titolo-sezione > .conteggio {
  margin-left: var(--s-2);
  vertical-align: 1px;
}

/* Cose da fare (messaggi aperti, segnalazioni nuove): inchiostro pieno, non
   il marchio, che in verde sembrerebbe «tutto bene». */
.conteggio-evidente {
  background: var(--inchiostro);
  color: var(--superficie);
}

/* Misuratore: <progress class="misuratore" value="214" max="400"> */
.misuratore {
  display: block;
  width: 100%;
  height: 6px;
  border: 0;
  border-radius: var(--raggio-pillola);
  background: var(--incavo);
  color: var(--accento-inchiostro);
  overflow: hidden;
  -webkit-appearance: none;
  appearance: none;
}

.misuratore::-webkit-progress-bar {
  border-radius: var(--raggio-pillola);
  background: var(--incavo);
}

.misuratore::-webkit-progress-value {
  border-radius: var(--raggio-pillola);
  background: var(--accento-inchiostro);
}

.misuratore::-moz-progress-bar {
  border-radius: var(--raggio-pillola);
  background: var(--accento-inchiostro);
}

.misuratore-alto::-webkit-progress-value {
  background: var(--attenzione-spia);
}

.misuratore-alto::-moz-progress-bar {
  background: var(--attenzione-spia);
}

.misuratore-pieno::-webkit-progress-value {
  background: var(--pericolo-spia);
}

.misuratore-pieno::-moz-progress-bar {
  background: var(--pericolo-spia);
}

/* Misure (Panoramica, Situazione, scheda del cliente): una striscia in un
   riquadro, celle divise da un filo. Etichetta di 13, cifra di 20, una riga
   di confronto: 76 px in tutto. */
.misure {
  display: grid;
  grid-template-columns: repeat(auto-fit, minmax(min(100%, 140px), 1fr));
  gap: 0;
  margin: 0;
  border: 1px solid var(--linea);
  border-radius: var(--raggio-riquadro);
  background: var(--superficie);
  overflow: hidden;
}

/* Il filo a sinistra e sopra ogni cella: sui bordi del riquadro resta
   nascosto, e una riga incompleta non lascia caselle grigie. */
.misura {
  --fondo-locale: var(--superficie);
  display: grid;
  align-content: start;
  gap: 2px;
  min-width: 0;
  padding: var(--s-3) var(--s-4);
  background: var(--superficie);
  box-shadow: -1px 0 0 var(--linea), 0 -1px 0 var(--linea);
}

.misura-etichetta {
  overflow: hidden;
  color: var(--secondario);
  font-size: var(--t-piccolo);
  font-weight: 500;
  text-overflow: ellipsis;
  white-space: nowrap;
}

.misura-valore {
  margin: 0;
  font-family: var(--f-titoli);
  font-size: var(--t-pagina);
  font-weight: 600;
  font-variant-numeric: tabular-nums;
  line-height: 1.2;
}

/* «214 / 400»: il totale piu' piccolo, accanto. */
.misura-valore > small {
  margin-left: 4px;
  color: var(--secondario);
  font-family: var(--f-testo);
  font-size: var(--t-piccolo);
  font-weight: 500;
}

.misura-confronto {
  display: flex;
  align-items: center;
  gap: 4px;
  margin: 0;
  color: var(--secondario);
  font-size: var(--t-nota);
}

.misura > .misuratore {
  margin-top: 4px;
}

/* Passi da completare (Panoramica): una sequenza vera, quindi numerata. */
.da-fare {
  display: grid;
}

.da-fare-voce {
  display: grid;
  grid-template-columns: 24px minmax(0, 1fr) auto;
  align-items: center;
  gap: var(--s-1) var(--s-3);
  padding: var(--s-2) var(--s-4);
  border-top: 1px solid var(--linea);
}

.da-fare-voce:first-child {
  border-top: 0;
}

.da-fare-segno {
  display: grid;
  place-items: center;
  width: 24px;
  height: 24px;
  border: 1.5px dashed var(--linea-campo);
  border-radius: 50%;
  color: var(--secondario);
  font-family: var(--f-cifre);
  font-size: var(--t-nota);
  font-weight: 600;
}

.da-fare-voce[data-fatto] .da-fare-segno {
  border: 0;
  background: var(--ok-fondo);
  color: var(--ok);
}

.da-fare-titolo {
  font-weight: 600;
  line-height: 1.43;
}

.da-fare-voce[data-fatto] .da-fare-titolo {
  color: var(--secondario);
}

.tacche {
  display: inline-flex;
  gap: 4px;
}

/* La tacca vuota ha il bordo dei campi (3:1 sul fondo), visibile anche nel
   tema scuro. */
.tacca {
  width: 22px;
  height: 6px;
  border-radius: 3px;
  background: transparent;
  box-shadow: inset 0 0 0 1.5px var(--linea-campo);
}

.tacca-piena {
  background: var(--ok-spia);
  box-shadow: none;
}


/* ---------------------------------------------------------------------------
   Allerte, stati vuoti, caricamento
   ------------------------------------------------------------------------ */

.allerta {
  --allerta-segno: var(--info);
  --allerta-fondo: var(--info-fondo);
  --allerta-bordo: var(--info-bordo);
  display: grid;
  grid-template-columns: auto minmax(0, 1fr) auto;
  align-items: start;
  gap: 2px var(--s-2);
  padding: 10px var(--s-3);
  border: 1px solid var(--allerta-bordo);
  border-radius: var(--raggio);
  background: var(--allerta-fondo);
  color: var(--inchiostro);
  font-size: var(--t-piccolo);
  line-height: 1.45;
}

.allerta > .icona {
  margin-top: 2px;
  color: var(--allerta-segno);
}

.allerta-corpo {
  display: grid;
  gap: 0;
  min-width: 0;
}

.allerta-titolo {
  font-weight: 600;
}

.allerta-azioni {
  display: flex;
  flex-wrap: wrap;
  align-self: center;
  gap: var(--s-2);
}

.allerta-ok {
  --allerta-segno: var(--ok);
  --allerta-fondo: var(--ok-fondo);
  --allerta-bordo: var(--ok-bordo);
}

.allerta-attenzione {
  --allerta-segno: var(--attenzione);
  --allerta-fondo: var(--attenzione-fondo);
  --allerta-bordo: var(--attenzione-bordo);
}

.allerta-pericolo {
  --allerta-segno: var(--pericolo);
  --allerta-fondo: var(--pericolo-fondo);
  --allerta-bordo: var(--pericolo-bordo);
}

@media (max-width: 679px) {
  .allerta {
    grid-template-columns: auto minmax(0, 1fr);
  }

  .allerta-azioni {
    grid-column: 2;
    margin-top: var(--s-2);
  }
}

/* Stato vuoto: dice cosa comparira' e propone il primo passo. */
/* Stato vuoto: una riga di titolo, una di testo, il primo passo. Compatto:
   dentro un riquadro (.vuoto-interno) sta nell'altezza di tre righe. */
.vuoto {
  display: grid;
  justify-items: start;
  gap: var(--s-1);
  padding: var(--s-5) var(--s-4);
  border: 1px dashed var(--linea-forte);
  border-radius: var(--raggio-riquadro);
}

.vuoto-interno {
  border: 0;
  border-radius: 0;
}

.vuoto-icona {
  display: grid;
  place-items: center;
  width: 32px;
  height: 32px;
  margin-bottom: var(--s-1);
  border: 1px solid var(--linea);
  border-radius: var(--raggio);
  background: var(--superficie);
  color: var(--secondario);
}

.vuoto-titolo {
  font-size: var(--t-testo);
  font-weight: 600;
  line-height: 1.43;
}

.vuoto-testo {
  max-width: 64ch;
  color: var(--secondario);
  font-size: var(--t-piccolo);
}

.vuoto > .azioni {
  margin-top: var(--s-2);
}

/* Segnaposto durante il caricamento (il contenitore ha aria-busy="true"). */
.segnaposto {
  display: block;
  width: 100%;
  height: 14px;
  border-radius: var(--raggio-piccolo);
  background: linear-gradient(90deg, var(--incavo) 0 40%, var(--superficie-2) 50%, var(--incavo) 60% 100%);
  background-size: 300% 100%;
  animation: luccica 1.6s linear infinite;
}

@keyframes luccica {
  from { background-position: 100% 0; }
  to { background-position: 0 0; }
}

.segnaposto-titolo {
  width: 30%;
  height: 20px;
}

.segnaposto-corta {
  width: 60%;
}

.segnaposto-tondo {
  width: 24px;
  height: 24px;
  border-radius: 50%;
}

.segnaposto-blocco {
  height: 96px;
  border-radius: var(--raggio-riquadro);
}


/* ---------------------------------------------------------------------------
   Finestre di dialogo, notifiche, menu a tendina
   ------------------------------------------------------------------------ */

/* <dialog class="finestra"> aperta con showModal(); sul telefono sale dal basso. */
.finestra {
  width: min(520px, calc(100vw - 32px));
  max-height: min(85vh, 760px);
  padding: 0;
  border: 1px solid var(--linea);
  border-radius: var(--raggio-finestra);
  background: var(--superficie);
  color: var(--inchiostro);
  box-shadow: var(--ombra-3);
  overflow: auto;
}

.finestra::backdrop {
  background: var(--velo, rgb(17 18 21 / 50%));
}

.finestra[open] {
  animation: finestra-entra var(--durata-lunga) var(--curva);
}

@keyframes finestra-entra {
  from { opacity: 0; transform: translateY(6px); }
}

.finestra-testata {
  display: flex;
  align-items: center;
  justify-content: space-between;
  gap: var(--s-3);
  padding: var(--s-3) var(--s-3) 0 var(--s-5);
}

.finestra-titolo {
  font-family: var(--f-titoli);
  font-size: var(--t-sottotitolo);
  font-weight: 600;
  line-height: 1.4;
}

.finestra-corpo {
  display: grid;
  gap: var(--s-3);
  padding: var(--s-3) var(--s-5) var(--s-5);
}

.finestra-azioni {
  position: sticky;
  bottom: 0;
  display: flex;
  flex-wrap: wrap;
  justify-content: flex-end;
  gap: var(--s-2);
  padding: var(--s-3) var(--s-5);
  border-top: 1px solid var(--linea);
  background: var(--superficie-2);
}

/* Finestra di lato (dettaglio di una chiamata, di un messaggio): alta come
   la pagina, a destra, 720 px; l'elenco resta visibile a sinistra. Sotto i
   680 px occupa lo schermo. <dialog class="finestra finestra-lato">. */
.finestra-lato {
  width: min(var(--larghezza-lato-finestra), 100vw);
  max-width: 100vw;
  height: 100vh;
  height: 100dvh;
  max-height: none;
  margin: 0 0 0 auto;
  border-width: 0 0 0 1px;
  border-radius: 0;
  overflow: hidden;
}

.finestra-lato[open] {
  display: flex;
  flex-direction: column;
  animation-name: lato-entra;
}

@keyframes lato-entra {
  from { opacity: 0; transform: translateX(24px); }
}

.finestra-lato > .finestra-testata {
  flex: none;
  min-height: var(--altezza-barra);
  padding: var(--s-2) var(--s-3) var(--s-2) var(--s-5);
  border-bottom: 1px solid var(--linea);
}

.finestra-lato > .finestra-corpo,
.finestra-lato > form > .finestra-corpo {
  flex: 1;
  align-content: start;
  gap: var(--s-4);
  padding: var(--s-4) var(--s-5) var(--s-6);
  overflow-y: auto;
  overscroll-behavior: contain;
}

.finestra-lato > .finestra-azioni {
  flex: none;
  justify-content: flex-start;
}

.elenco-puntato {
  display: grid;
  gap: 6px;
  margin: 0;
  padding-left: 1.2em;
}

@media (max-width: 679px) {
  .finestra {
    width: 100%;
    max-width: 100%;
    max-height: 92vh;
    margin: auto 0 0;
    border-width: 1px 0 0;
    border-radius: var(--raggio-finestra) var(--raggio-finestra) 0 0;
  }

  .finestra[open] {
    animation-name: foglio-sale;
  }

  .finestra-azioni {
    flex-direction: column-reverse;
    padding-bottom: calc(var(--s-4) + env(safe-area-inset-bottom));
  }

  .finestra-azioni > .pulsante {
    width: 100%;
  }
}

@keyframes foglio-sale {
  from { transform: translateY(40px); opacity: 0; }
}

/* Notifiche brevi: <div class="notifiche" aria-live="polite"> in fondo alla pagina.
   Non coprono mai la barra di pubblicazione: l'app scrive in
   --notifiche-sopra-barra la distanza fra il fondo della finestra e il bordo
   alto della barra (0 senza barra), e le notifiche stanno sopra.
   Il bordo destro e' quello del contenuto (.pagina-interna: menu a lato,
   margine della pagina, larghezza massima); in percentuale della finestra,
   cosi' la barra di scorrimento non lo sposta. */
.notifiche {
  position: fixed;
  z-index: 80;
  right: max(var(--spazio-pagina-lati), calc(100% - var(--larghezza-lato) - var(--spazio-pagina-lati) - var(--larghezza-contenuto)));
  bottom: max(var(--s-5), var(--notifiche-sopra-barra, 0px));
  display: grid;
  gap: var(--s-2);
  width: min(400px, calc(100vw - 32px));
  pointer-events: none;
}

.notifica {
  display: grid;
  grid-template-columns: auto minmax(0, 1fr) auto;
  align-items: center;
  gap: var(--s-2);
  padding: 6px 6px 6px var(--s-3);
  border: 1px solid var(--linea);
  border-radius: var(--raggio-riquadro);
  background: var(--carta);
  color: var(--inchiostro);
  box-shadow: var(--ombra-2);
  font-size: var(--t-piccolo);
  line-height: 1.4;
  pointer-events: auto;
  animation: notifica-entra var(--durata-lunga) var(--curva);
}

.notifica > .spia {
  --spia: var(--info-spia);
}

.notifica-ok > .spia { --spia: var(--ok-spia); }
.notifica-attenzione > .spia { --spia: var(--attenzione-spia); }
.notifica-pericolo > .spia { --spia: var(--pericolo-spia); }

.notifica-azioni {
  display: flex;
  align-items: center;
  gap: 2px;
}

@keyframes notifica-entra {
  from { opacity: 0; transform: translateY(8px); }
}

/* Avviso «nuova versione» (versione-web.js): vuoto non occupa spazio; pieno
   resta in alto al centro, sopra la testata, finche' non si ricarica. Il
   contenitore ha sempre role="status", cosi' il testo nuovo viene letto. */
.avviso-versione {
  position: fixed;
  z-index: 90;
  top: var(--s-3);
  left: 50%;
  transform: translateX(-50%);
  display: flex;
  flex-wrap: wrap;
  align-items: center;
  gap: var(--s-2) var(--s-3);
  width: max-content;
  max-width: calc(100vw - 32px);
  padding: 6px 6px 6px var(--s-3);
  border: 1px solid var(--info-bordo);
  border-radius: var(--raggio-riquadro);
  background: var(--carta);
  color: var(--inchiostro);
  box-shadow: var(--ombra-2);
  font-size: var(--t-piccolo);
  line-height: 1.4;
}

.avviso-versione:empty {
  display: none;
}


/* Menu a tendina (menu dell'utente): il contenitore ha position: relative. */
.menu-tendina {
  position: absolute;
  z-index: 40;
  top: calc(100% + 4px);
  right: 0;
  min-width: 260px;
  padding: 4px;
  border: 1px solid var(--linea);
  border-radius: var(--raggio-riquadro);
  background: var(--superficie);
  color: var(--inchiostro);
  box-shadow: var(--ombra-2);
}

.menu-tendina-testata {
  display: grid;
  gap: 0;
  margin-bottom: 4px;
  padding: 8px 10px;
  border-bottom: 1px solid var(--linea);
}

.menu-tendina-voce {
  display: flex;
  align-items: center;
  gap: 8px;
  width: 100%;
  min-height: var(--altezza-pulsante);
  padding: 0 8px;
  border: 0;
  border-radius: var(--raggio-piccolo);
  background: none;
  color: var(--inchiostro);
  font-size: var(--t-testo);
  font-weight: 500;
  text-align: left;
  text-decoration: none;
  cursor: pointer;
}

.menu-tendina-voce:hover {
  background: var(--superficie-2);
  text-decoration: none;
}

.menu-tendina-voce > .icona {
  color: var(--secondario);
}

.menu-tendina-sezione {
  display: grid;
  gap: 6px;
  padding: 6px 8px 8px;
}

.menu-tendina-separatore {
  height: 1px;
  margin: 4px 0;
  border: 0;
  background: var(--linea);
}


/* ---------------------------------------------------------------------------
   Percorso e paginazione
   ------------------------------------------------------------------------ */

.percorso ol {
  display: flex;
  flex-wrap: wrap;
  align-items: center;
  margin: 0;
  padding: 0;
  color: var(--secondario);
  font-size: var(--t-piccolo);
  list-style: none;
}

.percorso li + li::before {
  content: "/";
  margin: 0 6px;
  color: var(--linea-campo);
}

.percorso a {
  display: inline-flex;
  align-items: center;
  min-height: 24px;
  color: var(--secondario);
  text-decoration: none;
}

.percorso a:hover {
  color: var(--inchiostro);
  text-decoration: underline;
}

.percorso [aria-current="page"] {
  color: var(--inchiostro);
  font-weight: 600;
}

.paginazione {
  display: flex;
  flex-wrap: wrap;
  align-items: center;
  justify-content: space-between;
  gap: var(--s-3);
  padding: var(--s-2) 0;
}

/* «1–25 di 132», «32 mostrate»: parole nel carattere del testo, cifre
   allineate (il carattere a spaziatura fissa e' solo per le cifre sole). */
.paginazione-stato {
  color: var(--secondario);
  font-family: var(--f-testo);
  font-size: var(--t-piccolo);
  font-variant-numeric: tabular-nums;
}


/* ---------------------------------------------------------------------------
   Guscio dell'app: barra in alto, menu a lato, pagina, piede;
   sotto i 960 px il menu a lato lascia il posto alla barra in basso.

   +---------------------------------------------+
   | testata (48 px, tutta la larghezza)         |
   +------------+--------------------------------+
   | lato       | pagina                         |
   |  (menu     |                                |
   |  sticky)   |                                |
   +------------+--------------------------------+
   | piede (tutta la larghezza)                  |
   +---------------------------------------------+

   La colonna del lato (.lato, con il suo bordo) corre per tutta la riga
   fino al piede, su pagine corte e lunghe; il menu dentro (.menu-lato)
   resta sotto la barra mentre si scorre e in fondo alla pagina si ferma sul
   piede: la colonna e' il suo contenitore. Con poco contenuto il piede sta
   in fondo alla finestra.
   <div class="guscio"> <header class="testata-app"> <div class="lato">
   <nav class="menu-lato"> ... </nav></div> <main class="pagina">
   <footer class="piede-app"> <nav class="schede-telefono"></div>
   ------------------------------------------------------------------------ */

.guscio {
  display: grid;
  grid-template-columns: var(--larghezza-lato) minmax(0, 1fr);
  grid-template-rows: var(--altezza-barra) minmax(0, 1fr) auto;
  grid-template-areas:
    "testata testata"
    "lato pagina"
    "piede piede";
  min-height: 100vh;
  min-height: 100dvh;
}

.lato {
  grid-area: lato;
  min-width: 0;
  border-right: 1px solid var(--linea);
}

/* Barra in alto: 48 px, piena (niente vetro smerigliato). Il suo bordo
   inferiore resta neutro: stato e avvisi si leggono nella pillola, senza
   tratteggi o altri segnali decorativi. In chiamata e in guasto resta una
   sottile riga solida, ferma. */
.testata-app {
  grid-area: testata;
  position: sticky;
  top: 0;
  z-index: 30;
  display: flex;
  align-items: center;
  gap: var(--s-3);
  height: var(--altezza-barra);
  padding: 0 var(--s-4);
  background: var(--carta);
}

.testata-app::after {
  content: "";
  position: absolute;
  left: 0;
  right: 0;
  bottom: 0;
  height: 1px;
  background: var(--linea);
}

.testata-app[data-linea="in-chiamata"]::before {
  content: "";
  position: absolute;
  z-index: 1;
  left: 0;
  right: 0;
  bottom: 0;
  height: 2px;
  background: var(--ok-spia);
}

.testata-app[data-linea="guasto"]::after {
  height: 2px;
  background: var(--pericolo-spia);
}

@keyframes filo-segnale {
  from { background-position: 100% 0; }
  to { background-position: 0 0; }
}

/* Il marchio finisce dove finisce il menu a lato: lo stato della linea
   parte allineato al contenuto della pagina. */
.testata-marchio {
  display: inline-flex;
  flex: 0 0 calc(var(--larghezza-lato) + var(--s-7) - var(--s-4) - var(--s-3));
  align-items: center;
  gap: 8px;
  min-width: 0;
  color: var(--inchiostro);
  text-decoration: none;
}

.testata-marchio:hover {
  text-decoration: none;
}

.marchio-immagine {
  display: block;
  width: auto;
  max-width: 140px;
  height: auto;
  max-height: 24px;
  object-fit: contain;
}

.marchio-tessera {
  display: grid;
  place-items: center;
  flex: none;
  width: 24px;
  height: 24px;
  border-radius: var(--raggio);
  background: var(--marchio-pieno);
  color: var(--marchio-testo);
  font-family: var(--f-titoli);
  font-size: var(--t-piccolo);
  font-weight: 700;
  line-height: 1;
}

/* Su un fondo scuro la tessera ha un filo: un marchio quasi nero non si
   confonde con la barra e resta la forma, non solo la lettera. */
[data-theme="dark"] .marchio-tessera,
.inverso .marchio-tessera,
.ingresso-lato .marchio-tessera {
  box-shadow: inset 0 0 0 1px var(--linea-forte);
}

@media (prefers-color-scheme: dark) {
  :root:not([data-theme]) .marchio-tessera {
    box-shadow: inset 0 0 0 1px var(--linea-forte);
  }
}

.marchio-nome {
  min-width: 0;
  overflow: hidden;
  font-family: var(--f-titoli);
  font-size: var(--t-testo);
  font-weight: 600;
  text-overflow: ellipsis;
  white-space: nowrap;
}

.testata-azioni {
  display: flex;
  align-items: center;
  gap: 2px;
  margin-left: auto;
}

.aggiornato {
  margin-right: var(--s-2);
  color: var(--secondario);
  font-size: var(--t-nota);
  white-space: nowrap;
}

.utente {
  position: relative;
}

.utente-pulsante {
  display: inline-flex;
  align-items: center;
  gap: 6px;
  height: var(--altezza-pulsante);
  padding: 0 6px 0 4px;
  border: 1px solid transparent;
  border-radius: var(--raggio);
  background: none;
  color: var(--inchiostro);
  font-size: var(--t-piccolo);
  font-weight: 600;
}

.utente-pulsante:hover,
.utente-pulsante[aria-expanded="true"] {
  background: var(--superficie-3);
}

.utente-pulsante > .icona {
  color: var(--secondario);
}

.avatar-iniziale {
  display: grid;
  place-items: center;
  flex: none;
  width: 24px;
  height: 24px;
  border: 1px solid var(--linea-forte);
  border-radius: var(--raggio);
  background: var(--incavo);
  color: var(--inchiostro);
  font-family: var(--f-titoli);
  font-size: var(--t-nota);
  font-weight: 700;
  line-height: 1;
}

.avatar-immagine {
  display: block;
  flex: none;
  width: 24px;
  height: 24px;
  border: 1px solid var(--linea-forte);
  border-radius: var(--raggio);
  object-fit: cover;
  background: var(--incavo);
}

.profilo-foto-riga {
  display: flex;
  align-items: center;
  gap: var(--s-4);
}

.avatar-profilo {
  display: grid;
  place-items: center;
  flex: none;
  width: 72px;
  height: 72px;
}

.avatar-immagine-grande,
.avatar-iniziale-grande {
  width: 72px;
  height: 72px;
  border-radius: 50%;
}

.avatar-iniziale-grande {
  font-size: var(--t-titolo);
}

.profilo-foto-azioni {
  min-width: 0;
  flex: 1;
}

@media (max-width: 520px) {
  .profilo-foto-riga {
    align-items: flex-start;
    flex-direction: column;
  }
}

/* Menu a lato: 216 px, voci alte quanto un controllo (32 px col mouse,
   44 al tocco) in 14 px, icone di 16. La voce aperta ha un fondo pieno
   appena piu' scuro, non una carta in rilievo. */
.menu-lato {
  position: sticky;
  top: var(--altezza-barra);
  display: flex;
  flex-direction: column;
  gap: var(--s-4);
  /* Alto quanto la finestra sotto la barra, ma mai oltre la colonna: con
     una pagina corta il piede del menu sta subito sopra il piede della
     pagina. Se le voci non ci stanno, scorre dentro. */
  height: min(100%, calc(100vh - var(--altezza-barra)));
  height: min(100%, calc(100dvh - var(--altezza-barra)));
  min-height: 0;
  padding: var(--s-3) var(--s-2) var(--s-3) var(--s-3);
  overflow-y: auto;
  scrollbar-width: thin;
}

.menu-lato-gruppo {
  display: grid;
  gap: 1px;
}

.menu-lato-titolo {
  padding: 0 8px 4px;
  color: var(--terziario);
  font-size: var(--t-nota);
  font-weight: 500;
}

.menu-lato-voce {
  display: flex;
  align-items: center;
  gap: 8px;
  min-height: var(--altezza-controllo);
  padding: 0 8px;
  border-radius: var(--raggio);
  color: var(--secondario);
  font-size: var(--t-testo);
  font-weight: 500;
  line-height: 1.2;
  text-decoration: none;
  transition: background-color var(--durata-breve) var(--curva), color var(--durata-breve) var(--curva);
}

.menu-lato-voce:hover {
  background: color-mix(in oklab, var(--superficie-3) 60%, transparent);
  color: var(--inchiostro);
  text-decoration: none;
}

.menu-lato-voce[aria-current="page"] {
  background: var(--superficie-3);
  color: var(--inchiostro);
  font-weight: 600;
}

.menu-lato-voce[aria-current="page"] > .icona {
  color: var(--accento-inchiostro);
}

.menu-lato-voce > .conteggio {
  margin-left: auto;
}

.menu-lato-piede {
  display: grid;
  gap: 6px;
  margin-top: auto;
  padding: var(--s-3) 8px 0;
  border-top: 1px solid var(--linea);
  color: var(--secondario);
  font-size: var(--t-nota);
}

/* Zona in fondo al menu: le utilita' (minuti, impostazioni, supporto),
   staccate dal lavoro di ogni giorno da un filo. Un solo margine automatico
   la porta in basso quando c'e' spazio, per questo minuti e voci stanno
   nello stesso contenitore; quando lo spazio manca segue le voci e scorre
   con loro senza coprirle (niente sticky). */
.menu-lato-fondo {
  display: grid;
  gap: var(--s-3);
  margin-top: auto;
  padding-top: var(--s-3);
  border-top: 1px solid var(--linea);
}

.menu-lato-fondo > .menu-lato-piede {
  margin-top: 0;
  padding-top: 0;
  border-top: 0;
}

/* Pagina: il profilo condiviso decide la densita' desktop; sulle larghezze
   strette le media query sotto mantengono margini sicuri per telefono. */
.pagina {
  grid-area: pagina;
  min-width: 0;
  padding: var(--spazio-pagina-sopra) var(--spazio-pagina-lati) var(--spazio-pagina-sotto);
}

.pagina-interna {
  max-width: var(--larghezza-contenuto);
}

.larghezza-modulo {
  max-width: var(--larghezza-modulo);
}

/* Piede: una riga di 13 px, a tutta larghezza sotto il lato e la pagina;
   il testo parte dove parte il marchio nella barra in alto. */
.piede-app {
  grid-area: piede;
  display: flex;
  flex-wrap: wrap;
  align-items: center;
  gap: var(--s-1) var(--s-5);
  padding: var(--s-3) var(--s-4);
  border-top: 1px solid var(--linea);
  color: var(--secondario);
  font-size: var(--t-nota);
  line-height: 1.4;
}

.piede-app a {
  display: inline-flex;
  align-items: center;
  min-height: 24px;
  color: var(--secondario);
  text-decoration: none;
}

.piede-app a:hover {
  color: var(--inchiostro);
  text-decoration: underline;
}

.piede-app-contatti {
  display: flex;
  flex-wrap: wrap;
  gap: 4px var(--s-4);
}

.piede-app-tecnologia {
  margin-left: auto;
  color: var(--terziario);
}

/* Barra in basso, solo su telefono e tablet: cinque voci. */
.schede-telefono {
  display: none;
}

.scheda-telefono {
  position: relative;
  display: flex;
  flex-direction: column;
  align-items: center;
  justify-content: center;
  gap: 2px;
  min-width: 0;
  padding: 0 2px;
  border: 0;
  background: none;
  color: var(--secondario);
  font-size: var(--t-nota);
  font-weight: 500;
  line-height: 1.1;
  text-decoration: none;
  -webkit-tap-highlight-color: transparent;
}

.scheda-telefono:hover {
  color: var(--inchiostro);
  text-decoration: none;
}

.scheda-telefono:focus-visible {
  outline-offset: -4px;
  border-radius: var(--raggio);
}

.scheda-telefono > .icona {
  width: 20px;
  height: 20px;
}

.scheda-telefono[aria-current="page"] {
  color: var(--inchiostro);
  font-weight: 600;
}

.scheda-telefono[aria-current="page"] > .icona {
  color: var(--accento-inchiostro);
}

.scheda-telefono[aria-current="page"]::before {
  content: "";
  position: absolute;
  top: -1px;
  left: 24%;
  right: 24%;
  height: 2px;
  border-radius: 0 0 2px 2px;
  background: var(--accento-inchiostro);
}

.scheda-telefono > .conteggio {
  position: absolute;
  top: 4px;
  left: calc(50% + 4px);
  min-width: 18px;
  height: 18px;
  padding: 0 5px;
}

/* Barra di pubblicazione: una sola, per tutte le schede dell'assistente. */
.barra-pubblica {
  position: sticky;
  bottom: var(--s-4);
  z-index: 20;
  display: flex;
  flex-wrap: wrap;
  align-items: center;
  gap: var(--s-2) var(--s-4);
  margin-top: var(--s-6);
  padding: 8px 8px 8px 16px;
  border: 1px solid var(--linea);
  border-radius: var(--raggio-riquadro);
  background: var(--carta);
  color: var(--inchiostro);
  box-shadow: var(--ombra-2);
}

.barra-pubblica-stato {
  display: flex;
  flex: 1 1 260px;
  align-items: center;
  gap: 8px;
  min-width: 0;
  font-size: var(--t-piccolo);
  line-height: 1.4;
}

.barra-pubblica-stato > .spia {
  --spia: var(--attenzione-spia);
}

.barra-pubblica-azioni {
  display: flex;
  flex-wrap: wrap;
  align-items: center;
  gap: var(--s-2);
}

.barra-pubblica-stato a {
  color: var(--secondario);
  font-weight: 600;
  white-space: nowrap;
}


/* ---------------------------------------------------------------------------
   Accesso: due colonne da 880 px, una sola sotto.
   ------------------------------------------------------------------------ */

.ingresso {
  display: grid;
  grid-template-columns: minmax(0, 1fr);
  /* Su una colonna il racconto resta della sua altezza: lo spazio in piu'
     va al modulo, non a una fascia scura vuota. */
  grid-template-rows: auto 1fr;
  min-height: 100vh;
  min-height: 100dvh;
  background: var(--carta);
}

.ingresso-lato {
  position: relative;
  display: flex;
  flex-direction: column;
  gap: var(--s-6);
  padding: var(--s-6) var(--s-5) var(--s-7);
  background: var(--carta);
  color: var(--inchiostro);
  overflow: hidden;
}

/* Il logo di un cliente e' disegnato per il chiaro: sta sempre su bianco. */
.ingresso-marchio {
  display: inline-flex;
  align-self: flex-start;
  align-items: center;
  gap: 10px;
  padding: 8px 14px 8px 8px;
  border-radius: 12px;
  background: #FFFFFF;
  color: #17191C;
}

.ingresso-marchio > .marchio-immagine {
  max-height: 36px;
}

.ingresso-filo {
  display: flex;
  align-items: center;
  gap: var(--s-3);
}

.ingresso-filo-linea {
  position: relative;
  flex: 1;
  height: 1px;
  background: var(--linea-forte);
  overflow: hidden;
}

/* Il filo dell'accesso e' fermo: niente segnale che corre. */
.ingresso-filo-linea::after {
  content: none;
}

.ingresso-filo > .spia {
  --spia: var(--ok-spia);
}

.ingresso-punti {
  display: none;
  gap: var(--s-4);
  margin: 0;
}

.ingresso-punto {
  display: grid;
  grid-template-columns: 32px minmax(0, 1fr);
  gap: 0 var(--s-3);
  align-items: start;
}

.ingresso-punto-icona {
  grid-row: span 2;
  display: grid;
  place-items: center;
  width: 32px;
  height: 32px;
  border: 1px solid var(--linea);
  border-radius: var(--raggio);
  background: var(--superficie);
  color: var(--inchiostro);
}

.ingresso-punto-titolo {
  font-weight: 600;
}

.ingresso-punto-testo {
  color: var(--secondario);
  font-size: var(--t-piccolo);
}

.ingresso-modulo {
  display: flex;
  flex-direction: column;
  padding: var(--s-7) var(--s-5) 0;
}

.ingresso-modulo-interno {
  display: grid;
  gap: var(--s-4);
  width: 100%;
  max-width: 380px;
  margin: 0 auto auto;
}

.ingresso-modulo > .piede-app {
  margin-top: var(--s-8);
  padding-inline: 0;
  justify-content: center;
}

@media (min-width: 880px) {
  .ingresso {
    grid-template-columns: minmax(0, 11fr) minmax(0, 9fr);
    grid-template-rows: none;
  }

  .ingresso-lato {
    position: sticky;
    top: 0;
    justify-content: space-between;
    min-height: 100vh;
    min-height: 100dvh;
    padding: var(--s-8) var(--s-9);
  }

  .ingresso-punti {
    display: grid;
  }

  .ingresso-modulo {
    padding: var(--s-8) var(--s-8) 0;
  }

  .ingresso-modulo-interno {
    margin: auto;
  }
}


/* ---------------------------------------------------------------------------
   Aiuti di impaginazione
   ------------------------------------------------------------------------ */

.pila {
  display: grid;
  align-content: start;
  gap: var(--pila-spazio, var(--spazio-pila));
  min-width: 0;
}

.pila-stretta {
  --pila-spazio: var(--s-2);
}

.pila-larga {
  --pila-spazio: var(--s-6);
}

.riga {
  display: flex;
  flex-wrap: wrap;
  align-items: center;
  gap: var(--riga-spazio, var(--s-2));
  min-width: 0;
}

.spingi {
  margin-left: auto;
}

.griglia {
  display: grid;
  align-items: start;
  grid-template-columns: repeat(auto-fit, minmax(min(100%, var(--griglia-min, 300px)), 1fr));
  gap: var(--s-4);
}

/* Pagina di lavoro in due colonne sopra i 1200 px: il contenuto a sinistra,
   una colonna di 340 px a destra (agenda di oggi, sicurezza, pagamenti).
   Sotto, una colonna sola, la destra dopo la sinistra. */
.griglia-lavoro {
  display: grid;
  grid-template-columns: minmax(0, 1fr);
  align-items: start;
  gap: var(--s-4);
}

@media (min-width: 1200px) {
  .griglia-lavoro {
    grid-template-columns: minmax(0, 1fr) 340px;
  }
}

.griglia-lavoro > * {
  min-width: 0;
}

.solo-lettori {
  position: absolute !important;
  width: 1px;
  height: 1px;
  margin: -1px;
  padding: 0;
  border: 0;
  overflow: hidden;
  clip-path: inset(50%);
  white-space: nowrap;
}

.salta-contenuto {
  position: fixed;
  z-index: 100;
  top: var(--s-2);
  left: var(--s-2);
  padding: 10px 14px;
  border-radius: var(--raggio);
  background: var(--inchiostro);
  color: var(--carta);
  font-weight: 700;
  text-decoration: none;
  transform: translateY(-160%);
  transition: transform var(--durata) var(--curva);
}

.salta-contenuto:focus {
  transform: none;
}


/* ---------------------------------------------------------------------------
   Barra dei filtri, sopra un elenco o una tabella: cerca, periodo, filtri,
   azioni a destra. Una riga di controlli da 32 px, 12 px sopra la tabella.
   <div class="barra-filtri">
     <div class="controllo-gruppo barra-filtri-cerca">...</div>
     <div class="selettore">...</div> <div class="filtri-rapidi">...</div>
     <div class="spingi azioni">...</div>
   </div>
   ------------------------------------------------------------------------ */

.barra-filtri {
  display: flex;
  flex-wrap: wrap;
  align-items: center;
  gap: var(--s-2);
  margin-bottom: var(--s-3);
}

.barra-filtri-cerca {
  flex: 1 1 220px;
  max-width: 320px;
}

.barra-filtri > .selettore {
  flex: 0 1 180px;
}

.barra-filtri-stato {
  color: var(--secondario);
  font-size: var(--t-nota);
  font-variant-numeric: tabular-nums;
  white-space: nowrap;
}


/* ---------------------------------------------------------------------------
   Dettaglio di una chiamata (portale e pannello, nella .finestra-lato):
   testata con chi, quando, durata ed esito; il lettore dell'audio; il
   riassunto; la trascrizione. Senza registrazione il lettore lascia il
   posto a .lettore-assente.
   ------------------------------------------------------------------------ */

.chiamata-testata {
  display: grid;
  gap: 4px;
}

.chiamata-testata-dati {
  display: flex;
  flex-wrap: wrap;
  align-items: center;
  gap: 4px var(--s-3);
  color: var(--secondario);
  font-size: var(--t-piccolo);
}

/* Lettore: <div class="lettore"> con il comando (pulsante-icona, Ascolta o
   Pausa), il tempo, la barra (input type="range" class="lettore-barra",
   --avanzamento fra 0 e 1 da JS con style.setProperty), la durata, la
   velocita' (segmenti) e Scarica. */
.lettore {
  display: flex;
  flex-wrap: wrap;
  align-items: center;
  gap: var(--s-2) var(--s-3);
  padding: var(--s-2) var(--s-3);
  border: 1px solid var(--linea);
  border-radius: var(--raggio-riquadro);
  background: var(--superficie-2);
}

.lettore-tempo {
  min-width: 5ch;
  color: var(--secondario);
  font-size: var(--t-piccolo);
  text-align: center;
}

.lettore-barra {
  flex: 1 1 160px;
  min-width: 120px;
  height: 20px;
  margin: 0;
  background: transparent;
  cursor: pointer;
  -webkit-appearance: none;
  appearance: none;
}

.lettore-barra::-webkit-slider-runnable-track {
  height: 4px;
  border-radius: 2px;
  background: linear-gradient(90deg, var(--accento-inchiostro) calc(var(--avanzamento, 0) * 100%), var(--linea-forte) 0);
}

.lettore-barra::-moz-range-track {
  height: 4px;
  border-radius: 2px;
  background: var(--linea-forte);
}

.lettore-barra::-moz-range-progress {
  height: 4px;
  border-radius: 2px;
  background: var(--accento-inchiostro);
}

.lettore-barra::-webkit-slider-thumb {
  width: 12px;
  height: 12px;
  margin-top: -4px;
  border: 0;
  border-radius: 50%;
  background: var(--accento-inchiostro);
  -webkit-appearance: none;
  appearance: none;
}

.lettore-barra::-moz-range-thumb {
  width: 12px;
  height: 12px;
  border: 0;
  border-radius: 50%;
  background: var(--accento-inchiostro);
}

.lettore-barra:focus-visible {
  outline-offset: 4px;
}

.lettore-velocita .segmento {
  min-width: 3.5ch;
  padding: 0 6px;
  font-family: var(--f-cifre);
}

.lettore-nota {
  margin-top: 4px;
}

/* Registrazione spenta, cancellata dopo 90 giorni o in arrivo: una riga
   quieta al posto del lettore, con il perche'. L'icona e poi il testo in un
   solo <span> (lo spazio fra gli elementi non spezza le frasi). */
.lettore-assente {
  display: flex;
  align-items: center;
  gap: var(--s-2);
  min-height: 40px;
  padding: var(--s-2) var(--s-3);
  border: 1px dashed var(--linea-forte);
  border-radius: var(--raggio-riquadro);
  color: var(--secondario);
  font-size: var(--t-piccolo);
}

/* Trascrizione: una battuta per riga, il tempo a sinistra (un pulsante che
   porta l'audio li', o un testo se l'audio non c'e'), chi parla sopra il
   testo. La battuta che si sta ascoltando ha aria-current="true".
   <ol class="trascrizione">
     <li class="trascrizione-battuta" data-chi="assistente|chiamante|collega">
       <button class="trascrizione-tempo cifre" type="button">00:06</button>
       <div><p class="trascrizione-chi">Marta</p><p class="trascrizione-testo">...</p></div>
     </li>
     <li class="trascrizione-evento">...</li>
   </ol> */
.trascrizione {
  display: grid;
  gap: 0;
  margin: 0;
  padding: 0;
  list-style: none;
}

.trascrizione-battuta,
.trascrizione-evento {
  display: grid;
  grid-template-columns: 52px minmax(0, 1fr);
  gap: var(--s-2);
  padding: 6px var(--s-2) 6px 0;
  border-left: 2px solid transparent;
  border-radius: 0 var(--raggio-piccolo) var(--raggio-piccolo) 0;
}

.trascrizione-battuta[aria-current="true"] {
  border-left-color: var(--accento-inchiostro);
  background: var(--accento-tenue);
}

.trascrizione-tempo {
  justify-self: start;
  height: 20px;
  padding: 0 6px;
  border: 0;
  border-radius: var(--raggio-piccolo);
  background: none;
  color: var(--terziario);
  font-size: var(--t-nota);
  line-height: 20px;
  text-align: left;
}

button.trascrizione-tempo:hover {
  background: var(--superficie-3);
  color: var(--inchiostro);
}

.trascrizione-chi {
  color: var(--secondario);
  font-size: var(--t-nota);
  font-weight: 600;
  line-height: 20px;
}

.trascrizione-battuta[data-chi="assistente"] .trascrizione-chi {
  color: var(--accento-inchiostro);
}

.trascrizione-battuta[data-chi="chiamante"] .trascrizione-chi {
  color: var(--inchiostro);
}

.trascrizione-testo {
  max-width: 72ch;
  font-size: var(--t-testo);
  line-height: 1.5;
}

.trascrizione-evento {
  color: var(--secondario);
  font-size: var(--t-nota);
}

.trascrizione-evento > :last-child::before {
  content: "";
  display: inline-block;
  width: 6px;
  height: 6px;
  margin-right: 6px;
  border-radius: 1px;
  background: var(--linea-campo);
  vertical-align: 1px;
}


/* ---------------------------------------------------------------------------
   Servizio collegato (Google Calendar nelle Impostazioni del portale): il
   logo, il nome, con chi e' collegato, lo stato, le azioni.
   <div class="collegamento">
     <span class="collegamento-logo"><img src="/marchi/google-calendar.svg" alt=""></span>
     <div class="collegamento-corpo"><p class="collegamento-nome">Google Calendar</p>
       <p class="nota">Collegato come studio@gmail.com, calendario «Studio»</p></div>
     <span class="pillola pillola-ok">Collegato</span>
     <div class="azioni">...</div>
   </div>
   ------------------------------------------------------------------------ */

.collegamento {
  display: grid;
  grid-template-columns: 32px minmax(0, 1fr) auto auto;
  align-items: center;
  gap: var(--s-2) var(--s-3);
  padding: var(--s-3) var(--s-4);
}

.collegamento-logo {
  display: grid;
  place-items: center;
  width: 32px;
  height: 32px;
  border: 1px solid var(--linea);
  border-radius: var(--raggio);
  background: #FFFFFF;
}

.collegamento-logo > img {
  width: 20px;
  height: 20px;
}

.collegamento-corpo {
  min-width: 0;
}

.collegamento-nome {
  font-weight: 600;
}

@media (max-width: 679px) {
  .collegamento {
    grid-template-columns: 32px minmax(0, 1fr);
  }

  .collegamento > .pillola,
  .collegamento > .azioni {
    grid-column: 2;
    justify-self: start;
  }
}

/* «Accedi con Google»: i colori del pulsante di Google (chiaro e scuro),
   il logo «G» a colori a sinistra, 40 px. Il logo e' un file del core,
   mai caricato da Google. <a class="pulsante pulsante-google" href="...">
   <img src="/marchi/google-g.svg" alt="">Accedi con Google</a> */
.pulsante-google {
  --p-fondo: #FFFFFF;
  --p-testo: #1F1F1F;
  --p-bordo: #747775;
  --p-sopra: #F2F2F2;
  gap: 10px;
  min-height: 40px;
  padding: 0 12px;
  border-radius: var(--raggio);
  font-weight: 500;
  box-shadow: none;
}

.pulsante-google > img {
  width: 18px;
  height: 18px;
}

[data-theme="dark"] .pulsante-google {
  --p-fondo: #131314;
  --p-testo: #E3E3E3;
  --p-bordo: #8E918F;
  --p-sopra: #1F1F20;
}

@media (prefers-color-scheme: dark) {
  :root:not([data-theme]) .pulsante-google {
    --p-fondo: #131314;
    --p-testo: #E3E3E3;
    --p-bordo: #8E918F;
    --p-sopra: #1F1F20;
  }
}


/* ---------------------------------------------------------------------------
   Schermi stretti
   ------------------------------------------------------------------------ */

@media (max-width: 959px) {
  .guscio {
    grid-template-columns: minmax(0, 1fr);
    grid-template-areas:
      "testata"
      "pagina"
      "piede";
    padding-bottom: calc(var(--altezza-schede) + env(safe-area-inset-bottom));
  }

  .lato {
    display: none;
  }

  .testata-marchio {
    flex: 0 1 auto;
  }

  .pagina {
    padding: var(--s-5) var(--s-6) var(--s-8);
  }

  .piede-app {
    padding: var(--s-3) var(--s-6);
  }

  .schede-telefono {
    position: fixed;
    z-index: 30;
    left: 0;
    right: 0;
    bottom: 0;
    display: grid;
    grid-template-columns: repeat(5, minmax(0, 1fr));
    height: calc(var(--altezza-schede) + env(safe-area-inset-bottom));
    padding-bottom: env(safe-area-inset-bottom);
    border-top: 1px solid var(--linea);
    background: var(--superficie);
  }

  .barra-pubblica {
    bottom: calc(var(--altezza-schede) + env(safe-area-inset-bottom) + var(--s-3));
  }

  /* Larghe quanto il contenuto: stessi margini della pagina. */
  .notifiche {
    left: var(--s-6);
    right: var(--s-6);
    bottom: max(calc(var(--altezza-schede) + env(safe-area-inset-bottom) + var(--s-3)), var(--notifiche-sopra-barra, 0px));
    width: auto;
  }
}

@media (max-width: 679px) {
  .testata-app {
    gap: var(--s-2);
    padding: 0 var(--s-2) 0 var(--s-4);
  }

  .linea-stato-testo,
  .linea-stato-dettaglio,
  .aggiornato,
  .utente-nome {
    display: none;
  }

  .linea-stato-breve {
    display: inline;
  }

  .pagina {
    padding: var(--s-4) var(--s-4) var(--s-7);
  }

  .notifiche {
    left: var(--s-4);
    right: var(--s-4);
  }

  .piede-app {
    flex-direction: column;
    align-items: flex-start;
    padding: var(--s-3) var(--s-4);
  }

  .piede-app-tecnologia {
    margin-left: 0;
  }

  /* Il titolo resta a 20 px; le azioni vanno sotto, a sinistra. */
  .intestazione-pagina {
    grid-template-columns: minmax(0, 1fr);
    margin-bottom: var(--s-3);
  }

  .chiave-valore {
    grid-template-columns: minmax(0, 1fr);
    gap: 0;
  }

  .chiave-valore dd + dt {
    margin-top: var(--s-2);
  }

  .riquadro-testata,
  .riquadro-corpo,
  .riquadro-piede,
  .elenco-voce,
  .da-fare-voce {
    padding-left: var(--s-3);
    padding-right: var(--s-3);
  }

  .da-fare-voce {
    grid-template-columns: 24px minmax(0, 1fr);
  }

  .da-fare-voce > :last-child:not(.da-fare-segno):not(:nth-child(2)) {
    grid-column: 2;
    justify-self: start;
  }

  .misura {
    padding: var(--s-2) var(--s-3);
  }

  .schede {
    gap: var(--s-4);
  }

  /* I filtri rapidi su una riga che scorre, come le schede: tre righe di
     filtri spingevano l'elenco sotto la piega. */
  .filtri-rapidi {
    flex-wrap: nowrap;
    margin-inline: calc(-1 * var(--s-4));
    padding: 2px var(--s-4);
    overflow-x: auto;
    scrollbar-width: none;
  }

  .filtri-rapidi::-webkit-scrollbar {
    display: none;
  }

  .filtro-rapido {
    flex: none;
  }

  /* Barra dei filtri: la ricerca su tutta la riga, il resto sotto. */
  .barra-filtri-cerca {
    flex-basis: 100%;
    max-width: none;
  }

  .barra-filtri > .selettore {
    flex: 1 1 140px;
  }

  .barra-pubblica {
    padding: var(--s-2);
  }

  .barra-pubblica-azioni {
    justify-content: flex-end;
    width: 100%;
  }

  .barra-pubblica-azioni > .pulsante {
    padding: 0 12px;
  }

  .vuoto {
    padding: var(--s-4) var(--s-3);
  }

  .finestra-lato {
    width: 100%;
    height: 100dvh;
    max-height: none;
    margin: 0;
    border-width: 0;
    border-radius: 0;
  }

  .finestra-lato[open] {
    animation-name: lato-entra;
  }

  .finestra-lato > .finestra-corpo,
  .finestra-lato > form > .finestra-corpo {
    padding: var(--s-3) var(--s-4) var(--s-5);
  }

  .finestra-lato > .finestra-azioni {
    flex-direction: row;
    flex-wrap: wrap;
  }

  .finestra-lato > .finestra-azioni > .pulsante {
    width: auto;
    flex: 1 1 auto;
  }

  .lettore-barra {
    flex-basis: 100%;
    order: 5;
  }

  /* Il tempo («00:00» con il suo spazio interno) e' largo 52 px: la colonna
     non si stringe, e fra il tempo e il nome restano 4 px anche al tocco. */
  .trascrizione-battuta,
  .trascrizione-evento {
    grid-template-columns: 56px minmax(0, 1fr);
    gap: var(--s-1);
  }
}

@media (max-width: 419px) {
  .testata-marchio .marchio-nome {
    display: none;
  }
}

/* Tocco: interruttori, spunte e scelte piu' grandi da prendere col dito. */
@media (max-width: 679px), (pointer: coarse) {
  .interruttore-controllo {
    width: 40px;
    height: 24px;
  }

  .interruttore-controllo::before {
    width: 18px;
    height: 18px;
  }

  .interruttore-controllo:checked::before {
    transform: translateX(16px);
  }

  .spunta,
  .scelta {
    width: 20px;
    height: 20px;
  }

  .spunta::before {
    width: 14px;
    height: 14px;
  }

  .opzione > .spunta,
  .opzione > .scelta {
    margin-top: 0;
  }

  /* Le voci del menu a lato crescono da sole: --altezza-controllo, 44 px. */

  .tabella-a-voci tr,
  .elenco-voce {
    min-height: 48px;
  }
}


/* ---------------------------------------------------------------------------
   Telefono (360-679 px): misure compatte e coerenti, come le app di sistema.
   Campi 40 px, pulsanti 36 px, piccoli 32 px (il testo dei campi resta a
   16 px: sotto, iOS ingrandisce la pagina al tocco). Il dettaglio di lato
   diventa un foglio che lascia scoperta una striscia di sfondo in alto: si
   chiude con la X, con Esc o toccando fuori, come ogni finestra.
   ------------------------------------------------------------------------ */

@media (max-width: 679px) {
  :root {
    --altezza-controllo: 40px;
    --altezza-pulsante: 36px;
    --altezza-piccolo: 32px;
  }

  .pagina {
    padding: var(--s-3) var(--s-4) var(--s-7);
  }

  /* Titolo e azioni sulla stessa riga quando ci stanno; altrimenti le
     azioni vanno a capo, allineate a sinistra. */
  .intestazione-pagina {
    display: flex;
    flex-wrap: wrap;
    align-items: flex-start;
    justify-content: space-between;
    gap: var(--s-2) var(--s-3);
  }

  .intestazione-pagina > :first-child {
    flex: 1 1 200px;
    min-width: 0;
  }

  .intestazione-pagina > .percorso {
    flex-basis: 100%;
  }

  .intestazione-pagina-azioni > .pulsante {
    min-height: var(--altezza-piccolo);
    padding: 0 10px;
    font-size: var(--t-piccolo);
  }

  .pulsante-icona {
    min-width: var(--altezza-pulsante);
  }

  .barra-filtri {
    gap: var(--s-2);
  }

  .riquadro-testata {
    padding-top: var(--s-2);
    padding-bottom: var(--s-2);
  }

  .finestra-lato {
    height: calc(100dvh - var(--s-8) - env(safe-area-inset-top));
    margin: auto 0 0;
    border-width: 1px 0 0;
    border-radius: var(--raggio-finestra) var(--raggio-finestra) 0 0;
  }

  .finestra-lato[open] {
    animation-name: foglio-sale;
  }

  .finestra-lato > .finestra-testata {
    min-height: 52px;
    padding: var(--s-1) var(--s-2) var(--s-1) var(--s-4);
  }

  /* La X resta un bersaglio da dito anche con i pulsanti piu' bassi. */
  .finestra-testata > .pulsante-icona:last-child {
    width: 44px;
    min-width: 44px;
    height: 44px;
  }

  .finestra-testata {
    padding-left: var(--s-4);
  }

  .finestra-corpo {
    padding: var(--s-3) var(--s-4) var(--s-4);
  }

  .finestra-azioni {
    padding-left: var(--s-4);
    padding-right: var(--s-4);
  }
}


/* Tablet e telefono: lo stato della linea non scavalca cio' che ha accanto
   (su 768 px il dettaglio finiva sopra «Aggiornato alle»). */
@media (max-width: 959px) {
  .linea-stato {
    overflow: hidden;
  }

  .linea-stato-dettaglio {
    overflow: hidden;
    text-overflow: ellipsis;
  }

  .aggiornato {
    display: none;
  }
}


/* ---------------------------------------------------------------------------
   Movimento ridotto e colori forzati
   ------------------------------------------------------------------------ */

@media (prefers-reduced-motion: reduce) {
  *,
  *::before,
  *::after {
    animation-duration: 0.01ms !important;
    animation-iteration-count: 1 !important;
    transition-duration: 0.01ms !important;
    scroll-behavior: auto !important;
  }

  .segnaposto {
    background: var(--incavo);
  }
}

@media (forced-colors: active) {
  .spia,
  .pillola::before {
    forced-color-adjust: none;
  }

  /* Senza fondi le etichette di stato e la voce aperta del menu restano
     riconoscibili dal bordo. */
  .pillola,
  .filtro-rapido[aria-pressed="true"] {
    border-color: CanvasText;
  }

  .menu-lato-voce[aria-current="page"] {
    outline: 1px solid CanvasText;
  }

  .trascrizione-battuta[aria-current="true"] {
    border-left-color: Highlight;
  }

  .interruttore-controllo,
  .spunta,
  .scelta {
    border-color: ButtonText;
  }

  .interruttore-controllo:checked,
  .spunta:checked,
  .scelta:checked {
    background: Highlight;
  }

  .scheda[aria-selected="true"]::after,
  .scheda[aria-current="page"]::after,
  .scheda-telefono[aria-current="page"]::before {
    background: Highlight;
  }
}
