/* ─────────────────────────────────────────────────────────────────────────────
   Gestionale — Il Circolo, Diano Marina

   Stessa palette dell'area pubblica, ma densita' diversa: qui si lavora otto ore
   al giorno e serve vedere piu' roba per schermo, non respirare.

   NON aggiungere librerie UI senza valutarne il peso: in WASM il bundle e' unico
   e si scarica tutto o niente. Radzen, per dare un ordine di grandezza, costa
   559 KB brotli di DLL piu' 168 KB gzip di CSS/JS. Vedi docs/ARCHITETTURA.md 9.
   ───────────────────────────────────────────────────────────────────────────── */

/* ── Inter, servito da qui ────────────────────────────────────────────────────
   I file stanno in wwwroot/fonts e li serve questo sito. MAI da Google Fonts:
   e' una terza parte che riceve l'IP di ogni visitatore, ed e' gia' stata
   sanzionata in UE. Inter e' sotto licenza SIL Open Font, quindi ospitarlo
   in proprio e' esplicitamente consentito.

   DUE PESI E NON TRE, come impone DESIGN.md §2: ogni peso e' un file che
   qualcuno scarica. Regular 109 KB + Bold 112 KB = 221 KB. Il Medium (500),
   che nel kit e' il peso dominante, costerebbe altri 112 KB: se un giorno lo
   si vuole, e' una decisione da prendere guardando quel numero.

   font-display: swap — il testo compare subito col carattere di sistema e
   scambia quando Inter e' pronto. Meglio leggere subito in Segoe UI che
   fissare un rettangolo vuoto.
   ───────────────────────────────────────────────────────────────────────────── */

@font-face {
    font-family: "Inter";
    src: url("../fonts/Inter-Regular.woff2") format("woff2");
    font-weight: 400;
    font-style: normal;
    font-display: swap;
}

@font-face {
    font-family: "Inter";
    src: url("../fonts/Inter-Bold.woff2") format("woff2");
    font-weight: 700;
    font-style: normal;
    font-display: swap;
}

:root {
    --nero:    #070400;
    --pallina: #D4E24E;  /* il giallo-verde della pallina: l'azione, dal 19 ottobre 2026 */
    --sabbia:  #DCCAAA;
    --grigio:  #ACABAA;
    --testo:   #706F6D;
    --bianco:  #FFFFFF;
    --terra:   #C86B4A;

    --sfondo:  #FBFAF8;
    --bordo:   #E5E1DA;

    /* LE TRE TINTE DEGLI STATI DELLA GRIGLIA, in un posto solo (27 ottobre 2026). Stavano scritte a mano in dieci punti di
       questo foglio — la griglia della Settimana, i nastri, le pastiglie delle ore, i riquadri verdi, il tabellone — e il
       giorno che una cambiava le altre restavano indietro. --libero e --libero-bordo sono gli stessi due del sito
       (pubblico.css); lo spento è qui un po' più scuro di --non-prenot del sito (#FAFAF9), perché nel gestionale deve
       staccarsi dal bianco della tabella, e per questo ha un nome suo. Nessun colore nuovo: sono quelli che c'erano. */
    --libero:        #EFF7EA;
    --libero-bordo:  #7BB661;
    --spento:        #F4F2EF;

    /* Barra in basso: altezza e distanza dai bordi. Le usano in tre — la barra,
       il margine inferiore del contenuto e la posizione del foglio "Altro".
       Un posto solo, o si disallineano. */
    --barra-h: 62px;
    --barra-margine: 16px;

    /* La barra in alto (.riga-alta). Le intestazioni ferme del tabellone del Calendario si
       appoggiano sotto di lei: un numero solo, o il giorno che una cambia l'altra finisce
       sotto la barra. */
    --riga-alta-h: 52px;

    /* LA LARGHEZZA DELLA COLONNA, che è anche quella della barra. La leggono in tre:
       .barra-basso, il foglio "Altro" su schermo largo e .colonna-centrata della pagina
       Circolo — così la colonna e la pillola in basso hanno gli stessi bordi.

       ⚠️ IN PX, E NON IN REM: qui la radice è 15px, quindi 40rem farebbe 600 e la colonna
       resterebbe 20px più stretta della barra da ciascun lato. Era scritta a mano in due
       punti (640px e 320px): il giorno che se ne cambiava uno, i bordi si separavano. */
    --larghezza-colonna: 640px;

    /* I DUE RAGGI di DESIGN.md §3, e vanno dichiarati tutti e due.
       --raggio mancava: undici punti del foglio scrivevano var(--raggio, 10px) e
       campavano di fallback. Non si vedeva niente perché il fallback c'era — ma il
       primo border-radius: var(--raggio) scritto senza, come si fa normalmente,
       sarebbe diventato una dichiarazione invalida, cioè raggio ZERO, senza un
       errore di build e senza che nessuno colleghi la cosa. */
    --raggio: 10px;
    --pillola: 999px;

    /* LE DUE ALTEZZE DEI BERSAGLI, e finalmente scritte in un posto solo.
       Erano a mano in dieci punti, e la prossima classe le avrebbe indovinate.

       È l'idea che si prende dal kit MDI — una scala DICHIARATA — non i suoi
       numeri: là i gradini sono 52/44/32, qui restano i 48/44 che il gestionale
       già usa e che sono conformi. Il terzo gradino del kit, 32px, qui non può
       esistere: sta 12px sotto il minimo di DESIGN.md §4. */
    --h-azione:  48px;   /* .pulsante e i suoi fratelli: l'azione della schermata */
    --h-comando: 44px;   /* i comandi in linea, ed è il pavimento del §4 */

    /* I CAMPI DA COMPILARE, portati a 48 l'8 settembre 2026 su richiesta del
       committente: e' la proposta del kit MDI, dove il campo e' il gradino alto
       perche' ci si scrive dentro e ci si torna a correggere.

       ⚠️ NON e' --h-azione riusata, anche se il numero coincide: se un giorno
       l'azione principale cambiasse altezza, i campi non devono seguirla. Due
       ragioni diverse, due token diversi.

       ⚠️ E non vale per tutto cio' che si tocca: chi sta IN RIGA con dei comandi
       da 44 resta a 44, altrimenti e' l'unico piu' alto e la riga si sfalsa.
       Vedi .testo-caratteristica e .scelta-data. */
    --h-campo:   48px;

    /* UNA sola ombra in tutto il gestionale (DESIGN.md §3). Serve alla barra
       fluttuante e al foglio "Altro": senza, non si capisce che stanno sopra. */
    --ombra: 0 2px 12px rgb(7 4 0 / 18%);
}

/* ── IL RESET, che prima ci prestava Bootstrap ────────────────────────────────
   Bootstrap era linkato in index.html e non veniva usato: zero classi sue nei
   .razor, cercate una per una. Restava per il suo Reboot — il box-sizing, i margini
   azzerati, le tabelle che collassano i bordi — cioe' 160 KB di foglio scaricati
   e interpretati a ogni primo caricamento, piu' 4,2 MB di cartella pubblicata, per
   le trenta righe qui sotto.

   ⚠️ NON e' solo peso. Un sistema di stili scritto a mano che poggia su Reboot si
   trova sotto i piedi decisioni che non ha preso e che non vede: il giorno che una
   regola nostra sparisce, sotto non c'e' il vuoto — c'e' Bootstrap, che disegna
   qualcosa di plausibile e sbagliato. Meglio poco e nostro.

   Chi legge questo file cercando «da dove viene questo margine» adesso trova
   risposta qui dentro, e non in un minificato di terze parti.
   ───────────────────────────────────────────────────────────────────────────── */

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

/* I margini di default del browser sono decisioni di trent'anni fa: si azzerano e
   li rimette chi sa di che spaziatura ha bisogno. */
h1, h2, h3, h4, h5, h6,
p, figure, blockquote, dl, dd, ul, ol, fieldset {
    margin: 0;
}

ul, ol { padding: 0; list-style: none; }

/* Gli elenchi che vogliono i pallini se li chiedono: qui dentro quasi nessuno li
   vuole, e toglierli caso per caso era la ragione di meta' dei list-style: none. */
.elenco-puntato { padding-left: 1.25rem; list-style: disc; }

fieldset { padding: 0; border: 0; }
legend { padding: 0; }

table { border-collapse: collapse; border-spacing: 0; }
caption { text-align: left; }
th { text-align: left; font-weight: 700; }

/* max-width e non width: un'immagine piu' larga del suo posto non lo sfonda, ed e'
   il modo piu' rapido per far comparire lo scorrimento orizzontale che il §4 vieta.
   display: block toglie la riga fantasma sotto le immagini in linea. */
img, svg, video { max-width: 100%; display: block; }
.riga-caratteristica img, .icona-scelta img, .voce-basso img,
.caratteristica img, button img { display: inline-block; }

/* I controlli non ereditano niente per conto loro: il browser gli mette addosso la
   scorciatoia `font`, che azzera famiglia, corpo, interlinea E font-variant-numeric.
   Qui glieli si ridà una volta sola, invece che venti volte piu' sotto. */
button, input, select, textarea, optgroup {
    font: inherit;
    font-variant-numeric: inherit;
    margin: 0;
    color: inherit;
}

button { background: none; border: none; }

/* Il tocco non aspetta 300ms per vedere se e' un doppio tocco. */
button, [role="button"], input, label, select { touch-action: manipulation; }

[hidden] { display: none !important; }

html, body {
    margin: 0;
    /* Inter e' il carattere del kit: disegnato per le interfacce e, cosa che qui
       conta piu' dell'estetica, con le CIFRE A LARGHEZZA FISSA — in una griglia di
       prezzi e orari le colonne non ballano piu' da una riga all'altra.
       I .woff2 vanno in wwwroot/fonts e si servono da li': MAI da Google Fonts. */
    font-family: "Inter", system-ui, -apple-system, "Segoe UI", sans-serif;
    font-size: 15px;

    /* ⚠️ 1.5 SCRITTO QUI, ed e' DESIGN.md §2. Finora lo dava il Reboot di Bootstrap
       e nessuno lo sapeva: staccandolo l'interlinea di tutto il gestionale e' tornata
       a `normal` — cioe' a quello che decide il carattere, circa 1.21 su Inter — e
       ogni blocco di testo si e' stretto di tre pixel per riga. Un numero preso in
       prestito da una libreria che non si usa e' un numero che nessuno ha scelto. */
    line-height: 1.5;

    color: var(--testo);
    background: var(--sfondo);
}

/* I titoli respirano meno del corpo: §2 dice 1.2. Prima lo diceva Reboot con un
   1.2 suo, quindi il risultato non cambia — cambia che adesso e' scritto. */
h1, h2, h3, h4, h5, h6 { line-height: 1.2; }

/* Le cifre incolonnate ovunque compaiano numeri in tabella. */
table, .prezzo-slot, .cella-ora { font-variant-numeric: tabular-nums; }

/* ⚠️ E ANCHE DENTRO I CONTROLLI, che NON lo ereditano: il browser dà a <button>,
   <input> e <select> la scorciatoia `font`, che azzera font-variant-numeric.
   Risultato: i due segmenti di un orario — le ore e i minuti, dentro .campo-pannello —
   disegnano cifre a larghezza variabile, e «11» e «08» non hanno la stessa larghezza
   nella stessa casella. È un difetto che c'era già; il confronto col kit l'ha fatto
   vedere.

   Le cifre di Inter tabulari NON sono il default: stanno dietro questa proprietà.
   Vale la pena saperlo, perché DESIGN.md §2 lascia intendere il contrario. */
.ora-pillola,
.scelta-data,
.campo-pannello input,
table.elenco td input { font-variant-numeric: tabular-nums; }

h1 { font-size: 1.5rem; font-weight: 700; color: var(--nero); margin: 0 0 1rem; letter-spacing: -0.02em; }

/* ── Struttura: testata sottile, contenuto, navigazione in basso ──────────── */

.pagina { display: flex; flex-direction: column; min-height: 100vh; }

.riga-alta {
    height: var(--riga-alta-h);
    display: flex;
    align-items: center;
    justify-content: space-between;
    gap: 1rem;
    padding: 0 1rem;
    border-bottom: 1px solid var(--bordo);
    background: var(--bianco);
    position: sticky;
    top: 0;
    z-index: 20;
}

.riga-alta .marchio {
    font-weight: 700;
    color: var(--nero);
    letter-spacing: -0.01em;
    white-space: nowrap;   /* senza, "Il Circolo" va a capo e sfonda la testata */
}

.azioni-alte { display: flex; align-items: center; gap: 1rem; min-width: 0; }

.riga-alta a { color: var(--testo); text-decoration: none; font-size: 0.85rem; white-space: nowrap; }

/* Su telefono nella testata non ci sta tutto, e cio' che avanza va a capo
   accavallandosi. Si sacrifica il link all'area pubblica — che serve alla
   segreteria seduta, non a chi guarda dal telefono — e il nome si tronca. */
@media (max-width: 600px) {
    .riga-alta { padding: 0 0.75rem; }
    .azioni-alte > a { display: none; }
    .riga-alta .utente {
        max-width: 38vw;
        overflow: hidden;
        text-overflow: ellipsis;
        white-space: nowrap;
    }
}

main { flex: 1; min-width: 0; }  /* min-width:0 o la griglia sfonda il layout flex */

.contenuto {
    padding: 1.25rem;
    /* Senza questo margine l'ultima riga della griglia finisce SOTTO la barra e non
       si clicca. E' l'errore classico della navigazione in basso: non si vede finche'
       non si scorre fino in fondo, e a quel punto sembra che il sito sia rotto.
       Con la barra fluttuante va contato anche il suo stacco dal bordo, due volte:
       una sotto la barra e una sopra, o il contenuto le finisce a filo. */
    padding-bottom: calc(var(--barra-h) + var(--barra-margine) * 2 + 0.5rem);
}

/* ── Navigazione in basso ─────────────────────────────────────────────────── */

/* Barra FLUTTUANTE, non incollata al bordo: e' cosi' nel kit, dove misura
   320x67 dentro un artboard da 390 con 35px di margine su tutti e tre i lati.
   Qui il margine e' proporzionalmente minore perche' le voci sono cinque e le
   etichette sono parole intere, non icone sole.

   overflow: hidden serve: senza, lo sfondo pieno della voce attiva sborda dagli
   angoli tondi della pillola. */
.barra-basso {
    position: fixed;
    left: 50%;
    transform: translateX(-50%);
    bottom: calc(var(--barra-margine) + env(safe-area-inset-bottom, 0px));
    z-index: 30;
    display: flex;
    width: calc(100% - var(--barra-margine) * 2);
    max-width: var(--larghezza-colonna);
    padding: 4px;
    background: var(--nero);
    border-radius: var(--pillola);
    box-shadow: var(--ombra);
    overflow: hidden;
}

.voce-basso {
    flex: 1;
    min-width: 0;
    min-height: calc(var(--barra-h) - 8px);
    display: flex;
    flex-direction: column;
    align-items: center;
    justify-content: center;
    gap: 0.2rem;
    padding: 0.4rem 0.25rem;
    background: none;
    border: none;
    border-radius: var(--pillola);
    font-family: inherit;
    font-size: 0.7rem;
    color: var(--grigio);
    text-decoration: none;
    cursor: pointer;
}

.voce-basso .icona { display: block; line-height: 0; }
.voce-basso .icona svg { width: 22px; height: 22px; }

.voce-basso .etichetta {
    max-width: 100%;
    overflow: hidden;
    text-overflow: ellipsis;
    white-space: nowrap;
}

.voce-basso:hover { color: var(--sabbia); }

/* La voce attiva prende una pillola piena giallo pallina: cambia FORMA, SFONDO e PESO.
   Tre segnali invece di uno — il solo colore non basta mai (DESIGN.md §7).
   Dentro una barra a pillola il vecchio filetto dritto in alto non aveva senso:
   una riga retta dentro un contorno curvo si legge come un errore di disegno.

   Nero sulla pallina e non bianco: il bianco ci sta a 1,42:1, il nero a 14,41:1. */
.voce-basso.active {
    background: var(--pallina);
    color: var(--nero);
    font-weight: 700;
}

/* "Altro" col foglio aperto: pillola sabbia, non pallina. Aprire un menu NON e'
   una posizione — se avesse lo stesso giallo, sembrerebbero accese due voci
   insieme e nessuna delle due direbbe piu' dove sei.
   Nero su sabbia: 12,74:1. */
.voce-basso.aperta {
    background: var(--sabbia);
    color: var(--nero);
    font-weight: 700;
}

.voce-basso.active:hover,
.voce-basso.aperta:hover { color: var(--nero); }

/* ── Il foglio "Altro" ────────────────────────────────────────────────────── */

.velo-altro {
    position: fixed;
    inset: 0;
    z-index: 25;
    background: rgb(7 4 0 / 35%);
}

/* Il foglio galleggia anch'esso, appoggiato sopra la barra e con gli stessi
   margini laterali: le due cose devono sembrare la stessa famiglia. */
.foglio-altro .titolo-foglio { margin-left: 1rem; margin-right: 1rem; }

.foglio-altro {
    position: fixed;
    left: var(--barra-margine);
    right: var(--barra-margine);
    bottom: calc(var(--barra-h) + var(--barra-margine) * 2);
    z-index: 31;
    background: var(--bianco);
    border: 1px solid var(--bordo);
    border-radius: 18px;
    padding: 0.75rem 0.5rem 1rem;
    box-shadow: var(--ombra);
}

/* ⚠️ SENZA MARGINE ORIZZONTALE. Quel rientro di 1rem serve SOLO dentro il foglio
   «Altro», dove allinea il titolo alle sue voci; riusato nei pannelli e nella finestra
   spostava i titoli di sezione 15px a destra di ogni etichetta sotto di loro — e la
   finestra ne ha tre. Il margine torna qui sotto, dove e' nato. */
.titolo-foglio {
    margin: 0.25rem 0 0.5rem;
    font-size: 0.75rem;
    font-weight: 700;
    text-transform: uppercase;
    letter-spacing: 0.08em;
    color: var(--testo);
}

.voce-foglio {
    display: flex;
    align-items: center;
    gap: 0.75rem;
    min-height: var(--h-azione);
    padding: 0.5rem 1rem;
    border-radius: 10px;
    color: var(--nero);
    text-decoration: none;
}

.voce-foglio .icona { line-height: 0; color: var(--testo); }
.voce-foglio .icona svg { width: 20px; height: 20px; }

.voce-foglio:hover { background: var(--sfondo); }

.voce-foglio.active { background: var(--sabbia); font-weight: 700; }
.voce-foglio.active .icona { color: var(--nero); }

/* Su schermo largo la barra e' gia' centrata e limitata a --larghezza-colonna dal
   max-width: cinque bersagli da 300px l'uno sarebbero ridicoli, e il pollice qui non
   c'entra — il gestionale si usa col mouse. Il foglio si allinea al bordo destro della
   barra invece di occuparne tutta la larghezza: meta' schermo meno meta' colonna. */
@media (min-width: 900px) {
    .foglio-altro {
        left: auto;
        right: max(var(--barra-margine), calc(50vw - var(--larghezza-colonna) / 2));
        width: 260px;
        bottom: calc(var(--barra-h) + var(--barra-margine) * 2);
    }
}

/* ── Elenchi (anagrafica, e quelli che verranno) ──────────────────────────── */

table.elenco {
    width: 100%;
    border-collapse: collapse;
    background: var(--bianco);
    border: 1px solid var(--bordo);
    border-radius: var(--raggio, 10px);
    overflow: hidden;
}

table.elenco th {
    text-align: left;
    font-size: 0.8rem;
    color: var(--testo);
    padding: 0.6rem 0.75rem;
    border-bottom: 1px solid var(--bordo);
    background: var(--sfondo);
}

table.elenco td {
    padding: 0.5rem 0.75rem;
    border-bottom: 1px solid var(--bordo);
    font-size: 0.9rem;
}

table.elenco tbody tr:last-child td { border-bottom: none; }
table.elenco tbody tr:hover { background: var(--sfondo); }

/* Il nome è un bottone, non un link: apre un pannello, non naviga. Ma deve
   sembrare cliccabile e restare raggiungibile da tastiera. */
.collegamento-riga {
    background: none;
    border: none;
    padding: 0.25rem 0;
    min-height: var(--h-comando);
    font-family: inherit;
    font-size: 0.9rem;
    font-weight: 700;
    color: var(--nero);
    text-align: left;
    cursor: pointer;
    text-decoration: underline;
    text-underline-offset: 3px;
}

/* Una riga spenta si riconosce dal grigio E dalla parola "disattivato" accanto:
   il colore non è mai l'unica informazione (DESIGN.md §7). */
/* Una riga disattivata resta LEGGIBILE. Era --grigio su bianco, cioè 2,29:1 contro i
   4,5 richiesti, e produceva anche un'inversione assurda: il NOME della persona,
   testo nudo nella cella, veniva più chiaro dell'email che gli sta sotto — perché
   .dettaglio-riga dichiara il proprio colore e quindi non eredita.
   Che sia spenta lo dice già la parola «disattivato» accanto (DESIGN.md §7): il testo
   non ha bisogno di sbiadire per ripeterlo, e queste sono proprio le righe che si
   viene a cercare, dato che le schermate chiedono includiDisattivati. */
.riga-spenta td, .riga-spenta .collegamento-riga { color: var(--testo); }

/* I comandi dentro una riga si toccherebbero: sono elementi in linea, quindi vanno a
   capo come fossero parole. Serve dello spazio attorno.
   MARGINI E NON FLEX SULLA CELLA, e il motivo è che sotto i 640px la media query
   rimette display:block sui <td> per farne delle schede: un flex qui verrebbe
   sovrascritto proprio nella vista dove serve di più. Il margine invece vale in
   tutte e due. 0.25rem è il passo della griglia delle spaziature (DESIGN.md §3). */
table.elenco td > .bottone-oggi,
table.elenco td > .interruttore,
table.elenco td > input,
table.elenco td > select {
    margin: 0.25rem 0.25rem 0 0;
    vertical-align: middle;
}

/* ── Lo stato dell'accesso non è un ruolo, e non deve vestirsi da ruolo ──────
   In Accessi e Maestri convivono sulla stessa riga due informazioni di natura
   diversa: i PERMESSI (Segreteria, Amministratore) e a che punto è l'ACCESSO
   (entra, invito inviato, invito scaduto, accesso revocato). Rese con la stessa
   pillola si leggono tutte uguali a colpo d'occhio, che è il difetto che il
   committente ha descritto con «così ci capisco qualcosa».
   Nessun colore nuovo: la palette non si allarga (DESIGN.md §1). Cambia la FORMA —
   il pieno sabbia contro il contorno — e resta distinguibile anche in bianco e nero
   e a chi non separa le tinte (§7).

   La stessa pillola piena dice, nell'elenco delle fisse, «3 date saltate da guardare»
   (dal 20 ottobre 2026): è una situazione su cui c'è da fare qualcosa, come un invito
   scaduto, e ha la forma di quelle. «tua» accanto è un'.etichetta-ruolo, in contorno. */
.etichetta-accesso,
.etichetta-da-guardare {
    display: inline-block;
    margin-right: 0.25rem;
    font-size: 0.75rem;
    font-weight: 700;
    color: var(--nero);
    background: var(--sabbia);
    border: 1px solid var(--sabbia);
    border-radius: var(--pillola);
    padding: 0.25rem 0.5rem;
}

/* «Entra» è lo stato normale e non deve gridare: resta chiaro, col contorno pieno.
   Gli altri quattro sono situazioni su cui c'è da fare qualcosa, e restano sabbia. */
.etichetta-accesso.regolare {
    background: var(--bianco);
    border-color: var(--nero);
}

/* I ruoli nell'elenco: pillola chiara col bordo, distinta dall'etichetta
   "disattivato" che è piena — due significati diversi, due forme diverse.
   Nero su bianco con bordo sabbia: il testo porta l'informazione, il bordo no. */
.etichetta-ruolo {
    display: inline-block;
    margin-right: 0.25rem;
    font-size: 0.7rem;
    font-weight: 700;
    color: var(--nero);
    background: var(--bianco);
    border: 1px solid var(--sabbia);
    border-radius: var(--pillola);
    padding: 0.15rem 0.6rem;
}

.etichetta-spenta {
    display: inline-block;
    font-size: 0.7rem;
    font-weight: 700;
    color: var(--nero);
    background: var(--sabbia);
    border-radius: var(--pillola);
    padding: 0.15rem 0.6rem;
}

/* .campo-ricerca stava qui, e la usava solo la ricerca di Clienti. Dal 7 ottobre 2026
   quella ricerca è .cerca, la pillola con la lente: vedi «Clienti», in fondo al foglio. */

/* .titolo-sezione stava ANCHE qui, senza il grassetto: la regola completa è nel blocco
   «Circolo», più in basso, e vinceva quella. Una modifica fatta su questa copia non
   avrebbe prodotto nessun effetto, senza che nessuno capisse perché. */

/* Frecce per riordinare: quadrate e da 44px, perché si premono più volte di fila. */
.cella-ordine { white-space: nowrap; width: 1%; }

.bottone-ordine {
    width: 44px;
    min-height: var(--h-comando);
    margin-right: 0.15rem;
    background: var(--bianco);
    border: 1px solid var(--bordo);
    border-radius: 8px;
    font-family: inherit;
    font-size: 0.9rem;
    color: var(--nero);
    cursor: pointer;
}

.bottone-ordine:disabled { opacity: 0.35; cursor: default; }

/* Riga secondaria sotto al nome, in tabella: la superficie, un promemoria. */
.dettaglio-riga {
    display: block;
    font-size: 0.75rem;
    color: var(--testo);
}

/* .storico — lo storico di un cliente nel pannello laterale — stava qui. Dal 7 ottobre
   2026 la scheda è una finestra e lo storico è .righe-storico: vedi «Clienti», in fondo
   al foglio. Non scorre più per conto suo (scorre il corpo della finestra), e
   un'annullata non è più smorzata con l'opacità, che la portava sotto i 4,5:1. */

/* Sotto i 640px la tabella dei campi diventa un elenco di schede.
   Non è vezzo: sette colonne su un telefono facevano scorrere IN ORIZZONTALE
   tutta la pagina, e il menu in basso è pensato per essere usato dal telefono.
   Le celle che perdono l'intestazione se la riportano da data-etichetta.

   Qui c'erano anche le regole di .tabella-clienti, la tabella di Accessi e di Maestri
   fatta a schede con le etichette. Sono uscite il 29 ottobre 2026: Accessi ha le righe-
   bottone di Clienti dal passo 3, e Maestri, l'ultima pagina che le usava, ha la sua
   tabella (.elenco-maestri, in fondo al foglio). */
@media (max-width: 640px) {
    table.elenco.tabella-campi,
    table.elenco.tabella-campi tbody,
    table.elenco.tabella-campi tr,
    table.elenco.tabella-campi td { display: block; width: auto; }

    table.elenco.tabella-campi thead { display: none; }

    table.elenco.tabella-campi tr {
        position: relative;
        padding: 0.75rem 8rem 0.75rem 0.75rem;   /* a destra lo spazio per le frecce */
        border-bottom: 1px solid var(--bordo);
    }

    table.elenco.tabella-campi tbody tr:last-child { border-bottom: none; }

    table.elenco.tabella-campi td {
        padding: 0.1rem 0;
        border-bottom: none;
    }

    /* Le frecce in alto a destra, dove arriva il pollice, e fuori dal flusso: se
       restassero in colonna spingerebbero il nome del campo sotto di sé. */
    table.elenco.tabella-campi .cella-ordine {
        position: absolute;
        right: 0.75rem;
        top: 0.75rem;
        width: auto;
    }

    /* La cella dello stato è vuota quando il campo è attivo: senza questo
       lascerebbe una riga bianca in fondo a ogni scheda. */
    table.elenco.tabella-campi .cella-stato:empty { display: none; }

    table.elenco.tabella-campi td[data-etichetta]::before {
        content: attr(data-etichetta) ": ";
        color: var(--testo);
        font-size: 0.75rem;
    }
}

/* ── Scelta del socio dentro il pannello del calendario ───────────────────── */

.scelta-intestatario { margin-bottom: 0.75rem; }

.larghezza-piena { width: 100%; }

.risultati-clienti {
    list-style: none;
    margin: 0 0 0.75rem;
    padding: 0;
    border: 1px solid var(--bordo);
    border-radius: var(--raggio, 10px);
    overflow: hidden;
}

.risultati-clienti li + li { border-top: 1px solid var(--bordo); }

/* I suggerimenti di CampoCliente (passo 10 del piano dei clienti, 20 ottobre 2026) sono
   RIGHE DI UN ELENCO, non bottoni: col modello «combobox» il fuoco resta nella casella in
   cui si scrive, e la riga scelta con le frecce la dice aria-selected (vedi più sotto).
   Hanno lo stesso aspetto dei bottoni di questo elenco, quindi stanno nelle stesse regole. */
.risultati-clienti button,
.risultati-clienti [role="option"] {
    display: block;
    width: 100%;
    min-height: var(--h-comando);
    padding: 0.5rem 0.75rem;
    background: var(--bianco);
    border: none;
    font-family: inherit;
    font-size: 0.9rem;
    color: var(--nero);
    text-align: left;
    cursor: pointer;
}

.risultati-clienti button:hover,
.risultati-clienti [role="option"]:hover { background: var(--sfondo); }

/* Un nome scritto tutto attaccato arriva a 121 caratteri: va a capo dentro la riga invece
   di allargare la finestra, e a 360px il body non scorre (DESIGN.md §4). */
.risultati-clienti [role="option"] { overflow-wrap: anywhere; }

/* La riga evidenziata con le frecce. Il fuoco VERO resta nella casella, quindi il contorno
   di :focus-visible qui non scatterebbe mai: lo si disegna uguale — 3px nero, dentro la riga
   come quello dei bottoni qui sopra — perché da tastiera si veda sempre dove si è (§5). Il
   fondo da solo non basterebbe: è lo stesso del passaggio del mouse, e due righe con lo
   stesso fondo non dicono quale sceglie Invio (§7). */
.risultati-clienti [role="option"][aria-selected="true"] {
    background: var(--sfondo);
    outline: 3px solid var(--nero);
    outline-offset: -3px;
}

/* L'elenco sotto la casella da cui si cerca, attaccato a lei: .campo-pannello chiude con
   0,75rem, e a quella distanza l'elenco si leggeva come la casella dopo. Ne restano 0,25.
   ⚠️ E LA NOTA DEL GUASTO NELLO STESSO POSTO, con la stessa misura: prende il posto
   dell'elenco, e coi suoi 0,5rem di serie stava a 1,25rem dalla casella di cui parla e a
   0,75 da quella dopo — cioè più vicina alla casella sbagliata. */
.campo-cliente .risultati-clienti,
.campo-cliente .nota-guasta { margin-top: -0.5rem; }

/* Il contorno del fuoco va DENTRO il bottone: l'elenco ha overflow: hidden per gli angoli
   tondi, e il contorno di serie (3px, 2 di stacco, fuori) veniva tagliato ai due lati e
   in cima al primo risultato — da tastiera si vedevano due righe orizzontali staccate, o
   niente (DESIGN.md §5). */
.risultati-clienti button:focus-visible { outline-offset: -3px; }

.risultati-clienti .dettaglio-socio {
    display: block;
    font-size: 0.75rem;
    color: var(--testo);
}

/* ── «CERCA, POI SCEGLI O CREA»: SceltaCliente ──────────────────────────────────
   docs/CHI-GIOCA-PIANO.md, passo 2 (27 ottobre 2026). Nessun colore, nessuna ombra e
   nessun raggio nuovo: solo token che ci sono già (--bordo, --grigio, --bianco, --ombra,
   --h-campo, --raggio), nessuna transizione (DESIGN.md §6: non serve movimento), e il
   pulsante pieno della pallina non c'è, perché «Cambia», «Modifica», «Torna a» e
   «+ Nuovo cliente» sono comandi secondari (.bottone-oggi): la pallina resta a «Prenota». */

/* Il componente è un <fieldset> solo per spegnere tutto in una volta con `disabled` mentre una
   scrittura è in volo, come SceltaChi. Un fieldset ha min-width: min-content di serie, e un nome
   lungo allargherebbe la finestra: a 360px il body non scorre (DESIGN.md §4). */
.scelta-cliente {
    border: 0;
    padding: 0;
    margin: 0;
    min-width: 0;
}

/* Il riferimento dell'elenco quando, sul telefono, esce dal flusso (più sotto). */
.scelta-cliente .ricerca { position: relative; }

.scelta-cliente .ricerca > .nota-pannello,
.scelta-cliente > .nota-pannello { overflow-wrap: anywhere; }

/* LA RICERCA COME CAMPO DA COMPILARE. .cerca è alta 44 perché in Clienti sta in riga con la pista;
   qui è un campo, e un campo è 48 (--h-campo). Il bordo è quello degli altri campi della finestra
   (--grigio, come .campo-pannello input), non --sabbia: in Clienti --sabbia regge perché la lente e la
   frase d'esempio sono un secondo segnale, qui scritto il testo il segnaposto non c'è più. --grigio sta
   a 2,29:1, ed è il debito 5 di DESIGN.md §10: non si risolve qui, ma non se ne introduce un terzo.
   Due classi perché .cerca input sta più sotto nel foglio, a parità di peso vincerebbe lei. */
.cerca.cerca--campo input {
    min-height: var(--h-campo);
    border-color: var(--grigio);
}

/* L'elenco sotto la casella, attaccato a lei (sul computer): .risultati-clienti chiude con 0,75rem, e a quella
   distanza l'elenco si leggeva come la casella dopo. Quello che viene sotto — «Torna a», «Nuovo», le note — ha il
   suo margine. */
.scelta-cliente .risultati-clienti { margin: 0.25rem 0 0; }

/* «+ Nuovo cliente» in fondo all'elenco si distingue senza il colore: il grassetto, e la riga sopra che le
   dà `li + li` quando c'è un risultato prima di lei. La seconda riga (la divisione in nome e cognome) resta
   leggera come quella degli altri. */
.risultati-clienti .nuovo-cliente { font-weight: 700; }
.risultati-clienti .nuovo-cliente .dettaglio-socio { font-weight: 400; }

/* I comandi secondari sotto la casella — «Torna a», «+ Nuovo cliente», «Cerca un altro cliente» —: un nome lungo
   (121 caratteri) va a capo dentro il pulsante invece di allargare la finestra. */
.scelta-cliente > .bottone-oggi {
    margin: 0.5rem 0 0;
    max-width: 100%;
    text-align: left;
    overflow-wrap: anywhere;
}

/* Le quattro caselle di sempre, sotto «Cerca un altro cliente». */
.scelta-cliente .campo-cliente { margin-top: 0.75rem; }

/* LA SCHEDA: una RIGA con una linea sopra e una sotto, non un riquadro (DESIGN.md §3: niente superfici dentro
   superfici). Il nome in 1rem grassetto nero, che va a capo senza spingere fuori i pulsanti. */
.cliente-scelto {
    display: flex;
    flex-wrap: wrap;
    align-items: flex-start;
    justify-content: space-between;
    gap: 0.5rem 0.75rem;
    padding: 0.75rem 0;
    border-top: 1px solid var(--bordo);
    border-bottom: 1px solid var(--bordo);
}

/* Il gruppo riceve il fuoco da programma, dopo il tocco su un cliente: senza questo si vedrebbe il contorno
   nero su tutta la riga, che non è un bersaglio da premere (come .finestra:focus). I contorni dei comandi
   DENTRO restano intatti (DESIGN.md §5). */
.cliente-scelto:focus { outline: none; }

.cliente-scelto__dati {
    flex: 1 1 12rem;
    min-width: 0;
    display: flex;
    flex-direction: column;
    gap: 0.125rem;
}

.cliente-scelto__nome {
    font-size: 1rem;
    font-weight: 700;
    color: var(--nero);
    overflow-wrap: anywhere;
}

.cliente-scelto__comandi {
    display: flex;
    flex-wrap: wrap;
    gap: 0.5rem;
}

.cliente-scelto .recapito-cliente svg {
    width: 18px;
    height: 18px;
    flex: none;
}

/* L'ELENCO SUL TELEFONO, VARIANTE (d), scelta da Marco il 27 ottobre 2026 sul suo telefono con una casella vera
   (docs/anteprime/chi-gioca-casella.html). Sotto i 640px di larghezza — la soglia in cui la finestra poggia in
   basso — o sotto i 500 di altezza (un telefono in orizzontale con la tastiera aperta) l'elenco si apre SOPRA la
   casella, fuori dal flusso, come un fumetto: la casella NON si sposta. Sopra, resta sotto la casella e senza
   limite, com'è oggi.

   Perché non le altre. (a) sotto la casella: la tastiera lo copre, e un limite d'altezza non lo sposta fuori dalla
   tastiera. (b) sopra, in flusso (column-reverse): fa scendere la casella di tutta l'altezza dell'elenco appena
   compare, cioè sotto il dito. (c) interactive-widget=resizes-content nel meta viewport: tocca TUTTO il
   gestionale, e Safari su iPhone potrebbe non rispettarlo. index.html non cambia.

   14rem di altezza massima e lo scorrimento (overscroll-behavior: contain, perché il fondo della lista non porti
   con sé il corpo della finestra); «+ Nuovo cliente» resta incollata in fondo, cioè la riga più vicina alla
   casella e al pollice. L'ombra è l'unica del gestionale (--ombra): senza, non si capirebbe che l'elenco sta sopra.
   Lo scarto di 0,375rem dalla casella lascia stare il suo contorno di fuoco (3px + 2 di stacco).

   ⚠️ IL RISCHIO DELLA (d), E IL RIMEDIO SOLO CSS (28 ottobre 2026, revisione). L'elenco sta dentro
   .corpo-finestra, l'unica parte che scorre. Se la casella è in cima alla parte visibile del corpo — per esempio
   dopo aver scorso a mano, o con la finestra bassa di un telefono in orizzontale — sopra non c'è spazio, e
   l'elenco viene tagliato sotto l'intestazione della finestra. Misurato in Chromium a 375x667 (corpo alto 306px,
   l'elenco ne vuole 216): con la casella a 14px dal bordo alto restano visibili 9px di elenco, cioè nemmeno la riga
   «Nuovo», che in quello stato è l'unico modo di aggiungere un cliente. Sul telefono di Marco non succedeva perché
   la tastiera porta in vista la casella in BASSO.
   Il rimedio è lo `scroll-margin-top` sulla casella, qui sotto: 14,5rem, cioè i 14rem dell'elenco, lo scarto dalla
   casella e un filo. Quando la casella prende il fuoco il browser la porta ad almeno quella distanza dal bordo alto
   del corpo, e sopra di lei c'è lo spazio per l'elenco intero; dove c'è già, non si muove niente. Provato in
   Chromium a 375x667: da qualunque posizione di partenza la casella finisce a 218px dal bordo alto del corpo e il
   taglio va a zero; dove il corpo è troppo basso per contenere margine e casella (667x375, corpo di 143px) il
   browser la mette sul bordo basso, che è dove la mette anche senza.

   ⚠️ DA PROVARE SUL TELEFONO CON LA TASTIERA, perché da qui non si può: scorrere il corpo a mano e toccare la
   casella (1) già in cima alla parte visibile, (2) a metà, (3) in fondo, e scrivere due lettere. La casella deve
   restare sopra la tastiera, e l'elenco vedersi per intero o quasi sopra di lei. Questa riga NON è la (d) che Marco
   ha scelto: è un rimedio aggiunto dopo, e se la tastiera porta la casella dietro, o l'elenco peggiora, si toglie
   la sola `scroll-margin-top` e la (d) resta com'era. Un posizionamento ad àncora con ripiego (position-try) o
   un'animazione guidata dallo scorrimento sono funzioni nuove che l'iPhone di un cliente potrebbe non avere.

   ⚠️ UN LIMITE NOTO, NON UN RIMEDIO: la soglia guarda la larghezza e l'altezza, non il dispositivo, e
   `aria-activedescendant` non fa scorrere l'elenco (il componente non usa JavaScript). In una finestra di computer
   stretta, o bassa, le frecce possono evidenziare una riga fuori vista dentro l'elenco limitato; sul telefono, dove
   la (d) è stata scelta, le frecce non ci sono. Restringere la (d) ai dispositivi senza mouse (`hover: none`) è una
   riga, ma cambia la soglia che Marco ha scelto: la decide lui. */
@media (max-width: 640px), (max-height: 500px) {
    .scelta-cliente .risultati-clienti {
        position: absolute;
        left: 0;
        right: 0;
        bottom: calc(100% + 0.375rem);
        z-index: 5;
        margin: 0;
        max-height: 14rem;
        overflow-y: auto;
        overscroll-behavior: contain;
        box-shadow: var(--ombra);
    }

    .risultati-clienti .nuovo-cliente {
        position: sticky;
        bottom: 0;
    }

    /* Lo spazio per l'elenco sopra la casella quando prende il fuoco (vedi il rischio, sopra). Due classi come
       `.cerca.cerca--campo input` più su, per stare allo stesso livello. */
    .cerca.cerca--campo input {
        scroll-margin-top: 14.5rem;
    }
}

.interruttore {
    display: inline-flex;
    align-items: center;
    gap: 0.5rem;
    min-height: var(--h-comando);
    font-size: 0.85rem;
    cursor: pointer;
}

/* ── L'INTERRUTTORE, dal kit MDI ───────────────────────────────────────────
   Scelta del committente dell'8 settembre 2026: la casella di spunta del browser
   diventa un interruttore a pillola. Non e' solo estetica — un quadratino da 18px
   e' un bersaglio da 18px anche se la sua etichetta e' alta 44, e col pollice si
   sbaglia; questo e' largo 44 e alto 26.

   ⚠️ LO STATO NON LO DICE SOLO IL COLORE (DESIGN.md §7): lo dice anche la POSIZIONE
   del pomello, sinistra o destra. Chi non distingue il grigio dal giallo pallina vede
   comunque da che parte sta.

   ⚠️ IL BORDO NON E' DECORATIVO. Il fondo spento --grigio su bianco sta a 2,3:1 e
   la pallina a 1,42:1: sotto i 3:1 che il §1 chiede a un contorno quando e' l'unico
   segnale che distingue un elemento. Il bordo --testo porta il confine a 5,02:1 in
   tutti e due gli stati, ed e' quello a rendere l'interruttore percepibile. Non
   toglierlo per «pulire».

   ⚠️ min-height E padding A ZERO, DICHIARATI QUI, e non e' pignoleria: dentro un
   .campo-pannello la regola dei campi da compilare (.campo-pannello input, 48px di
   altezza minima e mezzo rem di imbottitura) prendeva anche l'interruttore, perche'
   questa regola non diceva niente di quelle due proprieta'. Usciva 44x48 col pomello
   appiccicato in alto — in Accessi, nel pannello del nuovo accesso. Un componente
   dichiara tutto cio' di cui ha bisogno, cosi' vince in qualunque contenitore. */
.interruttore input[type="checkbox"] {
    appearance: none;
    -webkit-appearance: none;
    flex: none;
    box-sizing: border-box;
    width: 44px;
    height: 26px;
    min-height: 0;
    margin: 0;
    padding: 0;
    border: 1px solid var(--testo);
    border-radius: var(--pillola);
    background: var(--grigio);
    position: relative;
    cursor: pointer;
    transition: background-color 150ms;   /* dentro i 120-200ms del §6 */
}

.interruttore input[type="checkbox"]::after {
    content: "";
    position: absolute;
    top: 2px;
    left: 2px;
    width: 20px;
    height: 20px;
    border-radius: 50%;
    background: var(--bianco);
    /* transform e non left: si anima senza far ricalcolare il layout (§6). */
    transition: transform 150ms;
}

.interruttore input[type="checkbox"]:checked { background: var(--pallina); }
.interruttore input[type="checkbox"]:checked::after { transform: translateX(18px); }

.interruttore input[type="checkbox"]:disabled { opacity: 0.6; cursor: wait; }

/* Un interruttore che sta salvando deve DIRLO. I bottoni hanno :disabled con
   opacity e cursor:wait; una checkbox disabilitata invece non cambia di un pixel,
   e chi non vede succedere niente ricicca — su una spunta d'incasso significa
   mandare due volte la stessa scrittura. */
.interruttore.in-attesa {
    opacity: 0.6;
    cursor: wait;
}

.interruttore.in-attesa input { cursor: wait; }

.stato-salvataggio {
    font-size: 0.8rem;
    color: var(--testo);
    margin-left: 0.5rem;
}

/* Un esito andato bene, con un elenco sotto. Era il resoconto della materializzazione
   delle ricorrenti, che con la pagina vecchia è sparito il 20 ottobre 2026 (passo 14 delle
   fisse); .etichetta-vince, la pillola del simulatore delle tariffe, era già senza nessuno
   e se n'è andata lo stesso giorno.

   ⚠️ QUESTE DUE OGGI NON LE USA NESSUNA PAGINA (22 ottobre 2026). Le teneva l'esito di
   «Rendi anonimo» della vecchia pagina Clienti, che il passo 12 di
   docs/CLIENTI-PER-PRENOTAZIONE-PIANO.md ha riscritto senza; e la cancellazione di un
   cliente, deciso il 22 ottobre, è rimandata a un blocco a parte. Restano: se quel blocco
   vorrà un esito con un elenco sotto, la forma c'è già; se no, escono insieme al resto
   del codice vecchio con la pulizia delle migrazioni distruttive. Da decidere allora,
   non adesso. */
.riquadro-esito {
    background: var(--libero);
    border: 1px solid var(--libero-bordo);
    color: var(--nero);
    border-radius: var(--raggio, 10px);
    padding: 0.75rem 1rem;
    margin: 0 0 1rem;
}

.elenco-saltate { margin: 0.5rem 0; padding-left: 1.25rem; font-size: 0.9rem; }
.elenco-saltate li { margin-bottom: 0.25rem; }

.separatore-pannello {
    border: none;
    border-top: 1px solid var(--bordo);
    margin: 1rem 0;
}

/* Primo avvio: si distingue dal modulo di accesso normale, o chi installa non
   capisce perche' gli si chiedono nome e cognome per entrare. */
.avviso-primo-avvio {
    background: #FDF6E7;
    border: 1px solid var(--sabbia);
    border-radius: var(--raggio, 10px);
    padding: 0.75rem 1rem;
    margin: 0 0 1rem;
    font-size: 0.9rem;
    color: var(--nero);
}

/* ── Impostazioni ─────────────────────────────────────────────────────────── */

/* ⚠️ QUI SOPRA C'ERA IL LISTINO A REGOLE — .riepilogo-listino, .scheda-listino,
   .tabella-fasce, .cella-prezzo, .scontrino, .frase-modulo e compagnia — rimasto dopo
   che Tariffe.razor era stata cancellata il 13 agosto 2026. Tolto il 15 settembre 2026,
   dopo aver cercato ogni classe in tutti i .razor: nessuno le usava più. Non era solo
   peso: dentro c'erano un colore fuori palette (#8A5A00), dei controlli alti 36px col
   testo a 13,5px — sotto le soglie del §4 e del §2 — e soprattutto una .frase-regola con lo
   stesso nome di quella della pagina Circolo, qui sotto. Due regole con lo stesso nome
   nello stesso foglio: vince l'ultima, e la prima inganna chi legge. */

.scheda-impostazioni {
    background: var(--bianco);
    border: 1px solid var(--bordo);
    border-radius: var(--raggio, 10px);
    padding: 1.25rem;
    max-width: 620px;
}

.titolo-sezione {
    font-size: 1rem;
    font-weight: 700;
    color: var(--nero);
    margin: 0 0 0.75rem;
}

/* Il riquadro dell'invito porta un indirizzo lungo da copiare: i 620px della scheda
   lo taglierebbero a metà. Larghezza piena, che è anche il modo di dire «questo
   leggilo adesso» senza aggiungere un colore. */
.scheda-larga { max-width: none; }

/* Rete di sicurezza: senza, un <h2> scritto senza classe ricade su Bootstrap e viene
   PIÙ GRANDE dell'h1, più magro del testo di corpo e grigio — cioè il contrario di
   una gerarchia. È già successo su due schermate. */
h2 {
    font-size: 1.1rem;
    font-weight: 700;
    color: var(--nero);
    line-height: 1.2;
    margin: 0 0 0.75rem;
}

/* Due o tre campi corti in riga invece che incolonnati: "apre alle / chiude alle"
   sono una cosa sola e vanno letti insieme. A wrap perche' sotto i 500px in riga
   non ci stanno, e schiacciarli li renderebbe intoccabili col pollice. */
.coppia-campi {
    display: flex;
    flex-wrap: wrap;
    gap: 0.75rem;
}

.coppia-campi .campo-pannello { flex: 1 1 10rem; min-width: 0; }

.coppia-campi input,
.coppia-campi select { width: 100%; }

/* La variante che NON va a capo, per i due prezzi. Il wrap qui sopra e' nato per gli
   orari: un <input type="time"> si porta dietro il quadrante e una larghezza minima
   sua, e sotto i 500px in riga davvero non ci sta. Una casella numerica no — a 375px
   il corpo della finestra e' 311px, quindi (311 - 12 di gap) / 2 = ~150px a testa,
   larghi il doppio di quello che serve a scriverci «16,00» e alti sempre 44.
   flex-basis 0 e non 10rem: con 10rem la base da sola sforerebbe e si tornerebbe a
   capo malgrado il nowrap, schiacciando le due colonne fuori dalla finestra. */
.coppia-campi.sempre-in-riga { flex-wrap: nowrap; }
.coppia-campi.sempre-in-riga .campo-pannello { flex: 1 1 0; }

/* Conferma di salvataggio: verde come il resoconto della materializzazione, e con
   la parola — il colore da solo non e' un'informazione (DESIGN.md §7). */
.avviso-salvato {
    background: var(--libero);
    border: 1px solid var(--libero-bordo);
    color: var(--nero);
    border-radius: var(--raggio, 10px);
    padding: 0.6rem 1rem;
    margin: 0 0 1rem;
    font-size: 0.9rem;
}

/* ══ CIRCOLO: PRIMA SI LEGGE, POI SI CAMBIA ══════════════════════════════════
   La pagina Circolo, variante C della tavola «Le regole del circolo», scelta dal
   committente il 15 settembre 2026: una scheda per argomento, ognuna con una frase
   che dice la regola e un «Cambia» che la apre sul posto. Una scheda aperta per volta.

   ⚠️ È LA PRIMA PAGINA DEL GESTIONALE CENTRATA NEL FLUSSO, e non per gusto. Il §0 dice
   che nel gestionale lo spazio bianco è tempo perso, e Calendario e Clienti hanno
   bisogno di tutta la larghezza: per questo .contenuto NON si tocca. Ma questa è una
   pagina da leggere — righe di testo — e una frase lunga 1.200px non si legge. La
   colonna è larga quanto la barra in basso (--larghezza-colonna), così i bordi della
   pagina e della pillola coincidono. Si centra il BLOCCO: il testo resta a sinistra
   (§8, niente testo centrato oltre le due righe).
   ═══════════════════════════════════════════════════════════════════════════ */

.colonna-centrata {
    max-width: var(--larghezza-colonna);
    margin-inline: auto;
    display: flex;
    flex-direction: column;
    gap: 1rem;
}

/* Il gap della colonna fa già da stacco: il margine della testata si riduce, o testata
   e prima scheda starebbero lontane il doppio delle schede fra loro. */
.colonna-centrata > .testata-calendario { margin-bottom: 0.5rem; }
.colonna-centrata > .testata-calendario h1 { margin-bottom: 0.25rem; }
.colonna-centrata > .avviso-errore { margin: 0; }

.spiegazione-pagina {
    margin: 0;
    font-size: 0.9rem;
    color: var(--testo);
}

/* ⚠️ UN <a> NON EREDITA IL COLORE: senza questa riga il collegamento a Campi usciva col
   blu del browser, che nella palette non esiste (§1). Nero e sottolineato: si distingue
   dal testo grigio intorno per colore E per forma. Solo dentro questa colonna — gli
   altri collegamenti in linea del gestionale restano come sono, finché qualcuno non lo
   decide per tutti. */
.colonna-centrata a:not([class]) {
    color: var(--nero);
    text-decoration: underline;
    text-underline-offset: 3px;
}

/* Aperta: il bordo si fa nero, 20,46:1. Da 1px a 1px, quindi niente salto di layout.
   ⚠️ NIENTE OMBRA: il §3 la riserva a ciò che galleggia, e una scheda aperta sta nel
   flusso. E niente barra colorata sul bordo: bastano il bordo, i campi e il piede. */
.scheda-impostazioni.aperta { border-color: var(--nero); }

/* La riga capo: il titolo a sinistra, il comando a destra. Alta quanto un comando
   anche quando il comando non c'è — a scheda aperta, o mentre un'altra è aperta — così
   aprire e chiudere non fanno saltare la frase sotto. A capo sul telefono. */
.capo-regola {
    display: flex;
    align-items: center;
    justify-content: space-between;
    flex-wrap: wrap;
    gap: 0.5rem 0.75rem;
    min-height: var(--h-comando);
    margin-bottom: 0.5rem;
}

.capo-regola .titolo-sezione { margin: 0; }

.titolo-regola { display: flex; align-items: baseline; flex-wrap: wrap; }

.comandi-regola { display: flex; flex-wrap: wrap; gap: 0.5rem; }

/* La regola in una frase: il contorno in --testo, i VALORI in nero e grassetto dentro
   il testo. Si legge la frase, e l'occhio trova i numeri senza cercarli. Le cifre
   incolonnate servono agli orari: «08:00» e «22:30» della stessa larghezza. */
.frase-regola {
    margin: 0;
    font-size: 0.95rem;
    line-height: 1.5;
    color: var(--testo);
}

/* nowrap: un valore si legge intero o non si legge. «1 ora e | mezza» spezzato a fine
   riga sembrano due valori; così scende tutto alla riga dopo. I valori sono corti — il
   più lungo è «non accetta prenotazioni» — e a 360px stanno comunque in una riga. */
.frase-regola strong,
.colonna-centrata .nota-pannello strong {
    color: var(--nero);
    font-weight: 700;
    font-variant-numeric: tabular-nums;
    white-space: nowrap;
}

.frase-regola + .frase-regola { margin-top: 0.5rem; }

/* Il piede di una scheda aperta, lo stesso della finestra di Campi senza la finestra:
   Salva poi Annulla, larghi uguali. Vanno a capo, uno sotto l'altro, quando in riga non
   ci stanno interi — «Pubblica sul sito» a 360px spezzato su due righe dentro una
   pillola si leggeva come due bottoni. */
.piede-regola {
    display: flex;
    flex-wrap: wrap;
    gap: 0.5rem;
    margin-top: 1rem;
    padding-top: 1rem;
    border-top: 1px solid var(--bordo);
}

.piede-regola > * { flex: 1 1 10rem; }

/* La stessa regola per la finestra «Hai lasciato a metà», che usa .piede-finestra. */
.piede-finestra.piede-a-capo { flex-wrap: wrap; }
.piede-finestra.piede-a-capo > * { flex: 1 1 10rem; }

/* ── L'avviso acceso: una superficie di richiamo ───────────────────────────
   Sabbia, come .barra-spostamento: è la palette a dire che --sabbia è per ciò che deve
   farsi notare (§1). Un avviso acceso da nove giorni DEVE farsi notare.

   ⚠️ SUL SABBIA TUTTO È NERO. --testo su --sabbia sta a 3,12:1, sotto soglia (§1, §10):
   ogni figlio che di suo è grigio va riportato a nero qui, uno per uno, altrimenti lo
   eredita in silenzio. E il bordo --sabbia dei .bottone-oggi sul fondo --sabbia
   sparirebbe: lì il bordo diventa nero, 12,74:1. */
.scheda-impostazioni.avviso-acceso {
    background: var(--sabbia);
    border-color: var(--sabbia);
    color: var(--nero);
}

.avviso-acceso .frase-regola,
.avviso-acceso .stato-salvataggio,
.avviso-acceso .nota-pannello,
.avviso-acceso .nota-guasta { color: var(--nero); }

.avviso-acceso .bottone-oggi { border-color: var(--nero); }

/* Il testo dell'avviso è la cosa più grande della scheda: è ciò che legge chi apre il
   sito. pre-line perché lo si scrive in una casella a più righe, e gli a capo sono suoi. */
.testo-avviso {
    margin: 0 0 0.5rem;
    font-size: 1.15rem;
    font-weight: 700;
    line-height: 1.35;
    color: var(--nero);
    white-space: pre-line;
    overflow-wrap: anywhere;
}

/* ── I recapiti, a due colonne ─────────────────────────────────────────────
   Il nome a sinistra e il valore a destra finché il valore ci sta largo; sotto, sul
   telefono, il valore scende sotto il suo nome e prende tutta la riga. Senza media
   query: lo decide la base di 16rem del valore.

   ⚠️ LA MISURA VIENE DALL'EMAIL. A due colonne fisse, a 360px il valore aveva 208px e
   «ilcircolodianomarina@gmail.com» ne chiede 225: andava a capo in mezzo alla parola,
   «gmail.c» e «om» su due righe. 16rem sono 240px, quindi l'indirizzo sta intero in
   tutte e due le disposizioni; overflow-wrap resta per un indirizzo ancora più lungo. */

.recapiti {
    margin: 0;
    display: flex;
    flex-direction: column;
    gap: 0.5rem;
    font-size: 0.95rem;
}

.recapiti > div {
    display: flex;
    flex-wrap: wrap;
    align-items: baseline;
    column-gap: 1rem;
}

.recapiti dt { flex: 0 0 6rem; font-size: 0.85rem; color: var(--testo); }

.recapiti dd {
    flex: 1 1 16rem;
    min-width: 0;
    margin: 0;
    color: var(--nero);
    overflow-wrap: anywhere;
}

/* Un recapito che manca non è un valore: si scrive col colore del contorno, e dice
   cosa comporta sul sito invece di lasciare un vuoto. */
.recapiti dd.vuoto { color: var(--testo); }

/* IL COLLEGAMENTO DELLA MAPPA È IL VALORE DA SOLO, non una parola dentro una frase: vale
   il §4, 44px. Il testo ne misura una ventina, e allungare la riga la staccherebbe dalle
   altre. L'area si allarga col padding e il margine negativo la riporta dov'era: la riga
   resta alta uguale, il dito prende 44px.

   ⚠️ position: relative non è un vezzo: senza, la frase d'aiuto che segue sta sopra la
   metà bassa dell'area, e il tocco lì va a lei. */
.recapiti dd > a {
    display: inline-block;
    position: relative;
    padding-block: calc((var(--h-comando) - 1lh) / 2);
    margin-block: calc((1lh - var(--h-comando)) / 2);
}

.recapiti .aiuto-recapito {
    display: block;
    margin-top: 0.25rem;
    font-size: 0.8rem;
    color: var(--testo);
}

/* ── Il nastro della giornata del sito ─────────────────────────────────────
   Lo stesso .nastro del Calendario, con le stesse parole: «si gioca» è la tinta di
   libero, «resta vuota» quella di non prenotabile. Sopra, in una fila sua, una tacca
   nera dove si comincia: a mezz'ore una ogni casella, a ore intere una ogni due, e la
   differenza si vede prima di leggerla.

   ⚠️ LE TACCHE NON STANNO DENTRO .nastro: quello ha overflow hidden col raggio da 6px,
   e taglierebbe proprio la prima, quella dell'apertura. Stanno in una fila con la
   stessa griglia — stessi figli, stesso gap — quindi cadono sugli stessi bordi.

   L'altezza del nastro resta quella del Calendario, 26px, e non si abbassa: le due
   tinte — si gioca, resta vuota — sono chiare e vicine fra loro, e su una striscia
   bassa la mezz'ora vuota in fondo non si distingueva più.

   È tutto aria-hidden: la parola la porta la frase sotto (§7). */
.anteprima-giornata { margin: 0.75rem 0; }

.tacche-partenze {
    display: flex;
    gap: 1px;
    height: 8px;
    margin-bottom: 2px;
}

.tacche-partenze i { flex: 1 1 0; position: relative; display: block; }

.tacche-partenze i.parte::before {
    content: "";
    position: absolute;
    left: 0;
    top: 0;
    bottom: 0;
    width: 2px;
    background: var(--nero);
}

/* Le ore sotto il nastro, messe dove cadono e non distribuite: con space-between le
   12:00 finirebbero a metà giornata anche quando la giornata non è simmetrica. La
   prima si appoggia a sinistra e l'ultima a destra, o uscirebbero dal nastro. */
.scala-partenze {
    position: relative;
    height: 1rem;
    margin-top: 0.25rem;
    font-size: 0.7rem;
    line-height: 1rem;
    color: var(--testo);
    font-variant-numeric: tabular-nums;
}

.scala-partenze span {
    position: absolute;
    top: 0;
    transform: translateX(-50%);
    white-space: nowrap;
}

.scala-partenze span:first-child { transform: none; }
.scala-partenze span:last-child { transform: translateX(-100%); }

.anteprima-giornata .legenda-nastro { margin-top: 0.5rem; }

/* Il campione della tacca: una riga nera, non un quadratino. 0,2,1 batte lo 0,1,1 di
   .legenda-nastro i, qualunque sia l'ordine nel foglio. */
.legenda-nastro i.tacca-legenda {
    width: 2px;
    height: 14px;
    border: 0;
    border-radius: 0;
    background: var(--nero);
}

/* ── Gli interruttori delle durate ─────────────────────────────────────────
   Uno per riga: si sceglie più d'una, quindi non è una pista (§3), e in fila a 360px
   il bersaglio da 44px varrebbe in altezza ma non in larghezza. */
.elenco-interruttori { display: flex; flex-direction: column; }
.elenco-interruttori .interruttore { display: flex; }

/* Spento perché a ore intere non si offre. ⚠️ NON cursor: wait, che è quello di
   .interruttore input:disabled e vuol dire «sto salvando»: qui non si sta aspettando
   niente, non si può e basta. Il secondo segnale oltre al grigio è la parola accanto,
   «solo a mezz'ore» (§5). */
.interruttore.spenta { color: var(--testo); cursor: not-allowed; }
.interruttore.spenta input[type="checkbox"]:disabled { cursor: not-allowed; }

/* L'interruttore che accende un gruppo di tendine sta sopra di loro: senza questo
   stacco l'etichetta della prima tendina toccava il bordo del suo bersaglio. */
.colonna-centrata .interruttore + .coppia-campi { margin-top: 0.5rem; }

/* ── Segnaposto delle pagine da implementare ──────────────────────────────── */

/* Il tratteggio dice già «qui non c'è ancora niente»: il testo può essere leggibile.
   Era --grigio (2,29:1) e portava frasi che contano — «Finché questo elenco è vuoto,
   nel calendario non si può inserire nessuna lezione», e in Impostazioni perfino un
   messaggio di guasto. */
.segnaposto {
    background: var(--bianco);
    border: 1px dashed var(--grigio);
    border-radius: var(--raggio);
    padding: 2rem;
    text-align: center;
    color: var(--testo);
}

/* ── Schermata di avvio (mostrata mentre scarica il WASM) ─────────────────── */

.avvio {
    display: flex;
    align-items: center;
    justify-content: center;
    height: 100vh;
    color: var(--testo);
}

/* D'ambra, come gli avvisi dell'area pubblica: il giallo che c'era è diventato il colore
   dell'azione il 19 ottobre 2026, e un avviso dello stesso colore di «Salva» si
   confonderebbe con lui. */
#blazor-error-ui {
    background: #FDF4E6;
    border-top: 1px solid var(--sabbia);
    bottom: 0;
    display: none;
    left: 0;
    padding: 0.6rem 1.25rem;
    position: fixed;
    width: 100%;
    z-index: 1000;
}

#blazor-error-ui .dismiss { cursor: pointer; position: absolute; right: 0.75rem; top: 0.5rem; }

/* ── Accesso ──────────────────────────────────────────────────────────────── */

.pagina-nuda { min-height: 100vh; background: var(--sfondo); }

/* In colonna, non in riga: sotto il riquadro ci sta la via d'uscita verso il sito,
   e con la direzione predefinita le si sarebbe messa ACCANTO. */
.accesso {
    display: flex;
    flex-direction: column;
    align-items: center;
    justify-content: center;
    min-height: 100vh;
    padding: 1rem;
}

.riquadro {
    background: var(--bianco);
    border: 1px solid var(--bordo);
    border-radius: 10px;
    padding: 2rem;
    width: 100%;
    max-width: 380px;
}

.riquadro h1 { margin: 0 0 0.25rem; }
.riquadro .sottotitolo { margin: 0 0 1.5rem; font-size: 0.85rem; color: var(--grigio); }

/* ── La via d'uscita dall'accesso ─────────────────────────────────────────────
   E' un pulsante per scelta del committente (10 settembre 2026). Prima era un
   collegamento sottolineato, con l'idea che dargli una forma da premere lo mettesse
   in gara con "Entra"; la gara non c'e' perche' i due si distinguono per PIENO e
   VUOTO, che e' la gerarchia standard fra azione principale e secondaria.

   ⚠️ NON e' largo quanto "Entra" e non e' alto uguale, ed e' li' che si vede chi
   comanda: 44px (--h-comando, i comandi in linea) contro i 48 di --h-azione, e
   larghezza sul contenuto invece che al 100%. Se un giorno lo si stira per tutta la
   riga diventa piu' largo del pulsante giallo pallina che sta dentro il riquadro — cioe'
   sembra l'azione principale della schermata, e ce n'e' una sola (DESIGN.md §8).

   Nero su bianco col bordo nero: 20,46:1, e un contorno ben oltre i 3:1 che il §1
   chiede quando e' il bordo a rendere percepibile l'elemento. Niente fondo pieno:
   l'azione primaria e' una per schermata ed e' "Entra".

   ⚠️ IL COLORE VA SCRITTO. Un <a> NON eredita quello del corpo: se non glielo dici
   prende il blu del browser — e visitato, il viola — cioe' due colori che nella
   palette non esistono (§1: non si allarga). E' esattamente com'e' uscito la prima
   volta, ed e' la trappola di ogni <a> vestito da pulsante.

   Pillola e non --raggio: la pillola dice "questo si preme", il raggio "questo
   contiene" (§3). Il riquadro sopra ha il raggio, questo ha la pillola.
   ───────────────────────────────────────────────────────────────────────────── */
.torna-al-sito {
    display: inline-flex;
    align-items: center;
    justify-content: center;
    min-height: var(--h-comando);
    margin-top: 1rem;
    padding: 0.5rem 1.5rem;
    background: var(--bianco);
    color: var(--nero);
    border: 1px solid var(--nero);
    border-radius: var(--pillola);
    font-weight: 700;
    font-size: 0.95rem;
    text-decoration: none;
}

.campo { margin-bottom: 1rem; }
.campo label { display: block; font-weight: 700; color: var(--nero); margin-bottom: 0.25rem; }

.campo input {
    width: 100%;
    padding: 0.7rem;
    min-height: var(--h-campo);
    border: 1px solid var(--grigio);
    border-radius: var(--raggio);
    font-family: inherit;

    /* 16px SCRITTI, non 1rem. Qui html sta a 15px, quindi 1rem faceva 15 — sotto la
       soglia, cioè esattamente ciò che il commento diceva di voler evitare: iOS
       zoomava al focus e la pagina restava zoomata. Il commento era giusto e il
       valore no, che è il modo peggiore di sbagliare (DESIGN.md §2). */
    font-size: 16px;
    box-sizing: border-box;
}

.pulsante {
    width: 100%;
    background: var(--pallina);
    color: var(--nero);   /* nero sulla pallina: il bianco ci sta a 1,42:1 — DESIGN.md §1 */
    /* Il bordo nero, come nell'area pubblica dal 7 ottobre 2026: sul bianco la pallina fa
       1,42:1 e da sola non delimita il pulsante (19 ottobre 2026). */
    border: 2px solid var(--nero);
    border-radius: var(--pillola);
    padding: 0.85rem;
    min-height: var(--h-azione);
    font-family: inherit;
    font-weight: 700;
    font-size: 1rem;
    cursor: pointer;
}

.pulsante:disabled { opacity: 0.6; cursor: wait; }

/* ── Gli stati dei bottoni, dal kit MDI ────────────────────────────────────
   Il kit dichiara Default / Hover / Focus / Disabled per ognuna delle quattro
   varianti. Qui sette classi su nove non avevano nessuna regola :hover, e chi
   passava sopra non riceveva nessuna risposta.

   Il gesto è quello già scritto in DESIGN.md §5 — filter: brightness(0.95),
   niente spostamenti verticali — quindi non entra nessun colore nuovo: si
   applica la disciplina del kit alla tavolozza del circolo.

   ⚠️ FUORI DA QUESTO ELENCO, E APPOSTA: .bottone-vista.attiva e .voce-basso.active.
   Hanno un fondo quasi nero o pieno giallo pallina, e schiarirlo del 5% non si vede;
   ma soprattutto sono lo stato «sei qui», e un bottone che risponde al passaggio
   promette un'azione che non c'è. */
.pulsante:hover:not(:disabled),
.pulsante-pericolo:hover:not(:disabled),
.bottone-oggi:hover:not(:disabled),
.bottone-giorno:hover:not(:disabled),
.bottone-ordine:hover:not(:disabled),
.scelta-icona:hover,
.icona-scelta:hover,
.torna-al-sito:hover,
.bottone-vista:not(.attiva):hover,
.giorno-settimana:not([aria-pressed="true"]):hover:not(:disabled),
.bottone-campo:not(.attiva):hover { filter: brightness(0.95); }

.errore, .validation-message { color: #B3261E; font-size: 0.85rem; margin: 0.25rem 0 0; }

/* ── Utente in barra alta ─────────────────────────────────────────────────── */

.riga-alta { gap: 1rem; }
.riga-alta .utente { font-size: 0.85rem; color: var(--nero); font-weight: 700; }

.riga-alta .esci {
    background: none;
    border: 1px solid var(--bordo);
    border-radius: var(--pillola);
    /* Era alto 29px: sotto la soglia dei 44 fin dall'inizio, e nessuno se n'era
       accorto perche' col mouse si prende lo stesso. Col dito no. */
    min-height: var(--h-comando);
    padding: 0.3rem 1rem;
    font-family: inherit;
    font-size: 0.8rem;
    color: var(--testo);
    cursor: pointer;
}

/* ── Focus ────────────────────────────────────────────────────────────────────
   Prima non c'era NESSUNA regola :focus in tutto il foglio. Niente era rotto —
   il default del browser c'era ancora — ma su un pulsante pieno o sulla
   laterale nera si vede pochissimo, e chi lavora tutto il giorno di tastiera
   perde il segno. Vedi DESIGN.md §5.
   :focus-visible e non :focus, cosi' il contorno non compare al clic del mouse. */

/* ⚠️ NON E' OPZIONALE (DESIGN.md §6). Il primo movimento del gestionale e' arrivato
   l'8 settembre 2026 con l'interruttore a pillola, e questo blocco e' arrivato con
   lui: c'e' chi dal movimento sullo schermo sta male, e una preferenza di sistema
   che nessuno ascolta e' come non averla. Sta qui e vale per tutto cio' che verra'. */
@media (prefers-reduced-motion: reduce) {
    *, *::before, *::after {
        animation-duration: 0.01ms !important;
        transition-duration: 0.01ms !important;
    }
}

:where(a, button, input, select, textarea):focus-visible {
    outline: 3px solid var(--nero);
    outline-offset: 2px;
}

/* Su un fondo nero un contorno nero sarebbe invisibile.
   ⚠️ Il selettore diceva `.laterale`, e quella classe NON ESISTE in nessun markup: la
   navigazione laterale è stata sostituita dalla barra in basso e la regola è rimasta
   indietro. Risultato: chi girava a tastiera arrivava sulla barra e il contorno era
   #070400 su #070400 — invisibile, cioè fuoco perso. È il difetto che DESIGN.md §5
   descrive come «non si nota provando col mouse», ed è per questo che era lì da
   settimane. */
.barra-basso :where(a, button):focus-visible { outline-color: var(--sabbia); }

/* ── Il titolo che prende il fuoco da solo ────────────────────────────────────
   <FocusOnNavigate Selector="h1"> in App.razor sposta il fuoco sul titolo a ogni
   navigazione. È una cosa BUONA e non va tolta: senza, chi naviga con un lettore
   di schermo cambia pagina e resta in mezzo al nulla, senza sentire dove è
   arrivato.

   Il problema è solo il segno: un titolo non si preme, e vedersi un rettangolo
   attorno a una scritta inerte sembra un difetto. Qui si toglie il CONTORNO, non
   il fuoco — l'annuncio del lettore di schermo resta.

   Non è in contrasto con DESIGN.md §5: quella regola parla degli elementi con cui
   si interagisce, dove togliere il focus rende il sito inutilizzabile da tastiera.
   Un'intestazione non è fra quelli, e infatti qui nessuno ci arriva col Tab. */
:where(h1, h2, h3, h4):focus,
:where(h1, h2, h3, h4):focus-visible { outline: none; }

/* ── Calendario: testata e navigazione ────────────────────────────────────── */

/* La testata di pagina — titolo piu' comandi — e' UNA cosa, e sotto ci vuole aria
   che la stacchi dal contenuto. Prima ne aveva 1rem, cioe' quanto lo spazio fra due
   campi di un modulo: titolo e contenuto sembravano lo stesso blocco. */
.testata-calendario { margin-bottom: 1.5rem; }
.testata-calendario h1 { margin-bottom: 0.75rem; }

/* La frase di chi può solo guardare (passo 14 delle deleghe, 21 ottobre 2026): sta sopra
   la griglia, fuori da qualunque pannello, e .nota-pannello chiude a margine zero — lì
   dentro seguiva sempre un campo o un filetto. Il suo spazio lo dà questa riga, con un
   multiplo di 0,25rem e nient'altro: nessun colore, bordo o raggio nuovo. */
.nota-pannello.nota-sola-lettura { margin: 0 0 1rem; }

/* ⚠️ clamp() e non i breakpoint (DESIGN.md §2): un clamp fa il lavoro di tre media
   query. Su un telefono resta 1.5rem — dove lo spazio e' prezioso il titolo non se
   ne prende piu' del dovuto — e su un monitor arriva a 1.9rem, che e' quanto serve
   perche' la pagina abbia una testa invece di cominciare e basta.

   Il tracking negativo NON e' un vezzo: Inter e' disegnata per stringersi ai corpi
   grandi, e a 1.9rem con spaziatura normale le lettere ballano. Sotto 1.5rem non si
   applica, perche' li' stringere danneggia la lettura. */
h1 {
    font-size: clamp(1.5rem, 1.15rem + 1.1vw, 1.9rem);
    letter-spacing: -0.02em;
}

.navigazione-giorno { display: flex; align-items: center; gap: 0.5rem; flex-wrap: wrap; }

.bottone-giorno,
.bottone-oggi,
.scelta-data {
    min-height: var(--h-comando);

    /* Il bordo è --sabbia e non --bordo, e il motivo è che qui il bordo È l'unico
       segnale: fondo bianco dentro una tabella bianca, quindi senza contorno non c'è
       nessun pulsante — DESIGN.md §1 chiede 3:1 quando il bordo porta l'informazione
       da solo, e --bordo su bianco stava a 1,30:1. Con --sabbia si vede la forma.
       Non serviva finché questi bottoni stavano solo nella barra dei giorni, sopra
       --sfondo e in fila fra loro; da oggi sono anche i comandi dentro le righe di
       Accessi e Maestri, dove non c'è niente che li circondi. */
    border: 1px solid var(--sabbia);
    border-radius: var(--pillola);
    background: var(--bianco);
    color: var(--nero);
    font-family: inherit;
    font-size: 0.9rem;
    padding: 0.5rem 1.1rem;
    cursor: pointer;
}

/* Il colore da solo non basta mai a dire «non si può» (DESIGN.md §5): qui il secondo
   segnale è il cursore, che smette di promettere il clic. Come .pulsante:disabled. */
.bottone-oggi:disabled,
.bottone-giorno:disabled { opacity: 0.45; cursor: default; }

/* Le frecce sono quadrate di contenuto ma tonde di forma: cerchi veri, non
   rettangoli stondati. */
.bottone-giorno { width: 44px; padding: 0; font-size: 1rem; }

/* La casella della data si tocca per SCEGLIERE, non per scrivere: il clic apre il
   calendario (vedi sotto, «Le date»), quindi il cursore promette quello. */
.scelta-data { cursor: pointer; }

.giorno-esteso {
    margin: 0.5rem 0 0;
    font-weight: 700;
    color: var(--nero);
}

/* È l'unica cosa a schermo mentre una pagina carica: a 2,20:1 non si leggeva. */
.in-caricamento { color: var(--testo); }

/* Barra dello spostamento in corso. Fondo sabbia e testo nero: su fondo colorato
   il grigio scende sotto soglia (DESIGN.md §1).

   ⚠️ FERMA IN VISTA (26 ottobre 2026, T3): sticky sotto la barra in alto, come le intestazioni del
   tabellone. Prima scorreva via con la pagina, e chi aveva scorso fino alle 18 per toccare l'ora non
   trovava più né la spunta né «Lascia dov'è» né, da T3, la domanda «Sì, sposta». Vale qui — per la
   Settimana, e per la giornata mentre si legge —; nel tabellone la barra sta dentro l'intestazione
   ferma (.tab-testata .barra-spostamento, più sotto), perché due elementi fermi alla stessa altezza si
   coprirebbero. Il fondo è pieno, quindi ciò che scorre le passa sotto. z-index sotto la barra in alto (20). */
.barra-spostamento {
    position: sticky;
    top: var(--riga-alta-h);
    z-index: 4;
    display: flex;
    align-items: center;
    justify-content: space-between;
    /* 0,5rem fra una riga e l'altra (era 1rem): la barra è ferma, e ciò che occupa lo toglie al tabellone. Fra una
       cosa e l'altra sulla stessa riga resta 1rem. */
    gap: 0.5rem 1rem;
    flex-wrap: wrap;
    background: var(--sabbia);
    color: var(--nero);
    border-radius: var(--raggio, 10px);
    padding: 0.75rem 1rem;
    margin: 0 0 1rem;
}

/* Lo stacco sotto la barra (il suo margine) è trasparente, e a barra ferma ci scorrerebbero in mezzo le righe della
   pagina: un pezzo pieno, del colore della pagina, lo copre. Si vede solo quando la barra si ferma — sul fondo della
   pagina ha il suo stesso colore. Nel tabellone la barra sta sul bianco dell'intestazione e non serve. */
.barra-spostamento::after {
    content: "";
    position: absolute;
    left: 0;
    right: 0;
    top: 100%;
    height: 1rem;
    background: var(--sfondo);
}

/* D'ambra dal 19 ottobre 2026, per la stessa ragione di #blazor-error-ui. Nero sopra, 18,76:1. */
.avviso-errore {
    background: #FDF4E6;
    border: 1px solid var(--sabbia);
    color: var(--nero);
    border-radius: 8px;
    padding: 0.75rem 1rem;
    margin: 0 0 1rem;
}

/* ── Calendario: la griglia ───────────────────────────────────────────────── */

/* ⚠️ QUI DENTRO NON C'E' PIU' NESSUN PANNELLO, e il commento di prima diceva una
   cosa falsa: prometteva che «sotto, il pannello scende sotto la griglia invece di
   comprimerla», ma senza flex-wrap niente e' mai andato a capo. Il risultato,
   misurato: con la finestra aperta su una colonna da 343px — un telefono da 375 — la
   griglia riceveva 0px e il pannello i suoi 300 interi. Si toccava un'ora e sparivano
   le ore, ed e' il difetto che il committente ha segnalato il 10 settembre 2026 come
   «non mi fa selezionare l'orario».

   Adesso la scheda di prenotazione e' .finestra, in fondo a questo foglio: sta SOPRA
   la pagina e non toglie larghezza a nessuno. Questo flex tiene una cosa sola. */
.area-calendario { display: flex; gap: 1rem; align-items: flex-start; }

/* min-width:0 o il flex non lascia restringere la tabella e sfonda la pagina.
   Lo scorrimento orizzontale sta QUI DENTRO: il body non scorre mai (DESIGN.md §4). */
.contenitore-griglia { flex: 1; min-width: 0; overflow-x: auto; }

table.griglia-admin {
    border-collapse: separate;
    border-spacing: 2px;
    width: 100%;
    min-width: 320px;
}

table.griglia-admin th {
    position: sticky;
    top: 0;
    background: var(--sfondo);
    color: var(--nero);
    font-size: 0.85rem;
    padding: 0.4rem 0.25rem;
    z-index: 1;
}

table.griglia-admin th .senza-luce {
    display: block;
    font-weight: 400;
    font-size: 0.7rem;
    color: var(--testo);
}

.cella-ora {
    white-space: nowrap;
    text-align: right;
    padding-right: 0.5rem;
    font-size: 0.8rem;
    color: var(--testo);
}

/* Una misura scritta e non l'1% «stringiti sul contenuto»: la tabella è a layout fisso
   (vedi «Calendario: vista settimana»), e lì la larghezza delle colonne la dà la prima
   riga. «08:00» più il suo margine destro ci stanno con un po' d'aria. */
.intestazione-ora { width: 3.25rem; }

/* Visibile ai lettori di schermo, non a video: l'intestazione della colonna
   delle ore serve a chi naviga la tabella senza vederla. */
.solo-lettori {
    position: absolute;
    width: 1px;
    height: 1px;
    overflow: hidden;
    clip-path: inset(50%);
}

.slot-admin {
    display: block;
    width: 100%;
    min-height: var(--h-comando);
    border: 1px solid transparent;
    border-radius: 6px;
    padding: 0.3rem 0.2rem;
    font-family: inherit;
    font-size: 0.8rem;
    text-align: center;
    cursor: pointer;
}

.slot-admin.libero { background: var(--libero); border-color: var(--libero-bordo); color: var(--nero); }
.slot-admin.occupato { background: var(--sabbia); color: var(--nero); }
.slot-admin.non-prenotabile { background: var(--spento); color: var(--grigio); cursor: default; }

/* Lo slot scelto si riconosce dal bordo spesso, non da una tinta diversa: cosi'
   resta leggibile anche a chi non distingue i colori. */
.slot-admin.scelto { border: 2px solid var(--nero); }

.slot-admin .etichetta-slot {
    display: block;
    font-weight: 700;
    overflow: hidden;
    text-overflow: ellipsis;
    white-space: nowrap;
}

/* Il salto di scala e' la cosa che rende leggibile una griglia fitta: il dato che
   conta grande e pesante, il resto piccolo e silenzioso. E' il tratto tipografico
   del kit — numeri enormi, etichette sussurrate — riportato a misura di tabella. */
.slot-admin .prezzo-slot { display: block; font-size: 0.95rem; font-weight: 700; letter-spacing: -0.01em; }

.slot-admin .etichetta-slot { font-size: 0.85rem; }

/* Il tipo e la luce sono su --sabbia o su verde chiaro, mai grigio su colore:
   var(--testo) su var(--sabbia) sta a 3,12:1 ed e' sotto soglia (DESIGN.md §1).
   Una riga sola e i puntini, come il nome: la colonna non si allarga per loro, e una
   parola che non ci sta uscirebbe dalla casella invece di andare a capo. */
.slot-admin .tipo-slot,
.slot-admin .luce-slot {
    display: block;
    font-size: 0.7rem;
    color: var(--nero);
    opacity: 0.7;
    overflow: hidden;
    text-overflow: ellipsis;
    white-space: nowrap;
}
.slot-admin.non-prenotabile .tipo-slot { color: var(--grigio); opacity: 1; }

/* ⚠️ QUI AVEVO SCRITTO UNA SECONDA .finestra, e il gestionale ne aveva già una — con
   il suo velo, la sua testata, il suo corpo che scorre e il suo piede — venti righe
   più in basso, usata dalla scheda del campo. Due componenti con lo STESSO NOME nello
   stesso foglio: vinceva l'ultimo, e la finestra del calendario si disegnava con le
   regole dell'altra a metà. La prenotazione usa quella che c'era: un secondo modo di
   coprire lo schermo sarebbe un secondo linguaggio. */

/* ── Calendario: pannello laterale ────────────────────────────────────────── */

.pannello {
    flex: 0 0 300px;
    background: var(--bianco);
    border: 1px solid var(--bordo);
    border-radius: 10px;
    padding: 1rem;
}

.testata-pannello {
    display: flex;
    flex-direction: column;
    gap: 0.25rem;
    position: relative;
    margin-bottom: 1rem;
    padding-bottom: 0.75rem;
    border-bottom: 1px solid var(--bordo);
}

.testata-pannello strong { color: var(--nero); }
.testata-pannello span { font-size: 0.85rem; }

.chiudi-pannello {
    position: absolute;
    top: -0.25rem;
    right: -0.25rem;
    min-width: 44px;
    min-height: var(--h-comando);
    background: none;
    border: none;
    font-size: 1rem;
    color: var(--testo);
    cursor: pointer;
}

.riga-pannello {
    display: flex;
    justify-content: space-between;
    gap: 0.5rem;
    margin: 0 0 0.5rem;
    font-size: 0.9rem;
}

.riga-pannello strong { color: var(--nero); }

/* ── Le righe del pannello a 360px (revisione del 21 ottobre 2026) ───────────────────────
   LA MISURA VIENE DALL'EMAIL, come in .recapiti: un indirizzo non ha spazi in cui andare a capo, e la
   riga «Email» del pannello — un flex con l'etichetta e il valore — non si restringeva mai sotto la sua
   larghezza. A 360px la finestra ha un corpo utile di ~296px: «maria.grazia.pellegrini.verdi@studiolegale-
   associato.it» (50 caratteri) ne misurava ~353 e faceva comparire lo scorrimento orizzontale DENTRO la
   finestra (DESIGN.md §4: se a 360 qualcosa esce, esce sul telefono di qualcuno). Il valore ha min-width 0 e
   va a capo ovunque serva; l'etichetta resta intera; a capo il valore resta sul lato destro. */
.riga-pannello > span { flex: none; }

.riga-pannello strong,
.riga-pannello > a {
    min-width: 0;
    overflow-wrap: anywhere;
    text-align: right;
}

/* ── I collegamenti nudi del pannello: il telefono, «Accessi» ────────────────────────────────
   In app.css non c'è una regola per `a` (solo classi specifiche): un <a> senza classe prende il blu e il
   viola «visitato» del browser, che nella palette non ci sono, e ha l'altezza della riga — 20px, contro i
   44 di DESIGN.md §4. Il telefono è il comando che si tocca mentre si risponde a qualcuno.

   NERO, come i comandi (.bottone-oggi). E la stessa tecnica di .recapiti dd > a: l'area si allarga col
   padding e il margine negativo la riporta dov'era, quindi la riga resta alta uguale e il dito prende 44px.
   ⚠️ position: relative non è un vezzo: senza, la riga che segue sta sopra la metà bassa dell'area, e il
   tocco lì va a lei. */
.riga-pannello > a,
.collegamento-nota {
    display: inline-block;
    position: relative;
    padding-block: calc((var(--h-comando) - 1lh) / 2);
    margin-block: calc((1lh - var(--h-comando)) / 2);
    color: var(--nero);
}

.collegamento-nota { font-weight: 700; }

.campo-pannello { margin-bottom: 0.75rem; }

/* .titolo-campo e' un'etichetta che NON e' una <label>, e serve dove il campo non
   e' un controllo solo: la foto ha un'immagine, due comandi e una nota, e una
   <label for> puntata su uno dei due comandi darebbe a quel bottone un nome
   accessibile che e' il titolo dell'intera sezione. Il nome dell'input sta
   sull'input, con aria-label. Stesso aspetto, semantica onesta. */
/* ⚠️ `:not(.scegli-foto)` NON E' UN RITOCCO DI SPECIFICITA', E' LA REGOLA DETTA
   BENE. Questa veste l'ETICHETTA DI UN CAMPO: blocco, grassetto, piccola, con
   l'aria sotto. La <label> che apre il selettore di file e' un'altra cosa — e' un
   comando, e sta dentro .azioni-foto, non sopra una casella.

   Senza l'esclusione vinceva questa (0,1,1 contro lo 0,1,0 di .scegli-foto) e
   «Sostituisci» usciva vestito da etichetta: display block invece che inline-flex,
   grassetto, 12,75px contro i 13,5px di «Togli» accanto, e un margin-bottom che
   lo alzava di 2px rispetto al suo vicino. Tre differenze visibili fra due bottoni
   che devono essere gemelli. Escluderlo qui evita di riscrivere altrove i valori
   di .bottone-oggi, che sarebbero due copie destinate a divergere.

   ⚠️ E PER LA STESSA RAGIONE `.interruttore`: anche lui e' una <label>, ma e' il
   comando stesso, non l'etichetta di una casella. Senza l'esclusione diventava
   blocco e grassetto, e casella e testo non stavano piu' in riga — in Accessi, nel
   pannello del nuovo accesso. La specificita' di :not con un elenco e' quella del
   suo argomento piu' forte, quindi resta 0,2,1 come prima. */
.campo-pannello label:not(.scegli-foto, .interruttore),
.campo-pannello .titolo-campo {
    display: block;
    font-weight: 700;
    color: var(--nero);
    font-size: 0.85rem;
    margin-bottom: 0.25rem;
}

/* Tolta dalla regola qui sopra, un'etichetta-interruttore resta comunque UNA PER RIGA
   dentro un campo: prima ci stava da blocco, e tornando inline-flex i «Permessi» di
   Accessi si sarebbero messi in fila — cioè il bersaglio da 44px che vale in altezza ma
   non in larghezza, lo stesso difetto corretto in .scelta-campi-blocco. */
.campo-pannello > .interruttore { display: flex; }

/* La riga che dice a cosa serve un campo, o che è facoltativo. Sta SOTTO la casella e
   non accanto all'etichetta: sopra allungherebbe l'etichetta e la manderebbe a capo su
   una finestra stretta, e un'etichetta su due righe si legge come due campi.

   È la gemella di .aiuto-campo dell'area pubblica, e le due restano due perché i due
   fogli di stile sono due: qui i colori sono quelli del gestionale. */
/* 0,8rem e non 0,75: qui la radice e' 15px, quindi 0,75 dava 11,25px — misurato — e
   sotto un'etichetta da 12,75 quella riga si legge come una nota a pie' di pagina.
   0,8rem fa 12px, un gradino sotto l'etichetta invece di due. */
.campo-pannello .aiuto-pannello {
    display: block;
    margin-top: 0.25rem;
    font-size: 0.8rem;
    color: var(--testo);
}

/* ── La foto del campo ────────────────────────────────────────────────────────
   Un'immagine e due comandi, senza nessuna scatola intorno: la finestra e' gia'
   una superficie, e un riquadro qui dentro sarebbe una superficie annidata
   (DESIGN.md §3). E' la foto stessa, con il suo raggio, a dire dove finisce.

   Niente segnaposto quando la foto non c'e': un rettangolo grigio con dentro
   un'icona occupa lo spazio di un'informazione che non esiste. Senza foto ci sono
   il bottone e la riga che spiega dove finirebbe, e basta.
   ───────────────────────────────────────────────────────────────────────────── */

.foto-campo {
    display: block;

    /* ⚠️ LARGA QUANTO GLI ALTRI CAMPI, e prima non lo era: c'era un
       `max-width: 320px` mentre le caselle della scheda arrivano a ~404px. La foto
       si fermava prima e i due comandi le restavano appesi sotto, disallineati da
       tutto il resto del modulo — «il pulsante messo male» era questo. In un modulo
       la larghezza e' la griglia: un elemento che non la rispetta si legge come un
       errore anche quando e' l'unico a sbagliare. */
    width: 100%;

    /* ⚠️ ALTEZZA FISSA, NON UN RAPPORTO, e ci sono arrivato sbagliando: con
       `aspect-ratio: 3/2` e la larghezza piena la foto usciva alta 342px e
       spingeva «Sostituisci» e «Togli» sotto la piega della finestra — si vedeva
       l'anteprima e non i comandi che la governano. In prima pagina il 3:2 e'
       giusto perche' li' la foto E' il contenuto; qui e' un riconoscimento, e vale
       il §0: nel gestionale l'altezza si paga in scorrimento. 13rem lascia foto e
       comandi nella stessa schermata.

       Il ritaglio lo fa `cover` e lo fa la CSS, non il server: il file su disco
       conserva le proporzioni sue, quindi domani si puo' inquadrare diversamente
       senza aver perso niente. */
    height: 13rem;
    object-fit: cover;

    border-radius: var(--raggio);

    /* 0,75rem e non 0,5: e' il passo con cui .campo-pannello stacca un campo dal
       successivo. A 0,5 i due comandi sembravano incollati al bordo inferiore
       della foto invece che appartenere alla sezione. */
    margin-bottom: 0.75rem;

    /* Mentre arriva, un fondo del progetto invece del bianco del browser: senza,
       la riga sotto salta quando l'immagine si decodifica. */
    background: var(--sfondo);
}

.azioni-foto {
    display: flex;
    flex-wrap: wrap;
    gap: 0.5rem;
    align-items: center;
}

/* ⚠️ RITAGLIATO, NON `display: none`. Un input nascosto del due modi esce dal
   percorso di tabulazione, e questo comando sparirebbe per chi non usa il mouse —
   il file lo si sceglie solo col mouse, che e' esattamente il difetto che
   DESIGN.md §5 dice di non introdurre. Cosi' invece resta focalizzabile, e il
   contorno del fuoco lo mostra l'etichetta qui sotto. */
/* ⚠️ `.campo-pannello .input-foto` E NON `.input-foto`: dentro .campo-pannello un
   <input> lo vestono TRE regole diverse — larghezza piena e bordo, min-height 48px,
   colore — e tutte e tre (0,1,1) battevano il ritaglio scritto con la sola classe
   (0,1,0). Il risultato non era un input un po' storto: era un rettangolo bianco
   558×48 col bordo, posizionato in assoluto sopra la nota della sezione, in mezzo
   alla scheda.

   Si alza la specificita' qui una volta sola invece di escluderlo da ognuna delle
   tre: quelle regole sono sparse nel foglio, e la prossima che si aggiunge
   ripeterebbe il difetto senza che nessuno colleghi le due cose. */
.campo-pannello .input-foto {
    position: absolute;
    width: 1px;
    height: 1px;
    min-height: 0;
    padding: 0;
    margin: -1px;
    overflow: hidden;
    clip: rect(0 0 0 0);
    clip-path: inset(50%);
    white-space: nowrap;
    border: 0;
}

/* Un'etichetta non e' un bottone e non ha :disabled, ma l'etichetta di un input
   disabilitato non attiva niente: durante il caricamento il comando smette di
   rispondere da solo. Il cursore lo dice, perche' il colore da solo non basta
   (DESIGN.md §5). */
/* ⚠️ NIENTE `padding` QUI, e prima c'era. Il riempimento lo dà .bottone-oggi
   — 0.5rem 1.1rem — e riscriverlo qui significava due bottoni gemelli con due
   riempimenti diversi, cioè la differenza che si vede senza sapere spiegarla.
   Questa regola dichiara solo ciò che a .bottone-oggi manca perché è pensata per
   un <button> e questa è una <label>: la centratura del testo dentro i 44px, e il
   cursore, che su un'etichetta non è a mano di suo. */
.scegli-foto {
    display: inline-flex;
    align-items: center;
    justify-content: center;
    cursor: pointer;
}

.input-foto:disabled + .scegli-foto { opacity: 0.6; cursor: wait; }

/* Il fuoco e' sull'input, che non si vede: lo mostra il suo vicino. Stessi 3px e
   stesso stacco della regola generale, o sarebbe un contorno diverso dagli altri
   nella stessa finestra. */
.input-foto:focus-visible + .scegli-foto {
    outline: 3px solid var(--nero);
    outline-offset: 2px;
}

.campo-pannello input,
.campo-pannello select,
/* ⚠️ ANCHE I CONTROLLI NUDI DENTRO UN ELENCO. In Maestri la tendina dei permessi e la
   casella del prezzo stanno direttamente nel <td>, senza .campo-pannello attorno:
   erano gli unici controlli del gestionale vestiti solo dal browser — sotto i 44px e
   sotto i 16px, cioè fuori da tutte e due le soglie del progetto. */
table.elenco td input,
table.elenco td select {
    width: 100%;
    min-height: var(--h-comando);   /* in tabella comanda il ritmo della riga */
    padding: 0.5rem;
    border: 1px solid var(--grigio);
    border-radius: var(--raggio);
    font-family: inherit;
    font-size: 16px;   /* scritti, non 1rem: vedi il commento su .campo input */
    box-sizing: border-box;
    background: var(--bianco);
}

/* I CAMPI DA COMPILARE VANNO A 48, quelli in tabella restano a 44 perche' li'
   l'altezza la detta la riga.

   ⚠️ DEVE STARE DOPO il blocco qui sopra e non prima: stessa specificita', quindi
   vince l'ultima scritta. Messa prima non faceva niente, e la misura diceva 44 con
   la regola in bella vista nel foglio. */
.campo-pannello input,
.campo-pannello select { min-height: var(--h-campo); }

/* ⚠️ LA CASELLA A PIÙ RIGHE ERA NUDA: nessuna regola dei campi la nominava, e usciva
   col disegno del browser — larga 185px (le venti colonne di default), gli spigoli
   vivi, e il testo a 15px, cioè sotto i 16 che su iPhone fanno zoomare la pagina al
   tocco (§2). È la casella dell'avviso sul sito, quella che si scrive col telefono in
   mano quando piove. Adesso è vestita come le altre.

   16px SCRITTI e non 1rem, come negli altri campi: qui la radice è 15px. E si allunga
   solo in verticale: allargata di lato farebbe scorrere il body, che il §4 vieta. */
.campo-pannello textarea {
    display: block;
    width: 100%;
    min-height: 5.5rem;
    padding: 0.5rem 0.75rem;
    border: 1px solid var(--grigio);
    border-radius: var(--raggio);
    background: var(--bianco);
    font-size: 16px;
    line-height: 1.5;
    resize: vertical;
    box-sizing: border-box;
}

/* opacity: 1 per Firefox, che di suo sbiadisce la frase d'esempio al 54% e la porta sotto i
   4,5:1 (come per .cerca input e .finestra-cliente input qui sotto): --testo su bianco sta a
   5,02. La nota di una fissa nuova ha una frase d'esempio, e prima non era protetta. */
.campo-pannello textarea::placeholder { color: var(--testo); opacity: 1; }

/* ⚠️ IL VALORE DI UN CAMPO E' NERO, NON GRIGIO, e non e' una preferenza: e' quello
   che il gestore ha scritto — contenuto — mentre --testo e' il colore delle cose che
   lo accompagnano. Le etichette sono gia' nere: con i valori grigi un modulo si legge
   al contrario, con il contorno piu' forte di cio' che contiene.

   Il colore glielo dava il BROWSER, che ai controlli ne assegna uno suo quasi nero.
   Il reset scritto in casa l'8 settembre 2026 — quello che ha preso il posto del
   Reboot di Bootstrap — dice "color: inherit" sui controlli, che in principio e'
   giusto: un campo segue la pagina. Ma la pagina e' --testo, e da quel momento i
   campi hanno ereditato il grigio. Qui si dice a voce alta quale dei due vale. */
.campo-pannello input,
.campo-pannello select,
.campo input,
.scelta-data,
table.elenco td input,
table.elenco td select,
.testo-caratteristica,
textarea { color: var(--nero); }

/* ══ I CONTROLLI NON SI VESTONO DA BROWSER ═══════════════════════════════════
   Richiesta del committente dell'8 settembre 2026. Fin qui la casella era nostra —
   bordo, raggio, altezza, carattere — ma il SEGNO dentro la casella era del sistema
   operativo: la freccetta della tendina, l'orologio, il calendario, le frecce del
   numero. Tre disegni diversi in tre punti della stessa schermata.

   ⚠️ LE ICONE SONO data-URI, e non e' un vezzo: sono dentro il foglio, quindi zero
   richieste in piu' e — soprattutto — nessun host esterno. Vale la stessa ragione per
   cui i font si servono da wwwroot/fonts e mai da Google Fonts. Il colore e' --testo
   (5,02:1 su bianco): sono segni, non decorazioni, e devono vedersi.

   ⚠️ QUELLO CHE RESTA DEL BROWSER, ed e' voluto: l'ELENCO che si apre toccando una
   tendina, e il calendario della data. Su un telefono quelli sono la ruota di sistema,
   con bersagli grandi e la lingua giusta; riscriverli vorrebbe dire un componente
   nuovo con la sua gestione da tastiera e i suoi ruoli ARIA, e si perderebbe piu' di
   quanto si guadagna. Si veste cio' che si vede sempre, non cio' che compare per due
   secondi sotto il pollice. */

/* -- Le tendine ---------------------------------------------------------- */
.campo-pannello select,
table.elenco td select {
    appearance: none;
    -webkit-appearance: none;

    /* Longhand e non la scorciatoia `background`: qui sopra c'e' gia' un
       `background: var(--bianco)`, e una scorciatoia scritta dopo cancellerebbe
       l'immagine senza dire niente. */
    background-image: url("data:image/svg+xml,<svg xmlns='http://www.w3.org/2000/svg' width='12' height='8' viewBox='0 0 12 8'><path d='M1 1.5 6 6.5 11 1.5' fill='none' stroke='%23706F6D' stroke-width='2' stroke-linecap='round' stroke-linejoin='round'/></svg>");
    background-repeat: no-repeat;
    background-position: right 0.75rem center;

    /* Spazio per il segno: senza, il testo lungo ci finisce sotto. «Sintetico in
       resina» a 375px arriva a un dito dal bordo. */
    padding-right: 2.25rem;
}

/* ══ IL CAMPO DI UN ORARIO ══════════════════════════════════════════════════
   Ci si SCRIVE dentro, per scelta del committente dell'8 settembre 2026 — dopo aver
   scartato la tendina di 48 mezz'ore (si scorreva) e il quadrante (due tocchi).

   Vestito come tutti gli altri campi del gestionale: quello che lo distingue e'
   l'orologio a destra, che dice di che tipo di dato si tratta. Il resto — che le
   19:17 diventino le 19:30 e che il campo lo dica — sta in Ore.Interpreta, provata
   senza browser. */
/* Il guscio dei due segmenti si comporta come un campo unico — stesso bordo, stessa
   altezza, stesso raggio, stesso orologio a destra — e i due <input> dentro sono
   nudi. E' quello che fa il browser col suo <input type="time">, disegnato da noi. */
.ora-segmenti {
    display: flex;
    align-items: center;
    gap: 0.1rem;
    width: 100%;
    min-height: var(--h-campo);
    padding: 0 2.5rem 0 0.75rem;
    border: 1px solid var(--grigio);
    border-radius: var(--raggio);
    background-color: var(--bianco);
    background-image: url("data:image/svg+xml,<svg xmlns='http://www.w3.org/2000/svg' width='16' height='16' viewBox='0 0 16 16'><circle cx='8' cy='8' r='6.4' fill='none' stroke='%23706F6D' stroke-width='1.6'/><path d='M8 4.2V8.2l2.7 1.6' fill='none' stroke='%23706F6D' stroke-width='1.6' stroke-linecap='round' stroke-linejoin='round'/></svg>");
    background-repeat: no-repeat;
    background-position: right 0.7rem center;
    box-sizing: border-box;
}

/* ⚠️ IL CONTORNO DEL FUOCO STA SUL GUSCIO, non sui segmenti: chi arriva con il Tab
   deve vedere illuminato IL CAMPO, non una casella da due cifre dentro un campo. */
.ora-segmenti:focus-within {
    outline: 3px solid var(--nero);
    outline-offset: 2px;
}

.ora-segmenti.spenta { opacity: 0.6; }

.ora-segmenti .segmento {
    /* ⚠️ 3ch E NON 2.1ch, che sarebbe l'aritmetica giusta per due cifre e invece
       tagliava «18» a meta'. L'unita' `ch` misura l'avanzamento dello ZERO nelle
       cifre normali, ma qui sopra c'e' font-variant-numeric: tabular-nums, che le
       disegna piu' larghe — e `ch` non ne tiene conto. Due cifre tabulari a 16px
       misurano 19,5px, piu' il cursore e l'imbottitura: 2.1ch ne lasciava 18. Il
       taglio si vedeva solo col valore dentro, quindi mai provando a campo vuoto.

       2.5ch fa 25px: i 23,5 che servono piu' un pelo. A 3ch ci stava tutto ma
       restavano sei pixel di aria per parte, e i due punti finivano lontani da
       tutti e due i numeri — «18 : 00» invece di «18:00». */
    width: 2.5ch;
    min-height: auto;
    padding: 0.15rem 0.1rem;
    border: none;
    background: none;
    font-family: inherit;

    /* 16px scritti: sotto quella soglia iOS zooma al tocco e la pagina resta zoomata. */
    font-size: 16px;
    font-variant-numeric: tabular-nums;
    color: var(--nero);
    text-align: center;
}

/* Il segmento su cui si sta scrivendo si accende di sabbia. E' il posto del blu di
   sistema del campo nativo — che non si puo' cambiare — ed e' l'unico segnale che
   dice quale delle due caselle sta ricevendo le cifre. */
.ora-segmenti .segmento:focus {
    outline: none;
    background: var(--sabbia);
    border-radius: 5px;
}

.ora-segmenti .segmento::placeholder { color: var(--grigio); }

.ora-segmenti .due-punti {
    color: var(--testo);
    font-variant-numeric: tabular-nums;

    /* Il cursore del testo sui due punti direbbe che ci si puo' scrivere. Non si puo'. */
    user-select: none;
}

/* L'avviso di quando l'ora e' stata spostata sulla mezz'ora. Non e' un guasto —
   il valore e' stato preso — quindi non prende il rosso: e' una nota come le altre,
   con il bordo a sinistra che la fa notare. */
.nota-aggancio {
    margin: 0.35rem 0 0;
    padding-left: 0.6rem;
    border-left: 3px solid var(--sabbia);
    font-size: 0.8rem;
    color: var(--testo);
}

/* -- Le date: il glifo del sistema esce, il nostro entra ------------------ */
.campo-pannello input[type="date"],
.scelta-data {
    background-image: url("data:image/svg+xml,<svg xmlns='http://www.w3.org/2000/svg' width='16' height='16' viewBox='0 0 16 16'><rect x='1.6' y='3' width='12.8' height='11.4' rx='2.2' fill='none' stroke='%23706F6D' stroke-width='1.6'/><path d='M1.6 6.6h12.8M5.2 1.6v2.8M10.8 1.6v2.8' fill='none' stroke='%23706F6D' stroke-width='1.6' stroke-linecap='round'/></svg>");
    background-repeat: no-repeat;
    background-position: right 0.7rem center;
    padding-right: 2.5rem;
}

/* ⚠️ opacity ZERO e non display:none. Il pulsante di sistema resta al suo posto e
   resta CLICCABILE — e' lui ad aprire il calendario del browser, che qui si tiene —
   ma non si vede piu': quello che si vede e' l'icona qui sopra, che sta esattamente
   sotto di lui. Nasconderlo davvero lascerebbe un campo data che si compila solo a
   tastiera, che e' un peggioramento vero. */
.campo-pannello input[type="date"]::-webkit-calendar-picker-indicator,
.scelta-data::-webkit-calendar-picker-indicator {
    opacity: 0;
    cursor: pointer;
    width: 1.6rem;
    margin: 0;
}

/* ⚠️ NELLA BARRA DEL CALENDARIO IL PULSANTE DI SISTEMA COPRE TUTTA LA CASELLA.
   Richiesta del committente del 20 ottobre 2026: «sarebbe bello che si aprisse il
   calendario se ci clicco sopra, così scelgo direttamente la settimana». Fin qui lo
   apriva solo l'icona a destra: un clic sul «20/10/2026» entrava nel giorno, nel mese
   o nell'anno per scriverli a mano, e per saltare tre settimane restavano le frecce.

   Il gestionale non ha JavaScript suo, quindi niente showPicker(): il pulsante
   trasparente di Chrome ed Edge si stende sulla casella intera, e qualunque clic
   cade su di lui. Firefox e Safari il calendario lo aprono già al clic. Scegliere un
   giorno nella vista Settimana porta alla sua settimana (ScegliDataAsync).

   Da tastiera non cambia niente: Tab entra nella data e le cifre si scrivono, e
   Alt+Giù apre il calendario. Vale solo qui: nei pannelli (Chiudi campi) la data si
   scrive anche a mano, e il calendario resta sull'icona. */
.scelta-data { position: relative; }

.scelta-data::-webkit-calendar-picker-indicator {
    /* ⚠️ !important, ed è l'unico che serve: Chrome la posizione di questo pulsante la
       impone dal suo foglio, e senza resta dov'era: il clic sulle cifre entra nel giorno
       come prima e il calendario non si apre (provato il 20 ottobre 2026, Chrome 152). */
    position: absolute !important;
    inset: 0;
    width: auto;
    height: auto;
    background: transparent;
}

/* -- I numeri: via le frecce ---------------------------------------------- */
/* Due frecce alte 9px l'una: sotto qualunque soglia del §4, e sul telefono non
   compaiono nemmeno. Chi scrive un prezzo lo scrive, non lo incrementa. Il
   type="number" resta, perche' e' lui a far uscire il tastierino numerico. */
.campo-pannello input[type="number"],
table.elenco td input[type="number"],
.campo input[type="number"] {
    appearance: textfield;
    -moz-appearance: textfield;
}

.campo-pannello input[type="number"]::-webkit-outer-spin-button,
.campo-pannello input[type="number"]::-webkit-inner-spin-button,
table.elenco td input[type="number"]::-webkit-outer-spin-button,
table.elenco td input[type="number"]::-webkit-inner-spin-button,
.campo input[type="number"]::-webkit-outer-spin-button,
.campo input[type="number"]::-webkit-inner-spin-button {
    appearance: none;
    -webkit-appearance: none;
    margin: 0;
}

/* Dentro una cella però non a piena larghezza: accanto ci stanno i due pulsanti. */
table.elenco td input,
table.elenco td select { width: auto; max-width: 100%; }

/* ⚠️ SOLO LA CASELLA NUDA, figlia diretta della cella (`>`). Senza, questa regola
   prendeva anche la casella DENTRO un .interruttore e pesava più della sua (due
   classi e tre elementi contro due classi e uno): `width: auto` su una casella con
   appearance: none la riduce al solo bordo, e l'interruttore «in servizio» di Maestri
   e «attivo» di Accessi usciva schiacciato, senza pomello (revisione della pagina
   Maestri, 7 ottobre 2026). Oggi nelle tabelle ci sono solo interruttori: la regola
   resta per la casella semplice che ci finisse domani. */
table.elenco td > input[type="checkbox"] {
    width: auto;
    min-height: 0;
    padding: 0;
}

.nota-pannello { font-size: 0.8rem; color: var(--testo); margin: 0.5rem 0 0; }

/* Una nota SEGUITA DA UN CAMPO ha bisogno del suo spazio: .nota-pannello chiude a
   margine zero, e finche' dopo c'era sempre un filetto non si notava.

   Vale per tutte e due le forme in cui un campo puo' venire dopo una nota: da solo,
   oppure dentro una .coppia-campi — che non ha margine proprio, quindi senza il
   secondo selettore il salto resta 0px. Succede davvero nel pannello «Chiudi dei
   campi» del calendario, dove la nota e' seguita da «Dal giorno / Al giorno». */
.nota-pannello + .campo-pannello,
.nota-pannello + .coppia-campi { margin-top: 0.75rem; }

/* ...e la stessa cosa quando il campo è CampoCliente (passo 11 del piano dei clienti, 21 ottobre
   2026): il suo contenitore è un <div class="campo-cliente">, non un .campo-pannello, e la nota che lo
   precede — «Vale solo per questa prenotazione» sopra la correzione — restava attaccata alle etichette.
   Solo una distanza, di 0,75rem come le altre due. */
.nota-pannello + .campo-cliente { margin-top: 0.75rem; }

/* Nota che segnala un guasto, dentro al pannello. Non è solo rossa: ha il bordo a
   sinistra e la parola la scrive il server — il colore da solo non è
   un'informazione (DESIGN.md §7), e qui il messaggio è l'unica cosa che dice alla
   segreteria che l'incasso NON è stato registrato. */
.nota-guasta {
    color: #B3261E;
    border-left: 3px solid #B3261E;
    padding-left: 0.6rem;
}

.pulsante-pericolo {
    width: 100%;
    min-height: var(--h-azione);
    background: var(--bianco);
    color: #B3261E;
    border: 1px solid #B3261E;
    border-radius: var(--pillola);
    padding: 0.7rem;
    font-family: inherit;
    font-weight: 700;
    font-size: 0.95rem;
    cursor: pointer;
}

.pulsante-pericolo:disabled { opacity: 0.6; cursor: wait; }

/* ── Calendario: scelta della vista e del campo ───────────────────────────── */

.barra-comandi {
    display: flex;
    align-items: center;
    gap: 1rem;
    flex-wrap: wrap;
}

.scelta-vista, .scelta-campo { display: flex; gap: 0.25rem; }

/* Il gruppo vive dentro una "pista" chiara, come un interruttore a due posizioni:
   cosi' si legge come UNA scelta fra alternative e non come pulsanti separati.
   E' la cosa che nel kit funziona meglio, ed e' l'unica che si trasferisce
   davvero da un'app per telefono a un gestionale. */
/* inline-flex e non flex: la pista deve stringersi attorno alle sue pillole.
   Con "flex" si allarga per tutta la riga e diventa una fascia grigia vuota con
   tre bottoni in un angolo — align-self non basta, perche' qui il genitore non
   e' un contenitore flex e quella proprieta' viene semplicemente ignorata. */
.scelta-vista, .scelta-campo {
    display: inline-flex;
    background: var(--bordo);
    border-radius: var(--pillola);
    padding: 3px;
}

.scelta-campo { margin-bottom: 0.75rem; }

/* 44px anche dentro la pista: il bordo di 3px si aggiunge fuori, non si prende
   dal bersaglio. Averlo messo a 42 per "far tornare i conti" era esattamente il
   modo in cui la soglia dei 44px si perde senza che nessuno se ne accorga. */
.bottone-vista, .bottone-campo {
    min-height: var(--h-comando);
    padding: 0.5rem 1.15rem;
    border: none;
    border-radius: var(--pillola);
    background: none;
    color: var(--nero);
    font-family: inherit;
    font-size: 0.9rem;
    cursor: pointer;
}

/* Lo stato attivo non e' una tinta appena diversa: e' un'inversione completa di
   sfondo e testo. Si vede anche stampato in bianco e nero (DESIGN.md §7). */
.bottone-vista.attiva, .bottone-campo.attivo {
    background: var(--nero);
    color: var(--bianco);
    border-color: var(--nero);
    font-weight: 700;
}

/* ⚠️ NERO, NON --testo: la pillola non scelta sta dentro la pista, che è --bordo, e --testo su
   quel fondo fa 3,85:1 — sotto i 4,5 che un testo di 10,5px chiede, e DESIGN.md §1 dice che
   --testo vale solo su bianco. Lo vede chiunque apra «Nuova fissa» o il Calendario, su ogni campo
   senza fari (rilievo del 21 ottobre 2026). La gerarchia resta nella misura e nel peso, non nel grigio. */
.bottone-campo .senza-luce {
    display: block;
    font-size: 0.7rem;
    font-weight: 400;
    color: var(--nero);
}

/* Su fondo nero il grigio scende sotto soglia: sull'attivo serve un colore chiaro. */
.bottone-campo.attivo .senza-luce { color: var(--sabbia); }

/* ── Calendario: vista settimana ──────────────────────────────────────────── */

table.griglia-admin th .data-colonna {
    display: block;
    font-weight: 400;
    font-size: 0.75rem;
    color: var(--testo);
}

/* Oggi si distingue nell'intestazione, non con una tinta sulla colonna: la colonna resta
   leggibile. Dal 19 ottobre 2026 l'intestazione ha il fondo giallo pallina e il filetto
   NERO: il filetto era arancio, e in giallo pallina sul bianco (1,42:1) non si sarebbe
   visto. Il segnale non dipende dal colore: restano il filetto e il grassetto. La data
   sotto il nome diventa nera: il --testo sulla pallina fa 3,53:1, sotto i 4,5. */
table.griglia-admin th.colonna-oggi {
    background: var(--pallina);
    border-bottom: 3px solid var(--nero);
    font-weight: 700;
}

table.griglia-admin th.colonna-oggi .data-colonna { color: var(--nero); }

/* ┌─────────────────────────────────────────────────────────────────────────────┐
   │ I SETTE GIORNI HANNO SEMPRE LA STESSA LARGHEZZA: table-layout: fixed.        │
   │                                                                             │
   │ Richiesta del committente del 17 settembre 2026: «si allarga il box in base  │
   │ a cosa c'è scritto dentro, devono rimanere le stesse larghezze sempre». Col  │
   │ layout automatico il browser dà più spazio alle colonne col testo più lungo, │
   │ e i puntini sul nome non bastano a impedirlo: MISURATO a 1134px, lunedì con  │
   │ «Pellegrini Marco» era largo 175px, martedì con «Manutenzione» 157, gli      │
   │ altri 138. La griglia cambiava forma da una settimana all'altra.             │
   └─────────────────────────────────────────────────────────────────────────────┘

   A layout fisso la larghezza la decide la PRIMA riga, non il contenuto: le ore hanno
   la loro misura scritta, i sette giorni si dividono il resto in parti uguali, e ciò che
   non ci sta si accorcia coi puntini — per intero sta nel title della casella e nella
   finestra che apre.

   ⚠️ IL MINIMO DI 84px PER GIORNO ORA LO TIENE LA TABELLA. Stava come min-width sulle
   celle, che a layout fisso non contano più niente: senza questo, fra i 740px e il
   margine della pagina le colonne si stringerebbero fino a spezzare i prezzi. I 18px
   sono i nove spazi da 2px fra le otto colonne. Sotto questa soglia scorre il
   contenitore, non la pagina (DESIGN.md §4). */
table.griglia-admin {
    table-layout: fixed;
    min-width: calc(3.25rem + 7 * 84px + 18px);
}

/* ── La settimana sul telefono: sette nastri ──────────────────────────────────
   Proposta C della tavola «Sette giorni, un campo», scelta dal committente il 15
   settembre 2026. Stesse tinte, stesso nastro e stesse misure che aveva la vista Giorno
   (fino al 22 ottobre 2026, quando è diventata un tabellone): è la scheda del campo ridotta
   a una riga. Il nastro è rimasto qui, e nella pagina Circolo.

   ⚠️ LA SOGLIA È 740px, e non i 640 del resto del foglio. MISURATA sul gestionale vero
   il 15 settembre 2026, dopo averla prima stimata a 700 e sbagliata: con i dati veri —
   «16,00 €», «non prenotabile» — la tabella non scende sotto i 703px, e i margini della
   pagina ne tolgono 37. A 740 ci sta esatta; a 700 scorreva di lato di 40px.

   Quella misura era del layout automatico, che si allargava col contenuto delle celle. Dal
   17 settembre 2026 la tabella è a layout fisso: il suo minimo è scritto (655px, vedi
   «Calendario: vista settimana») e un nome lungo non la allarga più. La soglia resta a 740,
   dove ci sta con margine. Se la tabella scorresse, scorre dentro il suo riquadro — mai il
   body, DESIGN.md §4. */
.solo-telefono { display: none !important; }

@media (max-width: 739px) {
    .solo-telefono { display: revert !important; }
    ul.solo-telefono, p.solo-telefono,
    .striscia-calendario.solo-telefono, .riga-periodo.solo-telefono { display: flex !important; }
    .solo-computer { display: none !important; }

    /* Senza frecce e data, sulla riga restano Giorno/Settimana e «Chiudi campi»: uno per
       parte. Il margine e non space-between: se la riga va a capo — un carattere di
       sistema ingrandito — «Chiudi campi» resta a destra invece di cadere a sinistra. */
    .barra-comandi .chiudi-campi { margin-left: auto; }

    /* LA SCELTA DEL CAMPO A TUTTA LARGHEZZA, richiesta del committente del 17 settembre
       2026. Sul telefono stretta a sinistra lasciava un vuoto a destra sopra sette righe
       che invece la larghezza la prendono tutta; così i campi si dividono la riga in
       parti uguali, e ognuno è un bersaglio più largo per il pollice.

       ⚠️ min-width: 0 e i puntini: i campi li nomina il gestore, e possono essere più di
       tre. Se non ci stanno, si accorcia il nome dentro la sua pillola — mai la pista
       che esce dalla pagina (DESIGN.md §4). Il nome intero lo dice il title. */
    .scelta-campo { display: flex; }

    .scelta-campo .bottone-campo {
        flex: 1 1 0;
        min-width: 0;
        padding-inline: 0.5rem;
        overflow: hidden;
        text-overflow: ellipsis;
        white-space: nowrap;
    }

    .scelta-campo .bottone-campo .senza-luce { overflow: hidden; text-overflow: ellipsis; }
}

/* ── La striscia della testata, sul telefono ──────────────────────────────────
   Proposta C: sette giorni in Giorno, quattro settimane in Settimana, e in fondo la
   casella del calendario per andare lontano. Le regole — quali giorni, quale tessera
   accesa — stanno in StrisciaCalendario.cs, con le loro prove.

   ⚠️ FLEX E NON UNA GRIGLIA A COLONNE CONTATE. Le tessere sono sette o quattro, e il
   quattro è una costante C#: scriverlo anche qui in un repeat(4, …) sarebbe il numero
   che un giorno cambia da una parte sola. Ogni tessera prende una parte uguale, la
   casella del calendario i suoi 44px.

   ⚠️ LE MISURE CHE CONTANO SONO LE PIÙ STRETTE. A 360px una tessera dei giorni è larga
   36px e «OGGI» in grassetto ne occupa 29; a 320px, col gradino qui sotto, 32 e 27. Una
   settimana è larga 66px e «QUESTA» ne occupa 45; a 320px 58. Il 17 settembre 2026 sette
   settimane uscivano dal bordo, ed è la ragione per cui sono diventate quattro: prima di
   allungare una sigla, misurala lì.

   ⚠️ E SE IL TESTO È INGRANDITO — Android e Samsung Internet lo fanno anche sui px — le
   tessere NON SI STRINGONO sotto le loro scritte: niente min-width: 0, così il minimo è il
   contenuto, e la striscia scorre di lato dentro di sé (mai il body, §4) invece di far
   uscire le sigle sulla tessera accanto. Al 100% non scorre niente: ci sta.

   Scorrendo, però, la striscia taglierebbe il contorno del fuoco, che sta fuori dalla
   tessera: da qui il quarto di rem di imbottitura, ripreso col margine negativo perché le
   tessere restino allineate al resto della pagina, e il contorno a 1px invece di 2. */
.striscia-calendario {
    gap: 0.25rem;
    margin: 0.5rem -0.25rem 0;
    padding: 0.25rem;
    overflow-x: auto;
}

.striscia-calendario .tessera-calendario:focus-visible { outline-offset: 1px; }

/* Il raggio e non la pillola, anche se si tocca (DESIGN.md §3): una pillola alta 56px e
   larga 36 è un bastoncino. È la stessa forma delle tessere dei giorni del sito, e chi
   prenota da lì la riconosce. */
.tessera-calendario {
    flex: 1 1 0;
    min-height: 3.75rem;
    position: relative;
    display: flex;
    flex-direction: column;
    align-items: center;
    justify-content: center;
    gap: 0.125rem;
    padding: 0;
    border: 1px solid var(--sabbia);
    border-radius: var(--raggio);
    background: var(--bianco);
    color: var(--nero);
    font-family: inherit;
    line-height: 1.1;
    font-variant-numeric: tabular-nums;
    white-space: nowrap;
    cursor: pointer;
}

.tessera-calendario .sigla {
    font-size: 0.7rem;
    text-transform: uppercase;
    letter-spacing: 0.05em;
    color: var(--testo);
}

.tessera-calendario .numero { font-size: 1.05rem; font-weight: 700; }

/* «28–4» è una parola sola da due numeri: un gradino sotto, o a 320px tocca i bordi. */
.striscia-calendario--settimane .numero { font-size: 0.95rem; }

.tessera-calendario:not([aria-pressed="true"]):hover { filter: brightness(0.95); }

/* Accesa come Giorno/Settimana qui sopra: l'inversione completa, non una tinta appena
   diversa. La sigla passa a --sabbia, perché il grigio è un colore per il bianco (§1):
   sul nero fa 12,74:1. */
.tessera-calendario[aria-pressed="true"] {
    background: var(--nero);
    border-color: var(--nero);
    color: var(--bianco);
}
.tessera-calendario[aria-pressed="true"] .sigla { color: var(--sabbia); font-weight: 700; }

/* Oggi, quando non è quella accesa: la parola «oggi» c'è già, il nero la fa trovare. */
.tessera-calendario--corrente:not([aria-pressed="true"]) .sigla { color: var(--nero); font-weight: 700; }

/* La casella del calendario. Tratteggiata perché non è un giorno: porta fuori dalla
   striscia. */
.tessera-calendario--data {
    flex: 0 0 var(--h-comando);
    border-style: dashed;
    color: var(--testo);
}
.tessera-calendario--data:hover { filter: brightness(0.95); }
.tessera-calendario--data svg { width: 1.25rem; height: 1.25rem; }

/* L'input vero, trasparente e steso su tutta la casella: il tocco arriva a lui, e il
   telefono apre il suo calendario.

   ⚠️ 16px NON È UNA DIMENSIONE DI TESTO, qui non si vede niente: sotto i 16px iOS zooma
   la pagina quando la casella prende il fuoco, e la lascia zoomata (DESIGN.md §2).

   ⚠️ L'indicatore di Chrome va steso anche lui: senza, su Chrome un tocco fuori dalla
   sua icona da 16px mette il fuoco nel campo e non apre niente. */
.tessera-calendario--data input {
    position: absolute;
    inset: 0;
    width: 100%;
    height: 100%;
    margin: 0;
    padding: 0;
    border: 0;
    opacity: 0;
    font-size: 16px;
    cursor: pointer;
}
.tessera-calendario--data input::-webkit-calendar-picker-indicator {
    position: absolute;
    inset: 0;
    width: auto;
    height: auto;
    margin: 0;
    padding: 0;
    cursor: pointer;
}

/* Il fuoco da tastiera sta sull'input, che è trasparente: il suo contorno sparirebbe con
   lui. Lo disegna la casella (DESIGN.md §5). */
.tessera-calendario--data:has(input:focus-visible) {
    outline: 3px solid var(--nero);
    outline-offset: 1px;
}

.riga-periodo {
    align-items: center;
    justify-content: space-between;
    gap: 0.5rem;
    min-height: var(--h-comando);
    margin-top: 0.25rem;
}
.riga-periodo .giorno-esteso { margin: 0; }

/* «Questa settimana» non va a capo: se non c'è posto, va a capo la frase accanto. Una
   pillola su due righe diventerebbe alta 58px, e la griglia sotto salterebbe secondo la
   settimana che si guarda. */
.riga-periodo .bottone-oggi { flex: none; white-space: nowrap; }

/* ⚠️ SOTTO I 360px, UN GRADINO PIÙ STRETTO. MISURATO il 17 settembre 2026 su Inter vera:
   a 320px una tessera dei giorni è larga 30px e «OGGI» ne occupava 29 — a 0,7px dal bordo
   —, e Giorno/Settimana più «Chiudi campi» (187 + 118px) andavano a capo in 282. Senza la
   spaziatura delle sigle, con la casella del calendario a 34px e le pillole della riga
   sopra un po' più strette, a 320 tutto sta nella sua riga. A 360 non cambia niente.

   La casella del calendario scende sotto i 44px di larghezza, non di altezza: resta alta
   56, e le tessere accanto sono già larghe 30. */
@media (max-width: 359px) {
    .tessera-calendario .sigla { letter-spacing: 0; }
    .tessera-calendario--data { flex-basis: 2.25rem; }
    .barra-comandi .bottone-vista,
    .barra-comandi .chiudi-campi { padding-inline: 0.75rem; }
}

.scala-nastro {
    justify-content: space-between; margin: 0 0.75rem 0.375rem;
    font-size: 0.7rem; color: var(--testo); font-variant-numeric: tabular-nums;
}

.righe-settimana { list-style: none; margin: 0; padding: 0; flex-direction: column; gap: 0.5rem; }

/* La riga È il bottone: il bersaglio è largo tutto lo schermo e alto più dei 44px che
   il §4 chiede, perché contiene la frase e il nastro. */
.riga-giorno {
    width: 100%; min-height: var(--h-comando); cursor: pointer; text-align: left;
    background: var(--bianco); border: 1px solid var(--bordo); border-radius: var(--raggio);
    padding: 0.625rem 0.75rem; font-family: inherit; color: var(--nero);
    display: grid; grid-template-columns: 1fr auto; column-gap: 0.5rem; row-gap: 0.375rem;
    align-items: center;
}
.riga-giorno:hover { filter: brightness(0.97); }

.riga-giorno .capo-riga { display: flex; align-items: baseline; gap: 0.5rem; font-variant-numeric: tabular-nums; }
.riga-giorno .capo-riga strong { font-size: 0.95rem; }
.riga-giorno .riassunto-riga { font-size: 0.8rem; color: var(--testo); }
.riga-giorno .freccia { grid-row: 1 / span 2; grid-column: 2; width: 20px; height: 20px; color: var(--testo); }
.riga-giorno .freccia svg { width: 20px; height: 20px; display: block; }
.riga-giorno .nastro { grid-column: 1 / -1; height: 18px; }

/* Oggi con lo stesso segnale della colonna di oggi nella tabella: il fondo giallo pallina
   sotto il nome (era un filetto arancio), e la parola accanto (DESIGN.md §7). Raggio 6px,
   quello delle etichette che non si toccano: il bersaglio è la riga intera. */
.riga-giorno--oggi { border-color: var(--sabbia); }
.riga-giorno--oggi .capo-riga strong { padding: 0 0.3rem; border-radius: 6px; background: var(--pallina); }

/* I giorni passati si aprono lo stesso — chi ha giocato lunedì si guarda — ma si
   leggono spenti: il grigio su bianco regge (5,02:1). */
.riga-giorno--passato .capo-riga strong,
.riga-giorno--passato .riassunto-riga { color: var(--testo); }

@media (max-width: 900px) {
    /* align-items: stretch e non il flex-start ereditato: in colonna, con flex-start
       i figli si dimensionano sul CONTENUTO, quindi la tabella della settimana
       (7 colonne) allargava la pagina invece di scorrere dentro il suo contenitore.
       Il body che scorre in orizzontale e' vietato — DESIGN.md §4. */
    .area-calendario { flex-direction: column; align-items: stretch; }
    .contenitore-griglia { width: 100%; }
    .pannello { flex: none; width: 100%; box-sizing: border-box; }
    .barra-comandi { gap: 0.5rem; }
}

/* Il nastro della giornata: un segmento per mezz'ora, tutta la giornata in una
   riga alta 26px. È una FIGURA e non un comando — a 29 segmenti ognuno sarebbe
   largo dieci pixel, un quarto del bersaglio minimo (DESIGN.md §4). Lo disegnano
   la settimana sul telefono (.riga-giorno) e l'anteprima della pagina Circolo: la
   vista Giorno non ce l'ha più dal 22 ottobre 2026, quando è diventata un tabellone. */
.nastro { display: flex; gap: 1px; height: 26px; border-radius: 6px; overflow: hidden; }
.nastro i { flex: 1 1 0; display: block; }

.nastro-libero { background: var(--libero); }
.nastro-occupato { background: var(--sabbia); }
.nastro-buio { background: var(--spento); }

/* Un elenco di righe: l'esito di un gesto sul calendario, le date di una fissa, le prenotazioni
   in mezzo a un blocco. */
.impegni { list-style: none; margin: 0; padding: 0; display: flex; flex-direction: column; gap: 2px; }

/* Una riga da premere dentro un elenco: oggi i riassunti degli orari di una fissa. */
.riga-impegno {
    width: 100%;
    min-height: var(--h-comando);
    display: flex;
    align-items: center;
    gap: 0.75rem;
    text-align: left;
    background: var(--sfondo);
    border: 1px solid var(--bordo);
    border-radius: var(--raggio);
    padding: 0.375rem 0.625rem;
    font-family: inherit;
    font-size: 0.85rem;
    color: var(--nero);
    cursor: pointer;
}
.riga-impegno:hover { filter: brightness(0.97); }

/* ═══════════════════════════════════════════════════════════════════════════
   CALENDARIO — IL TABELLONE DELLA VISTA GIORNO (22 ottobre 2026)

   Proposta B delle tavole «Calendario a colonne», scelta dal committente: le tre schede
   impilate facevano circa 1.480px dalla data alla legenda, e ogni prenotazione ne
   aggiungeva 51. Adesso l'ora scende a sinistra a mezz'ore, ogni campo è una colonna e
   ogni prenotazione un blocco alto quanto dura. L'altezza è fissa: 29 mezz'ore da 24px,
   più l'intestazione.

   ⚠️ LA MEZZ'ORA È ALTA 24px (28 SUL TELEFONO), sotto i 44 di DESIGN.md §4. È
   un'eccezione dichiarata, accettata dal committente sapendolo; il perché sta in
   DESIGN.md, accanto alla regola. A misura piena restano «Prenota» nell'intestazione di
   ogni campo (sul telefono l'intestazione stessa) e i blocchi di una partita o di una lezione, che
   durano almeno un'ora (36px dentro, 46 fuori). ⚠️ Una CHIUSURA invece si scrive anche a mezz'ore (una
   «pioggia» 11:00–11:30): è un pulsante da 22px (26 sul telefono), sotto i 44, e DESIGN.md §4 lo dichiara
   nell'eccezione (confermato dal committente il 27 ottobre 2026) — apre soltanto il pannello, dove sta tutto ciò che si fa
   su una chiusura.

   SOLO TOKEN CHE C'ERANO: nessun colore, ombra o raggio nuovo, nessuna transizione. Le
   tinte del libero e dello spento sono quelle del nastro e della settimana, che dal 27 ottobre 2026
   hanno un posto solo, in :root (--libero, --libero-bordo, --spento); qui sono ripetute con
   i nomi del tabellone (--tab-libero, …), che puntano a quelli.

   LE MISURE DEL TELEFONO SONO QUELLE DELLA TAVOLA A 390px, e valgono da 739px in giù (la
   soglia di .solo-telefono): colonna delle ore da 36px, mezz'ora da 28, tabellone da
   bordo a bordo.
   ═══════════════════════════════════════════════════════════════════════════ */

/* ⚠️ SENZA OVERFLOW, e non è una dimenticanza: .contenitore-griglia ha overflow-x: auto per
   la tabella della settimana, e un overflow diverso da visible lo fa diventare il riquadro
   che scorre — le intestazioni sticky del tabellone si fermerebbero lì dentro invece di
   restare sotto la barra in alto. Il tabellone non scorre mai di lato: le colonne sono
   minmax(0, 1fr) e si stringono. */
.contenitore-tabellone { overflow: visible; }

.tabellone,
.legenda-tabellone,
.nota-buio {
    --tab-libero: var(--libero);
    --tab-libero-bordo: var(--libero-bordo);
    --tab-spento: var(--spento);
}

.tabellone {
    --tab-riga: 24px;        /* una mezz'ora */
    --tab-ore: 44px;         /* la colonna delle ore */
    --tab-intervallo: 9px;   /* fra una colonna e l'altra */
    --tab-piede: 14px;       /* sotto l'ultima mezz'ora, dove sta l'etichetta della chiusura */

    background: var(--bianco);
    border: 1px solid var(--bordo);
    border-radius: var(--raggio);
    padding: 0.8rem 1rem;
}

/* L'intestazione e il corpo hanno le stesse colonne: la prima colonna è quella delle ore,
   poi una per campo. --campi e --righe le scrive la pagina (inline, sono numeri dei dati). */
.tab-testata,
.tab-corpo {
    display: grid;
    grid-template-columns: var(--tab-ore) repeat(var(--campi), minmax(0, 1fr));
    column-gap: var(--tab-intervallo);
}

/* Sei pixel d'aria sopra la prima mezz'ora (27 ottobre 2026). Il contorno del fuoco di un blocco che comincia alla prima
   mezz'ora (una lezione delle 08:30, una fissa) sta 2px fuori dal blocco più 3px di spessore, cioè DENTRO gli ultimi
   pixel dell'intestazione ferma, che è bianca e sta sopra (z-index 3 contro 2): il lato alto dell'anello spariva. Ore e
   colonne stanno nella stessa griglia, quindi restano allineate fra loro. */
.tab-corpo { padding-top: 6px; }

/* Ferma sotto la barra in alto, che è alta --riga-alta-h: scorrendo fino alle 22:00 si deve
   sapere di che campo è la colonna. Bianca, o le colonne le scorrerebbero sotto. */
.tab-testata {
    position: sticky;
    top: var(--riga-alta-h);
    z-index: 3;
    background: var(--bianco);
}

/* La barra dello spostamento (26 ottobre 2026, T3) sta DENTRO l'intestazione ferma, sopra i nomi dei campi, a tutta
   larghezza: è già ferma insieme a lei, e le due non si coprono qualunque altezza abbia la barra — e cresce quando si
   apre la domanda, quindi non c'è un numero da scrivere qui. Per questo non è sticky per conto suo. Lo spazio sotto
   è mezzo rem, come fra le righe dell'intestazione: l'1rem della barra da sola farebbe una fascia bianca ferma di troppo. */
.tab-testata .barra-spostamento {
    position: static;
    grid-column: 1 / -1;
    margin: 0 0 0.5rem;

    /* ⚠️ UN TETTO, E NON È CORTESIA (27 ottobre 2026). Una zona ferma più alta dello schermo non scorre: quello che sta in
       fondo alla barra — «Sì, sposta» e «Scegli un'altra ora» — resta fuori vista e non si raggiunge più. Succede su un
       telefono in orizzontale (640×360), dove la sola barra con la domanda supera la finestra. Oltre il tetto la barra scorre
       DENTRO di sé, così i due pulsanti si raggiungono sempre. Il tetto toglie alla finestra ciò che c'è sempre sopra e sotto:
       la barra in alto, i nomi dei campi (--tab-nomi-h: 64px più il mezzo rem), la barra che fluttua in basso e i suoi due
       margini. 100vh prima, 100dvh poi: dove dvh non c'è, il primo. */
    --tab-nomi-h: 5rem;
    max-height: calc(100vh - var(--riga-alta-h) - var(--barra-h) - var(--barra-margine) * 2 - var(--tab-nomi-h));
    max-height: calc(100dvh - var(--riga-alta-h) - var(--barra-h) - var(--barra-margine) * 2 - var(--tab-nomi-h));
    overflow-y: auto;
    overscroll-behavior: contain;
}

.tab-testata .barra-spostamento::after { display: none; }

.tab-testa {
    position: relative;
    min-height: 52px;
    padding-bottom: 7px;
    border-bottom: 1px solid var(--bordo);
    display: flex;
    flex-wrap: wrap;
    align-items: center;
    justify-content: space-between;
    column-gap: 12px;
}

/* Il testo prende il posto che resta; se «Prenota» non ci sta accanto va sotto, invece di
   schiacciare la frase fra 740 e 1000px. */
.tab-testa-testo { flex: 1 1 9rem; min-width: 0; }

.tab-nome-campo { margin: 0; display: flex; align-items: baseline; gap: 0.5rem; }
.tab-nome-campo strong { font-size: 1rem; line-height: 1.3; color: var(--nero); }
.tab-nome-campo .senza-luce { font-size: 0.7rem; line-height: 1.35; color: var(--testo); }

.tab-frase { margin: 0; font-size: 0.9rem; line-height: 1.3; font-weight: 700; color: var(--nero); }
.tab-frase-breve { display: none; }

.tab-prenota { flex: none; }
.tab-prenota-piu { display: none; }

/* La colonna delle ore. La mezz'ora in punto in nero e in grassetto, la mezza più chiara
   (--testo regge solo su bianco, ed è su bianco). Le etichette sono disegno: i blocchi
   portano il loro orario per intero. */
.tab-ore { display: flex; flex-direction: column; }

.tab-ora {
    display: block;
    height: var(--tab-riga);
    padding: 7px 5px 0 0;
    text-align: right;
    font-size: 0.7rem;
    line-height: 14px;
    font-variant-numeric: tabular-nums;
    color: var(--testo);
}
.tab-ora--piena { font-weight: 700; color: var(--nero); }
.tab-ora--fine { height: var(--tab-piede); padding-top: 3px; }

/* Una colonna è una griglia a sé: una riga per mezz'ora, più il piede. Ogni blocco si
   mette con grid-row (inline: riga di inizio e numero di mezz'ore vengono dai dati). */
.tab-campo {
    display: grid;
    grid-template-columns: minmax(0, 1fr);
    grid-template-rows: repeat(var(--righe), var(--tab-riga)) var(--tab-piede);
    min-width: 0;
}

.tab-blocco {
    grid-column: 1;
    align-self: stretch;
    min-width: 0;
    margin: 1px;
    border-radius: 6px;
    color: var(--nero);
    font-family: inherit;
    text-align: left;
}

/* Il fuoco o Tab portano un blocco in vista SENZA farlo finire sotto le due cose ferme: la barra in alto con
   le intestazioni dei campi (--riga-alta-h più circa 64px, +11px d'aria) e la barra in basso che fluttua
   (--barra-h più --barra-margine, +1rem). Vale anche per le mezz'ore, che sono i pulsanti più bassi. */
.tab-blocco,
.tab-pezzo {
    scroll-margin-block: calc(var(--riga-alta-h) + 5rem) calc(var(--barra-h) + var(--barra-margine) + 1rem);
}

/* Il contorno del fuoco deve stare SOPRA i blocchi accanto, che sono a 2px di distanza. */
.tab-blocco:focus-visible { z-index: 2; }

button.tab-blocco { cursor: pointer; }
button.tab-blocco:hover { filter: brightness(0.97); }

/* ── Il libero: verde col bordo, una casella per mezz'ora ──────────────────────────
   Il tratto è un contenitore diviso in mezz'ore da una riga: più chiara a metà ora, un filo più
   scura all'ora in punto. La prima casella dice «Libero» e l'intervallo. Ogni mezz'ora da cui si
   può cominciare è un PULSANTE a sé (T2, 22 ottobre 2026: prenota a quell'ora, o durante uno
   spostamento apre la domanda «Sì, sposta» — T3, 26 ottobre: non sposta da sola); le altre sono uno
   <span> senza cursore a mano né fuoco: grigio (.tab-pezzo--inerte, 27 ottobre 2026) per chi può prenotare, uguale al
   tratto per chi non può aggiungere niente e nel Passato.
   Il «Passato» è lo stesso tratto, smorzato: non è quello da offrire a chi telefona. Si prenota ancora
   solo dove la partita è IN CORSO (26 ottobre 2026: dal gestionale non si scrive più una partita già
   finita; dal 27, anche se è cominciata da più della durata minima, purché una partita lunga quanto la più lunga che si
   vende non sia già finita); le mezz'ore da cui ogni partita sarebbe già finita sono disegnate uguali ma sono uno
   <span>, non un pulsante, e il loro title dice perché. Una mezz'ora passata che resta un inizio non ha un aspetto suo:
   è un pulsante dentro il tratto «Passato», come la 16:30 alle 17:05.

   ⚠️ overflow: hidden SERVE a tenere dentro gli angoli tondi del contenitore le mezz'ore accese
   (pallina piena); il contorno del fuoco delle mezz'ore sta DENTRO la casella (outline-offset
   negativo), così non viene tagliato. */
.tab-libero,
.tab-passato {
    margin: 0 1px;
    padding: 0;
    display: flex;
    flex-direction: column;
    overflow: hidden;
    border: 1px solid var(--tab-libero-bordo);
    background: var(--tab-libero);
}

.tab-passato { border-color: var(--bordo); background: var(--bianco); color: var(--testo); }

.tab-pezzo {
    flex: 1 1 0;
    min-height: 0;
    width: 100%;
    margin: 0;
    display: flex;
    align-items: center;
    justify-content: space-between;
    gap: 12px;
    padding: 0 10px;
    border: 0;
    border-radius: 0;
    background: transparent;
    color: inherit;
    font-family: inherit;
    font-size: 0.75rem;
    line-height: 14px;
    text-align: left;
}
.tab-pezzo + .tab-pezzo { border-top: 1px solid var(--bianco); }
.tab-pezzo + .tab-pezzo--ora { border-top-color: var(--bordo); }

/* Il pulsante della mezz'ora: la mano e un filo più scuro al passaggio (§5), il fuoco dentro la casella —
   e sopra le vicine, che sono a un filo di distanza.

   ⚠️ IL FILO PIÙ SCURO NON PUÒ ESSERE UN FILTER SUL PULSANTE LIBERO (27 ottobre 2026): il verde sta sul contenitore
   (.tab-libero), e il pulsante è trasparente — un filter agisce sul disegno del pulsante (il testo, un bordo da
   1px), non sullo sfondo del genitore, quindi al passaggio del mouse non cambiava niente di visibile. Il libero
   prende un suo fondo, lo stesso 5% di nero che il filtro prometteva (rgb(7 4 0 / 5%), come l'ombra e il velo: il
   --nero a trasparenza). La mezz'ora ACCESA dello spostamento ha già il suo fondo pallina, e lì il filtro funziona. */
button.tab-pezzo { cursor: pointer; }
button.tab-pezzo:hover { filter: brightness(0.95); }
button.tab-pezzo:hover:not(.tab-pezzo--dest):not(:disabled) { background: rgb(7 4 0 / 5%); filter: none; }
button.tab-pezzo:disabled { cursor: progress; }
.tab-pezzo:focus-visible { outline-offset: -3px; z-index: 2; }

/* Una mezz'ora libera da cui NON si comincia (27 ottobre 2026): la coda prima dell'ultima luce o della chiusura, la
   mezz'ora sola fra due partite, la mezza a ore intere. È <span>, non risponde — niente cursore a mano, niente fuoco —, e
   prima era verde IDENTICA a quelle che prenotano: la stessa condizione («libera ma non un inizio») che nella riga
   «Dalle» della finestra è grigia — la mezz'ora sola fra due partite compresa: confermato dal committente il 27 ottobre 2026. Al telefono non c'è il passaggio del mouse che spiega perché (il title non esiste al
   tocco né da tastiera), quindi la differenza la dice il COLORE: la tinta della zona spenta (--tab-spento), che è anche
   il campione «non prenotabile» della legenda. Nessun colore nuovo. Il verde resta alle mezz'ore che prenotano.
   Il verde e il grigio sono chiari quasi uguali (la luminosità cambia di poco), e il colore da solo non basta (§7): dove
   le mezz'ore che prenotano finiscono e cominciano quelle che non lo fanno c'è anche una FORMA, la riga tratteggiata
   della zona spenta (--grigio). */
.tab-pezzo.tab-pezzo--inerte { background: var(--tab-spento); }
.tab-pezzo:not(.tab-pezzo--inerte) + .tab-pezzo.tab-pezzo--inerte { border-top: 1px dashed var(--grigio); }

.tab-etichetta { display: flex; align-items: center; gap: 6px; }
.tab-etichetta svg { width: 12px; height: 12px; flex: none; stroke-width: 2.25; }
.tab-intervallo { font-variant-numeric: tabular-nums; }

/* ── Una prenotazione: sabbia, e il tipo anche a parole (§7) ───────────────────────
   Il bordo è sempre da 2px, dello stesso colore del fondo: la lezione lo ha nero e il
   blocco non cambia misura. La chiusura è nera piena, con la scritta bianca (20,46:1). */
.tab-impegno {
    display: flex;
    justify-content: space-between;
    align-items: flex-start;
    gap: 12px;
    padding: 3px 8px;
    border: 2px solid var(--sabbia);
    background: var(--sabbia);
    overflow: hidden;
}
.tab-lezione { border-color: var(--nero); }
.tab-chiuso { border-color: var(--nero); background: var(--nero); color: var(--bianco); }

/* La prenotazione che si sta spostando (T2): il contorno diventa un tratteggio nero e al posto del tipo
   c'è «Sto spostando» — il segno è una forma E una parola, non un colore solo (§7). Su una chiusura, che è
   già nera piena, il tratteggio è bianco. */
.tab-spostata { border-style: dashed; border-color: var(--nero); }
.tab-chiuso.tab-spostata { border-color: var(--bianco); }
.tab-spostata .tab-tipo { font-weight: 700; }

.tab-testo { display: block; min-width: 0; }

.tab-nome {
    display: block;
    overflow: hidden;
    text-overflow: ellipsis;
    white-space: nowrap;
    font-size: 0.9rem;
    line-height: 17px;
}

.tab-tipo { display: block; font-size: 0.75rem; line-height: 14px; }
.tab-lezione .tab-tipo { font-weight: 700; }

.tab-orario { flex: none; font-size: 0.85rem; line-height: 17px; font-variant-numeric: tabular-nums; }

/* Una mezz'ora sola (il circolo può permetterla): 22px di blocco, una riga e basta. Il nome
   intero, il tipo e l'orario sono nell'aria-label. */
.tab-impegno.tab-breve { align-items: center; padding-block: 0; }
.tab-impegno.tab-breve .tab-tipo,
.tab-impegno.tab-breve .tab-orario { display: none; }

/* ── Una prenotazione che finisce al buio: «al buio dalle 17:30» (26 ottobre 2026) ─────────────────
   Una partita scritta quando il campo chiudeva più tardi resta lì dopo che l'ultima luce si è spostata, e la zona
   spenta comincia DOPO di lei: senza un segno il campo sembra chiudere un'ora più tardi di quello accanto. Il segno è una
   PAROLA (§7), in un'etichetta della famiglia della zona spenta che le sta sotto — stesso fondo, stesso tratteggio grigio —
   e non porta nessun colore nuovo: nero su --tab-spento è 18,31:1.

   Sta nella stessa colonna dell'orario (.tab-coda: l'orario sopra, l'etichetta sotto) perché un blocco da un'ora è alto 36px
   dentro (46 fuori: 2 righe da 24 meno il margine di 1px per parte, tolti il bordo da 2px e il padding da 3px) e il nome
   più il tipo ne prendono 31: l'etichetta alta 15 ci sta a destra, dove l'orario ne prende 17 (17 + 15 = 32 su 36), e non
   a sinistra, dove 31 + 15 fanno 46 contro 36. Sul telefono il blocco è a colonna sola, e l'etichetta sta sotto il nome (più sotto). Tre scritte, perché la
   colonna cambia: «al buio dalle 17:30» da 1180px in su, «al buio 17:30» sotto (il «dalle» è .tab-buio-dalle: stesso
   schema di .tab-frase-intera/breve) — è larga come l'orario, quindi non stringe il nome —, e «al buio» e basta su una
   mezz'ora sola al telefono (.tab-buio-ora), dove accanto al nome non c'è posto per l'ora (le tre forme secondo la larghezza
   sono confermate dal committente, 27 ottobre 2026). L'ora intera sta sempre nel nome del blocco e nel title. Il blocco che si sta spostando non la porta (la pagina non la disegna). */
.tab-coda {
    display: flex;
    flex: none;
    flex-direction: column;
    align-items: flex-end;
}

.tab-buio {
    display: block;
    padding: 0 4px;
    border: 1px dashed var(--grigio);
    border-radius: 6px;   /* i 6px dell'etichetta che non si tocca (DESIGN.md §3), come .nota-buio: 4px non era un raggio del sistema */
    background: var(--tab-spento);
    color: var(--nero);
    font-size: 0.75rem;
    line-height: 13px;
    white-space: nowrap;
    font-variant-numeric: tabular-nums;
}

/* La nota nel pannello della prenotazione che finisce al buio: la stessa famiglia dell'etichetta, a tutta riga. Il
   nero, perché il --testo grigio su --tab-spento fa 4,49:1, appena sotto la soglia del 4,5 (§1). */
.nota-pannello.nota-buio {
    margin: 0 0 0.5rem;
    padding: 0.5rem 0.65rem;
    border: 1px dashed var(--grigio);
    border-radius: 6px;
    background: var(--tab-spento);
    color: var(--nero);
}

/* ── La zona spenta: tratteggiata, e dice perché ───────────────────────────────────
   Il cursore che vieta è il secondo segnale (§5): il colore da solo non dice «non si può». */
.tab-spento {
    padding: 7px 10px;
    border: 1px dashed var(--grigio);
    background: var(--tab-spento);
    cursor: not-allowed;
    overflow: hidden;
}

/* Sotto le tre mezz'ore non c'è posto per titolo e motivo: una riga sola, al centro. */
.tab-spento:not(.tab-lungo) { display: flex; align-items: center; padding-block: 0; }

.tab-spento-titolo { margin: 0; font-size: 0.85rem; line-height: 17px; font-weight: 700; }
.tab-spento-motivo { margin: 0; font-size: 0.75rem; line-height: 14px; }
.tab-spento-breve { font-size: 0.75rem; line-height: 14px; font-weight: 700; }

/* ── La legenda: cinque campioni, gli stessi del tabellone ───────────────────────────
   Più un sesto mentre si sposta: le mezz'ore accese. */
.legenda-nastro.legenda-tabellone { row-gap: 0.4rem; }
.legenda-tabellone i.leg-libero { border-color: var(--tab-libero-bordo); background: var(--tab-libero); }
.legenda-tabellone i.leg-occupato { border-color: var(--sabbia); background: var(--sabbia); }
.legenda-tabellone i.leg-lezione { border: 2px solid var(--nero); background: var(--sabbia); }
.legenda-tabellone i.leg-chiuso { border-color: var(--nero); background: var(--nero); }
.legenda-tabellone i.leg-spento { border: 1px dashed var(--grigio); background: var(--tab-spento); }
.legenda-tabellone i.leg-dest { border-color: var(--nero); background: var(--pallina); }

/* ── Lo spostamento: si accendono le mezz'ore dove la partita ci sta intera ─────────────
   Al posto delle pastiglie «Sposta qui» sopra il tabellone (T1) ci sono le mezz'ore stesse, che sono
   già al loro posto e al loro orario: toccarne una è toccare l'ora, e apre la domanda «Sì, sposta» nella
   barra (T3, 26 ottobre 2026) — non sposta. La mezz'ora toccata resta segnata (.tab-pezzo--scelta, più sotto).

   Le accese sono PALLINA PIENA con il bordo nero e la parola «Sposta qui» (§1: il pulsante pieno pallina
   col bordo nero; mai la pallina come testo sul bianco — qui è lo sfondo, il testo è nero, 14,41:1).
   Le altre libere si spengono, bianche col bordo chiaro e il testo --testo (5,02:1 su bianco): sono
   disegnate e basta, non prenotano. Una riga nera sopra ogni accesa le divide, e una sotto l'ultima di
   ogni fila chiude: senza, due mezz'ore accese di fila sarebbero una striscia unica e non si capirebbe
   quale ora si tocca. */
.tabellone--sposta .tab-libero,
.tabellone--sposta .tab-passato {
    border-color: var(--bordo);
    background: var(--bianco);
    color: var(--testo);
}

.tab-pezzo.tab-pezzo--dest {
    background: var(--pallina);
    color: var(--nero);
    font-weight: 700;
    border-top: 1px solid var(--nero);
}
.tab-pezzo.tab-pezzo--fine { border-bottom: 1px solid var(--nero); }

/* La mezz'ora che la domanda dello spostamento sta nominando (T3, 26 ottobre 2026): resta SEGNATA finché la domanda è
   aperta, perché toccare non sposta e chi ha toccato deve poter vedere quale mezz'ora aveva toccato. Una cornice nera
   da 3px dentro la casella (outline-offset negativo, come il fuoco: non esce sulle vicine né viene tagliata da
   overflow: hidden), e z-index sopra le accese accanto. È una forma, non un colore (§7), e lo dice anche il nome
   (aria-label «…, scelta») e la frase della domanda. Nessun colore nuovo. Il fuoco della tastiera, che usa lo stesso
   contorno, coincide: quando la domanda si chiude e il fuoco torna qui, la cornice sparisce e resta il fuoco. */
.tab-pezzo.tab-pezzo--scelta {
    outline: 3px solid var(--nero);
    outline-offset: -3px;
    z-index: 2;
}

/* Il fuoco o Tab portano una mezz'ora in vista senza farla finire sotto la barra dello spostamento: scroll-margin non
   può saperne l'altezza, e questa è una stima. Dal 27 ottobre 2026 è quella della barra CON LA DOMANDA aperta (era quella
   a riposo, 11rem, e Esc o «Scegli un'altra ora» riportavano il fuoco su una mezz'ora ancora coperta): sopra la barra in
   alto e i nomi dei campi (--riga-alta-h più 5rem, come sopra) ci stanno 13rem di barra, cioè 195px. MISURATO con Chrome sul
   markup vero della barra e dell'intestazione (pagina statica, iframe della larghezza vera): con la domanda aperta il blocco
   fermo, barra in alto compresa, è ~294px a 360 e fino a 370 (la frase della domanda va su 5 righe; i nomi dei campi non ci
   sono: .tab-testata--domanda), ~274 da 375 in su (4 righe), ~297 fra 740 e 900 e ~286 al computer (1280, coi nomi). Un
   indirizzo email lungo porta la domanda a 6 righe e il blocco a ~314. La stima, 52 + 75 + 195 = 322, sta sopra tutte: era 12rem
   (307) fino al 27 ottobre, sotto il caso delle 6 righe. Una stima per eccesso non fa male: il browser scorre di qualche riga
   in più. Vale solo mentre si sposta. */
.tabellone--sposta .tab-blocco,
.tabellone--sposta .tab-pezzo {
    scroll-margin-block-start: calc(var(--riga-alta-h) + 5rem + 13rem);
}

/* ── Colonne strette: l'intestazione è il pulsante, col segno + ────────────────────────
   Sotto i 1180px di larghezza (misurato: a 1280 la frase intera e «Prenota» stanno nella
   colonna, 379px; a 800 ne restano 217 e la frase andava su tre righe, con «Prenota» sotto,
   e l'intestazione sticky mangiava 118px di schermo) l'intestazione prende la forma del
   telefono: nome, «senza fari», la frase corta, e tutta la cella è il pulsante che prenota.
   La frase intera — con la prima ora libera — resta nel nome accessibile. */
@media (max-width: 1179px) {
    .tab-testa { display: block; min-height: 64px; padding-bottom: 5px; }
    .tab-testa-testo { padding: 5px 6px; min-height: 58px; }

    .tab-nome-campo { display: block; min-height: 30px; }
    .tab-nome-campo strong { display: block; font-size: 0.9rem; line-height: 17px; }
    .tab-nome-campo .senza-luce { display: block; font-size: 0.7rem; line-height: 13px; }

    .tab-frase { font-size: 0.8rem; line-height: 15px; }
    .tab-frase-intera { display: none; }
    .tab-frase-breve { display: inline; }

    /* «al buio dalle 17:30» → «al buio 17:30»: sotto i 1180px l'etichetta resta larga come l'orario che le sta sopra
       (misurato: 66,6px contro 71,4), e non toglie posto al nome. */
    .tab-buio-dalle { display: none; }

    /* L'intestazione È il pulsante: lo stesso pulsante di «Prenota», steso su tutta la cella
       e senza forma, con il + in alto a destra. La parola resta per chi legge con lo schermo
       (e per il nome accessibile, che è nell'aria-label). */
    .tab-testa .tab-prenota {
        position: absolute;
        inset: 0;
        min-height: 0;
        padding: 0;
        border: 0;
        border-radius: 0;
        background: transparent;
    }
    .tab-testa .tab-prenota:focus-visible { outline-offset: -3px; }

    .tab-prenota-parola {
        position: absolute;
        width: 1px;
        height: 1px;
        overflow: hidden;
        clip-path: inset(50%);
    }

    .tab-prenota-piu { display: block; position: absolute; top: 6px; right: 6px; width: 16px; height: 16px; color: var(--nero); }
    .tab-prenota-piu svg { display: block; width: 16px; height: 16px; stroke-width: 2; }
}

/* ── Sul telefono: da bordo a bordo, le tre colonne strette ────────────────────────── */
@media (max-width: 739px) {
    .tabellone {
        --tab-riga: 28px;
        --tab-ore: 36px;
        --tab-intervallo: 3px;

        /* Il padding di .contenuto, tolto: il tabellone va da un bordo all'altro. */
        margin-inline: -1.25rem;
        padding: 6px 8px 8px;
        border-width: 1px 0;
        border-radius: 0;
    }

    /* Il nome su due righe, cognome sopra e nome sotto, coi puntini se non ci sta. */
    .tab-impegno { display: block; padding: 3px 6px; }
    .tab-nome { overflow: visible; text-overflow: clip; white-space: normal; font-size: 0.8rem; line-height: 14px; }
    .tab-nome > span { display: block; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }

    /* Il tipo solo dove serve a riconoscere il blocco (la lezione, la chiusura); l'orario solo
       dove c'è la terza riga. Il resto è nell'aria-label. */
    .tab-tipo { display: none; font-size: 0.75rem; line-height: 13.5px; }
    .tab-lezione .tab-tipo,
    .tab-chiuso .tab-tipo,
    .tab-spostata .tab-tipo { display: block; }

    .tab-orario { display: none; font-size: 0.75rem; line-height: 13.5px; }
    .tab-lungo .tab-orario { display: block; }

    /* Una mezz'ora sola, 22px di blocco: il nome non ci sta su due righe, e va tutto su una, coi puntini. */
    .tab-impegno.tab-breve { display: flex; align-items: center; }
    .tab-breve .tab-nome { overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
    .tab-breve .tab-nome > span { display: inline; overflow: visible; }

    /* «Al buio» sul telefono (26 ottobre 2026). Il blocco è a colonna sola, e l'etichetta sta sotto il nome: un blocco da
       un'ora è alto 44px dentro, il nome su due righe ne prende 28 e l'etichetta 15 — ci sta. «al buio 17:30» è larga 66,6px
       (misurato, con Inter) in 82px di colonna a 360px.
       ⚠️ La LEZIONE da un'ora è l'unico blocco che non ci sta: nome (28) più «lezione» (13,5) più l'etichetta (15) fanno 56,5
       contro 44. Il nome va su una riga sola, coi puntini — il nome intero è nel nome del blocco e nel pannello — e ne restano
       42,5. Da tre mezz'ore in su (:not(.tab-lungo)) c'è posto per tutto. */
    .tab-coda { display: block; }
    .tab-buio { width: fit-content; }

    .tab-lezione.tab-al-buio:not(.tab-lungo) .tab-nome { overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
    .tab-lezione.tab-al-buio:not(.tab-lungo) .tab-nome > span { display: inline; overflow: visible; }

    /* Su una mezz'ora sola (28px, una riga) il nome e l'etichetta stanno fianco a fianco: l'ora non ci sta, resta «al buio»,
       e il distacco fra i due scende da 12px a 5. L'ora è nel nome e nel title. */
    .tab-breve.tab-al-buio { gap: 5px; }
    .tab-breve .tab-buio-dalle,
    .tab-breve .tab-buio-ora { display: none; }

    .tab-pezzo { gap: 5px; padding: 0 6px; }
    .tab-etichetta { gap: 5px; }
    .tab-intervallo { display: none; }

    .tab-spento { padding: 6px; }
    .tab-spento-titolo,
    .tab-spento-motivo { font-size: 0.75rem; line-height: 14px; }
}

/* La stessa riga dell'impegno, ma da LEGGERE e non da premere: l'anteprima di un
   blocco elenca cosa si chiude e chi si annulla, e nessuna di quelle righe porta
   da qualche parte. Niente cursore a mano, niente hover: se sembra un bottone,
   qualcuno lo preme e non succede niente. */
.riga-esito {
    min-height: var(--h-comando);
    display: flex;
    align-items: center;
    gap: 0.75rem;
    background: var(--sfondo);
    border: 1px solid var(--bordo);
    border-radius: var(--raggio);
    padding: 0.375rem 0.625rem;
    font-size: 0.85rem;
    color: var(--nero);
}
.riga-esito .quando { font-weight: 700; white-space: nowrap; font-variant-numeric: tabular-nums; }
.riga-esito .chi { font-weight: 700; min-width: 0; }
.riga-esito .dettaglio-riga { font-weight: 400; }

/* Le spunte dei campi da chiudere stanno UNA PER RIGA.
   .interruttore e' inline-flex, e in fila i tre campi diventavano una riga sola
   dove il bersaglio da 44px vale in altezza ma non in larghezza: a 375px si
   spunta il campo sbagliato. Qui il blocco prende tutta la riga, e l'etichetta
   «senza fari» resta attaccata al campo di cui parla. */
.scelta-campi-blocco { display: flex; flex-direction: column; }
.scelta-campi-blocco .interruttore { display: flex; }

/* Le tracce in fondo al pannello: chi ha toccato questa prenotazione.
   Piccole e grigie apposta — non servono a chi prenota, servono il giorno che
   qualcuno dice «io non ho toccato niente». Etichetta e valore su due righe,
   perche' «il 3/9 alle 14:20, da Elena Gallo» in un pannello da 300px non ci sta
   accanto a «Annullata». */
.tracce { margin: 0; font-size: 0.78rem; color: var(--testo); }
.tracce > div + div { margin-top: 0.4rem; }
.tracce dt {
    font-weight: 700; color: var(--nero);
    text-transform: uppercase; letter-spacing: 0.05em; font-size: 0.68rem;
}
.tracce dd { margin: 0; font-variant-numeric: tabular-nums; }

/* ── Le schede dei campi ──────────────────────────────────────────────────── */

/* Tre schede affiancate dove ci stanno, impilate dove no. minmax(260px, 1fr) e
   non tre colonne fisse: a 900px diventano due e a 640px una, senza media query
   e senza che nessuna scheda scenda sotto la larghezza in cui i tre comandi in
   fondo stanno ancora in riga. */
.schede-gestione {
    display: grid;
    grid-template-columns: repeat(auto-fit, minmax(260px, 1fr));
    gap: 0.75rem;
}

.scheda-gestione {
    display: flex;
    flex-direction: column;
    gap: 0.6rem;
    background: var(--bianco);
    border: 1px solid var(--bordo);
    border-radius: var(--raggio);

    /* Un filo piu' d'aria dentro: la scheda tiene sette blocchi diversi — nome,
       caratteristiche, prezzi, luce, orari, comandi, nota — e a 0.875rem si
       toccavano tutti. Non e' respiro decorativo, e' separazione. */
    padding: 1.125rem;
}

/* Un campo spento si vede prima di leggerlo, ma NON solo dal colore: accanto al
   nome c'e' la parola «disattivato» (DESIGN.md §7). */
.scheda-gestione.spenta { background: var(--sfondo); }
.scheda-gestione.spenta .prezzi-scheda dd { color: var(--testo); }

/* ── La foto in cima alla scheda di gestione ──────────────────────────────────
   Al vivo, mangiandosi il padding: la scheda ha gia' bordo, raggio e fondo, e una
   foto appoggiata dentro con l'aria intorno sarebbe una superficie dentro una
   superficie (DESIGN.md §3). Il raggio solo sopra, e meno 1px perche' quello
   interno di una scatola con 1px di bordo e' l'esterno meno il bordo — altrimenti
   resta un filo di bianco negli angoli alti.

   ⚠️ ALTEZZA FISSA, non un rapporto. In prima pagina la foto e' 3:2 perche' li' e'
   la vetrina; qui e' un contrassegno, e cio' che conta e' che tutte le schede
   abbiano lo stesso passo qualunque sia la larghezza della colonna. 7rem tiene la
   scheda leggibile per intero senza scorrere, che nel gestionale e' il criterio
   (§0: qui non si respira, si lavora).

   ⚠️ Niente margine sotto: .scheda-gestione e' un flex in colonna con gap 0.6rem,
   che lo mette gia' lui. Aggiungerlo qui lo raddoppierebbe.
   ───────────────────────────────────────────────────────────────────────────── */
.foto-gestione {
    display: block;
    width: calc(100% + 2.25rem);

    /* ⚠️ SENZA QUESTA RIGA IL CALCOLO NON SERVE A NIENTE. Piu' in alto c'e'
       `img, svg, video { max-width: 100% }`, che esiste apposta per impedire lo
       scorrimento orizzontale vietato dal §4: quel tetto vince sul calcolo e la
       foto si ferma alla scatola di contenuto, cioe' 36px prima del bordo destro
       della scheda — misurati, si vedeva. Qui il debordo e' voluto e va dichiarato:
       il margine negativo lo riporta comunque dentro la scheda, quindi la ragione
       per cui quel tetto esiste non viene toccata. */
    max-width: none;
    height: 7rem;
    object-fit: cover;
    margin: -1.125rem -1.125rem 0;
    border-radius: calc(var(--raggio) - 1px) calc(var(--raggio) - 1px) 0 0;
    background: var(--sfondo);
}

/* Un campo disattivato NON e' smorzato: la sua regola cambia solo il fondo, da
   bianco a --sfondo, piu' la parola «disattivato» accanto al nome. E' un segnale
   tenue, e una fotografia a colori pieni sopra ci passa sopra — diventerebbe la
   cosa piu' viva della scheda che deve leggersi come spenta. */
.scheda-gestione.spenta .foto-gestione { opacity: 0.55; }

.capo-scheda { display: flex; align-items: flex-start; justify-content: space-between; gap: 0.5rem; }
/* Il nome del campo e' il titolo della scheda e va letto per primo: prima stava a
   1.05rem, cioe' due decimi sopra il corpo, e in una scheda fatta di sette blocchi
   non emergeva da niente. */
.capo-scheda strong {
    color: var(--nero);
    font-size: 1.15rem;
    font-weight: 700;
    letter-spacing: -0.01em;
}
.ordine-scheda { display: flex; flex: none; }

/* Le caratteristiche: una riga per voce, con la sua icona. Le icone sono nere di
   file e qui vanno appoggiate al testo, non gridate. */
.caratteristiche-scheda { list-style: none; margin: 0; padding: 0; display: flex; flex-direction: column; gap: 0.15rem; }
.caratteristiche-scheda li {
    display: flex; align-items: center; gap: 0.4rem;
    font-size: 0.85rem; color: var(--nero);
}
.caratteristiche-scheda img { opacity: 0.6; flex: none; }

.nota-scheda { margin: 0; font-size: 0.8rem; color: var(--testo); font-style: italic; }

/* I due prezzi, che sono la ragione per cui questa scheda si guarda. */
.prezzi-scheda {
    margin: 0; display: flex; gap: 1.25rem;
    border-top: 1px solid var(--bordo); padding-top: 0.6rem;
}
.prezzi-scheda dt {
    font-size: 0.68rem; text-transform: uppercase; letter-spacing: 0.06em; color: var(--testo);
}
.prezzi-scheda dd {
    margin: 0; font-size: 1.15rem; font-weight: 700; color: var(--nero);
    font-variant-numeric: tabular-nums; letter-spacing: -0.01em;
}

.fatti-scheda { list-style: none; margin: 0; padding: 0; font-size: 0.8rem; color: var(--testo); }
.fatti-scheda li { display: flex; align-items: center; gap: 0.35rem; flex-wrap: wrap; padding: 0.1rem 0; }

/* I tre comandi: stessa larghezza, in fondo, e vanno a capo insieme. */
.comandi-scheda { display: flex; gap: 0.375rem; margin-top: auto; padding-top: 0.4rem; }
.comandi-scheda > * { flex: 1; padding: 0 0.5rem; }

/* Il comando che spegne si distingue senza gridare: e' il bordo a cambiare, non
   il fondo. Il rosso pieno resta al momento della conferma, dove serve. */
.bottone-oggi.pericoloso { border-color: #B3261E; color: #B3261E; }
.bottone-oggi.pericoloso:hover { background: #FDF2F1; }

/* La conferma sta dentro la scheda, non in un modale: si vede di quale campo si
   parla e quante prenotazioni ha, mentre si decide. */
.conferma-scheda {
    margin-top: auto;
    background: var(--sfondo);
    border: 1px solid var(--bordo);
    border-radius: var(--raggio);
    padding: 0.75rem;
}
.conferma-scheda p { margin: 0 0 0.6rem; font-size: 0.82rem; color: var(--nero); }

/* ⚠️ UN INDIRIZZO LUNGO VA A CAPO (22 ottobre 2026). La domanda di «Annulla prenotazione» scrive l'email del
   cliente dentro questo paragrafo, e un indirizzo senza trattini non ha un punto dove spezzarsi: a 360px, uno
   da 63 caratteri usciva dal riquadro e il corpo della finestra (overflow-y: auto, quindi anche overflow-x)
   scorreva di lato. Il resto del gestionale lo fa già dove compare un indirizzo (.recapito-cliente,
   .dettaglio-riga). Le frasi corte non cambiano. */
.conferma-scheda p { overflow-wrap: anywhere; }
.conferma-scheda .comandi-scheda { margin-top: 0; padding-top: 0; }

/* ── La finestra della scheda del campo ───────────────────────────────────── */

/* Stessa famiglia del foglio «Altro»: stesso velo, stessa ombra, stesso raggio
   grande. Un secondo modo di coprire lo schermo sarebbe un secondo linguaggio. */
.velo-modale {
    position: fixed;
    inset: 0;
    z-index: 60;
    background: rgb(7 4 0 / 35%);
}

/* Il fondo NON scorre dietro la finestra, e si ottiene senza una riga di
   JavaScript: :has() guarda se il velo e' a schermo. E' il modo in cui lo fa il
   booking engine, ed e' l'unica cosa di quel modale che si porta di peso. */
body:has(.velo-modale) { overflow: hidden; }

/* ⚠️ SI CENTRA CON inset + margin: auto, NON con transform, e la ragione non e'
   estetica: UN ANTENATO TRASFORMATO DIVENTA IL RIFERIMENTO DEI position: fixed CHE
   STANNO DENTRO DI LUI. Con translate(-50%,-50%) qui sopra, il velo del quadrante —
   fixed, inset 0 — copriva 558px invece dello schermo, cioe' esattamente la
   finestra, e toccare fuori dal modale finiva sul velo DEL MODALE: si chiudeva la
   scheda buttando via le modifiche invece di chiudere l'orologio.

   inset + margin: auto centra su tutti e due gli assi senza trasformare niente, e
   ogni fixed dentro la finestra torna a parlare con lo schermo. */
.finestra {
    position: fixed;
    z-index: 61;
    inset: 0;
    margin: auto;
    height: fit-content;
    width: min(560px, calc(100vw - 2 * var(--barra-margine)));
    max-height: min(85vh, calc(100vh - 2 * var(--barra-margine)));

    display: flex;
    flex-direction: column;

    background: var(--bianco);
    border: 1px solid var(--bordo);
    border-radius: 18px;
    box-shadow: var(--ombra);
    overflow: hidden;
}

/* La finestra riceve il fuoco all'apertura: senza questo si vedrebbe il contorno
   nero su tutto il riquadro, che non e' un bersaglio da premere. I contorni dei
   comandi DENTRO restano intatti (DESIGN.md §5). */
.finestra:focus { outline: none; }

.capo-finestra {
    flex: none;
    display: flex; align-items: center; justify-content: space-between; gap: 0.75rem;
    padding: 0.875rem 1rem;
    border-bottom: 1px solid var(--bordo);
}
.capo-finestra strong { color: var(--nero); font-size: 1.05rem; }

/* Nella testata della finestra il chiudi sta in una riga flex, non in un angolo.
   Il posizionamento assoluto lo eredita dal pannello del calendario, e li' i suoi
   -0.25rem lo spingevano FUORI dalla finestra: .capo-finestra non e' position:
   relative, quindi si ancorava a .finestra. Risultato, 4px di scorrimento
   orizzontale dentro un dialogo, misurati a 375px. */
.capo-finestra .chiudi-pannello {
    position: static;
    flex: none;
}

/* Il corpo scorre, testata e piede no: la scheda e' lunga e Salva deve restare
   raggiungibile senza arrivare in fondo. */
.corpo-finestra {
    flex: 1;
    min-height: 0;
    overflow-y: auto;
    padding: 1rem;
}

.piede-finestra {
    flex: none;
    display: flex; gap: 0.5rem;
    padding: 0.75rem 1rem;
    border-top: 1px solid var(--bordo);
    background: var(--bianco);
}
.piede-finestra > * { flex: 1; }

/* L'AVVISO DENTRO LA FINESTRA: sopra il piede, fuori dal corpo che scorre, quindi in
   vista qualunque sia lo scorrimento. La fascia di pagina non poteva servire — sta in
   cima alla schermata, e con la finestra aperta finisce sotto il velo. Dentro
   .piede-finestra nemmeno: e' flex con > * { flex: 1 }, e il messaggio sarebbe
   diventato la terza colonna accanto a Salva e Annulla. */
.avviso-finestra {
    flex: none;
    margin: 0;
    border-radius: 0;
    border-top: 1px solid var(--bordo);
}

/* Sul telefono la finestra si appoggia in basso e prende tutta la larghezza: e'
   dove arriva il pollice, ed e' la stessa scelta del foglio «Altro». */
@media (max-width: 640px) {
    .finestra {
        top: auto; left: var(--barra-margine); right: var(--barra-margine);
        bottom: calc(var(--barra-h) + var(--barra-margine) * 2);
        /* margin: 0, altrimenti l'auto ereditato litiga con il bottom fissato qui. */
        margin: 0;
        width: auto;
        max-height: 75vh;
    }
}

/* Le ore libere, quando si apre un campo. Pillole grandi: si toccano col
   pollice, cosa che una casella di griglia non permetteva. */
/* ── Le mezz'ore da toccare, dentro la finestra ────────────────────────────────
   Stavano sotto «Prenota su Campo 1», dove il pannello che apriva le schiacciava a
   zero. Adesso stanno DENTRO la finestra, in due file: gli inizi e le fini.

   84px di base e 56 di altezza: si toccano col pollice, cosa che una casella di
   griglia larga dieci pixel non permetteva. */
.ore-libere {
    display: grid;
    grid-template-columns: repeat(auto-fill, minmax(84px, 1fr));
    gap: 0.5rem;
    margin-bottom: 1rem;
}

.ora-pillola {
    min-height: 56px;
    border: 1px solid var(--libero-bordo);
    background: var(--libero);
    border-radius: var(--raggio);
    color: var(--nero);
    font-family: inherit;
    font-size: 0.95rem;
    font-weight: 700;
    display: flex;
    flex-direction: column;
    align-items: center;
    justify-content: center;
    gap: 0.125rem;
    cursor: pointer;
}
.ora-pillola:hover { filter: brightness(0.97); }
.ora-pillola small {
    font-size: 0.7rem; font-weight: 400; color: var(--testo);
    max-width: 100%; overflow: hidden; text-overflow: ellipsis; white-space: nowrap;
}

/* ⚠️ LE OCCUPATE SI VEDONO, e non si toccano. Toglierle dalla fila darebbe una
   giornata fatta solo di buchi, senza il verso di quello che c'e' in mezzo: «alle 19
   c'e' Rossi» e' un'informazione, e la segreteria risponde al telefono con quella.
   Il grigio e il disabled dicono la stessa cosa due volte, come vuole DESIGN.md §7:
   il colore non e' mai l'unica informazione, c'e' anche il nome sotto. */
.ora-pillola--presa {
    border-color: var(--bordo);
    /* --sabbia: la stessa tinta con cui il tabellone (e il nastro della settimana)
       dice «occupato» nella stessa schermata. Un secondo grigio per la stessa cosa
       sarebbe una seconda parola per dirla. */
    background: var(--sabbia);
    color: var(--testo);
    cursor: not-allowed;
}
.ora-pillola--presa:hover { filter: none; }

/* Al buio: la tinta che il tabellone e il nastro usano per «non prenotabile», che non è
   la stessa di «occupato». Nessun nome sotto — non c'è nessuno: è il campo che ha finito la luce. */
.ora-pillola--buio {
    border-color: var(--bordo);
    background: var(--spento);
    color: var(--testo);
    cursor: not-allowed;
}
.ora-pillola--buio:hover { filter: none; }

/* L'ora scelta: nera piena, come i comandi principali del gestionale. */
.ora-pillola--scelta {
    background: var(--nero);
    border-color: var(--nero);
    color: var(--bianco);
}
.ora-pillola--scelta small { color: var(--bianco); }

/* ── L'ora d'inizio quando la fila è chiusa ───────────────────────────────────
   È la stessa pastiglia nera di prima — .ora-pillola.ora-pillola--scelta — e non
   una forma nuova: cambia solo che è rimasta sola e porta la matita. Se cambiasse
   aspetto, chi ha appena scelto si chiederebbe dove è finita la sua scelta.

   ⚠️ NON è dentro .ore-libere, quindi la griglia non la dimensiona: senza una
   larghezza propria si stirerebbe per tutta la finestra e sembrerebbe una barra,
   non un'ora. Larga quanto le pastiglie della griglia (84px, il minmax di
   .ore-libere) più lo spazio della matita, e il margine sotto è quello che dava la
   griglia — toglierlo incollerebbe «Alle» all'ora scelta.

   ⚠️ ANCHE «ALLE» SI CHIUDE COSÌ (28 ottobre 2026, passo 5 di docs/CHI-GIOCA-PIANO.md):
   scelta la fine resta «Fino alle 14:30», la durata sotto e la matita. È la stessa
   pastiglia — stessa forma, stesso nero, stesse due righe — e divide queste regole
   (.ora-fine-sola) invece di ricopiarle, ma ha una classe a sé: «la pastiglia chiusa di
   Dalle» deve restare una sola per chi la cerca, prove comprese. Le due righe interne
   (.ora-scelta-sola__ora, la matita) sono le stesse. Nessun colore, ombra o raggio nuovo.

   max-width: 100%: «Fino alle 14:30» è più lunga di «14:30», e nella finestra da 296px
   una pastiglia che sfora la colonna sarebbe uno scorrimento di lato (DESIGN.md §4).
   ───────────────────────────────────────────────────────────────────────────── */
.ora-scelta-sola,
.ora-fine-sola {
    width: fit-content;
    max-width: 100%;
    min-width: 84px;
    padding: 0 0.9rem;
    margin-bottom: 1rem;
}

/* L'ora e la matita sulla stessa riga, la matita staccata dalle cifre quel tanto
   che basta a non sembrare un accento. */
.ora-scelta-sola__ora {
    display: inline-flex;
    align-items: center;
    gap: 0.5rem;
}

/* 16px come le altre icone in linea del gestionale. currentColor la porta bianca
   sul nero della pastiglia senza una riga di colore in più. */
.ora-scelta-sola__matita svg {
    width: 16px;
    height: 16px;
    display: block;

    /* ⚠️ Un filo più sottile delle icone del menu, non per gusto: quelle stanno su
       24px, questa è rimpicciolita a 16 e a parità di stroke-width il tratto
       ingrassa di un terzo. A 1.75 la matita qui sembrava un pennarello. */
    stroke-width: 1.5;
}

/* Dentro la fascia scelta ma non l'inizio: si vede che fanno parte della stessa
   partita senza gridare quanto l'inizio. */
.ora-pillola--dentro {
    border-color: var(--nero);
    background: var(--bianco);
}

/* Il colore non è mai l'unica informazione (DESIGN.md §7): il nastro va spiegato,
   perché lì dentro la parola non ci sta. */
.legenda-nastro {
    display: flex; flex-wrap: wrap; gap: 0.75rem;
    margin: 0.75rem 0 0; font-size: 0.75rem; color: var(--testo);
}
.legenda-nastro span { display: inline-flex; align-items: center; gap: 0.3rem; }
.legenda-nastro i {
    width: 14px; height: 14px; border-radius: 4px;
    display: inline-block; border: 1px solid var(--bordo);
}

/* ── La scheda del campo: caratteristiche e icone ─────────────────────────── */

/* Un pulsante che non chiama all'azione principale: il salvataggio resta uno
   solo, giallo pallina, in fondo. Questo aggiunge una riga a un elenco. */
.pulsante-tenue {
    width: 100%;
    min-height: var(--h-azione);
    background: var(--bianco);
    color: var(--nero);
    border: 1px dashed var(--sabbia);
    border-radius: var(--pillola);
    padding: 0.7rem;
    font-family: inherit;
    font-weight: 700;
    font-size: 0.95rem;
    cursor: pointer;
}

.pulsante-tenue:hover { background: var(--sfondo); }

.riga-caratteristica {
    display: flex;
    align-items: center;
    gap: 0.35rem;
    margin-bottom: 0.5rem;
}

/* 44px come i bottoni d'ordine accanto: DESIGN.md §5, il bersaglio minimo per un
   dito. Sotto quella misura si sbaglia riga, e qui sbagliare riga vuol dire
   cambiare l'icona di un'altra voce. */
.scelta-icona {
    width: 44px;
    min-width: 44px;
    height: 44px;
    background: var(--bianco);
    border: 1px solid var(--bordo);
    border-radius: 8px;
    display: flex;
    align-items: center;
    justify-content: center;
    font-size: 1.2rem;
    color: var(--testo);
    cursor: pointer;
}

.scelta-icona img { width: 22px; height: 22px; opacity: 0.75; }

/* Il testo prende tutto lo spazio che avanza: è la parte che si legge. */
/* ⚠️ ERA NUDO, e il confronto col kit l'ha fatto emergere: aveva solo flex e
   min-width, quindi lo vestiva il browser — corpo ~13px e altezza ~21px, cioè
   fuori da tutte e due le soglie del progetto (16px del §2, 44px del §4). Su
   iPhone toccarlo faceva zoomare la pagina, che poi restava zoomata.

   44 e non 48: sta in riga con .scelta-icona e tre .bottone-ordine, tutti 44×44
   (.riga-caratteristica ha align-items: center). A 48 sarebbe l'unico più alto. */
.testo-caratteristica {
    flex: 1;
    min-width: 0;
    min-height: var(--h-comando);
    padding: 0.5rem;
    border: 1px solid var(--grigio);
    border-radius: var(--raggio);
    font-family: inherit;
    font-size: 16px;
    background: var(--bianco);
    box-sizing: border-box;
}

/* L'elenco delle icone si apre SOTTO la riga a cui appartiene, non in un
   dialogo: così si vede insieme alla voce che si sta scrivendo. */
.scelta-icone {
    display: grid;
    grid-template-columns: repeat(auto-fill, minmax(44px, 1fr));
    gap: 0.25rem;
    padding: 0.5rem;
    margin: 0 0 0.75rem;
    background: var(--sfondo);
    border: 1px solid var(--bordo);
    border-radius: var(--raggio);
    max-height: 240px;
    overflow-y: auto;
}

.icona-scelta {
    aspect-ratio: 1;
    background: var(--bianco);
    border: 1px solid var(--bordo);
    border-radius: 8px;
    display: flex;
    align-items: center;
    justify-content: center;
    color: var(--testo);
    cursor: pointer;
}

.icona-scelta img { width: 24px; height: 24px; opacity: 0.75; }

/* Scelta: il bordo, non solo il colore — DESIGN.md §7. Due pixel di NERO si vedono anche
   in bianco e nero e anche a chi il colore non lo distingue; erano arancio, e in giallo
   pallina sul bianco (1,42:1) non si sarebbero visti. Il fondo è la pallina: la scelta
   fatta, come la voce attiva della barra. */
.icona-scelta.scelta {
    border: 2px solid var(--nero);
    background: var(--pallina);
}

.icona-scelta.scelta img { opacity: 1; }

/* Spento: la scelta non conta finché non si sceglie «A ore intere». Il colore da solo
   non basta (DESIGN.md §5): il cursore dice la stessa cosa. */
.bottone-vista:disabled, .bottone-campo:disabled { opacity: 0.55; cursor: not-allowed; }

/* ══ CLIENTI, RIDISEGNATA IL 7 OTTOBRE 2026 ══════════════════════════════════════
   Le tavole G «Gestionale · Clienti», scelte dal committente il 7 ottobre 2026
   (docs/PIANO.md, «Grafica nuova, ispirata al kit Courtly»): la scheda in una finestra
   con le risposte in cima, le righe compatte sul telefono, la ricerca con la lente.

   SOLO TOKEN CHE C'ERANO: nessun colore, ombra o raggio nuovo. Dove la tavola usa una
   misura a mano, la misura è la sua; dove usa un valore del foglio, è il token.
   ═══════════════════════════════════════════════════════════════════════════════ */

/* Un <a> vestito da pulsante: il telefono da toccare nella scheda di un cliente.
   È LA STESSA REGOLA che il piano delle fisse (docs/FISSE-PIANO-TECNICO.md §14) chiede
   per «Apri la fissa» e «Chiama»: arrivata prima con Clienti, quel passo la trova già
   qui e non la riscrive. Il colore lo danno .bottone-oggi e .pulsante-tenue (nero):
   senza quelle classi un <a> prenderebbe il blu del browser, che nella palette non c'è. */
a.bottone-oggi,
a.pulsante-tenue {
    display: inline-flex;
    align-items: center;
    justify-content: center;
    text-decoration: none;
}

/* ── La testata: titolo, ricerca, pista, «+ Nuova fissa» ─────────────────────────
   UNA GRIGLIA E NON DUE MARKUP. Sul computer il titolo sta da solo e sotto c'è la
   riga dei comandi, col comando di creazione in fondo; sul telefono sale ACCANTO al
   titolo, e ricerca e pista prendono una riga intera ciascuna. Le aree spostano lo
   stesso bottone: renderlo due volte vorrebbe dire due fermate del Tab.

   ⚠️ Clienti il comando di creazione non ce l'ha più dal 21 ottobre 2026: i clienti sono
   ricavati dalle prenotazioni, non si creano («+ Nuovo cliente» è caduto, con Modifica e
   Unisci). L'area «nuovo» resta vuota, e la testata è quella di prima senza il bottone.

   ⚠️ La nota del filtro NON ha un'area sua: un'area vuota resta una riga alta zero
   con il suo spazio sopra, e la testata sarebbe più bassa di 0,75rem solo quando il
   filtro è spento. Va a capo da sé, su tutta la larghezza, solo quando c'è.

   LA STESSA TESTATA DELLE FISSE (.testata-fisse, «+ Nuova fissa»), dal 20 ottobre 2026:
   l'elenco delle fisse è la variante A1 «Come Clienti», scelta dal committente il 6
   ottobre 2026. Selettori aggiunti a queste regole, non una copia accanto: due testate
   uguali scritte due volte divergono alla prima misura cambiata in una sola. */
.testata-clienti,
.testata-fisse {
    display: grid;
    grid-template-columns: minmax(10rem, 26rem) auto auto;
    grid-template-areas:
        "titolo titolo titolo"
        "cerca  pista  nuovo";
    justify-content: start;
    align-items: center;
    gap: 0.75rem 1rem;
}

.testata-clienti > h1, .testata-fisse > h1 { grid-area: titolo; margin: 0; }
.testata-clienti > .cerca, .testata-fisse > .cerca { grid-area: cerca; }
.testata-clienti > .scelta-vista, .testata-fisse > .scelta-vista { grid-area: pista; justify-self: start; }
.testata-fisse > .nuova-fissa { grid-area: nuovo; justify-self: start; white-space: nowrap; }
.testata-clienti > .nota-filtro { grid-column: 1 / -1; margin: 0; }

/* LA RICERCA, una pillola con la lente dentro a sinistra.
   Alta 44 e non 48 (--h-campo): sta IN RIGA con la pista, che è un comando da 44, e
   sarebbe l'unica più alta (DESIGN.md §4).
   16px SCRITTI e non 1rem — qui la radice è 15px, e sotto i 16 iOS zooma al tocco e la
   pagina resta zoomata (DESIGN.md §2).
   Il bordo --sabbia (1,61:1) è quello di .bottone-oggi, e regge per la stessa ragione:
   non è l'unico segnale — dentro ci sono la lente e la frase d'esempio, a 5,02:1. */
.cerca {
    position: relative;
    min-width: 0;
}

.cerca svg {
    position: absolute;
    left: 1rem;
    top: 50%;
    width: 18px;
    height: 18px;
    margin-top: -9px;
    color: var(--testo);
    pointer-events: none;   /* è disegno: il tocco va alla casella sotto */
}

.cerca input {
    display: block;
    width: 100%;
    min-height: var(--h-comando);
    padding: 0.5rem 1.1rem 0.5rem 2.75rem;
    border: 1px solid var(--sabbia);
    border-radius: var(--pillola);
    background: var(--bianco);
    color: var(--nero);
    font-size: 16px;
    font-variant-numeric: tabular-nums;
    -webkit-appearance: none;
    appearance: none;
}

/* opacity: 1 per Firefox, che di suo sbiadisce la frase d'esempio al 54% e la porta
   sotto i 4,5:1. --testo su bianco sta a 5,02. */
.cerca input::placeholder { color: var(--testo); opacity: 1; }

/* La soglia è quella della testata del Calendario (739px, .solo-telefono): sotto, la
   riga dei comandi non ci sta più con la ricerca ancora larga abbastanza. */
@media (max-width: 739px) {
    .testata-clienti,
    .testata-fisse {
        grid-template-columns: minmax(0, 1fr) auto;
        grid-template-areas:
            "titolo nuovo"
            "cerca  cerca"
            "pista  pista";
        row-gap: 0.5rem;
    }

    /* Lo stacco sotto il titolo resta 0,75rem, come prima: fra ricerca e pista basta mezzo. */
    .testata-clienti > h1, .testata-fisse > h1 { margin-bottom: 0.25rem; }
    .testata-fisse > .nuova-fissa { justify-self: end; margin-bottom: 0.25rem; }

    /* La pista a tutta larghezza, con le due scelte larghe uguali: sul telefono stretta a
       sinistra lasciava un vuoto sopra un elenco che la larghezza la prende tutta. È la
       stessa scelta della pista dei campi nel Calendario (17 settembre 2026). */
    .testata-clienti > .scelta-vista,
    .testata-fisse > .scelta-vista { justify-self: stretch; display: flex; }

    .testata-clienti > .scelta-vista .bottone-vista,
    .testata-fisse > .scelta-vista .bottone-vista {
        flex: 1 1 0;
        min-width: 0;
        padding-inline: 0.5rem;
    }
}

/* ── L'elenco sul computer: la tabella ───────────────────────────────────────────
   ⚠️ .elenco-clienti, NON .tabella-clienti: quella la usavano anche Accessi e Maestri,
   che sotto i 640px facevano della riga una scheda con le etichette, mentre questa
   diventa una riga-bottone, e cambiare l'altra avrebbe cambiato tre pagine. Dal 29
   ottobre 2026 .tabella-clienti non c'è più: Accessi usa questa stessa tabella, e
   Maestri ha la sua (.elenco-maestri, in fondo al foglio).

   Le larghezze sono quelle della tavola. nowrap sulle colonne di numeri e date, non sul
   nome: un'email lunga va a capo nella sua cella invece di allargare la tabella. */
table.elenco.elenco-clienti td { padding-top: 0.375rem; padding-bottom: 0.375rem; }

.elenco-clienti td:not(:first-child) { white-space: nowrap; }

.elenco-clienti .colonna-nome { width: 34%; }
.elenco-clienti .colonna-telefono { width: 17%; }
.elenco-clienti .colonna-partite { width: 9%; }
.elenco-clienti .colonna-data { width: 20%; }

.elenco-clienti .cella-numero { text-align: right; }

/* Le date si staccano dai numeri: senza, «23» di Partite e «04/10/2026» di Ultima si
   leggerebbero come una cifra sola. */
.elenco-clienti .cella-data { padding-left: 2.5rem; }

/* Il bottone porta nome ED email, uno sotto l'altro: tutta la cella si preme. La
   sottolineatura sta solo sul nome — sull'email direbbe che è un secondo collegamento.
   Lo stesso bottone nell'elenco delle fisse (.tabella-fisse), col nome della fissa e,
   sotto, di chi è: più giù, «Fisse». */
.elenco-clienti .collegamento-riga,
.tabella-fisse .collegamento-riga {
    display: flex;
    flex-direction: column;
    justify-content: center;
    align-items: flex-start;
    width: 100%;
    padding: 0.25rem 0;
    text-decoration: none;
}

.elenco-clienti .nome-riga,
.tabella-fisse .nome-riga { text-decoration: underline; text-underline-offset: 3px; }

.elenco-clienti .collegamento-riga .dettaglio-riga,
.tabella-fisse .collegamento-riga .dettaglio-riga { font-weight: 400; overflow-wrap: anywhere; }

/* Il riassunto e la freccia sono del telefono. display: none li toglie anche dal nome
   accessibile del bottone: sul computer un lettore di schermo sente nome ed email, non
   il riassunto delle colonne che ha già accanto. Nelle fisse il riassunto è il primo
   orario e le etichette: sul computer stanno nelle loro colonne. */
.elenco-clienti .riassunto-riga,
.elenco-clienti .freccia,
.tabella-fisse .orari-riga,
.tabella-fisse .collegamento-riga .etichette-fissa,
.tabella-fisse .freccia { display: none; }

/* ── L'elenco sul telefono: righe-bottone su due righe ───────────────────────────
   La STESSA tabella, con le colonne nascoste: sopra il nome, sotto «347 000 1048 ·
   8 partite · ultima 30/09», a destra la freccia. È la riga della settimana del
   Calendario (.riga-giorno), con le sue misure: un componente che si conosce già.

   Bianche su --sfondo, col bordo --bordo: il bordo da solo sta a 1,30:1, ma non è lui a
   dire che si preme — lo dicono la freccia e la riga intera che risponde al tocco. */
@media (max-width: 640px) {
    /* ⚠️ Il contenitore della griglia scorre di lato (overflow-x: auto), e chi scorre
       taglia ciò che esce: il contorno del fuoco, 3px più 2 di stacco, sparirebbe ai due
       lati di righe larghe quanto lo schermo. Qui non scorre niente, quindi si apre. */
    .contenitore-clienti { overflow: visible; }

    table.elenco.elenco-clienti,
    table.elenco.elenco-clienti tbody,
    table.elenco.elenco-clienti tr,
    table.elenco.elenco-clienti td { display: block; width: auto; }

    table.elenco.elenco-clienti {
        background: none;
        border: 0;
        border-radius: 0;
        overflow: visible;
    }

    table.elenco.elenco-clienti thead { display: none; }

    table.elenco.elenco-clienti tbody {
        display: flex;
        flex-direction: column;
        gap: 0.375rem;
    }

    table.elenco.elenco-clienti tbody tr:hover { background: none; }
    table.elenco.elenco-clienti td { padding: 0; border: 0; }
    table.elenco.elenco-clienti td:not(:first-child) { display: none; }

    .elenco-clienti .collegamento-riga {
        display: grid;
        grid-template-columns: minmax(0, 1fr) auto;
        column-gap: 0.5rem;
        row-gap: 0.125rem;
        align-items: center;
        padding: 0.5rem 0.75rem;
        background: var(--bianco);
        border: 1px solid var(--bordo);
        border-radius: var(--raggio);
        font-weight: 400;
    }

    .elenco-clienti .collegamento-riga:hover { filter: brightness(0.97); }

    .elenco-clienti .nome-riga {
        grid-column: 1;
        grid-row: 1;
        min-width: 0;
        font-size: 0.95rem;
        font-weight: 700;
        text-decoration: none;
        overflow-wrap: anywhere;
    }

    .elenco-clienti .collegamento-riga .dettaglio-riga { display: none; }

    /* Un riassunto, e la scheda dice il resto: una riga quando ci sta, due quando no, con i puntini solo
       dopo la seconda. 0,8rem = 12px, sopra il minimo di 0,7rem (DESIGN.md §2); --testo su bianco, 5,02:1.

       ⚠️ NON PIÙ UNA RIGA SOLA CON I PUNTINI (22 ottobre 2026). A 360px restano ~276px per un testo che con
       tutto dentro misura 355-390 («347 000 1048 · 8 partite · da incassare 40,00 € · ultima 30/09»): il
       taglio cadeva dentro «da incassare», cioè proprio sulla cifra per cui la riga si apre. La frase mette
       «da incassare» prima di «ultima» (ClientiInFrasi.Riassunto) e il foglio lascia andare a capo: anche a
       320px, dove nemmeno questo basta, a mancare è il fondo della seconda riga. -webkit-line-clamp è il
       modo che hanno tutti i browser di limitare le righe (la proprietà senza prefisso segue). */
    .elenco-clienti .riassunto-riga {
        display: -webkit-box;
        -webkit-box-orient: vertical;
        -webkit-line-clamp: 2;
        line-clamp: 2;
        grid-column: 1;
        grid-row: 2;
        min-width: 0;
        overflow: hidden;
        font-size: 0.8rem;
        color: var(--testo);
        font-variant-numeric: tabular-nums;
        overflow-wrap: anywhere;
    }

    .elenco-clienti .freccia {
        display: block;
        grid-column: 2;
        grid-row: 1 / span 2;
        width: 20px;
        height: 20px;
        color: var(--testo);
    }

    .elenco-clienti .freccia svg { width: 20px; height: 20px; }
}

/* ── La finestra della scheda ────────────────────────────────────────────────────
   La .finestra di Campi e del Calendario, così com'è. Qui solo ciò che le manca: un
   titolo vero (un <h2>, non uno <strong>) e la croce disegnata invece del glifo. */
.capo-finestra h2 {
    margin: 0;
    min-width: 0;
    font-size: 1.05rem;
    line-height: 1.3;
    color: var(--nero);
    overflow-wrap: anywhere;
}

.capo-finestra .chiudi-pannello svg { width: 18px; height: 18px; margin: auto; }

/* Spenta mentre si salva: il colore da solo non basta (DESIGN.md §5), lo dice anche
   il cursore — come .bottone-oggi:disabled. */
.chiudi-pannello:disabled { opacity: 0.45; cursor: default; }

/* Come i campi del modulo: la frase d'esempio della ricerca «Unisci» a 5,02:1, non al
   grigio chiaro che ogni browser sceglie per conto suo. */
.finestra-cliente input::placeholder { color: var(--testo); opacity: 1; }

/* ── Le risposte in cima: telefono, email ────────────────────────────────────────
   Il telefono è un pulsante da toccare — sul telefono della segreteria chiama —, l'email
   si legge. Vanno a capo una sotto l'altro quando non ci stanno insieme. */
.contatti-cliente {
    display: flex;
    flex-wrap: wrap;
    align-items: center;
    gap: 0.5rem 1.25rem;
}

.contatti-cliente svg { width: 18px; height: 18px; flex: none; }

.contatti-cliente .chiama {
    gap: 0.5rem;
    padding-inline: 1rem 1.25rem;
    font-size: 1rem;
    font-weight: 700;
    font-variant-numeric: tabular-nums;
}

/* Un recapito da leggere: nero, perché è il dato; l'icona in --testo, perché lo
   accompagna. overflow-wrap per un indirizzo più largo della finestra. */
.recapito-cliente {
    display: inline-flex;
    align-items: center;
    gap: 0.5rem;
    min-width: 0;
    font-size: 0.95rem;
    color: var(--nero);
    overflow-wrap: anywhere;
}

.recapito-cliente svg { color: var(--testo); }

/* «Senza telefono» non è un valore: si scrive col colore del contorno, come i recapiti
   vuoti della pagina Circolo. */
.recapito-cliente.vuoto { color: var(--testo); }

/* ── I numeri grandi: partite · ultima · prossima · da incassare ─────────────────
   Il tratto del kit — numeri grandi, etichette sussurrate — senza la striscia colorata
   del kit: una striscia tinta dentro la finestra sarebbe una superficie dentro una
   superficie (DESIGN.md §3). Si separano con lo spazio.

   L'etichetta sta SOTTO il numero a schermo e PRIMA nel codice (column-reverse): un
   lettore di schermo dice «partite, 12», chi guarda trova prima il 12.

   ⚠️ I PREZZI HANNO SEMPRE I CENTESIMI, anche qui: «40,00 €» e mai «40 €» (decisione
   del committente del 7 ottobre 2026). Dove non ci stanno si rimpicciolisce la cifra:
   sul telefono scende a 1,35rem, non perde i decimali. */
.numeri-cliente {
    display: flex;
    flex-wrap: wrap;
    gap: 0.75rem 2.25rem;
    margin: 1.25rem 0 0;
}

.numeri-cliente:first-child { margin-top: 0; }

.numeri-cliente > div { display: flex; flex-direction: column-reverse; }

.numeri-cliente dt { margin-top: 0.125rem; font-size: 0.8rem; color: var(--testo); }

.numeri-cliente dd {
    margin: 0;
    font-size: 1.6rem;
    font-weight: 700;
    line-height: 1.1;
    letter-spacing: -0.02em;
    color: var(--nero);
    font-variant-numeric: tabular-nums;
    white-space: nowrap;
}

/* L'unità piccola accanto alla cifra grande: si legge la cifra, l'euro la qualifica. */
.numeri-cliente .unita {
    margin-left: 0.2rem;
    font-size: 0.95rem;
    letter-spacing: 0;
    color: var(--testo);
}

/* ── Le sezioni della scheda ─────────────────────────────────────────────────────
   Separate da una riga, non da scatole (DESIGN.md §3): Prossime, Passate, Dati e i
   comandi in fondo. La prima — su un cliente nuovo è il modulo — non ha la riga sopra. */
.sezione-scheda {
    margin-top: 1rem;
    padding-top: 1rem;
    border-top: 1px solid var(--bordo);
}

.sezione-scheda:first-child { margin-top: 0; padding-top: 0; border-top: 0; }

.sezione-scheda > .titolo-sezione,
.sezione-scheda > section > .titolo-sezione { margin-bottom: 0.25rem; }

.sezione-scheda > .capo-regola { margin-bottom: 0; }

/* Gli esiti dentro una sezione: lo stacco di una riga, non il metro della pagina. */
.sezione-scheda .avviso-salvato { margin: 0.5rem 0; }
.sezione-scheda > .avviso-salvato:first-child { margin-top: 0; }

/* ── Lo storico: una riga per partita ────────────────────────────────────────────
   Quando · cosa · parola · importo, in quattro colonne fisse perché righe diverse si
   leggano in colonna: le date sotto le date, le cifre sotto le cifre.

   ⚠️ 9,75rem E NON I 9,25 DELLA TAVOLA: la tavola scrive solo date di quest'anno, ma
   le partite di un altro anno portano l'anno («mer 30/12/25 · 20:30»), e quella data
   in Inter 700 a 0,9rem con le cifre incolonnate misura circa 140–146px — i 138,75 di
   9,25rem la facevano sbordare contro «cosa», che non ha margine a sinistra.
   E «cosa» non scende sotto 5rem: senza un minimo, un'etichetta lunga (il nome di una
   fissa arriva a 80 caratteri) la schiacciava a zero. */
.righe-storico li {
    display: grid;
    /* L'ultima colonna non scende sotto 4,75rem ma cresce con la cifra: «senza prezzo» (una lezione a zero,
       dal 21 ottobre 2026) è più larga di «16,00 €» e con una colonna fissa usciva sopra la vicina. */
    grid-template-columns: 9.75rem minmax(5rem, 1fr) auto minmax(4.75rem, auto);
    align-items: center;
    min-height: 2.5rem;
    padding: 0.375rem 0;
    border-bottom: 1px solid var(--bordo);
    font-size: 0.9rem;
}

.righe-storico li:last-child { border-bottom: none; }

.righe-storico .quando {
    grid-column: 1;
    grid-row: 1;
    font-weight: 700;
    color: var(--nero);
    font-variant-numeric: tabular-nums;
    white-space: nowrap;
}

.righe-storico .cosa {
    grid-column: 2;
    grid-row: 1;
    min-width: 0;
    padding-right: 0.75rem;
    color: var(--testo);
}

.righe-storico .etichetta-stato { grid-column: 3; grid-row: 1; justify-self: end; }

/* ⚠️ NELLO STORICO L'ETICHETTA DI UNA FISSA VA A CAPO, quando non ci sta. Il nome di una
   fissa lo scrive la segreteria e arriva a 80 caratteri: «fissa «Corso adulti principianti
   del martedì sera»» misura circa 330px, e con nowrap — com'è nella tavola, che ha solo
   nomi corti — usciva dalla finestra, sul computer e sul telefono, e il corpo scorreva
   di lato.

   ⚠️ SOLO LEI (22 ottobre 2026), non ogni etichetta dello storico. La regola valeva per
   tutte e sul telefono, dove la colonna dell'etichetta si stringe accanto a «Correggi»,
   spezzava a metà parola «da incassare» («da / incassar / e», 69×51px a 360px) e
   «prenotata» («prenotat / a»). Le etichette corte restano su una riga, come le definisce
   .etichetta-stato: è la pillola che DESIGN.md §7 vuole letta al primo sguardo. La classe
   la mette la pagina (Clienti.razor, ClasseEtichetta) alle sole etichette con la fissa. */
.righe-storico .etichetta-fissa { white-space: normal; overflow-wrap: anywhere; }

.righe-storico .importo {
    grid-column: 4;
    grid-row: 1;
    min-width: 0;
    margin-left: 0.5rem;
    text-align: right;
    font-weight: 700;
    color: var(--nero);
    font-variant-numeric: tabular-nums;
    white-space: nowrap;
}

/* Un'annullata resta leggibile e si riconosce dalla PAROLA «annullata» (DESIGN.md §7):
   la data passa al colore del contorno, 5,02:1. Prima era smorzata con l'opacità al
   55%, che portava il testo intorno ai 2:1. */
.righe-storico .riga-annullata .quando { color: var(--testo); }

/* La parola di una riga: un'etichetta che si legge, non un comando. «da incassare» è
   l'unica piena — sabbia, nero sopra a 12,74:1 —, perché è l'unica che chiede di fare
   qualcosa; le altre stanno in contorno. A dirlo è la parola, non la tinta: in bianco e
   nero il pieno e il contorno restano due forme diverse (§7).
   Pillola come le altre etichette del gestionale (.etichetta-accesso, .etichetta-ruolo),
   ed è la tavola G approvata. */
.etichetta-stato {
    display: inline-flex;
    align-items: center;
    gap: 0.3rem;
    padding: 0.2rem 0.6rem;
    border: 1px solid var(--sabbia);
    border-radius: var(--pillola);
    background: var(--bianco);
    font-size: 0.75rem;
    font-weight: 700;
    line-height: 1.3;
    color: var(--nero);
    white-space: nowrap;
}

.etichetta-stato.da-fare { background: var(--sabbia); }

.etichetta-stato svg { width: 14px; height: 14px; flex: none; }

/* I comandi che si usano di rado, in fondo e discreti: pillole in contorno, a capo insieme.
   La classe nasceva per la finestra di Clienti («Unisci», «Rendi anonimo…»); oggi la usa solo
   Fisse.razor, e la pagina Clienti non ha più nessun comando raro (Unisci è caduto il 21
   ottobre 2026 con le schede, «Rendi anonimo» il 22, con la cancellazione di un cliente
   rimandata a un blocco a parte). Il nome della classe è rimasto. */
.azioni-discrete { display: flex; flex-wrap: wrap; gap: 0.5rem; }

@media (max-width: 640px) {
    .numeri-cliente { gap: 0.75rem 1.25rem; }
    .numeri-cliente dd { font-size: 1.35rem; }

    /* Sul telefono la riga dello storico va su due righe: sopra quando e importo, sotto
       cosa e parola. Quattro colonne in 300px schiacciavano «cosa» a una parola per riga.
       La prima colonna non scende sotto la data, che non va a capo (min-content): un
       importo o un'etichetta larghi stringono «cosa», non la data. */
    .righe-storico li {
        grid-template-columns: minmax(min-content, 1fr) auto;
        row-gap: 0.125rem;
        align-items: baseline;
        padding: 0.5rem 0;
    }

    .righe-storico .importo { grid-column: 2; grid-row: 1; }
    .righe-storico .cosa { grid-column: 1; grid-row: 2; padding-right: 0.5rem; font-size: 0.8rem; }
    .righe-storico .etichetta-stato { grid-column: 2; grid-row: 2; }
}

/* ══ CLIENTI RICAVATI DALLE PRENOTAZIONI, 21 OTTOBRE 2026 ═══════════════════════════
   Il passo 12 del piano dei clienti: la pagina di sopra, sui clienti che sono gruppi di
   prenotazioni. Qui solo ciò che i clienti ricavati hanno portato in più; la forma è sempre
   quella delle tavole G.

   SOLO TOKEN CHE C'ERANO: nessun colore, ombra o raggio nuovo. «Correggi» è un
   .collegamento-riga (nero, sottolineato, alto 44); «Apri» una .bottone-oggi. Il grassetto di
   «da incassare» è il secondo segnale oltre alla cifra, non una tinta.
   ═══════════════════════════════════════════════════════════════════════════════ */

/* «I più recenti in cima.» sopra la tabella: la nota di sempre, con lo stacco sotto invece che sopra. */
.nota-ordine { margin: 0 0 0.5rem; }

/* La colonna «Da incassare» c'è solo per chi legge la cassa. È una colonna in più da dividere: le
   altre si stringono di quanto serve a farle stare nelle stesse percentuali (30 + 15 + 9 + 17 × 2 +
   12 = 100). Sul telefono non c'è: la dice il riassunto della riga. */
.elenco-clienti.con-incasso .colonna-nome { width: 30%; }
.elenco-clienti.con-incasso .colonna-telefono { width: 15%; }
.elenco-clienti.con-incasso .colonna-data { width: 17%; }
.elenco-clienti .colonna-incasso { width: 12%; }

/* Quando c'è da chiedere qualcosa la cifra è in grassetto e nera: si legge a colpo d'occhio scorrendo la
   colonna, e senza il colore. «—» (niente da chiedere) resta quello degli altri. */
.elenco-clienti .da-incassare { font-weight: 700; color: var(--nero); }

/* ── «Correggi», sulla singola partita dello storico ─────────────────────────────
   Una quinta colonna, FISSA: con una larghezza che dipende dal contenuto, le righe col bottone e
   quelle senza (una data di una fissa non si corregge) metterebbero l'importo in due posti.
   La riga resta alta quanto il bottone, 44, e non di più: senza il respiro sopra e sotto, un
   cliente con trenta partite non diventa una pagina. Sul telefono il bottone sta sotto l'importo, in
   fondo alla seconda riga, accanto alla parola della partita: la riga non cresce di una terza —
   finché la finestra è larga abbastanza; sotto i 400px vedi più in fondo.

   ⚠️ ANCHE LE RIGHE SENZA BOTTONE (22 ottobre 2026) hanno l'altezza del bottone: una data di una fissa,
   dove «Correggi» non c'è, restava alta quanto il suo testo con le due linee di separazione attaccate,
   accanto a righe da 44. Con min-height lo sono tutte e il testo sta al centro (align-items: center). */
.righe-storico.con-correggi li {
    grid-template-columns: 9.75rem minmax(5rem, 1fr) auto minmax(4.75rem, auto) 5.5rem;
    padding-block: 0;
    min-height: var(--h-comando);
}

.righe-storico .correggi-riga {
    grid-column: 5;
    grid-row: 1;
    justify-self: end;
    padding-inline: 0.5rem;
    font-size: 0.85rem;
}

.righe-storico .correggi-riga:disabled { opacity: 0.45; cursor: default; }

/* Ciò che sta sotto la riga e la riempie tutta: l'errore di una lettura, il modulo di correzione. Senza
   riga o colonna sue: il posto lo trova la griglia, sotto quelle fisse delle altre. */
.righe-storico .riga-intera,
.righe-storico .correzione-riga { grid-column: 1 / -1; }

.righe-storico .riga-intera { margin: 0 0 0.5rem; }

/* Il modulo apre sulla riga, dentro la sua stessa linea di separazione: il respiro è tutto sotto. */
.righe-storico .correzione-riga { padding: 0.25rem 0 0.75rem; min-width: 0; }

@media (max-width: 640px) {
    /* Sul telefono la riga è su due righe di testo, e il respiro dipende da cosa c'è sotto: le righe SENZA
       bottone prendono quello di tutte le altre dello storico (0,5rem sopra e sotto, dalla regola di sopra
       che le dice «a due righe»); quelle CON il bottone (riga-correggibile) ne hanno già 12px sotto il testo
       dentro i suoi 44, e sopra un respiro piccolo. */
    .righe-storico.con-correggi li {
        grid-template-columns: minmax(min-content, 1fr) auto auto;
        column-gap: 0.5rem;
        padding-block: 0.5rem;
    }

    .righe-storico.con-correggi li.riga-correggibile { padding-block: 0.375rem 0; }

    .righe-storico.con-correggi .importo { grid-column: 2 / 4; }
    .righe-storico .correggi-riga { grid-column: 3; grid-row: 2; }
}

/* ⚠️ SOTTO I 400px «CORREGGI» PASSA SU UNA TERZA RIGA, a destra (22 ottobre 2026). La finestra è larga
   ~296px a 360 e ~311 a 375: la data («mer 30/12/25 · 20:30», che non va a capo) ne prende ~146, «Correggi»
   ~74 e le due distanze 16, e alla colonna dell'importo e dell'etichetta restano ~60px. «da incassare» ne
   vuole 84: si spezzava a metà parola, e «senza prezzo» (~70px) sbordava. Con tre righe — data e importo,
   campo e parola, il bottone — le colonne sono due e la parola ha tutto lo spazio che le serve. Il
   bottone resta alto 44 (DESIGN.md §4): la riga costa una terza riga di testo, non un bersaglio più
   piccolo. Da 400px in su la finestra è larga ≥336 e le tre colonne ci stanno. */
@media (max-width: 399px) {
    .righe-storico.con-correggi li { grid-template-columns: minmax(min-content, 1fr) auto; }

    .righe-storico.con-correggi .importo { grid-column: 2; }
    .righe-storico .correggi-riga { grid-column: 1 / -1; grid-row: 3; }
}

/* ── Le fisse del cliente ────────────────────────────────────────────────────────
   Una riga per fissa: il nome e quando si gioca a sinistra, «Apri» a destra. Il nome e l'orario sono in
   nero e in grassetto, il resto è il testo di sempre. Il nome di una fissa lo scrive la segreteria e
   arriva a 80 caratteri: va a capo dentro la sua colonna (min-width: 0), e «Apri» non si stringe. */
.righe-fisse-cliente li {
    display: flex;
    align-items: center;
    justify-content: space-between;
    gap: 0.75rem;
    min-height: 2.75rem;
    padding: 0.375rem 0;
    border-bottom: 1px solid var(--bordo);
    font-size: 0.9rem;
}

.righe-fisse-cliente li:last-child { border-bottom: none; }

.righe-fisse-cliente .testo-fissa {
    display: flex;
    flex-direction: column;
    gap: 0.0625rem;
    min-width: 0;
}

.righe-fisse-cliente .nome-fissa,
.righe-fisse-cliente .quando-fissa {
    font-weight: 700;
    color: var(--nero);
    overflow-wrap: anywhere;
}

.righe-fisse-cliente .quando-fissa { font-variant-numeric: tabular-nums; }

.righe-fisse-cliente .cosa { font-size: 0.8rem; color: var(--testo); overflow-wrap: anywhere; }

.righe-fisse-cliente a.bottone-oggi { flex: none; }

/* ══ LA SCELTA DELLE DELEGHE, 20 OTTOBRE 2026 ════════════════════════════════════
   Componenti/SceltaDeleghe.razor (passo 13 delle deleghe): in cima i livelli pronti, sotto
   il dettaglio voce per voce. La monta Accessi (dal 29 ottobre 2026: «Nuovo accesso»,
   «Cambia», «Dai di nuovo l'accesso») e la monterà Lezioni, dentro una scheda che è già
   una superficie: qui niente scatole, niente fondi, niente ombre — si
   separa con lo spazio (DESIGN.md §3, niente superfici annidate). Nessun colore nuovo:
   nero, bianco, sabbia e il --testo grigio solo sul bianco.
   ─────────────────────────────────────────────────────────────────────────────── */

.scelta-deleghe { min-width: 0; }

/* «Tutto: è amministratore.»: una riga che si legge, non un'etichetta. */
.tutto-deleghe { font-size: 0.9rem; font-weight: 700; color: var(--nero); }

/* I livelli pronti (prima qui: una griglia di pillole con la frase sotto) sono un elenco a scelta singola, a ogni larghezza: le
   regole sono nel blocco di Accessi in fondo al foglio (.scelta-singola, .voce-singola). Scelto da Marco il 29 ottobre 2026,
   docs/ACCESSI-PIANO.md, domanda 3, risposta B. */

/* La riga che dice dov'è l'insieme: «Tutto il bancone», «Su misura: …, più: …». */
.riassunto-deleghe {
    font-size: 0.85rem;
    color: var(--nero);
}

.apri-dettaglio { margin-top: 0.25rem; }

/* Il dettaglio: un argomento per gruppo, una casella per riga. Lo stacco fra due argomenti
   è il doppio di quello fra due caselle, così i gruppi si leggono senza bisogno di filetti. */
.dettaglio-deleghe {
    display: grid;
    gap: 1rem;
    margin-top: 0.5rem;
}

/* min-width: 0 perché un fieldset di serie non scende sotto il suo contenuto più largo:
   «Spostare e annullare le lezioni di tutti i maestri» a 360px sfonderebbe la scheda e
   farebbe scorrere il body in orizzontale (DESIGN.md §4). */
.gruppo-deleghe { min-width: 0; }

.gruppo-deleghe legend {
    margin-bottom: 0.25rem;
    font-size: 0.85rem;
    font-weight: 700;
    color: var(--nero);
}

/* Una per riga, come i Permessi di Accessi: l'interruttore è inline-flex, e in fila le
   caselle diventerebbero bersagli da 44px in altezza ma non in larghezza. */
.gruppo-deleghe .interruttore { display: flex; }

/* La riga sotto la casella — perché è spenta, o cosa fa in più del nome — rientra quanto
   l'interruttore e il suo spazio (44px più 0,5rem), così sta sotto il nome e non sotto il
   pomello; e risale di un passo verso la sua casella, che è alta 44 col testo in mezzo. */
.gruppo-deleghe .aiuto-voce {
    display: block;
    margin: -0.25rem 0 0.25rem;
    padding-left: calc(44px + 0.5rem);
    font-size: 0.8rem;
    color: var(--testo);
}

/* ══ FISSE: L'ELENCO, 20 OTTOBRE 2026 ═════════════════════════════════════════════
   Il passo 14 di docs/FISSE-PIANO-TECNICO.md. L'elenco è la variante A1 «Come Clienti»,
   scelta dal committente il 6 ottobre 2026 sulle tavole: la testata di Clienti (selettori
   aggiunti lassù, .testata-fisse), la sua tabella, il suo bottone sul nome.

   ⚠️ UNA TABELLA SOLA, CHE SUL TELEFONO DIVENTA RIGHE-BOTTONE, come Clienti (DESIGN.md,
   «Clienti: la scheda in una finestra»): il piano proponeva una tabella per il computer e
   un secondo elenco per il telefono. Un elenco solo vuol dire un bottone solo per fissa, e
   il fuoco che torna quando la finestra si chiude ha un posto solo dove tornare: con due,
   il bottone dell'elenco nascosto prende il fuoco senza farlo vedere a nessuno.

   ⚠️ LA SOGLIA È 739px, NON I 640 DI CLIENTI. Qui le colonne portano gli orari interi, e
   «Quando», «Dove» e «Fino a» non vanno a capo (le righe di «Quando» e di «Dove» devono
   restare allineate): stimato con i testi veri — «lun, mer, gio 15:00–16:30», «11
   settembre 2027» — sotto i 700px circa al nome della fissa resterebbe una colonna da una
   parola. È la soglia della testata qui sopra e di .solo-telefono. Fra 740 e 800, con
   un nome di campo lungo, la tabella può scorrere: scorre DENTRO il suo riquadro
   (.contenitore-griglia), mai il body (DESIGN.md §4). Da misurare sulla pagina vera.

   SOLO TOKEN CHE C'ERANO: nessun colore, ombra o raggio nuovo, niente transizioni. */

/* ── Sul computer: la tabella ─────────────────────────────────────────────────── */

/* La densità di Clienti. vertical-align: top perché una fissa con tre orari ha tre righe
   in «Quando», e il nome deve restare in cima alla sua, non a metà. */
table.elenco.tabella-fisse td {
    padding-top: 0.375rem;
    padding-bottom: 0.375rem;
    vertical-align: top;
}

/* Le celle accanto al bottone cominciano dove comincia il nome: il bottone ha 0,25rem di
   respiro sopra (.collegamento-riga), e senza questi 0,25 in più «Quando» starebbe quattro
   pixel più in alto del nome della fissa di cui parla. */
table.elenco.tabella-fisse td:not(:first-child) { padding-top: 0.625rem; }

/* Il nome lo scrive la segreteria, fino a 80 caratteri: va a capo nella sua cella invece
   di allargare la tabella. */
.tabella-fisse .colonna-fissa { width: 30%; }
.tabella-fisse .nome-riga { overflow-wrap: anywhere; }

/* Un orario per riga, in «Quando» e in «Dove»: la riga i dell'una è la riga i dell'altra,
   e per questo nessuna delle due va a capo. Cifre incolonnate anche qui (DESIGN.md §2):
   «15:00–16:30» sotto «9:30–11:00» non deve ballare. */
.tabella-fisse .orari-cella span {
    display: block;
    white-space: nowrap;
    font-variant-numeric: tabular-nums;
}

.tabella-fisse .cella-fine { white-space: nowrap; }

/* Le etichette in fila, e a capo l'una sotto l'altra quando la colonna è stretta. Il gap
   prende il posto dei margini a destra che .etichetta-accesso ed .etichetta-ruolo portano
   per stare in riga col testo: qui sarebbero spazio in più solo da una parte. */
.etichette-fissa {
    display: flex;
    flex-wrap: wrap;
    gap: 0.25rem;
}

.etichette-fissa > * { margin: 0; }

/* ── Sul telefono: righe-bottone ──────────────────────────────────────────────────
   La STESSA tabella, con le colonne nascoste e la riga di Clienti: bianca su --sfondo,
   col bordo --bordo, il nome sopra e la freccia a destra. Sotto il nome, di chi è; poi il
   primo orario su due righe — il risultato e la descrizione, «almeno si vede meglio»
   (commento del committente sulla tavola) — con «+1 orario» se ce ne sono altri; in fondo
   le etichette. Più alta di una riga di Clienti, ed è il prezzo di sapere QUANDO senza
   aprirla: è la domanda per cui si viene qui. */
@media (max-width: 739px) {
    /* Il riquadro della griglia scorre di lato, e chi scorre taglia ciò che esce: il
       contorno del fuoco sparirebbe ai due lati di righe larghe quanto lo schermo. Qui non
       scorre niente, quindi si apre — come .contenitore-clienti. */
    .contenitore-fisse { overflow: visible; }

    table.elenco.tabella-fisse,
    table.elenco.tabella-fisse tbody,
    table.elenco.tabella-fisse tr,
    table.elenco.tabella-fisse td { display: block; width: auto; }

    table.elenco.tabella-fisse {
        background: none;
        border: 0;
        border-radius: 0;
        overflow: visible;
    }

    table.elenco.tabella-fisse thead { display: none; }

    table.elenco.tabella-fisse tbody {
        display: flex;
        flex-direction: column;
        gap: 0.375rem;
    }

    table.elenco.tabella-fisse tbody tr:hover { background: none; }
    table.elenco.tabella-fisse td { padding: 0; border: 0; }
    table.elenco.tabella-fisse td:not(:first-child) { display: none; }

    .tabella-fisse .collegamento-riga {
        display: grid;
        grid-template-columns: minmax(0, 1fr) auto;
        column-gap: 0.5rem;
        row-gap: 0.125rem;
        align-items: center;
        padding: 0.5rem 0.75rem;
        background: var(--bianco);
        border: 1px solid var(--bordo);
        border-radius: var(--raggio);
        font-weight: 400;
    }

    .tabella-fisse .collegamento-riga:hover { filter: brightness(0.97); }

    .tabella-fisse .nome-riga {
        grid-column: 1;
        grid-row: 1;
        min-width: 0;
        font-size: 0.95rem;
        font-weight: 700;
        text-decoration: none;
    }

    /* Di chi è: 0,8rem come il riassunto di Clienti, --testo su bianco (5,02:1). */
    .tabella-fisse .collegamento-riga .dettaglio-riga {
        grid-column: 1;
        grid-row: 2;
        min-width: 0;
        font-size: 0.8rem;
    }

    /* L'orario sotto, su tutta la larghezza: la freccia accompagna il nome, non l'orario.
       Va a capo invece dei puntini, al contrario del riassunto di Clienti: «dall'11 giugno
       2027» tagliato a metà direbbe una data sbagliata. Il risultato in nero, la
       descrizione in grigio: si legge prima QUANDO, poi dove e fino a quando. */
    .tabella-fisse .orari-riga {
        display: block;
        grid-column: 1 / -1;
        margin-top: 0.25rem;
        font-size: 0.8rem;
        color: var(--testo);
        font-variant-numeric: tabular-nums;
    }

    .tabella-fisse .orari-riga > span { display: block; overflow-wrap: anywhere; }
    .tabella-fisse .orari-riga .risultato { color: var(--nero); }
    .tabella-fisse .orari-riga .altri-orari { color: var(--testo); }

    .tabella-fisse .collegamento-riga .etichette-fissa {
        display: flex;
        grid-column: 1 / -1;
        margin-top: 0.25rem;
    }

    .tabella-fisse .freccia {
        display: block;
        grid-column: 2;
        grid-row: 1 / span 2;
        width: 20px;
        height: 20px;
        color: var(--testo);
    }

    .tabella-fisse .freccia svg { width: 20px; height: 20px; }
}

/* ══ FISSE: LA FINESTRA IN LETTURA, 20 OTTOBRE 2026 ════════════════════════════════
   Il passo 15 di docs/FISSE-PIANO-TECNICO.md. La finestra è la .finestra di Clienti, di Campi e
   del Calendario, così com'è; le sezioni sono la variante A3 «Una sezione alla volta»,
   scelta dal committente il 6 ottobre 2026 sulle tavole, e riusano .capo-regola,
   .titolo-regola, .frase-regola e .piede-regola della pagina Circolo — che è dove nascono
   «una scheda alla volta», «una frase che dice la regola» e «un comando che la apre».

   SOLO TOKEN CHE C'ERANO: nessun colore, ombra o raggio nuovo, nessuna transizione.
   I contorni dei bottoni non si toccano (DESIGN.md §5). */

/* ── Le sezioni: separate da una riga, non da scatole (DESIGN.md §3) ─────────────── */
.sezione-fissa + .sezione-fissa {
    margin-top: 1rem;
    padding-top: 1rem;
    border-top: 1px solid var(--bordo);
}

/* Chiusa, una sezione è UNA RIGA: il capo non porta il margine che .capo-regola ha per
   staccarsi da ciò che gli sta sotto, perché sotto non c'è niente. Aperta lo riprende. */
.sezione-fissa .capo-regola { margin-bottom: 0; }
.sezione-fissa.aperta .capo-regola { margin-bottom: 0.5rem; }

/* Il titolo e la sua frase prendono tutto il posto che il comando lascia, e la frase va a
   capo SOTTO il titolo quando di fianco non ci sta: sul telefono, nella finestra da 296px,
   il titolo da 7,5rem, la frase e un «Apri» da 44px non stanno in una riga. Nessuna media
   query: lo decide lo spazio, come per .piede-regola. */
.sezione-fissa .titolo-regola {
    flex: 1 1 0;
    min-width: 0;
    column-gap: 0.75rem;
    row-gap: 0.25rem;
}

/* Un titolo non meno largo di «Date saltate», così le frasi delle sezioni chiuse
   cominciano tutte alla stessa altezza. */
.sezione-fissa .titolo-sezione { min-width: 7.5rem; }

.sezione-fissa .titolo-regola > .frase-regola {
    flex: 1 1 12rem;
    min-width: 0;
    overflow-wrap: anywhere;
}

/* I comandi a destra del titolo non vanno mai a capo da soli e non si stringono. */
.sezione-fissa .comandi-regola { flex: none; }

.sezione-fissa .impegni { margin-top: 0.25rem; }

/* ── Un orario, o una data: il risultato sopra, il dove e il quando sotto ─────────────
   «mar 19:00–20:30» in nero e in grassetto, «Campo 1 · dal 15 settembre, senza fine» in
   --testo. Le cifre incolonnate (DESIGN.md §2): «15:00» sotto «9:30» non deve ballare. */
.orario-fissa {
    display: flex;
    flex-direction: column;
    min-width: 0;
}

.orario-fissa .risultato {
    font-size: 0.9rem;
    font-weight: 700;
    line-height: 1.35;
    color: var(--nero);
    font-variant-numeric: tabular-nums;
    overflow-wrap: anywhere;
}

.orario-fissa .descrizione {
    font-size: 0.8rem;
    line-height: 1.35;
    color: var(--testo);
    overflow-wrap: anywhere;
}

/* «e 2 altri» sotto il primo orario, nel riassunto di una sezione chiusa. */
.sezione-fissa .altri-orari {
    display: block;
    margin-top: 0.125rem;
    font-size: 0.8rem;
    color: var(--testo);
}

/* ── Le righe da leggere: il comando a destra ────────────────────────────────────────
   «Rimetti» accanto a una data saltata, «Chiama» accanto a una persona. Il comando sta in
   fondo alla riga e non si stringe; il testo prende il resto e va a capo da solo. L'icona
   della cornetta ha la misura che le serve, come in .contatti-cliente. */
.riga-esito .bottone-oggi {
    margin-left: auto;
    flex: none;
    gap: 0.4rem;
}

.riga-esito .bottone-oggi svg { width: 18px; height: 18px; flex: none; }

.riga-esito .orario-fissa { flex: 1 1 0; }

/* Il nome di una persona lo scrive la segreteria: va a capo invece di allargare la riga. */
.sezione-fissa .riga-esito .chi,
.chi-avvisare .riga-esito .chi {
    flex: 1 1 0;
    overflow-wrap: anywhere;
}

/* Un'etichetta in fondo a una riga («concluso») non si schiaccia contro il testo. */
.riga-esito > .etichetta-spenta { flex: none; }

/* L'errore di una riga sta SOTTO la riga, non dentro: la riga è un flex, e la frase del server
   («C'è la partita di Rossi Mario, 18:00–19:00») è lunga. */
.sezione-fissa .impegni > li > .nota-guasta { margin: 0.25rem 0 0.5rem; }

/* ── Dentro la sezione aperta ───────────────────────────────────────────────────────── */

/* La nota in cima quando non c'è nessun comando: lascia il suo spazio alla prima sezione. */
.nota-sola-lettura { margin: 0 0 1rem; }

/* La nota di una fissa la scrive la segreteria, anche a capo: gli a capo sono suoi. Nero, perché
   è il dato e non un commento. */
.nota-della-fissa {
    margin: 0;
    font-size: 0.9rem;
    line-height: 1.45;
    color: var(--nero);
    white-space: pre-line;
    overflow-wrap: anywhere;
}

/* Il modulo che si apre sul posto («Salta», «Disdici»): respiro sopra e sotto, e basta. Non è
   una scatola dentro la finestra (DESIGN.md §3). */
.modulo-fissa { margin: 0.5rem 0 1rem; }

/* «Una data | Un periodo»: la pista prende tutta la riga e le due metà sono uguali. È la forma
   di .scelta-vista, che è inline-flex perché in testata si stringe attorno ai suoi bottoni. */
.scelta-vista.piena { display: flex; margin-bottom: 0.75rem; }

.scelta-vista.piena .bottone-vista {
    flex: 1 1 0;
    min-width: 0;
    padding-inline: 0.5rem;
}

/* Il campo accanto a un orario nelle spunte del modulo «Salta»: grigio, piccolo, dopo l'ora. */
.scelta-campi-blocco .campo-dell-orario {
    margin-left: 0.25rem;
    font-size: 0.75rem;
    color: var(--testo);
}

/* Cancellare del tutto sta sotto la disdetta, discreto: lo stacco è lo spazio. */
.cancella-fissa { margin-top: 1rem; }

/* Chi avvisare, dopo un salto: sotto la frase dell'esito. */
.chi-avvisare { margin-top: 0.75rem; }

/* ══ FISSE: SCRIVERE, 20 OTTOBRE 2026 ══════════════════════════════════════════════
   Il passo 16 di docs/FISSE-PIANO-TECNICO.md: la finestra che crea una fissa, ne cambia gli
   orari e ne cambia «Di chi è». Tre passi — Scrivi, Guarda, Fatto — nella .finestra di sempre:
   la forma è quella delle tavole «Nuova fissa · Scrivi / Guarda / Fatto» del 6 ottobre.

   SOLO TOKEN CHE C'ERANO: nessun colore, ombra o raggio nuovo, nessuna transizione. Il pulsante
   dell'azione è .pulsante (giallo pallina col bordo nero) e il rosso è solo di .pulsante-pericolo,
   quando si toglie la prenotazione di qualcuno. I contorni dei bottoni non si toccano (DESIGN.md §5). */

/* ── Il campo di un orario: la pista a tutta larghezza ────────────────────────────────
   La pista dei campi del Calendario è stretta attorno ai suoi bottoni; nella finestra le
   pillole si dividono la riga in parti uguali, come la scelta del campo sul telefono. Il nome
   lo scrive il gestore e può essere lungo: si accorcia coi puntini dentro la sua pillola, mai
   la pista fuori dalla finestra (DESIGN.md §4). */
.scelta-campo.piena { display: flex; margin-bottom: 0; }

.scelta-campo.piena .bottone-campo {
    flex: 1 1 0;
    min-width: 0;
    padding-inline: 0.5rem;
    overflow: hidden;
    text-overflow: ellipsis;
    white-space: nowrap;
}

.scelta-campo.piena .bottone-campo .senza-luce { overflow: hidden; text-overflow: ellipsis; }

/* La riga che dice cosa vuol dire la durata scelta: sta sotto le date, non dentro un campo. */
.editor-orario > .aiuto-orario { margin: -0.25rem 0 0.75rem; font-size: 0.8rem; color: var(--testo); }

/* ── I sette giorni ──────────────────────────────────────────────────────────────────
   Sette bottoni da toccare, in una griglia. ⚠️ SOTTO I 399px SU QUATTRO COLONNE: la finestra
   sul telefono ha 16px di margine e 1px di bordo per parte e 15px di respiro, quindi a 360px il
   corpo è largo 296px e sette colonne farebbero (296 − 6 × 4) / 7 = 39px — sotto i 44 di
   DESIGN.md §4. Su quattro fanno 71px, e i sette giorni vanno su due righe, 4 + 3. Da 396px in
   su sette colonne tornerebbero a 44px: la soglia scritta è 399, un po' prudente. DA MISURARE
   sul telefono vero. Lo stato è un'inversione completa di sfondo e testo, come .bottone-vista.attiva
   (DESIGN.md §7): si vede anche stampato in bianco e nero, e non dipende dal colore. */
.scelta-giorni {
    display: grid;
    grid-template-columns: repeat(7, minmax(0, 1fr));
    gap: 0.25rem;
}

@media (max-width: 399px) {
    .scelta-giorni { grid-template-columns: repeat(4, minmax(0, 1fr)); }
}

.giorno-settimana {
    min-height: var(--h-comando);
    padding: 0.5rem 0.25rem;
    border: none;
    border-radius: var(--pillola);
    background: var(--bordo);
    color: var(--nero);
    font-family: inherit;
    font-size: 0.9rem;
    cursor: pointer;
}

.giorno-settimana[aria-pressed="true"] {
    background: var(--nero);
    color: var(--bianco);
    font-weight: 700;
}

.giorno-settimana:disabled { opacity: 0.55; cursor: not-allowed; }

/* ── Un orario riassunto su due righe ────────────────────────────────────────────────
   L'orario che non è quello aperto, in una fissa nuova con più orari, e l'orario che si può
   toccare in «Orari»: il risultato sopra, il dove e il quando sotto, a sinistra. */
.riga-impegno--orario {
    flex-direction: column;
    align-items: flex-start;
    gap: 0.125rem;
}

.riga-impegno--orario .orario-fissa { width: 100%; }

/* I due comandi di un orario toccato: sotto la sua riga, che restano raggiungibili col pollice. */
.comandi-orario { display: flex; flex-wrap: wrap; gap: 0.5rem; margin: 0.5rem 0 0.75rem; }
.comandi-orario > * { flex: 1 1 10rem; }

/* ── Di chi è: il maestro, l'intestatario, chi partecipa ─────────────────────────────
   Un fieldset che ferma le caselle mentre una scrittura è in volo, senza bordo né margini: è
   un modo di spegnerle tutte insieme, non una scatola dentro la finestra (DESIGN.md §3). */
.scelta-chi { border: 0; padding: 0; margin: 0 0 0.75rem; min-width: 0; }

.partecipante { margin-bottom: 1rem; }

.capo-partecipante {
    display: flex;
    align-items: center;
    justify-content: space-between;
    gap: 0.5rem;
    margin-bottom: 0.25rem;
}

.titolo-persona { font-size: 0.85rem; font-weight: 700; color: var(--nero); }

.orario-aperto { margin-bottom: 0.75rem; }

.campi-in-arrivo { margin-bottom: 0.75rem; }

/* Gli orari già scritti di una fissa nuova stanno uno sotto l'altro, e «+ Aggiungi un altro orario»
   sta staccato dall'ultimo: sono righe da toccare, e due bersagli attaccati si sbagliano. */
.scrivi-fissa > .riga-impegno { margin-bottom: 0.25rem; }
.scrivi-fissa > .pulsante-tenue { margin: 0.5rem 0 0.75rem; }

/* ── Guarda: «Uguale per tutte» e, per ogni prenotazione in mezzo, la sua pista ──────
   Il riquadro con chi c'è e la pista «Lascia | Togli» stanno uno accanto all'altro e vanno a capo
   da soli (flex con wrap): sul telefono la pista cade sotto, a tutta riga. La pista sta FUORI
   dal riquadro, non dentro — una scatola dentro una scatola (DESIGN.md §3). */
.uguale-per-tutte {
    display: flex;
    flex-wrap: wrap;
    align-items: center;
    justify-content: space-between;
    gap: 0.5rem;
    margin: 0.75rem 0;
}

.uguale-per-tutte .titolo-campo { font-size: 0.85rem; font-weight: 700; color: var(--nero); }

.conflitto-fissa {
    display: flex;
    flex-wrap: wrap;
    align-items: center;
    gap: 0.5rem;
    margin-top: 0.5rem;
}

.conflitto-fissa .riga-esito { flex: 1 1 14rem; min-width: 0; }
.conflitto-fissa .scelta-vista { flex: none; }

/* ── Il piede: cosa manca, e «Hai lasciato a metà» ───────────────────────────────────
   Sopra il pulsante spento, fuori dal corpo che scorre: la prima cosa da fare in una frase, sempre
   in vista. Come .avviso-finestra, con la riga di separazione che il piede ha già: una sola. */
.motivo-finestra,
.uscita-finestra {
    flex: none;
    margin: 0;
    padding: 0.5rem 1rem 0;
    border-top: 1px solid var(--bordo);
    background: var(--bianco);
    font-size: 0.85rem;
    color: var(--testo);
}

.uscita-finestra { padding-top: 0.75rem; color: var(--nero); }
.uscita-finestra p { margin: 0; }
.titolo-uscita { font-weight: 700; }

.motivo-finestra + .piede-finestra,
.uscita-finestra + .piede-finestra { border-top: none; }

/* ══ CALENDARIO: «PRENOTA SU CAMPO» IN TRE SEZIONI, 27 OTTOBRE 2026 ═══════════════════
   Il passo 3 di docs/CHI-GIOCA-PIANO.md. La finestra di inserimento si ritaglia in Quando, Cosa e Chi gioca —
   più una quarta, senza titolo, di note e cifre — separate da una riga e non da scatole (DESIGN.md §3), come le
   sezioni di una fissa. «Prenota», il perché è spento e il rifiuto del server stanno nel piede, fuori dal corpo
   che scorre: sono le regole qui sopra (.piede-finestra, .motivo-finestra, .avviso-finestra), non ne servono altre.

   SOLO TOKEN CHE C'ERANO: nessun colore, ombra o raggio nuovo, nessuna transizione. Sono distanze, tutte multipli
   di 0,25rem. */

/* La riga fra una sezione e la successiva, con lo stesso respiro sopra e sotto: uguale a
   .sezione-fissa + .sezione-fissa, con un nome suo perché questa non è una fissa. */
.sezione-prenota + .sezione-prenota {
    margin-top: 1rem;
    padding-top: 1rem;
    border-top: 1px solid var(--bordo);
}

/* L'ultima cosa di una sezione non porta il suo margine sotto. Ognuna ha il proprio (le pastiglie di «Alle» 1rem,
   la pista di «Singolo | Doppio» 0,75rem, la spunta della conferma 0,75rem), e finivano SOMMATI al padding della
   sezione dopo: il respiro sopra la riga era diverso da quello sotto, e cambiava da una sezione all'altra. Il
   respiro fra le sezioni lo dà la riga, soltanto lei. */
.sezione-prenota > :last-child { margin-bottom: 0; }

/* ══ CALENDARIO: UNA DATA DI UNA FISSA, 21 OTTOBRE 2026 ═══════════════════════════════
   Il passo 17 di docs/FISSE-PIANO-TECNICO.md: il pannello di una data di una fissa ha tre
   comandi («Sposta», «Salta questa data», «Apri la fissa») e, dopo un salto o una chiusura
   tolta, un riquadro in cima alla pagina con l'esito e chi avvisare.

   SOLO TOKEN CHE C'ERANO: nessun colore, ombra o raggio nuovo, nessuna transizione. Sono
   distanze, tutte multipli di 0,25rem. «Salta questa data» è .bottone-oggi e non rosso: la
   data non si perde, si rimette dalla fissa (DESIGN.md, «Fisse: la finestra a sezioni»). */

/* I comandi dei tre sono uno sotto l'altro con lo stesso respiro: .pulsante e .bottone-oggi
   sono un <button> e un <a> inline, e in fila senza questo si toccherebbero. */
.comandi-data {
    display: flex;
    flex-direction: column;
    gap: 0.5rem;
}

/* L'esito in cima: la frase verde, l'elenco, chi chiamare, i due comandi. Sotto, lo stacco della
   frase di .avviso-salvato (1rem). Le righe non si allargano sul computer a tutta la pagina:
   una data e un campo in una fascia da 1.200px sono un elastico da seguire con l'occhio. */
.avviso-data { margin: 0 0 1rem; }

.avviso-data > .avviso-salvato { margin-bottom: 0.5rem; }

/* La mail che non è partita: il riquadro d'avviso (ambra, .avviso-errore) sotto il verde del gesto, con lo
   stesso stacco. Stessa tinta e stesso bordo che ha ovunque nel gestionale: nessun colore nuovo. */
.avviso-data > .avviso-errore { margin-bottom: 0.5rem; }

.avviso-data .impegni,
.avviso-data .chi-avvisare { max-width: 40rem; }

.avviso-data .barra-comandi { margin-top: 0.75rem; }

/* Il nome di una fissa lo scrive la segreteria: va a capo invece di allargare la riga. Vale per le
   righe dell'esito in cima e per il terzo elenco di «Chiudi dei campi», dove quel nome sta accanto a
   una data e a un campo in una finestra da 296px. */
.avviso-data .riga-esito .chi,
.date-di-fisse .riga-esito .chi {
    flex: 1 1 0;
    overflow-wrap: anywhere;
}

/* ── Le spunte delle mail al cliente (21 ottobre 2026, docs/PIANO.md) ────────────────────
   «Manda la conferma», «Avvisa il cliente per email» e «Avvisa i clienti per email»: sono
   .interruttore, lo stesso della spunta dell'incasso e dei campi di «Chiudi dei campi», e non
   hanno nessuna forma nuova. Qui c'è soltanto la distanza fra l'interruttore con la sua nota e
   ciò che viene dopo (un campo, il pulsante rosso, il piede): .nota-pannello chiude a margine
   zero. Nessun colore, ombra o raggio nuovo, nessuna transizione. */
.spunta-mail { margin: 0 0 0.75rem; }

/* Nella barra dello spostamento il fondo è sabbia, e SUL SABBIA TUTTO È NERO (DESIGN.md §1): la
   nota piccola ha --testo, che lì sta a 3,12:1, e il bordo dell'interruttore spento riesce a
   sparire. Si riportano a --nero. La nota è dentro un <small>, non una .nota-pannello. */
.barra-spostamento .spunta-mail { margin: 0; }

.barra-spostamento .spunta-mail .aiuto-pannello {
    display: block;
    color: var(--nero);
    font-size: 0.8rem;
}

.barra-spostamento .interruttore input[type="checkbox"] { border-color: var(--nero); }

/* ── SceltaData: la data su misura (30 ottobre 2026) ───────────────────────────
   Al posto dell input type=date del browser: casella da scrivere, sigla del giorno
   e il mese, che si apre al centro dello schermo sopra uno sfondo velato: così non resta
   tagliato dentro una finestra che scorre, né nella striscia dei giorni del telefono. */
.casella-data { position: relative; }
.casella-data-casella { position: relative; display: flex; align-items: center; }
.casella-data-casella input {
    width: 100%; height: var(--h-campo); padding: 0 92px 0 14px;
    border: 1px solid var(--bordo); border-radius: var(--raggio);
    background: var(--bianco); color: var(--nero); font: inherit;
}
.casella-data-casella input:focus-visible { outline: 2px solid var(--nero); outline-offset: 1px; }
.casella-data-casella input[aria-invalid="true"] { border-color: var(--terra); }
.casella-data-casella input:disabled { background: var(--spento); color: var(--testo); }
.casella-data-giorno {
    position: absolute; right: 48px; color: var(--testo); font-size: .875rem; pointer-events: none;
}
.casella-data-apri {
    position: absolute; right: 4px; width: 40px; height: 40px; display: grid; place-items: center;
    border: 0; border-radius: var(--pillola); background: transparent; color: var(--nero); cursor: pointer;
}
.casella-data-apri:hover:not(:disabled) { background: var(--spento); }
.casella-data-apri svg, .casella-data-icona svg { width: 20px; height: 20px; }
.casella-data-icona {
    width: var(--h-comando); height: var(--h-comando); display: grid; place-items: center;
    border: 1px solid var(--bordo); border-radius: var(--raggio); background: var(--bianco);
    color: var(--nero); cursor: pointer;
}
.casella-data-errore { color: var(--terra); }
.casella-data-sfondo { position: fixed; inset: 0; z-index: 60; background: rgb(7 4 0 / 18%); }
.casella-data-mese {
    position: fixed; z-index: 61; top: 50%; left: 50%; transform: translate(-50%, -50%);
    width: 312px; max-width: calc(100vw - 32px); padding: 12px;
    background: var(--bianco); border: 1px solid var(--bordo); border-radius: var(--raggio);
    box-shadow: var(--ombra);
}
.casella-data-testa { display: flex; align-items: center; justify-content: space-between; margin-bottom: 6px; }
.casella-data-testa strong { font-weight: 600; }
.casella-data-testa button {
    width: 40px; height: 40px; border: 0; border-radius: var(--pillola);
    background: transparent; color: var(--nero); font-size: 1.5rem; line-height: 1; cursor: pointer;
}
.casella-data-testa button:hover:not(:disabled) { background: var(--spento); }
.casella-data-testa button:disabled { color: var(--bordo); cursor: default; }
.casella-data-griglia { display: grid; grid-template-columns: repeat(7, 1fr); gap: 2px; }
.casella-data-sigla { padding: 4px 0; text-align: center; color: var(--testo); font-size: .75rem; }
.casella-data-griglia button {
    height: 40px; border: 0; border-radius: var(--pillola);
    background: transparent; color: var(--nero); font: inherit; cursor: pointer;
}
.casella-data-griglia button:hover:not(:disabled) { background: var(--spento); }
.casella-data-griglia button.fuori-mese { color: var(--grigio); }
.casella-data-griglia button.oggi { box-shadow: inset 0 0 0 1.5px var(--nero); }
.casella-data-griglia button.scelto { background: var(--nero); color: var(--bianco); }
.casella-data-griglia button:disabled { color: var(--bordo); cursor: default; }
.casella-data-griglia button:focus-visible,
.casella-data-testa button:focus-visible,
.casella-data-piede button:focus-visible { outline: 2px solid var(--nero); outline-offset: 1px; }
.casella-data-piede { display: flex; justify-content: space-between; margin-top: 6px; }
.casella-data-piede button {
    min-height: var(--h-comando); padding: 0 10px; border: 0; background: transparent;
    color: var(--nero); font: inherit; text-decoration: underline; cursor: pointer;
}

/* La casella del giorno nella barra del Calendario, alta come i pulsanti accanto. */
.casella-data-barra { width: 13rem; }
.casella-data-barra .casella-data-casella input { height: var(--h-comando); }
/* Sul telefono, nella striscia dei giorni: l icona riempie la sua tessera. */
.tessera-calendario--data .casella-data-icona { width: 100%; height: 100%; border: 0; background: transparent; }

/* L orologio di SceltaOra si tocca (30 ottobre 2026): il pulsante sta sopra l icona disegnata
   dallo sfondo del campo, e apre l elenco delle mezz ore al centro dello schermo. */
.ora-segmenti { position: relative; }
.ora-apri {
    position: absolute; top: 0; right: 0; bottom: 0; width: 2.5rem;
    border: 0; border-radius: 0 var(--raggio) var(--raggio) 0; background: transparent; cursor: pointer;
}
.ora-apri:disabled { cursor: default; }
.ora-apri:focus-visible { outline: 2px solid var(--nero); outline-offset: -4px; }
.casella-ora-elenco {
    position: fixed; z-index: 61; top: 50%; left: 50%; transform: translate(-50%, -50%);
    width: 312px; max-width: calc(100vw - 32px); max-height: calc(100vh - 32px); overflow-y: auto;
    padding: 12px; background: var(--bianco); border: 1px solid var(--bordo);
    border-radius: var(--raggio); box-shadow: var(--ombra);
}
.casella-ora-elenco > strong { display: block; margin: 4px 4px 10px; font-weight: 600; }
.casella-ora-griglia { display: grid; grid-template-columns: repeat(4, 1fr); gap: 4px; }
.casella-ora-griglia button {
    height: 40px; border: 1px solid var(--bordo); border-radius: var(--pillola);
    background: var(--bianco); color: var(--nero); font: inherit; cursor: pointer;
}
.casella-ora-griglia button:hover { background: var(--spento); }
.casella-ora-griglia button.scelto { background: var(--nero); border-color: var(--nero); color: var(--bianco); }
.casella-ora-griglia button:focus-visible { outline: 2px solid var(--nero); outline-offset: 1px; }

/* ── Lo spostamento chiede conferma (26 ottobre 2026, T3) ────────────────────────────────
   La domanda sta DENTRO la barra dello spostamento, che è ferma in vista (vedi .barra-spostamento): chi ha scorso
   fino alle 18 per toccare l'ora la legge senza tornare in cima, al computer come sul telefono. Le frasi sono in
   CalendarioInFrasi.DomandaSpostamento; qui solo le distanze e la riga del rifiuto.

   SOLO TOKEN CHE C'ERANO: nessun colore, ombra o raggio nuovo, nessuna transizione. Distanze a multipli di 0,25rem.
   Niente scatola dentro la scatola (DESIGN.md §3): la barra è già sabbia, e la domanda è testo nero su sabbia
   (12,74:1) con due pulsanti sotto, non un riquadro. «Sì, sposta» è .pulsante (pallina col bordo nero, 48px) e
   «Scegli un'altra ora» è .bottone-oggi (44px): due bersagli sopra il pavimento del §4. */
.barra-spostamento .spostamento-domanda {
    flex: 1 1 100%;
    display: flex;
    flex-direction: column;
    gap: 0.5rem;
}

/* Un indirizzo lungo non ha un punto dove spezzarsi (vedi .conferma-scheda p): va a capo comunque, o la barra
   scorrerebbe di lato. Un solo rientro: nessuno, il testo parte dal bordo della barra come il resto. */
.spostamento-domanda p {
    margin: 0;
    font-size: 0.9rem;
    color: var(--nero);
    overflow-wrap: anywhere;
}

/* I due pulsanti uno accanto all'altro dove ci stanno (computer), uno sotto l'altro dove no (a 360px la barra ha
   314px, e due basi da 11rem — 165px l'una — non ci stanno insieme: «Scegli un'altra ora» in una colonna da 144 andrebbe
   a capo dentro la pillola). .pulsante è width: 100% di suo: qui la larghezza la decide il flex, con un tetto perché su
   un monitor largo due pillole da 540px non servono. Sul telefono la base è il testo (più sotto). */
.spostamento-comandi {
    display: flex;
    flex-wrap: wrap;
    gap: 0.5rem;
}

.spostamento-comandi > button {
    flex: 1 1 11rem;
    width: auto;
    max-width: 16rem;
}

/* Il rifiuto del server («Lì c'è già una prenotazione»): una riga nera sopra, che separa senza scatole (§3), e il
   grassetto — il colore da solo non dice «attenzione» (§7), e sul sabbia tutto è nero (§1: il rosso degli errori sul sabbia scende sotto i 4,5:1). */
.barra-spostamento .spostamento-errore {
    flex: 1 1 100%;
    margin: 0;
    padding-top: 0.5rem;
    border-top: 1px solid var(--nero);
    font-weight: 700;
    color: var(--nero);
    overflow-wrap: anywhere;
}

/* ── La barra ferma non deve mangiare lo schermo di un telefono (27 ottobre 2026) ──────────────────────────────────────
   Calcolato sul foglio a 360px (DESIGN.md §4) e poi MISURATO con Chrome sul markup vero della barra e dell'intestazione
   (pagina statica, iframe della larghezza vera, Inter vera): barra in alto 52, barra dello spostamento col suo padding, la
   spunta e «Lascia dov'è» su due righe (non stanno insieme in 314), la domanda di 5 righe (101), i due pulsanti uno sotto
   l'altro (103: due basi da 165 non stanno in 314), i nomi dei campi 64: 461px FERMI a 360 (338 di barra + 64 + 7,5 + 52),
   su ~560 visibili e 94 coperti dalla barra in basso. Restavano ~85px di tabellone, e la cornice della mezz'ora toccata
   finiva sotto la barra. Anche PRIMA di toccare, con le istruzioni e la nota sotto la spunta, il blocco fermo era 334px.
   Qui sotto i 739px, quattro cose, tutte con i token e le classi che c'erano:
   1. la spunta e «Lascia dov'è» sulla STESSA riga: la spunta prende lo spazio che resta e la sua etichetta va a capo
      («Avvisa il cliente / per email»);
   2. i due pulsanti sulla stessa riga: la base è il loro testo, non 11rem (misurato: a 320, dove i comandi sono larghi 274,
      stanno già affiancati, quindi il margine è ampio; due basi da 11rem non ci stanno nemmeno a 360);
   3. la nota sotto la spunta non si scrive (la spunta dice già cosa fa, e la domanda lo dice per esteso prima del «Sì»;
      resta nel DOM, e aria-describedby la legge lo stesso);
   4. con la domanda aperta i NOMI DEI CAMPI non stanno fermi (.tab-testata--domanda, messa dalla pagina): la domanda dice
      già campo e ora, e sono 64px. Succede anche in orizzontale su un telefono (poca altezza, qualunque larghezza).
   Le scelte 3 e 4 — la nota sotto la spunta non scritta e i nomi dei campi non fermi con la domanda aperta, al telefono —
   sono confermate dal committente (27 ottobre 2026).
   Misurato dopo (rimisurato il 27 ottobre 2026: la prima cifra, 274 a 360, valeva solo da 375 in su): con la domanda aperta e i
   nomi dei campi nascosti la testata fa 242px da 320 a 370, dove la frase della domanda va su 5 righe da 20,25 (101px) in 314
   utili, e 222px da 375 in su, dove le righe sono 4. Con la barra in alto da 52 il blocco fermo scende quindi da 461 a ~294px a
   360 (lo stesso da 320 a 370), a ~274 a 375 e 390; prima di toccare, da 334 a 265. Con i nomi dei campi sono ~297 fra 740 e 900
   e ~286 a 1280. Su un 360×640 restano ~250px di tabellone (640 − 294 − 94 della barra in basso), cioè
   ~170 sui ~560 visibili: prima ~85. Un indirizzo email lungo porta la domanda a 6 righe e il blocco a ~314. In orizzontale
   (640×300) la barra ha il suo tetto e scorre dentro di sé. DA RIGUARDARE sulla pagina vera a 360, 390 e 640×360: la misura è
   di una pagina statica col markup vero, non del gestionale in esecuzione. */
@media (max-width: 739px) {
    .barra-spostamento { column-gap: 0.5rem; }

    .barra-spostamento .spunta-mail {
        flex: 1 1 10rem;
        min-width: 0;
    }

    .barra-spostamento .spunta-mail .aiuto-pannello { display: none; }

    .spostamento-comandi > button {
        flex: 1 1 auto;
        max-width: none;
    }
}

@media (max-width: 739px), (max-height: 520px) {
    .tab-testata--domanda .tab-angolo,
    .tab-testata--domanda .tab-testa { display: none; }

    .tab-testata--domanda .barra-spostamento { --tab-nomi-h: 0px; }
}

/* ══ ACCESSI, 29 OTTOBRE 2026 ═══════════════════════════════════════════════════════════
   La pagina Accessi sulla forma di Clienti (docs/ACCESSI-PIANO.md, «La grafica»): una testata con la pista
   Attivi/Spenti, un elenco di righe-bottone, la scheda in una .finestra. UN BLOCCO SOLO, e ogni passo del piano lo
   allunga qui sotto: le righe di Clienti e del giro A non si toccano, e le classi della pagina non si spargono per il
   foglio. Dopo di lui, in fondo al file, viene soltanto il blocco di Maestri (passo 8), con la sua intestazione: chi
   allunga questo scrive prima di quello. La bozza di queste regole, vista da Marco sul suo telefono, è
   docs/anteprime/accessi.html.

   ⚠️ SOLO TOKEN CHE C'ERANO: nessun colore, nessuna ombra, nessun raggio nuovo, nessuna transizione (DESIGN.md §1, §3,
   §6). Il blocco sta in coda al foglio, dentro la fetta che due prove del tabellone leggono fino a fine file
   (TabelloneNelFoglioTest): un esadecimale o una transizione qui farebbe cadere la prova di un'altra funzione.

   Si riusa quasi tutto: .testata-calendario, .scelta-vista, .elenco-clienti, .collegamento-riga, le etichette dei ruoli e
   dello stato, la .finestra con le sue sezioni. Qui c'è solo ciò che mancava.
   ═════════════════════════════════════════════════════════════════════════════════════ */

/* ── Passo 3 · La testata: titolo, frase, pista, «+ Nuovo accesso» ────────────────────────
   La griglia di .testata-clienti senza la ricerca: la sua prima colonna è riservata alla casella (10-26rem) e qui
   resterebbe vuota. Sul computer la pista e il comando stanno sotto il titolo, uno accanto all'altro; sotto i 739px (la
   soglia della testata di Clienti) il comando sale accanto al titolo e la pista prende tutta la riga, con le due scelte
   larghe uguali. .testata-calendario sta sullo stesso elemento: il suo margine sotto è quello di ogni testata.

   La nota della pista non ha un'area sua: un'area vuota resta una riga alta zero con il suo spazio sopra, e la testata
   sarebbe più bassa solo quando il filtro è spento. Va a capo da sé, su tutta la larghezza, solo quando c'è. */
.testata-accessi {
    display: grid;
    grid-template-columns: auto auto minmax(0, 1fr);
    grid-template-areas:
        "titolo titolo titolo"
        "frase  frase  frase"
        "pista  nuovo  .";
    align-items: center;
    gap: 0.75rem 1rem;
}

.testata-accessi > h1 { grid-area: titolo; margin: 0; }
.testata-accessi > .frase-testata { grid-area: frase; margin: 0; font-size: 0.9rem; color: var(--testo); }
.testata-accessi > .scelta-vista { grid-area: pista; justify-self: start; }
.testata-accessi > .nuovo-accesso { grid-area: nuovo; justify-self: start; white-space: nowrap; }
.testata-accessi > .nota-filtro { grid-column: 1 / -1; margin: 0; }

@media (max-width: 739px) {
    .testata-accessi {
        grid-template-columns: minmax(0, 1fr) auto;
        grid-template-areas:
            "titolo nuovo"
            "frase  frase"
            "pista  pista";
        row-gap: 0.5rem;
    }

    .testata-accessi > h1 { margin-bottom: 0.25rem; }
    .testata-accessi > .nuovo-accesso { justify-self: end; margin-bottom: 0.25rem; }
    .testata-accessi > .scelta-vista { justify-self: stretch; display: flex; }
    .testata-accessi > .scelta-vista .bottone-vista { flex: 1 1 0; min-width: 0; padding-inline: 0.5rem; }
}

/* Una frase sopra l'elenco («Non so chi sei…», «Non riesco a leggere chi non ha più un accesso»): lo stacco lo dà questa
   riga, perché .nota-pannello chiude a margine zero. */
.nota-sopra-elenco { margin: 0 0 0.75rem; }

/* ── Passo 3 · L'elenco: la tabella di Clienti con le larghezze di Accessi ─────────────────
   Le celle VANNO A CAPO: la regola di Clienti le tiene su una riga (nowrap), perché portano numeri e date, e qui portano
   frasi intere («Su misura: Gestire le sue lezioni, più: incassi delle sue lezioni»). Le larghezze sono quelle della tavola
   A2-Elenco-computer.

   ⚠️ LA SOGLIA È 640px, come Clienti, FINCHÉ LA MISURA NON DICE ALTRO. Fisse ha dovuto salire a 739 perché le sue colonne non
   vanno a capo; queste sì, e un indirizzo lungo si spezza (overflow-wrap) invece di allargare la tabella. Da guardare a 641,
   700 e 739px con le email e le frasi più lunghe: se la tabella scorre di lato, la soglia sale a 739 per questa pagina, con
   regole del telefono sue come quelle di .tabella-fisse (le righe-bottone di Clienti valgono sotto i 640px per tutte le
   pagine che usano .elenco-clienti, e non si spostano per una sola). */
.elenco-clienti.elenco-accessi .colonna-nome { width: 22%; }
.elenco-clienti.elenco-accessi .colonna-ruoli { width: 24%; }
.elenco-clienti.elenco-accessi .colonna-cosa { width: 30%; }
.elenco-clienti.elenco-accessi .colonna-accesso { width: 24%; }

.elenco-clienti.elenco-accessi td:not(:first-child) { white-space: normal; }

/* Il nome e le etichette di una riga stanno insieme: sul computer il nome e «tu» (lo stato ha la sua colonna), sul telefono
   anche lo stato, perché le altre celle spariscono. */
.elenco-accessi .testa-riga {
    display: flex;
    flex-wrap: wrap;
    align-items: center;
    gap: 0.25rem 0.5rem;
    min-width: 0;
}

.elenco-accessi .testa-riga .etichetta-ruolo,
.elenco-accessi .testa-riga .etichetta-accesso { margin: 0; }

.elenco-accessi .cella-ruoli .etichetta-ruolo { margin-bottom: 0.25rem; }

/* «Cosa può fare» è il dato di quella colonna: nero, come il nome. In una riga spenta torna al colore del contorno, come
   tutta la riga (.riga-spenta). */
.elenco-accessi .cosa-riga { color: var(--nero); }
.elenco-accessi .riga-spenta .cosa-riga { color: var(--testo); }

.elenco-accessi .dettaglio-accesso { margin-top: 0.125rem; overflow-wrap: anywhere; }

/* Lo stato dentro il bottone è del telefono: sul computer ha la sua colonna, e display:none lo toglie anche dal nome del
   bottone. */
.elenco-accessi .stato-riga { display: none; }

@media (max-width: 640px) {
    .elenco-accessi .testa-riga { grid-column: 1; grid-row: 1; }
    .elenco-accessi .stato-riga { display: inline-block; }

    /* ⚠️ «Ruoli · Cosa può fare» INTERA, A CAPO QUANTE VOLTE SERVE E MAI CON I PUNTINI (29 ottobre 2026, risposta di Marco
       guardando l'anteprima). Clienti la limita a due righe (-webkit-line-clamp: 2) perché il suo riassunto è un elenco di
       dati; qui il taglio cadrebbe dentro «Su misura: …, più: …» o dentro «da maestro: …», cioè proprio sulla cosa che si
       cerca. Di solito sono due righe; tre per chi è segreteria e maestro, la cui frase arriva a circa 140 caratteri. */
    .elenco-accessi .riassunto-riga {
        display: block;
        -webkit-line-clamp: none;
        line-clamp: none;
        overflow: visible;
    }
}

/* ── Passo 3 · La scheda in lettura ───────────────────────────────────────────────────────
   La .finestra di Clienti (la classe .finestra-cliente le dà già i campi e il titolo): qui solo ciò che le frasi di Accessi
   chiedono in più.

   ⚠️ I VALORI IN GRASSETTO VANNO A CAPO. .frase-regola strong è nowrap («un valore si legge intero o non si legge»), pensato
   per «08:00» e «1 ora e mezza»; nella scheda i valori sono frasi — «Su misura: Gestire le sue lezioni, più: incassi delle sue
   lezioni» —, e in nowrap escono dalla finestra e fanno scorrere di lato il corpo (misurato nell'anteprima). */
.finestra-accessi .frase-regola strong { white-space: normal; overflow-wrap: anywhere; }

.riepilogo-accesso { margin-top: 0.75rem; }

/* Il titolo di una sezione sta nella riga alta come un comando (.capo-regola): sotto ci vuole un respiro, che quella riga
   senza il suo pulsante non dà. Le due etichette «Ruoli» e «Cosa può fare» stanno una sopra l'altra: la seconda si stacca. */
.finestra-accessi .sezione-scheda > .capo-regola { margin-bottom: 0.25rem; }
.finestra-accessi .sezione-scheda .titolo-foglio ~ .titolo-foglio { margin-top: 0.75rem; }

/* Lo storico delle deleghe: una riga per cambio, sotto il pulsante che lo apre. */
.storico-deleghe p + p { margin-top: 0.25rem; }

.riprova-deleghe { margin-top: 0.5rem; }

/* ── Passo 8 · La sua lezione ─────────────────────────────────────────────────────────────
   Una frase e la sua nota dentro una .sezione-scheda senza titolo — la frase comincia con «La sua lezione:», e un titolo sopra la
   ripeterebbe —, separata dalle altre da una riga, come ogni sezione. La nota sta attaccata alla frase, com'è nell'anteprima che
   Marco ha visto (docs/anteprime/accessi.html); e quando la lezione non si legge la nota di guasto è la prima cosa della sezione,
   e senza questa regola staccherebbe dalla riga più di quanto faccia la frase. «Apri Maestri» è .collegamento-nota, che porta già
   il suo bersaglio da 44px, e la regola che segue gli dà lo spazio che quel bersaglio chiede. Solo distanze: nessun colore, nessuna
   ombra, nessuna transizione. */
.sezione-lezione > .nota-pannello { margin-top: 0; }

/* ⚠️ «APRI MAESTRI» STA A RIGA PROPRIA SOTTO LA NOTA, E IL SUO BERSAGLIO ESCE DALLA RIGA (revisione del 29 ottobre 2026).
   .collegamento-nota prende i 44px col padding e li compensa con un margine negativo: la riga resta alta uguale, ma l'area esce di
   (44 - 1lh) / 2 = 10,75px sopra e sotto, e il contorno del fuoco (3px, a 2px di distanza) di altri 5. In mezzo a una frase non pesa;
   sotto un paragrafo e sopra la riga di una sezione sì. Misurato con Chrome sul foglio vero e su Inter vera, a 360, 375, 700 e 1280px:
   il contorno cominciava 15,75px dentro l'ultima riga della nota, con la barra in cima sopra le lettere (da 700px in su, con la nota su
   una riga sola, anche quella di destra, che tagliava «Maestri»); 11,5px dei 18 di quella riga rispondevano al collegamento, quindi un
   tocco sulla nota portava fuori dalla finestra; e il contorno toccava di 0,75px la riga della sezione che segue.
   Qui il margine di sopra è +0,5rem al posto dei -10,75px e quello di sotto -0,5rem: il contorno sta a 2,5px dalla nota e a 2,5px dalla
   riga sotto, l'area non copre più niente, e la riga del collegamento è alta i suoi 44px (21,5px più di prima). Multipli di 0,25rem; solo
   distanze, nessun colore, nessuna ombra, nessuna transizione. Il selettore vuole il collegamento figlio diretto della sezione. */
.sezione-lezione > .collegamento-nota { margin-top: 0.5rem; margin-bottom: -0.5rem; }

/* ── Passo 4 · I comandi dell'accesso ─────────────────────────────────────────────────────
   Nella sezione «Accesso al gestionale» della scheda: un comando per riga, con la sua nota. Sul computer il pulsante e la
   nota stanno affiancati (il pulsante da 11 a 14rem, la nota prende il resto), sul telefono uno sopra l'altra. Il pulsante è
   .bottone-oggi a tutta la sua colonna (44px, mai sotto) e la nota è .nota-pannello. La bozza, vista da Marco sul suo
   telefono, è docs/anteprime/accessi.html.

   Il gruppo è una griglia a una colonna con il suo respiro: lo stacco fra due comandi, e fra l'ultimo e la chiusura («In tutti
   i casi quello che ha fatto resta.»), lo dà il gap e non il margine delle note. La domanda in linea (.conferma-scheda con
   .comandi-data, lo schema del Calendario) sta nella stessa colonna, al posto della riga del suo comando: le sue regole sono
   quelle che c'erano, qui solo il margine che il gap sostituisce. */
.gruppo-comandi-accesso {
    display: grid;
    gap: 0.75rem;
    margin-top: 0.75rem;
}

.gruppo-comandi-accesso > .nota-pannello,
.gruppo-comandi-accesso > .conferma-scheda { margin: 0; }

.comando-accesso {
    display: grid;
    grid-template-columns: minmax(11rem, 14rem) minmax(0, 1fr);
    gap: 0.25rem 1rem;
    align-items: center;
}

.comando-accesso > .nota-pannello { margin: 0; }

@media (max-width: 640px) {
    .comando-accesso { grid-template-columns: minmax(0, 1fr); }
}

/* ── Passo 5 · «Nuovo accesso» e la finestra del collegamento ─────────────────────────────
   Le due finestre nuove sono la .finestra della scheda, con le sue regole (velo, capo, corpo che scorre, piede fermo,
   .avviso-finestra, .motivo-finestra, .uscita-finestra): qui solo ciò che mancava. La bozza, vista da Marco sul suo telefono,
   è docs/anteprime/accessi.html. */

/* L'apertura di «Nuovo accesso» è la prima cosa del corpo: senza il respiro che .nota-pannello mette sopra. Quello fra lei e i
   campi è di sempre (.nota-pannello + .coppia-campi). */
.finestra-nuovo .corpo-finestra > .nota-apertura { margin-top: 0; }

/* I due pulsanti del collegamento («Copia il collegamento», «Chiudi») e quelli di «Hai lasciato a metà» («Resta», «Esci senza
   salvare») sono lunghi: a 375px due colonne da 10rem (la base di .piede-a-capo) li spezzavano su due righe dentro una pillola
   alta 58-75px, misurato nell'anteprima. Con 13rem di base vanno uno sotto l'altro finché non c'è posto per tutti e due interi,
   e stanno affiancati nella finestra da computer.

   ⚠️ 13rem E NON 12 (chiusura del giro del 29 ottobre 2026, la stessa correzione del piede di «Cambia» più sotto). Qui html sta a
   15px: 12rem sono 180px, e «Copia il collegamento» ne vuole circa 187, quindi fra 432 e 445px di schermo — quando i due pulsanti
   si affiancano — l'etichetta andava su due righe, in una pillola alta 74,5px invece di 52. Con 13rem (195px) sta su una riga a ogni
   larghezza provata, e i due pulsanti vanno uno sotto l'altro fino a 461px e stanno affiancati da 462. Misurato dal revisore del
   piede di «Cambia» con Chrome senza finestra, il foglio vero e Inter, sul markup del piede trascritto a mano: non è la pagina viva,
   e la conferma sul telefono resta da fare dal vivo. È un numero tarato sul testo: se un'etichetta si allunga si allunga anche la base. */
.piede-finestra.piede-a-capo.piede-due-comandi > * { flex: 1 1 13rem; }

/* Il rifiuto della creazione con «Apri la sua scheda» sotto: la frase è l'avviso (role="alert"), il pulsante un comando a parte, a
   tutta la larghezza come quelli della scheda. .avviso-finestra dà già il filetto sopra e nessun raggio. */
.avviso-con-comando > p { margin: 0; }
.avviso-con-comando > .bottone-oggi { margin-top: 0.5rem; }

/* Il collegamento è lungo e senza spazi: nel campo si legge l'inizio, e i puntini dicono che c'è dell'altro (si copia per intero). */
.campo-collegamento input { text-overflow: ellipsis; }

/* Sotto la frase che dice con quale indirizzo entrerà (una .frase-regola) il campo ha lo stesso stacco che .nota-pannello +
   .campo-pannello dà dopo una nota: qui non scatta, perché la frase non è una nota. Senza, l'etichetta resta attaccata al testo. */
.frase-regola + .campo-collegamento { margin-top: 0.75rem; }

/* ── I livelli pronti: un elenco a scelta singola (SceltaDeleghe) ─────────────────────────
   Scelto da Marco il 29 ottobre 2026 guardando l'anteprima (docs/ACCESSI-PIANO.md, domanda 3, risposta B): «forse mi piace più
   così graficamente la parte dei permessi». Righe a tutta larghezza una sotto l'altra, divise da un filo: a sinistra un cerchio da
   20px, a destra il nome in grassetto e sotto la frase intera. UNA FORMA SOLA, a ogni larghezza e dovunque si sceglie un livello
   (Nuovo accesso, Cambia, Dai di nuovo l'accesso). Prima erano pillole affiancate con la frase sotto (.livelli-deleghe, tolta):
   un'eccezione a DESIGN.md §3 che non risultava approvata.

   ⚠️ LO STATO NON LO DICE IL COLORE DA SOLO (DESIGN.md §7): lo scelto è il cerchio pieno di nero col pallino color pallina dentro
   (come i selettori del sito, DESIGN.md §1), e il nero pieno regge anche stampato in bianco e nero. Il pallino è un segno piccolo
   sul nero, non testo sul bianco: la pallina come testo sul bianco non si fa mai (1,42:1).

   Il bersaglio è tutta la riga (44px, mai sotto). Il filo sotto l'ultima riga non c'è: sotto c'è la nota o il dettaglio. Lo
   scelto non risponde al passaggio del mouse, come ogni «sei qui». Il passaggio si vede nel cerchio, che si scurisce del 5%: su
   un elemento trasparente il filtro agisce sul disegno (DESIGN.md §5). */
.scelta-singola { display: flex; flex-direction: column; }

.voce-singola {
    display: grid;
    grid-template-columns: 20px minmax(0, 1fr);
    column-gap: 0.75rem;
    align-items: start;
    width: 100%;
    min-height: var(--h-comando);
    padding: 0.625rem 0;
    background: none;
    border: 0;
    border-bottom: 1px solid var(--bordo);
    text-align: left;
    font-family: inherit;
    cursor: pointer;
}

.voce-singola:last-child { border-bottom: 0; }

.voce-singola:not([aria-pressed="true"]):hover { filter: brightness(0.95); }

.voce-singola .segno {
    grid-row: 1 / span 2;
    width: 20px;
    height: 20px;
    margin-top: 0.125rem;
    border: 2px solid var(--nero);
    border-radius: 50%;
    background: var(--bianco);
}

.voce-singola[aria-pressed="true"] .segno { position: relative; background: var(--nero); }

.voce-singola[aria-pressed="true"] .segno::after {
    content: "";
    position: absolute;
    inset: 4px;
    border-radius: 50%;
    background: var(--pallina);
}

.voce-singola .nome-voce { font-size: 0.95rem; font-weight: 700; color: var(--nero); }

.voce-singola .frase-voce { font-size: 0.8rem; line-height: 1.4; color: var(--testo); }

/* ── Passo 6 · «Cambia» ruoli e deleghe ───────────────────────────────────────────────────
   Il modulo prende il posto delle due righe in lettura («Ruoli», «Cosa può fare») dentro la stessa .sezione-scheda: un titolo, la
   spiegazione, i tre ruoli, ciò che si perde, i livelli (SceltaDeleghe, con le regole qui sopra) e il piede. Si riusa quasi tutto:
   .gruppo-deleghe e .interruttore (le caselle dei ruoli, come in «Nuovo accesso»), .nota-pannello, .piede-regola (il piede di una
   scheda aperta, quello di Circolo), .pulsante e .bottone-oggi. La bozza, vista da Marco sul suo telefono, è
   docs/anteprime/accessi.html. Solo distanze, tutte multipli di 0,25rem. */

/* I tre ruoli stanno sotto la spiegazione con un respiro: una legend e tre caselle da 44px non vogliono essere attaccate a una nota. */
.sezione-scheda > .gruppo-ruoli-modulo { margin-top: 0.75rem; }

/* «Cosa potrà fare» apre la seconda metà del modulo: un titolo di sezione, con più aria sopra che sotto. Due classi perché
   `.sezione-scheda > .titolo-sezione` (margine sotto di 0,25rem) altrimenti vince. */
.sezione-scheda > .titolo-cosa-modulo { margin: 1rem 0 0.5rem; }

/* ── Passo 9 · «Dai di nuovo l'accesso» ───────────────────────────────────────────────────
   Lo stesso modulo di «Cambia», ma nella sezione dell'accesso e non in quella dei ruoli: sta nel gruppo dei comandi al posto del
   pulsante che lo apre, come una domanda in linea. Le due regole qui sopra e il margine dei titoli sono scritte per i figli DIRETTI di
   .sezione-scheda, e qui il modulo ha un contenitore: si ripetono per lui, con le stesse distanze. Una riga sopra lo stacca dai comandi
   che lo precedono, come le sezioni della scheda, e non una scatola (DESIGN.md §3). Solo token e distanze, tutte multipli di 0,25rem.
   min-width: 0 perché è una cella del gruppo (una griglia): senza, una riga che non si spezza la allargherebbe oltre la finestra. */
.modulo-dai {
    min-width: 0;
    padding-top: 1rem;
    border-top: 1px solid var(--bordo);
}

.modulo-dai > .titolo-sezione { margin: 0 0 0.25rem; }
.modulo-dai > .frase-regola { margin-top: 0.5rem; }
.modulo-dai > .gruppo-ruoli-modulo { margin-top: 0.75rem; }
.modulo-dai > .titolo-cosa-modulo { margin: 1rem 0 0.5rem; }

/* Il piede del modulo (.piede-regola) ha due pulsanti e una frase sopra. A 375px «Salva ruoli e deleghe» in una colonna da 10rem
   andava su due righe, in una pillola alta 75px (misurato nell'anteprima): con 13rem di base i due pulsanti vanno uno sotto l'altro
   finché non c'è posto per tutti e due interi, e stanno affiancati nella finestra da computer. La frase che dice cosa succede
   salvando occupa tutta la riga, SOPRA il pulsante corto, e in nero: è la cosa da leggere prima di toccarlo.

   ⚠️ LA BASE È 13rem E NON 12 (revisione dei passi 6 e 7, 29 ottobre 2026). Qui html sta a 15px: 12rem sono 180px, e l'etichetta
   più lunga, «Salva ruoli e deleghe», ne vuole 181,3 (il testo 151,8, più 25,5 di imbottitura e 4 di bordo). Fra 432 e 434px di
   schermo il corpo della finestra misura 368-370px, i due pulsanti si affiancavano a 180,3-181,3px e l'etichetta andava su due
   righe, in una pillola alta 74,5px invece di 52. Con 13rem (195px) stanno uno sotto l'altro fino a 461px e affiancati da 462, e da
   360px in su un pulsante non è mai più stretto della sua etichetta. È un numero tarato sul testo: se l'etichetta si allunga si
   allunga anche la base (PaginaAccessiPassi67Test lo ricorda). Misurato con Chrome senza finestra, il foglio vero e Inter, sul markup
   del piede trascritto a mano — dal revisore, e di nuovo in questa copia su 24 larghezze fra 320 e 1280px: con 12rem va su due righe
   a 432-434px, con 13rem a nessuna. Non è la pagina viva: la conferma sul telefono resta da fare dal vivo. */
.piede-regola.piede-modulo > * { flex: 1 1 13rem; }
.piede-regola.piede-modulo > .frase-salva { flex: 1 1 100%; color: var(--nero); }

/* ─────────────────────────────────────────────────────────────────────────────────────
   MAESTRI, 29 OTTOBRE 2026
   La pagina Maestri ridisegnata (docs/ACCESSI-PIANO.md, passo 8, «Maestri ridisegnata»): una tabella con il nome, la lezione col suo
   «Cambia» accanto, il livello sul calendario e, a chi legge gli accessi, lo stato; il prezzo si cambia in una finestra, quella di
   Clienti. UN BLOCCO SUO, IN FONDO AL FILE, DOPO QUELLO DI ACCESSI: chi allunga il blocco di Accessi scrive prima di questo. La bozza,
   vista da Marco sul suo telefono, è docs/anteprime/maestri.html.

   ⚠️ SOLO TOKEN CHE C'ERANO: nessun colore, nessuna ombra, nessun raggio nuovo, nessuna transizione (DESIGN.md §1, §3, §6). Il blocco
   sta in coda al foglio, dentro la fetta che le prove del tabellone e quelle di Accessi leggono fino a fine file: un esadecimale o una
   transizione qui farebbe cadere la prova di un'altra funzione. Qui dentro non c'è niente che non sia un'unità di spazio o un token.

   Le classi nuove: .testata-maestri; .elenco-maestri (con .con-cambia se almeno una riga ha «Cambia», e .con-accesso se chi guarda legge
   gli accessi); .riga-maestro; .colonna-lezione e .colonna-cambia; le celle .cella-nome, .cella-lezione, .cella-cambia,
   .cella-riepilogo, .cella-cosa e .cella-accesso; .testa-nome, .nome-maestro, .prezzo-lezione e .senza-prezzo; .note-maestri e
   .vuoto-maestri; .finestra-prezzo. Si riusa il resto senza toccarlo: .testata-calendario, .spiegazione-pagina, .area-calendario,
   .contenitore-griglia con .contenitore-clienti (sul telefono tolgono lo scorrimento di lato), table.elenco, .dettaglio-riga,
   .etichetta-accesso e .etichetta-ruolo, .bottone-oggi, .pulsante, .campo-pannello, .nota-pannello, .avviso-errore, .avviso-salvato,
   .stato-salvataggio, .segnaposto, .collegamento-nota, .solo-lettori e, per la finestra, .velo-modale, .finestra, .capo-finestra,
   .corpo-finestra, .piede-finestra e .chiudi-pannello.
   ───────────────────────────────────────────────────────────────────────────────────── */

/* ── La testata: il titolo e una frase. Lo stacco fra i due si stringe, come in Circolo. ── */
.testata-maestri h1 { margin-bottom: 0.25rem; }

/* ── L'elenco sul computer ──────────────────────────────────────────────────────────
   Maestro · la sua lezione · «Cambia» · sul calendario · accesso. Due colonne sono facoltative:
   - «Cambia» sta nella colonna SUBITO dopo il prezzo che cambia (la sua intestazione è «Comandi», visibile solo ai lettori di
     schermo) e c'è solo se almeno una riga ha il comando;
   - «Accesso» c'è solo se chi guarda può leggere gli accessi. A chi non li legge il server non manda lo stato, e una colonna di
     «—» si leggerebbe «non ha accesso», ed è falso (come «Da incassare» in Clienti: un numero che non arriva sparisce, non diventa zero).
   Le larghezze cambiano con le colonne che ci sono. Sono percentuali di tabella, cioè un'indicazione: la somma non fa sempre cento
   (con Accesso e senza «Cambia» fa 100; senza Accesso e senza «Cambia» fa 96; con «Cambia» la lezione e il comando si stringono al
   loro contenuto) e la tabella divide ciò che resta. */
.elenco-maestri .colonna-nome { width: 26%; }
.elenco-maestri .colonna-cosa { width: 22%; }
.elenco-maestri.con-accesso .colonna-accesso { width: 30%; }
.elenco-maestri:not(.con-accesso) .colonna-nome { width: 38%; }
.elenco-maestri:not(.con-accesso) .colonna-cosa { width: 36%; }
.elenco-maestri:not(.con-cambia) .colonna-lezione { width: 22%; }

table.elenco.elenco-maestri td { padding-top: 0.375rem; padding-bottom: 0.375rem; }

/* DUE LIVELLI DI TESTO, non tre. Il primo è nero e in grassetto ed è ciò che si cerca: il nome e, un gradino sopra, il prezzo,
   che è la risposta (0,9rem e 1rem). Il secondo è grigio e piccolo ed è ciò che accompagna: il telefono, «il più vicino», l'email,
   «Lo cambia un'altra persona» (0,8rem). Restano pieni solo la pillola dello stato e «Cambia». Il nome non è un bottone, quindi
   non è sottolineato. Sulla riga di chi guarda «tu» sta accanto al nome (come in Accessi) e va a capo con lui. */
.elenco-maestri .testa-nome { display: flex; flex-wrap: wrap; align-items: center; gap: 0.125rem 0.5rem; min-width: 0; }
.elenco-maestri .testa-nome .etichetta-ruolo { margin: 0; }
.elenco-maestri .nome-maestro { font-weight: 700; color: var(--nero); overflow-wrap: anywhere; }
.elenco-maestri .dettaglio-riga { font-size: 0.8rem; }

/* Il prezzo non va a capo («38,00 € a lezione» si legge intero o non si legge). «senza prezzo» è uno stato normale (dal 19 ottobre
   2026): grigio, normale, senza etichetta né avviso. */
.elenco-maestri .cella-lezione { white-space: nowrap; }
.elenco-maestri.con-cambia .cella-lezione { width: 1%; }
.elenco-maestri .prezzo-lezione { font-size: 1rem; font-weight: 700; color: var(--nero); }
.elenco-maestri .senza-prezzo { color: var(--testo); }

/* La cella del comando si stringe al comando, e tiene la sua altezza anche vuota: una riga senza «Cambia» (la propria, o di chi non
   si può cambiare) non deve essere più bassa delle altre. Il margine di .bottone-oggi dentro una tabella (0,25rem a destra) qui non serve. */
.elenco-maestri .cella-cambia { white-space: nowrap; height: calc(var(--h-comando) + 0.75rem); }
.elenco-maestri .cella-cambia .bottone-oggi { margin: 0; }

.elenco-maestri .cella-cosa { color: var(--nero); }

/* Lo stato dell'accesso è una pillola: non va a capo (una pillola su due righe diventa un grumo). L'email sì, anche a metà parola, se non ci sta. */
.elenco-maestri .etichetta-accesso { white-space: nowrap; }
.elenco-maestri .cella-accesso .dettaglio-riga { margin-top: 0.125rem; overflow-wrap: anywhere; }

/* Il riassunto «telefono · sul calendario» è del telefono: sul computer il telefono sta sotto il nome e il livello nella sua colonna. */
.elenco-maestri .cella-riepilogo { display: none; }

/* ── Il prezzo in una finestra ──────────────────────────────────────────────────────
   È la .finestra di Clienti così com'è (velo, testata con il titolo e la croce, corpo, piede coi due pulsanti): per un campo solo
   sui 560px di larghezza che ha di suo avanzerebbe metà finestra, e si stringe. Sul telefono resta com'è: appoggiata in
   basso, a tutta larghezza. */
@media (min-width: 641px) {
    .finestra-prezzo { width: min(440px, calc(100vw - 2 * var(--barra-margine))); }
}

/* ── Le note in fondo e l'elenco vuoto ──────────────────────────────────────────────
   Frasi di corpo piccolo: la riga non va oltre 36rem (a 44rem, 660px, erano 100 caratteri), e text-wrap: pretty
   evita la parola sola sull'ultima riga. */
.note-maestri { display: grid; gap: 0.5rem; max-width: 36rem; margin-top: 0.75rem; }
.note-maestri .nota-pannello { margin: 0; text-wrap: pretty; }

/* .segnaposto è centrato, ed è giusto per una frase sola; qui sono due, e DESIGN.md §8 non vuole il testo centrato oltre le due righe. */
.segnaposto.vuoto-maestri { display: grid; justify-items: start; gap: 0.5rem; padding: 1.25rem; text-align: left; }
.vuoto-maestri p { margin: 0; }

/* ── Sul telefono: una scheda per maestro, intera ───────────────────────────────────
   Da 739px in giù, come Calendario e Fisse: fra 641 e 739px cinque colonne con un nome lungo non stanno (a 641 la colonna del nome
   scendeva a 71px e la tabella scorreva di lato). La STESSA tabella con le righe fatte a scheda (come .elenco-clienti, ma qui la riga
   non è un bottone: l'unico comando è «Cambia»).
   Quattro righe: il nome, la lezione (con «Cambia» a destra, alto quanto le due), «telefono · sul calendario» su una riga e, in fondo,
   come entra (solo per chi legge gli accessi). Mai tagliato con i puntini: va a capo quante volte serve. */
@media (max-width: 739px) {
    table.elenco.elenco-maestri,
    table.elenco.elenco-maestri tbody,
    table.elenco.elenco-maestri tr,
    table.elenco.elenco-maestri td { display: block; width: auto; }

    table.elenco.elenco-maestri { background: none; border: 0; border-radius: 0; overflow: visible; }
    table.elenco.elenco-maestri thead { display: none; }
    table.elenco.elenco-maestri tbody { display: flex; flex-direction: column; gap: 0.375rem; }
    table.elenco.elenco-maestri tbody tr:hover { background: var(--bianco); }
    table.elenco.elenco-maestri td { padding: 0; border: 0; }

    table.elenco.elenco-maestri tr.riga-maestro {
        display: grid;
        grid-template-columns: minmax(0, 1fr) auto;
        grid-template-areas:
            "nome      cambia"
            "lezione   cambia"
            "riepilogo riepilogo"
            "accesso   accesso";
        column-gap: 0.5rem;
        row-gap: 0.125rem;
        align-items: start;
        padding: 0.5rem 0.75rem;
        background: var(--bianco);
        border: 1px solid var(--bordo);
        border-radius: var(--raggio);
    }

    /* Nessun «Cambia» su nessuna riga: la colonna del comando non c'è e il suo spazio non si riserva. La regola ha la stessa forza
       di quella di sopra (quattro classi e due tag): con meno, la sua specificità perde e la colonna resta. */
    table.elenco.elenco-maestri:not(.con-cambia) tr.riga-maestro {
        grid-template-columns: minmax(0, 1fr);
        grid-template-areas: "nome" "lezione" "riepilogo" "accesso";
        column-gap: 0;
    }

    .elenco-maestri .cella-nome { grid-area: nome; min-width: 0; }
    .elenco-maestri .cella-nome .dettaglio-riga { display: none; }

    /* width: auto, o il 1% del computer stringerebbe il prezzo a una parola per riga. */
    table.elenco.elenco-maestri td.cella-lezione { grid-area: lezione; width: auto; min-width: 0; white-space: normal; }

    .elenco-maestri .cella-cambia { grid-area: cambia; align-self: center; width: auto; height: auto; }

    .elenco-maestri .cella-riepilogo {
        display: block;
        grid-area: riepilogo;
        margin-top: 0.125rem;
        font-size: 0.8rem;
        color: var(--testo);
        overflow-wrap: anywhere;
    }

    /* La colonna «sul calendario» sta nel riassunto. */
    table.elenco.elenco-maestri td.cella-cosa { display: none; }

    table.elenco.elenco-maestri td.cella-accesso {
        grid-area: accesso;
        display: flex;
        flex-wrap: wrap;
        align-items: center;
        gap: 0.25rem 0.5rem;
        min-width: 0;
        margin-top: 0.25rem;
    }

    .elenco-maestri .cella-accesso .etichetta-accesso { margin: 0; }
    .elenco-maestri .cella-accesso .dettaglio-riga { margin: 0; min-width: 0; }
}
