/* =====================================================================
   DENSO - foglio di stile del template
   =====================================================================

   Sta sopra a Bootstrap 5 e basta: nessun tema di terze parti sotto.

   Bootstrap porta la meccanica - griglia, stati di focus, tendine che si
   posizionano da sole, modali, collapse. Questo foglio porta l'aspetto, e
   lo porta sui nomi di classe che GMCE Design gia' scrive: .table, .card,
   .btn, .form-floating, .form-control. Non c'e' niente da cambiare nel
   generatore.

   Il taglio e' quello di un gestionale: si sta dentro otto ore, si guarda
   una tabella, e ogni pixel speso in decorazione e' una riga di dati in
   meno sullo schermo.

   Misure di riferimento:
       fascia in alto     40px
       binario a sinistra 44px
       riga di tabella    28px
       campo               32px
   ===================================================================== */


/* =====================================================================
   1. I COLORI
   ---------------------------------------------------------------------
   I neutri non sono grigi puri: hanno una punta del colore d'accento
   dentro. Un grigio esatto legge come "non scelto"; questo legge come
   scelto, ed e' l'unica differenza fra i due a occhio nudo.

   L'accento lo riscrive la generazione: e' l'unico colore che il
   progetto puo' cambiare.
   ===================================================================== */

:root{
    --ds-accento:        #405189;
    --ds-accento-tenue:  #eef0f7;
    --ds-accento-scuro:  #33416e;
    --ds-accento-legg:   #33416e;   /* l'accento quando fa da testo */

    /*
     * Nell'anteprima il piano di lavoro e' BIANCO e il binario e le
     * intestazioni sono grigi: il grigio e' la cornice, il bianco e' dove si
     * lavora. Al contrario - foglio grigio con la cornice bianca - la pagina
     * sembra spenta e il binario si stacca dal resto invece di sparire.
     */
    --ds-fondo:      #ffffff;   /* il piano di lavoro */
    --ds-carta:      #ffffff;   /* i riquadri, sul piano */
    --ds-cromo:      #f1f1f4;   /* binario, intestazioni di tabella: la cornice */
    --ds-fascia:     #121116;   /* la barra in alto */

    --ds-filo:       #e2e0e4;   /* i bordi che si vedono */
    --ds-filo-tenue: #edecef;   /* quelli che quasi non si vedono */

    --ds-testo:      #1f1e24;
    --ds-testo-2:    #5d5b66;   /* etichette, roba di servizio */
    --ds-testo-3:    #8a8892;   /* segnaposto, cose spente */

    /* Il colore che dice come sta andando. E' un'altra cosa
       dall'accento: l'accento dice "premi qui", questi dicono "sta
       cosi'". Confonderli e' il modo piu' rapido per rendere una
       tabella illeggibile. */
    --ds-bene:       #1a7f37;  --ds-bene-tenue:    #e9f4ec;
    --ds-attesa:     #9a6700;  --ds-attesa-tenue:  #fdf5e3;
    --ds-male:       #b42318;  --ds-male-tenue:    #fdeceb;
    --ds-info:       #0b6bcb;  --ds-info-tenue:    #e8f1fb;

    /* Il rosso dell'asterisco e' UN'ALTRA COSA dal rosso degli errori.
       --ds-male e' un mattone, scelto per potersi leggere come testo su
       fondo chiaro; a corpo 17 su un asterisco tira all'arancio. Questo
       non deve essere leggibile, deve essere ROSSO. */
    --ds-obbl:       #e01b1b;

    --ds-riga:   28px;
    --ds-campo:  32px;

    --ds-testo-font: system-ui, -apple-system, "Segoe UI", Roboto, "Helvetica Neue", Arial, sans-serif;
}

[data-bs-theme=scuro]{
    --ds-accento:        #93a1d6;
    --ds-accento-tenue:  #2a2937;
    --ds-accento-scuro:  #b3bee6;
    --ds-accento-legg:   #b3bee6;

    --ds-fondo:      #1c1b21;   /* il piano di lavoro */
    --ds-carta:      #1c1b21;
    --ds-cromo:      #26252c;   /* la cornice: qui e' piu' chiara del piano */

    /*
     * --ds-fascia NON si ridefinisce qui, di proposito. Il colore della barra
     * in alto lo decide il progetto - o l'unita' organizzativa su cui si sta
     * lavorando - e non deve cambiare quando uno passa al fondo scuro: e' il
     * segnale che dice "sei in questa azienda, in questa divisione", e un
     * segnale che cambia colore da solo non e' piu' un segnale.
     */

    --ds-filo:       #35333c;
    --ds-filo-tenue: #2b2a31;

    --ds-testo:      #eceaf0;
    --ds-testo-2:    #a9a6b3;
    --ds-testo-3:    #79767f;

    --ds-bene:       #5bbd7a;  --ds-bene-tenue:    #1f2c23;
    --ds-attesa:     #d6a441;  --ds-attesa-tenue:  #2b2519;
    --ds-male:       #e5766a;  --ds-male-tenue:    #2f1e1c;
    --ds-info:       #74aeea;  --ds-info-tenue:    #17202b;
    --ds-obbl:       #ff5a5a;
}

/* Bootstrap lavora con le sue variabili: gliele si riempie con le
   nostre, cosi' i suoi componenti nascono gia' del colore giusto invece
   di essere ridipinti uno per uno. */
:root{
    --bs-body-bg:          var(--ds-fondo);
    --bs-body-color:       var(--ds-testo);
    --bs-body-font-family: var(--ds-testo-font);
    --bs-body-font-size:   13px;
    --bs-border-color:     var(--ds-filo);
    --bs-primary:          var(--ds-accento);
    --bs-link-color:       var(--ds-accento);
    --bs-link-hover-color: var(--ds-accento-scuro);
}


/* =====================================================================
   2. LA PAGINA
   ===================================================================== */

body{
    background: var(--ds-fondo);
    color: var(--ds-testo);
    font-family: var(--ds-testo-font);
    font-size: 13px;
    line-height: 1.45;
    -webkit-font-smoothing: antialiased;
}

h1,h2,h3,h4,h5,h6{ color: var(--ds-testo); font-weight: 600; text-wrap: balance; }
h4{ font-size: 16px; margin: 0 0 8px; }

a{ text-decoration: none; }
a:hover{ text-decoration: underline; }

/* Le cifre incolonnate devono stare incolonnate: senza questo il "1"
   e' piu' stretto degli altri numeri e le colonne ballano. */
.num, td.num, th.num, .table .num{ text-align: right; font-variant-numeric: tabular-nums; }



/* --- le icone ---------------------------------------------------------- */
/*
 * Un font di icone non e' testo: se eredita il maiuscolo, la spaziatura fra
 * lettere o il grassetto di quello che lo contiene, il disegno si deforma o
 * sparisce del tutto e resta il quadratino. Qui si taglia l'eredita' una
 * volta per tutte, invece di ricordarsene ogni volta che si mette un'icona
 * dentro a un titolo.
 */
[class^="ri-"], [class*=" ri-"]{
    font-weight: 400 !important;
    font-style: normal;
    text-transform: none !important;
    letter-spacing: normal !important;
    font-variant: normal;
    line-height: 1;
    display: inline-block;
    vertical-align: -.125em;
}

/* =====================================================================
   3. LA TABELLA
   ---------------------------------------------------------------------
   E' il pezzo per cui si apre il programma, quindi ha la precedenza su
   tutto il resto.

   Niente bordi verticali: separano colonne che l'occhio separa gia' da
   solo, e a venti colonne diventano una gabbia. Restano i fili
   orizzontali, che invece servono a non perdere la riga.
   ===================================================================== */

.table{
    --bs-table-bg: transparent;
    width: 100%;
    margin: 0;
    font-size: 13px;
    color: var(--ds-testo);
    border-collapse: collapse;
}

.table > :not(caption) > * > *{
    padding: 4px 8px;
    border-bottom: 1px solid var(--ds-filo-tenue);
    border-right: 0;
    border-left: 0;
    box-shadow: none;
    background: transparent;
    vertical-align: middle;
}

.table > thead > tr > *{
    background: var(--ds-cromo);
    border-bottom: 1px solid var(--ds-filo);
    color: var(--ds-testo-2);
    font-weight: 600;
    font-size: 12px;
    white-space: nowrap;
    text-align: left;
    padding-top: 6px;
    padding-bottom: 6px;
}

.table > tbody > tr{ height: var(--ds-riga); }
.table > tbody > tr:hover > *{ background: var(--ds-accento-tenue); }

/*
 * I collegamenti nelle celle sono il modo normale per aprire una scheda, e
 * restavano del blu di serie di Bootstrap: in un programma giallo, cinque
 * colonne di collegamenti blu sono la prima cosa che si vede.
 *
 * Non si puo' semplicemente passargli l'accento - Bootstrap 5.3 i
 * collegamenti li colora da --bs-link-color-RGB, che vuole tre numeri e non
 * un colore, e comunque un accento chiaro come testo piccolo su bianco non
 * si legge. Si usa la versione dell'accento gia' scurita quanto basta,
 * calcolata in attributi.php.
 */
.table td a:not(.btn), .table th a:not(.btn){
    color: var(--ds-accento-legg);
}
.table td a:not(.btn):hover, .table th a:not(.btn):hover{
    color: var(--ds-accento-legg);
    text-decoration: underline;
}

/* La riga scelta si vede dal filo verde a sinistra, non da un fondo
   acceso: il fondo acceso su venti righe scelte acceca. */
.table > tbody > tr.scelta > *,
.table > tbody > tr.table-active > *{ background: var(--ds-bene-tenue); }
.table > tbody > tr.scelta > *:first-child,
.table > tbody > tr.table-active > *:first-child{ box-shadow: inset 3px 0 0 var(--ds-bene); }

/* Il generatore scrive table-bordered e table-striped perche' li scriveva
   per il tema di prima. Qui non si tolgono dal generatore: si spengono. */
.table-bordered > :not(caption) > * > *{ border-width: 0 0 1px 0; }
.table-striped > tbody > tr:nth-of-type(odd) > *{ background: transparent; }

/* La riga dei filtri sta dentro all'intestazione e i suoi campi devono
   sparire dentro alla cella, non sembrare un modulo da compilare. */
.table thead .filtri > *{ padding: 3px 5px; background: var(--ds-cromo); }
.table thead .filtri .form-control,
.table thead .filtri .form-select{
    height: 24px; min-height: 24px;
    padding: 1px 5px;
    font-size: 12px;
    border-color: var(--ds-filo);
    background: var(--ds-carta);
}

.table-responsive{ overflow-x: auto; }


/* --- la pastiglia di stato ------------------------------------------- */
/*
 * Dice come sta la riga, e lo dice anche a chi non distingue il verde dal
 * rosso: la parola c'e' sempre, il colore la accompagna.
 */
.stato, .badge.stato{
    display: inline-block;
    padding: 1px 7px;
    border-radius: 9px;
    font-size: 11.5px;
    font-weight: 600;
    line-height: 1.5;
    white-space: nowrap;
}
.stato.bene,   .badge.bg-success-subtle{ background: var(--ds-bene-tenue);   color: var(--ds-bene); }
.stato.attesa, .badge.bg-warning-subtle{ background: var(--ds-attesa-tenue); color: var(--ds-attesa); }
.stato.male,   .badge.bg-danger-subtle { background: var(--ds-male-tenue);   color: var(--ds-male); }


/* =====================================================================
   4. IL RIQUADRO
   ---------------------------------------------------------------------
   Il tema di prima incorniciava ogni tabella in una card con l'ombra e
   sedici pixel di margine per lato. Qui il riquadro c'e' ma non si fa
   notare: un filo, niente ombra, niente arrotondamenti da vetrina.
   ===================================================================== */

/* Sul piano bianco il riquadro non si distingue per il fondo - e' bianco
   anche lui - quindi lo tiene in piedi il bordo. */
.card{
    background: var(--ds-carta);
    border: 1px solid var(--ds-filo);
    border-radius: 4px;
    box-shadow: none;
    margin-bottom: 10px;
}
.card-body{ padding: 10px 12px; }
/*
 * L'intestazione e' una fila: a sinistra il titolo, a destra i comandi.
 * Senza il flex .card-controls - che si sposta a destra con margin-left:auto -
 * finiva a capo sotto al titolo, e il tasto che ricarica il widget si
 * ritrovava in mezzo alla scheda invece che nel suo angolo.
 */
.card-header{
    display: flex;
    align-items: center;
    gap: 8px;
    padding: 7px 12px;
    background: var(--ds-cromo);
    border-bottom: 1px solid var(--ds-filo);
    font-weight: 600;
    font-size: 13px;
}
.card-header > .card-title{ min-width: 0; overflow: hidden; text-overflow: ellipsis; }

/* Una tabella dentro a un riquadro tocca i bordi: il riquadro e' gia' il
   margine, farne un altro dentro e' spazio buttato. */
.card-body > .table:only-child,
.card-body > .table-responsive:only-child{ margin: -10px -12px; width: calc(100% + 24px); }
.card-body > .table-responsive:only-child > .table{ margin: 0; width: 100%; }

/* Nel corpo principale il riquadro e' gia' a filo dei bordi: il corpo della
   card non deve rientrare ancora. */
.ds-corpo > .card > .card-body,
.ds-corpo > * > .card > .card-body{ padding: 10px 12px; }


/* =====================================================================
   5. I CAMPI
   ===================================================================== */

.form-control, .form-select{
    height: var(--ds-campo);
    min-height: var(--ds-campo);
    padding: 4px 8px;
    font-size: 13px;
    color: var(--ds-testo);
    background: var(--ds-carta);
    border: 1px solid var(--ds-filo);
    border-radius: 3px;
}
.form-control::placeholder{ color: var(--ds-testo-3); }
.form-control:focus, .form-select:focus{
    border-color: var(--ds-accento);
    box-shadow: 0 0 0 2px var(--ds-accento-tenue);
    outline: 0;
}

/* Un campo che non si tocca deve vedersi che non si tocca, senza doverci
   cliccare sopra per scoprirlo. */
.form-control[readonly], .form-select[readonly], .form-control:disabled{
    background: var(--ds-cromo);
    color: var(--ds-testo-2);
    cursor: default;
}
.form-control[readonly]:focus{ border-color: var(--ds-filo); box-shadow: none; }

.form-label, .control-label{
    margin-bottom: 2px;
    font-size: 12px;
    font-weight: 600;
    color: var(--ds-testo-2);
}

textarea.form-control{ height: auto; min-height: 60px; padding: 5px 8px; }


/* --- L'IMPAGINAZIONE DEI CAMPI ---------------------------------------- */
/*
 * Etichetta a sinistra, puntini, campo a destra.
 *
 * Il generatore scrive form-floating dappertutto: in Bootstrap l'etichetta
 * parte in mezzo al campo e sale quando si scrive. E' un'animazione che costa
 * 56px per ogni campo e che su una scheda da trenta campi non serve a
 * nessuno - nessuno guarda l'etichetta salire, si guarda il valore.
 *
 * Qui il markup resta identico e cambia solo la disposizione: form-floating
 * diventa una griglia a due colonne. L'etichetta sta nella prima, il campo
 * nella seconda, e in mezzo corrono i puntini.
 *
 * I puntini non sono decorazione: su una riga larga mezzo schermo, con
 * l'etichetta a sinistra e il valore a destra, servono a portare l'occhio
 * da una all'altro senza perdere la riga. E' la stessa ragione per cui li
 * usano gli indici dei libri.
 */
.form-floating{
    display: grid;
    grid-template-columns: minmax(90px, 34%) 1fr;
    align-items: center;
    column-gap: 8px;
    min-height: 30px;
    position: static;
}

.form-floating > label{
    /* il markup mette prima il campo e poi l'etichetta: qui si rimettono
       nell'ordine in cui si leggono */
    grid-column: 1;
    grid-row: 1;

    display: flex;
    align-items: baseline;
    gap: 6px;

    position: static;
    height: auto;
    padding: 0;
    border: 0;
    background: transparent;
    transform: none !important;    /* Bootstrap la rimpicciolirebbe */
    opacity: 1 !important;
    pointer-events: auto;

    font-size: 12.5px;
    font-weight: 400;
    color: var(--ds-testo-2);
    white-space: nowrap;
    overflow: hidden;
}

/* I puntini: riempiono quello che avanza fra la parola e il campo. */
.form-floating > label::after{
    content: "";
    flex: 1 1 auto;
    min-width: 10px;
    border-bottom: 1px dotted var(--ds-filo);
    transform: translateY(-3px);
}

/*
 * Bootstrap tiene 26px di padding sopra e 10 sotto per far posto
 * all'etichetta che galleggia dentro al campo. Qui l'etichetta e' fuori,
 * quel posto non serve a nessuno, e con 36px di padding il campo cresce a
 * 38 qualunque altezza gli si scriva: in una casella col bordo alto 38 il
 * testo galleggiava a meta'.
 *
 * Vanno elencati tutti gli stati - vuoto, pieno, a fuoco, riempito dal
 * browser - perche' Bootstrap li riscrive uno per uno.
 */
.form-floating > .form-control,
.form-floating > .form-control:focus,
.form-floating > .form-control:not(:placeholder-shown),
.form-floating > .form-control:-webkit-autofill,
.form-floating > .form-control-plaintext,
.form-floating > .form-select{
    grid-column: 2;
    grid-row: 1;
    height: 28px;
    min-height: 28px;
    padding: 3px 8px;
    line-height: 1.4;
}

.form-floating > textarea.form-control{
    height: auto;
    min-height: 56px;
    padding: 5px 8px;
}
/* Con una textarea l'etichetta sta in alto, non a meta' altezza. */
.form-floating:has(textarea){ align-items: start; }
.form-floating:has(textarea) > label{ padding-top: 5px; }

.form-floating > .form-control:focus ~ label,
.form-floating > .form-control:not(:placeholder-shown) ~ label,
.form-floating > .form-select ~ label,
.form-floating > textarea ~ label{
    color: var(--ds-testo-2);
    opacity: 1;
    transform: none !important;
}
.form-floating > .form-control:focus ~ label{ color: var(--ds-accento-legg); }

/*
 * Appena il campo ha un valore, Bootstrap trasforma l'etichetta::after in
 * una striscia bianca messa dietro al bordo - serve a bucare il contorno
 * del campo quando l'etichetta ci galleggia sopra. Qui quella striscia
 * mangiava i puntini: sparivano esattamente sulle righe compilate, cioe'
 * quelle che si guardano.
 */
.form-floating > .form-control:focus ~ label::after,
.form-floating > .form-control:not(:placeholder-shown) ~ label::after,
.form-floating > .form-control:-webkit-autofill ~ label::after,
.form-floating > .form-control-plaintext ~ label::after,
.form-floating > .form-select ~ label::after,
.form-floating > textarea ~ label::after{
    content: "";
    position: static;
    inset: auto;
    z-index: auto;
    height: auto;
    background: transparent;
    border-radius: 0;

    flex: 1 1 auto;
    min-width: 10px;
    border-bottom: 1px dotted var(--ds-filo);
    transform: translateY(-3px);
}

/* Un campo obbligatorio ha l'etichetta piu' marcata, e basta. Colorare di
   rosso un campo che non ha ancora nessun errore fa sembrare rotta una
   scheda appena aperta. */
.form-floating.obbligatorio > label{ font-weight: 600; color: var(--ds-testo); }

/* Su schermo stretto le due colonne non ci stanno: l'etichetta torna sopra
   al campo e i puntini spariscono, che a quel punto non collegano niente. */
@media (max-width: 575.98px){
    .form-floating{ grid-template-columns: 1fr; row-gap: 2px; }
    .form-floating > label{ grid-column: 1; grid-row: 1; }
    .form-floating > .form-control,
    .form-floating > .form-select{ grid-column: 1; grid-row: 2; }
    .form-floating > label::after{ display: none; }
}

/* --- gruppi di campi -------------------------------------------------- */
.input-group{ flex-wrap: nowrap; }
.input-group-text{
    padding: 0 8px;
    font-size: 13px;
    color: var(--ds-testo-2);
    background: var(--ds-cromo);
    border: 1px solid var(--ds-filo);
    border-radius: 3px;
}
/* I pulsantini in coda al campo (cerca, svuota) devono essere alti quanto
   il campo e non piu' larghi di quello che serve. */
.input-group > .btn.input-group-text{
    height: 40px;
    background: transparent;
    color: var(--ds-testo-2);
}
.input-group > .btn.input-group-text:hover{ color: var(--ds-accento-legg); background: var(--ds-accento-tenue); }

.form-check-input:checked{ background-color: var(--ds-accento); border-color: var(--ds-accento); }
.form-check-input:focus{ box-shadow: 0 0 0 2px var(--ds-accento-tenue); border-color: var(--ds-accento); }

.mb-3{ margin-bottom: 8px !important; }


/* =====================================================================
   6. I PULSANTI
   ---------------------------------------------------------------------
   Bassi e stretti. Un pulsante alto 38px in una barra di azioni fa la
   barra alta 54, e quei 54 pixel sono tolti alla tabella per sempre.
   ===================================================================== */

.btn{
    --bs-btn-padding-y: 3px;
    --bs-btn-padding-x: 9px;
    --bs-btn-font-size: 12.5px;
    --bs-btn-border-radius: 3px;
    font-weight: 600;
    display: inline-flex;
    align-items: center;
    gap: 5px;
    white-space: nowrap;
    line-height: 1.5;
}
.btn i{ font-size: 14px; line-height: 1; }

.btn-primary{
    --bs-btn-bg: var(--ds-accento);
    --bs-btn-border-color: var(--ds-accento);
    --bs-btn-hover-bg: var(--ds-accento-scuro);
    --bs-btn-hover-border-color: var(--ds-accento-scuro);
    --bs-btn-color: var(--ds-accento-testo, #fff);
    --bs-btn-hover-color: var(--ds-accento-testo, #fff);
    --bs-btn-active-bg: var(--ds-accento-scuro);
    --bs-btn-active-border-color: var(--ds-accento-scuro);
    --bs-btn-active-color: var(--ds-accento-testo, #fff);
}

/*
 * GLI ALTRI
 *
 * Il generatore colora i pulsanti per tipo di azione, e in una barra di
 * comandi dieci pulsanti pieni di dieci colori si annullano a vicenda:
 * quando tutto grida, niente si sente, e "Elimina" finisce a pari merito
 * con "Stampa".
 *
 * Quindi il colore c'e' ma tenuto basso: fondo velato, bordo e scritta del
 * colore pieno. Si distinguono a colpo d'occhio, restano leggibili in fila,
 * e il pieno - che e' la voce alta - resta a due soli: l'azione principale
 * e quella che distrugge qualcosa, e solo quando ci si passa sopra.
 *
 * Le tinte si prendono dalle stesse variabili delle tabelle e dei messaggi:
 * verde e' verde ovunque nel programma, non un verde per posto.
 */
.btn-success{
    --bs-btn-bg: var(--ds-bene-tenue);
    --bs-btn-border-color: var(--ds-bene);
    --bs-btn-color: var(--ds-bene);
    --bs-btn-hover-bg: var(--ds-bene);
    --bs-btn-hover-border-color: var(--ds-bene);
    --bs-btn-hover-color: #fff;
    --bs-btn-active-bg: var(--ds-bene);
    --bs-btn-active-border-color: var(--ds-bene);
    --bs-btn-active-color: #fff;
}
.btn-info{
    --bs-btn-bg: var(--ds-info-tenue);
    --bs-btn-border-color: var(--ds-info);
    --bs-btn-color: var(--ds-info);
    --bs-btn-hover-bg: var(--ds-info);
    --bs-btn-hover-border-color: var(--ds-info);
    --bs-btn-hover-color: #fff;
    --bs-btn-active-bg: var(--ds-info);
    --bs-btn-active-border-color: var(--ds-info);
    --bs-btn-active-color: #fff;
}
.btn-warning{
    --bs-btn-bg: var(--ds-attesa-tenue);
    --bs-btn-border-color: var(--ds-attesa);
    --bs-btn-color: var(--ds-attesa);
    --bs-btn-hover-bg: var(--ds-attesa);
    --bs-btn-hover-border-color: var(--ds-attesa);
    --bs-btn-hover-color: #fff;
    --bs-btn-active-bg: var(--ds-attesa);
    --bs-btn-active-border-color: var(--ds-attesa);
    --bs-btn-active-color: #fff;
}
.btn-danger{
    --bs-btn-bg: var(--ds-male-tenue);
    --bs-btn-border-color: var(--ds-male);
    --bs-btn-color: var(--ds-male);
    --bs-btn-hover-bg: var(--ds-male);
    --bs-btn-hover-border-color: var(--ds-male);
    --bs-btn-hover-color: #fff;
    --bs-btn-active-bg: var(--ds-male);
    --bs-btn-active-border-color: var(--ds-male);
    --bs-btn-active-color: #fff;
}

/* Il pulsante che non dice niente: quello che c'e' accanto a Salva e vuol
   dire Annulla. Neutro di proposito - se avesse un colore chiederebbe
   attenzione, e il suo mestiere e' non chiederne. */
.btn-secondary, .btn-light, .btn-default, .btn-outline-secondary{
    --bs-btn-bg: var(--ds-carta);
    --bs-btn-border-color: var(--ds-filo);
    --bs-btn-color: var(--ds-testo);
    --bs-btn-hover-bg: var(--ds-cromo);
    --bs-btn-hover-border-color: var(--ds-filo);
    --bs-btn-hover-color: var(--ds-testo);
    --bs-btn-active-bg: var(--ds-filo-tenue);
    --bs-btn-active-border-color: var(--ds-filo);
    --bs-btn-active-color: var(--ds-testo);
}
.btn-dark{
    --bs-btn-bg: var(--ds-testo);
    --bs-btn-border-color: var(--ds-testo);
    --bs-btn-color: var(--ds-fondo);
    --bs-btn-hover-bg: var(--ds-testo-2);
    --bs-btn-hover-border-color: var(--ds-testo-2);
    --bs-btn-hover-color: var(--ds-fondo);
}

/* I contornati: stessa tinta, ma senza fondo finche' non li si tocca.
   Servono dove i pulsanti sono tanti e vicini - una riga di tabella - e
   anche il fondo velato farebbe rumore. */
.btn-outline-primary{ --bs-btn-color: var(--ds-accento-legg); --bs-btn-border-color: var(--ds-accento-legg);
    --bs-btn-hover-bg: var(--ds-accento); --bs-btn-hover-border-color: var(--ds-accento);
    --bs-btn-hover-color: var(--ds-accento-testo, #fff); --bs-btn-bg: transparent; }
.btn-outline-success{ --bs-btn-color: var(--ds-bene); --bs-btn-border-color: var(--ds-bene);
    --bs-btn-hover-bg: var(--ds-bene); --bs-btn-hover-border-color: var(--ds-bene);
    --bs-btn-hover-color: #fff; --bs-btn-bg: transparent; }
.btn-outline-info{ --bs-btn-color: var(--ds-info); --bs-btn-border-color: var(--ds-info);
    --bs-btn-hover-bg: var(--ds-info); --bs-btn-hover-border-color: var(--ds-info);
    --bs-btn-hover-color: #fff; --bs-btn-bg: transparent; }
.btn-outline-warning{ --bs-btn-color: var(--ds-attesa); --bs-btn-border-color: var(--ds-attesa);
    --bs-btn-hover-bg: var(--ds-attesa); --bs-btn-hover-border-color: var(--ds-attesa);
    --bs-btn-hover-color: #fff; --bs-btn-bg: transparent; }
.btn-outline-danger{ --bs-btn-color: var(--ds-male); --bs-btn-border-color: var(--ds-male);
    --bs-btn-hover-bg: var(--ds-male); --bs-btn-hover-border-color: var(--ds-male);
    --bs-btn-hover-color: #fff; --bs-btn-bg: transparent; }

/* Il collegamento vestito da pulsante: nessun riquadro, solo la parola. */
.btn-link{
    --bs-btn-color: var(--ds-accento-legg);
    --bs-btn-hover-color: var(--ds-accento-scuro);
    --bs-btn-bg: transparent;
    --bs-btn-border-color: transparent;
    text-decoration: none;
}
.btn-link:hover{ text-decoration: underline; }

/*
 * SPENTO
 *
 * Bootstrap non riusa il colore del pulsante quando e' disabilitato: ha una
 * terna a parte (--bs-btn-disabled-*) che ogni variante riempie coi propri
 * colori di serie. Riscrivendo solo i colori normali, un Salva spento
 * tornava blu Bootstrap in mezzo a una pagina che blu non e'.
 *
 * Qui il pulsante spento e' sempre lo stesso, qualunque variante sia: grigio
 * di cornice. E' anche piu' giusto - spento e' spento, non "spento ma
 * pericoloso" - e si vede subito che non risponde.
 */
.btn{
    --bs-btn-disabled-bg: var(--ds-cromo);
    --bs-btn-disabled-border-color: var(--ds-filo);
    --bs-btn-disabled-color: var(--ds-testo-3);
    --bs-btn-disabled-opacity: 1;
}
.btn:disabled, .btn.disabled, fieldset:disabled .btn{
    cursor: not-allowed;
}

/*
 * LARGO QUANTO IL SUO POSTO
 *
 * w-100 di Bootstrap mette width:100% e basta. Su un pulsante non era
 * abbastanza: il pulsante e' una scatola in fila (inline-flex), e dentro a
 * un contenitore in fila il 100% e' solo un punto di partenza da cui puo'
 * ancora restringersi per far posto ai vicini - cosi' la classe sembrava
 * non fare niente.
 *
 * Qui il pulsante diventa una riga sua: si prende tutto, non si lascia
 * stringere, e la scritta va al centro invece di restare a sinistra con
 * il vuoto a destra.
 */
.btn.w-100, .btn.w-75, .btn.w-50, .btn.w-25{
    display: flex;
    justify-content: center;
    flex-shrink: 0;
}
.btn.w-100{ flex-basis: 100%; }

/*
 * IL PULSANTE A TUTTA LARGHEZZA DEL GENERATORE
 *
 * La spunta "buttonblock" su una maschera scrive btn-block, che e' una
 * classe di Bootstrap 4: in Bootstrap 5 e' stata tolta e non vuol dire piu'
 * niente - per questo la spunta sembrava non fare nulla. Si rimette qui, che
 * e' il posto giusto: il markup gia' generato di tutti i progetti resta
 * com'e'.
 *
 * E non basta il 100%. Il generatore scrive un ANELLO ESTERNO attorno al
 * pulsante:
 *
 *     <a onclick="..."><span class="btn btn-block ...">Salva</span></a>
 *
 * L'<a> e' in linea, quindi e' largo quanto la scritta: il <span> dentro
 * puo' anche chiedere il 100%, ma il 100% di una scatola che e' gia' stretta
 * resta stretto. Si allarga anche l'anello, e solo quando dentro c'e'
 * davvero un btn-block.
 */
a:has(> .btn-block){ display: block; }

.btn.btn-block{
    display: flex;
    width: 100%;
    justify-content: center;
    flex-shrink: 0;
}

/* Un pulsante che e' solo un'icona resta quadrato invece di diventare un
   rettangolo storto. */
.btn.btn-icon{ width: 26px; padding-left: 0; padding-right: 0; justify-content: center; }

.btn:focus-visible{ box-shadow: 0 0 0 2px var(--ds-accento-tenue); }
.btn-sm{ --bs-btn-padding-y: 2px; --bs-btn-padding-x: 7px; --bs-btn-font-size: 12px; }

/*
 * L'ICONA DEL CALENDARIO, AL BUIO
 *
 * Il pulsantino dentro a un campo data lo disegna il browser, non noi: e'
 * un'immagine nera fissa, che sul fondo scuro diventa nero su nero. Non si
 * puo' colorare - non e' un carattere - ma si puo' rovesciare, ed e'
 * l'unico modo per vederla senza rifare il campo data da capo.
 *
 * Vale per tutti i campi data del programma, non solo per quelli dei
 * filtri: era li' che era sistemata, ed e' il motivo per cui sulle schede
 * non si vedeva.
 */
[data-bs-theme=scuro] input[type=date]::-webkit-calendar-picker-indicator,
[data-bs-theme=scuro] input[type=datetime-local]::-webkit-calendar-picker-indicator,
[data-bs-theme=scuro] input[type=time]::-webkit-calendar-picker-indicator,
[data-bs-theme=scuro] input[type=month]::-webkit-calendar-picker-indicator{
    filter: invert(1);
    opacity: .55;
    cursor: pointer;
}
[data-bs-theme=scuro] input[type=date]::-webkit-calendar-picker-indicator:hover,
[data-bs-theme=scuro] input[type=datetime-local]::-webkit-calendar-picker-indicator:hover,
[data-bs-theme=scuro] input[type=time]::-webkit-calendar-picker-indicator:hover,
[data-bs-theme=scuro] input[type=month]::-webkit-calendar-picker-indicator:hover{ opacity: 1; }

/* Sul chiaro c'e' gia', ma spenta: si accende quando ci si passa sopra. */
input[type=date]::-webkit-calendar-picker-indicator,
input[type=datetime-local]::-webkit-calendar-picker-indicator{ opacity: .55; cursor: pointer; }
input[type=date]::-webkit-calendar-picker-indicator:hover,
input[type=datetime-local]::-webkit-calendar-picker-indicator:hover{ opacity: 1; }


/* Classi rimaste dal tema di prima, che in Bootstrap non vogliono dire
   niente: si spengono qui invece di andarle a togliere dal generatore. */
.btn-float{ float: none; }
.text-default{ color: var(--ds-testo); }


/* =====================================================================
   7. SCHEDE, TENDINE, PAGINAZIONE
   ===================================================================== */

.nav-tabs{
    border-bottom: 1px solid var(--ds-filo);
    gap: 2px;
    flex-wrap: nowrap;
    overflow-x: auto;
    scrollbar-width: none;
}
.nav-tabs::-webkit-scrollbar{ display: none; }

.nav-tabs .nav-link{
    padding: 5px 11px;
    font-size: 12.5px;
    font-weight: 600;
    color: var(--ds-testo-2);
    border: 0;
    border-bottom: 2px solid transparent;
    border-radius: 0;
    white-space: nowrap;
}
.nav-tabs .nav-link:hover{ color: var(--ds-testo); background: var(--ds-cromo); }
.nav-tabs .nav-link.active{
    color: var(--ds-accento);
    background: transparent;
    border-bottom-color: var(--ds-accento);
}

.dropdown-menu{
    padding: 3px;
    font-size: 13px;
    border: 1px solid var(--ds-filo);
    border-radius: 4px;
    box-shadow: 0 6px 20px rgba(12,11,16,.13);
    background: var(--ds-carta);
}
.dropdown-item{ padding: 4px 9px; border-radius: 3px; color: var(--ds-testo); }
.dropdown-item:hover, .dropdown-item:focus{ background: var(--ds-accento-tenue); color: var(--ds-accento-legg); }
.dropdown-divider{ margin: 3px 0; border-color: var(--ds-filo-tenue); }

.pagination{ margin: 0; gap: 2px; }
.page-link{
    min-width: 24px;
    padding: 2px 6px;
    font-size: 12.5px;
    text-align: center;
    color: var(--ds-testo-2);
    background: transparent;
    border: 1px solid transparent;
    border-radius: 3px;
}
.page-link:hover{ background: var(--ds-cromo); color: var(--ds-testo); }
.page-item.active .page-link{
    background: var(--ds-accento);
    border-color: var(--ds-accento);
    color: #fff;
}
.page-item.disabled .page-link{ color: var(--ds-testo-3); background: transparent; }


/* =====================================================================
   8. MODALI E MESSAGGI
   ===================================================================== */

.modal-content{
    border: 1px solid var(--ds-filo);
    border-radius: 5px;
    background: var(--ds-carta);
}
.modal-header{ padding: 9px 14px; border-bottom: 1px solid var(--ds-filo); }
.modal-title{ font-size: 14px; font-weight: 600; }
.modal-body{ padding: 12px 14px; }
.modal-footer{ padding: 8px 14px; border-top: 1px solid var(--ds-filo); gap: 6px; }

.alert{
    padding: 7px 11px;
    font-size: 13px;
    border: 1px solid transparent;
    border-radius: 3px;
    margin-bottom: 8px;
}
.alert-success{ background: var(--ds-bene-tenue);   border-color: var(--ds-bene);   color: var(--ds-bene); }
.alert-warning{ background: var(--ds-attesa-tenue); border-color: var(--ds-attesa); color: var(--ds-attesa); }
.alert-danger,
.alert-error{  background: var(--ds-male-tenue);   border-color: var(--ds-male);   color: var(--ds-male); }
.alert-info{   background: var(--ds-accento-tenue); border-color: var(--ds-accento-legg); color: var(--ds-accento-legg); }


/* =====================================================================
   9. LA SCOCCA
   ---------------------------------------------------------------------
   Fascia nera in alto, binario di icone a sinistra, menu' che scivola
   fuori dal binario quando serve, e tutto il resto dello schermo per il
   contenuto.

   Il menu' sta dietro a un pulsante e non in una colonna fissa: una
   colonna da 250px su uno schermo da 1440 e' un sesto della larghezza
   spesa per un elenco che si guarda tre volte al giorno.
   ===================================================================== */

:root{
    --ds-fascia-h:   40px;
    --ds-binario-w:  44px;
    --ds-pannello-w: 260px;
}


/* --- la fascia -------------------------------------------------------- */
/*
 * Il colore della fascia lo sceglie il progetto. Il colore del testo no: lo
 * calcola attributi.php misurando quanto e' chiaro il fondo, e arriva qui
 * gia' deciso. Cosi' una fascia gialla non puo' finire con sopra del bianco.
 */
.ds-fascia{
    position: fixed;
    top: 0; left: 0; right: 0;
    z-index: 1002;
    height: var(--ds-fascia-h);
    display: flex;
    align-items: center;
    gap: 12px;
    padding: 0 10px;
    background: var(--ds-fascia, #121116);
    color: var(--ds-fascia-testo, #fff);
    font-size: 13px;
}

/* Il marchio e' un collegamento, quindi prenderebbe il colore dei
   collegamenti: blu su una fascia oro. Sulla fascia comanda il colore
   calcolato per quel fondo, non quello dei link. */
.ds-marchio{
    flex: 0 0 auto;
    display: flex;
    align-items: center;
    color: var(--ds-fascia-testo);
}
.ds-marchio:hover{ color: var(--ds-fascia-testo); text-decoration: none; opacity: .85; }
.ds-marchio img{ height: 16px; width: auto; }

/* Stessa ragione per qualunque altro collegamento finisca in fascia. */
.ds-fascia a{ color: inherit; }
.ds-fascia a:hover{ color: var(--ds-fascia-testo); text-decoration: none; }

.ds-briciole{
    flex: 0 1 auto; min-width: 0;
    color: var(--ds-fascia-velato);
    font-size: 12.5px;
    white-space: nowrap; overflow: hidden; text-overflow: ellipsis;
}
.ds-briciole .ds-sep{ opacity: .4; margin: 0 6px; }
.ds-briciole b{ color: var(--ds-fascia-testo); font-weight: 600; }

.ds-fascia-destra{ margin-left: auto; display: flex; align-items: center; gap: 6px; flex: 0 0 auto; }

.ds-fascia .ds-icona{
    width: 26px; height: 26px;
    display: grid; place-items: center;
    border: 0; border-radius: 4px;
    background: transparent;
    color: var(--ds-fascia-velato);
    font-size: 15px;
    cursor: pointer;
}
.ds-fascia .ds-icona:hover:not([disabled]){ background: var(--ds-fascia-tocco); color: var(--ds-fascia-testo); }
.ds-fascia .ds-icona[disabled]{ opacity: .5; cursor: default; }

.ds-utente{
    width: 24px; height: 24px;
    display: grid; place-items: center;
    border-radius: 50%;
    background: var(--ds-accento);
    color: #fff;
    font-size: 10.5px; font-weight: 700;
}

/*
 * LA RICERCA FRA LE PAGINE
 *
 * Sta al centro della fascia e non in un angolo, perche' col menu' nascosto
 * e' il modo principale per spostarsi: e' il comando piu' usato della fascia,
 * quindi prende il posto piu' facile da colpire.
 *
 * Il campo e' bianco anche sulla fascia scura: la fascia e' cornice, e la
 * cornice deve essere spenta; questo invece e' l'unica cosa che si usa
 * davvero e deve staccare. E' anche il motivo per cui non e' un incavo
 * semitrasparente come le altre icone.
 *
 * "Al centro" e' il centro della fascia, non il centro di quello che avanza:
 * gli spazi a sinistra e a destra sono diversi (marchio e percorso da una
 * parte, icone dall'altra) e centrare fra i due farebbe ballare il campo da
 * una pagina all'altra a seconda di quanto e' lungo il percorso.
 */
.ds-cerca{
    position: absolute;
    left: 50%;
    transform: translateX(-50%);
    width: min(420px, 38vw);
}
.ds-cerca > i{
    /*
     * Nera fissa, non "del colore del testo".
     *
     * Il campo di ricerca ha il fondo bianco sempre - e' voluto, e' quello
     * che lo stacca dalla fascia colorata - quindi quello che ci sta sopra
     * non deve seguire il tema: al buio --ds-testo diventa quasi bianco, e
     * bianco su bianco non e' un colore poco leggibile, e' niente.
     *
     * Vale per la lente, per il testo che si scrive e per il segnaposto: le
     * tre cose stanno sullo stesso fondo e devono seguire la stessa regola.
     *
     * E ci vuole lo z-index, se no il colore non si vede perche' NON SI VEDE
     * LA LENTE: il campo e' disabilitato - e' un segnaposto finche' la
     * ricerca non c'e' davvero - e i campi disabilitati qui hanno opacita'
     * .82. Un elemento con opacita' minore di 1 viene disegnato come un
     * blocco a se', insieme a quelli posizionati e nell'ordine in cui stanno
     * nel documento: l'input viene dopo la lente, quindi le finiva sopra col
     * suo fondo bianco. La lente c'era, era nera, ed era coperta - motivo per
     * cui cambiarle colore non sortiva alcun effetto.
     */
    position: absolute; left: 9px; top: 50%;
    z-index: 1;
    transform: translateY(-50%);
    font-size: 14px; line-height: 1;
    color: #14131a !important;
    pointer-events: none;
}
.ds-cerca input{
    width: 100%; height: 28px; min-height: 28px;
    padding: 2px 10px 2px 29px;
    font-size: 12.5px;
    color: #14131a;
    background: #fff;
    border: 1px solid transparent;
    border-radius: 4px;
}
.ds-cerca input::placeholder{ color: #6b6976; }
.ds-cerca input:focus{
    outline: 0;
    border-color: var(--ds-accento);
    box-shadow: 0 0 0 3px rgba(255,255,255,.25);
}
.ds-cerca input:disabled{ background: #fff; opacity: .82; }

/* La barra scritta dentro al campo, a destra: chi non conosce la
   scorciatoia non la cerca, e chi la vede la impara. Sparisce appena si
   scrive, che li' serve lo spazio. */
.ds-cerca-tasto{
    position: absolute; right: 8px; top: 50%;
    z-index: 1;
    transform: translateY(-50%);
    padding: 1px 6px;
    font-size: 10.5px; line-height: 1.5;
    font-family: inherit;
    color: #6b6976;
    background: #f1f0f4;
    border: 1px solid #dedce4;
    border-radius: 3px;
    pointer-events: none;
}
.ds-cerca-aperta .ds-cerca-tasto,
.ds-cerca input:focus ~ .ds-cerca-tasto{ display: none; }

/* --- la tendina degli esiti --- */
.ds-cerca-esiti{
    position: absolute; left: 0; right: 0; top: calc(100% + 6px);
    z-index: 1100;
    max-height: min(420px, calc(100vh - var(--ds-fascia-h) - 24px));
    overflow-y: auto;
    padding: 4px;
    background: var(--ds-carta);
    border: 1px solid var(--ds-filo);
    border-radius: 8px;
    box-shadow: 0 12px 32px rgba(16,15,24,.18);
}
.ds-cerca-esiti[hidden]{ display: none; }

/*
 * Le righe si scrivono .ds-cerca-esiti .ds-cerca-riga e non .ds-cerca-riga
 * e basta, ed e' necessario: la tendina sta dentro alla fascia, e piu' su
 * c'e' '.ds-fascia a{ color: inherit }' - che pesa piu' di una classe sola.
 * Con il solo nome della classe le righe non scelte ereditavano il bianco
 * della barra e sparivano sul fondo bianco della tendina: c'erano, erano
 * scritte, ed erano invisibili.
 */
.ds-cerca-esiti .ds-cerca-riga{
    display: flex; align-items: center; gap: 10px;
    padding: 7px 9px;
    border-radius: 6px;
    color: var(--ds-testo);
    text-decoration: none;
    cursor: pointer;
}
.ds-cerca-esiti .ds-cerca-riga:hover,
.ds-cerca-esiti .ds-cerca-riga.scelta{ background: var(--ds-accento-tenue); text-decoration: none; color: var(--ds-testo); }

/* La riga scelta si riconosce anche senza colore: al buio, o su uno schermo
   scadente, la differenza fra due fondi vicini puo' non vedersi. */
.ds-cerca-esiti .ds-cerca-riga.scelta{ box-shadow: inset 2px 0 0 var(--ds-accento); }

.ds-cerca-icona{
    flex: 0 0 auto;
    width: 16px;
    font-size: 15px; line-height: 1;
    color: var(--ds-testo-2);
    text-align: center;
}
.ds-cerca-esiti .ds-cerca-riga.scelta .ds-cerca-icona{ color: var(--ds-accento); }

/* La stella dei preferiti tiene il suo giallo anche sulla riga scelta: e'
   uno stato, non una decorazione, e deve leggersi sempre allo stesso modo -
   qui, sul pulsante in cima agli elenchi e nel pannello. */
.ds-cerca-esiti .ds-cerca-icona.pref,
.ds-cerca-esiti .ds-cerca-riga.scelta .ds-cerca-icona.pref{ color: #d6a441; }

/* min-width:0 e non basta: senza, un nome lungo allarga la riga invece di
   accorciarsi, e la tendina esce dalla sua scatola. */
.ds-cerca-testi{ display: flex; flex-direction: column; min-width: 0; }

.ds-cerca-nome{
    font-size: 13px; font-weight: 500;
    white-space: nowrap; overflow: hidden; text-overflow: ellipsis;
}
.ds-cerca-strada{
    font-size: 11px;
    color: var(--ds-testo-2);
    white-space: nowrap; overflow: hidden; text-overflow: ellipsis;
}

/* L'intestazione del gruppo. Piccola e spenta: separa, non annuncia. */
.ds-cerca-gruppo{
    padding: 8px 10px 3px;
    font-size: 10.5px; font-weight: 700;
    text-transform: uppercase; letter-spacing: .05em;
    color: var(--ds-testo-3);
}
.ds-cerca-gruppo:not(:first-child){ margin-top: 4px; border-top: 1px solid var(--ds-filo-tenue); padding-top: 10px; }

/* Quando, a destra. Cifre a larghezza fissa: incolonnate si confrontano con
   l'occhio senza leggerle. */
.ds-cerca-quando{
    flex: 0 0 auto;
    margin-left: auto;
    padding-left: 8px;
    font-size: 11px;
    font-variant-numeric: tabular-nums;
    font-family: ui-monospace, SFMono-Regular, Menlo, Consolas, monospace;
    color: var(--ds-testo-3);
}

.ds-cerca-vuoto{
    padding: 14px 10px;
    font-size: 12.5px;
    color: var(--ds-testo-2);
    text-align: center;
}

/* Sotto ai 1100px il campo intero non ci sta piu' senza schiacciare il
   percorso: si stringe e smette di essere ancorato al centro. */
@media (max-width: 1100px){
    .ds-cerca{ position: static; transform: none; width: 200px; margin-left: auto; }

    /* Ancorato a destra e piu' largo del campo: a 200px il nome di una
       pagina non ci sta, e il percorso sotto nemmeno. */
    .ds-cerca-esiti{ left: auto; width: 320px; }
    .ds-cerca-tasto{ display: none; }
}


/* --- il binario ------------------------------------------------------- */
.ds-binario{
    position: fixed;
    top: var(--ds-fascia-h); bottom: 0; left: 0;
    z-index: 1001;
    width: var(--ds-binario-w);
    display: flex; flex-direction: column; align-items: center; gap: 2px;
    padding: 6px 0;
    background: var(--ds-cromo);
    border-right: 1px solid var(--ds-filo);
}
.ds-binario > button, .ds-binario > a{
    width: 32px; height: 30px;
    display: grid; place-items: center;
    border: 0; border-radius: 3px;
    background: transparent;
    color: var(--ds-testo-3);
    font-size: 16px;
    cursor: pointer; text-decoration: none;
}
.ds-binario > button:hover:not([disabled]), .ds-binario > a:hover{
    background: var(--ds-filo-tenue); color: var(--ds-testo);
}
.ds-binario > button[disabled]{ opacity: .45; cursor: default; }

/* Acceso vuol dire "questo e' aperto adesso", non "questo l'hai premuto
   per ultimo". */
.ds-binario > button[aria-expanded=true]{ background: var(--ds-accento-tenue); color: var(--ds-accento-legg); }

.ds-binario .ds-stacco{ width: 22px; height: 1px; background: var(--ds-filo); margin: 5px 0; }


/* --- il pannello del menu' -------------------------------------------- */
.ds-pannello{
    position: fixed;
    top: var(--ds-fascia-h); bottom: 0;
    left: var(--ds-binario-w);
    z-index: 1000;
    width: var(--ds-pannello-w);
    max-width: calc(100% - var(--ds-binario-w));
    display: flex; flex-direction: column;
    background: var(--ds-carta);
    border-right: 1px solid var(--ds-filo);
    box-shadow: 6px 0 22px rgba(12,11,16,.14);

    /* Chiuso deve stare fuori davvero: -100% lo lascerebbe sopra al
       binario e i tasti non si potrebbero piu' premere. */
    transform: translateX(calc(-100% - var(--ds-binario-w)));
    visibility: hidden;
    transition: transform .2s ease, visibility 0s linear .2s;
}
/*
 * :not(.ds-pannello-pref) non e' pignoleria.
 *
 * I due pannelli - il menu' e i preferiti - condividono .ds-pannello perche'
 * sono la stessa scocca. Senza l'esclusione questa regola li apriva
 * ENTRAMBI: premendo il menu' scivolava fuori anche il pannello dei
 * preferiti, e siccome stanno nello stesso punto si vedeva solo quello che
 * il browser disegnava per ultimo - cioe' i preferiti.
 */
html.ds-menu-aperto .ds-pannello:not(.ds-pannello-pref):not(.ds-pannello-rec){
    transform: none; visibility: visible;
    transition: transform .2s ease, visibility 0s;
}

.ds-pannello-testa{
    display: flex; align-items: center; justify-content: space-between;
    padding: 8px 12px;
    border-bottom: 1px solid var(--ds-filo-tenue);
    font-size: 13px; font-weight: 700;
}
.ds-pannello-testa button{
    border: 0; background: transparent; cursor: pointer;
    color: var(--ds-testo-3); font-size: 16px; padding: 0;
    display: grid; place-items: center;
}
.ds-pannello-testa button:hover{ color: var(--ds-testo); }

.ds-pannello-corpo{ flex: 1 1 auto; overflow-y: auto; padding: 4px 0 12px; }

.ds-pannello .ds-voce{
    display: flex; align-items: center; gap: 8px;
    padding: 6px 14px;
    font-size: 13px;
    color: var(--ds-testo);
}
.ds-pannello .ds-voce:hover{ background: var(--ds-cromo); text-decoration: none; }
.ds-pannello .ds-voce.attiva{
    color: var(--ds-accento-legg); font-weight: 600;
    background: var(--ds-accento-tenue);
    box-shadow: inset 3px 0 0 var(--ds-accento);
}
.ds-pannello .ds-voce i{ font-size: 15px; color: var(--ds-testo-3); }
.ds-pannello .ds-voce.attiva i{ color: var(--ds-accento-legg); }

/*
 * La casella dell'icona c'e' sempre, anche vuota: senza, le voci con icona e
 * quelle senza partirebbero da due punti diversi e l'elenco si sfilaccerebbe.
 * Cosi' le scritte restano tutte incolonnate e le icone, dove ci sono, si
 * leggono come un'informazione in piu' invece che come decorazione.
 */
.ds-icona-voce{
    flex: 0 0 auto;
    width: 15px;
    text-align: center;
}

.ds-pannello .ds-gruppo > summary{
    display: flex; align-items: center; justify-content: space-between; gap: 8px;
    padding: 7px 14px;
    font-size: 13px; font-weight: 600;
    color: var(--ds-testo);
    cursor: pointer; list-style: none;
    user-select: none;
}
.ds-pannello .ds-gruppo > summary > span{
    display: flex; align-items: center; gap: 8px;
    min-width: 0; overflow: hidden; text-overflow: ellipsis; white-space: nowrap;
}
.ds-pannello .ds-gruppo > summary i:not(.ds-frec){ font-size: 15px; color: var(--ds-testo-3); }
.ds-pannello .ds-gruppo > summary::-webkit-details-marker{ display: none; }
.ds-pannello .ds-gruppo > summary:hover{ background: var(--ds-cromo); }

/*
 * Il browser disegna il suo riquadro di fuoco attorno al summary appena lo si
 * preme col mouse, e su una riga larga quanto il pannello si vedono due righe
 * azzurre sopra e sotto che sembrano un guasto. Si toglie quello del browser e
 * se ne mette uno che compare solo navigando da tastiera, dove serve davvero.
 */
.ds-pannello .ds-gruppo > summary:focus{ outline: none; }
.ds-pannello .ds-gruppo > summary:focus-visible{
    outline: 2px solid var(--ds-accento);
    outline-offset: -2px;
}
.ds-pannello .ds-gruppo[open] > summary .ds-frec{ transform: rotate(180deg); }
.ds-pannello .ds-frec{ font-size: 14px; transition: transform .15s ease; }
/*
 * IL RIENTRO DEI LIVELLI
 *
 * Il menu' non ha una profondita' fissa: index.php lo disegna richiamando se
 * stesso, e il livello di ogni riga arriva qui in data-liv.
 *
 * Il primo scalino non e' come gli altri. Le sottovoci si incolonnano con la
 * SCRITTA del gruppo, non col suo bordo: il titolo parte dopo il rientro del
 * pannello, piu' la casella dell'icona, piu' lo stacco. Se usassero un
 * rientro qualsiasi finirebbero piu' a sinistra del padre e l'elenco
 * sembrerebbe rotto. Il +10 e' il rientro vero e proprio - allineate esatte
 * al titolo si leggerebbero come voci dello stesso livello.
 *
 * Dal secondo in giu' bastano 14px a scalino: il livello si e' gia' capito
 * dal primo, qui serve solo dire "e questa sta sotto a quella".
 *
 * Si arriva al quarto e ci si ferma. In un pannello da 280px un quinto
 * rientro lascerebbe una quarantina di pixel alla scritta, e due livelli che
 * si somigliano si leggono meglio di una colonna di parole tagliate a meta'.
 */
/* I due selettori per ogni livello non sono un doppione: la voce e il titolo
   di un gruppo hanno gia' una regola loro col rientro di partenza, e una
   scritta con solo [data-liv] perderebbe di specificita' contro quelle. E'
   quello che succedeva: le voci rientravano, i gruppi no, e un
   sottogruppo si presentava incolonnato col padre. */
.ds-pannello .ds-gruppo > summary[data-liv="1"],
.ds-pannello .ds-voce[data-liv="1"]{ padding-left: calc(14px + 15px + 8px + 10px); }

.ds-pannello .ds-gruppo > summary[data-liv="2"],
.ds-pannello .ds-voce[data-liv="2"]{ padding-left: calc(14px + 15px + 8px + 10px + 14px); }

.ds-pannello .ds-gruppo > summary[data-liv="3"],
.ds-pannello .ds-voce[data-liv="3"]{ padding-left: calc(14px + 15px + 8px + 10px + 28px); }

.ds-pannello .ds-gruppo > summary[data-liv="4"],
.ds-pannello .ds-gruppo > summary[data-liv="5"],
.ds-pannello .ds-gruppo > summary[data-liv="6"],
.ds-pannello .ds-gruppo > summary[data-liv="7"],
.ds-pannello .ds-gruppo > summary[data-liv="8"],
.ds-pannello .ds-voce[data-liv="4"],
.ds-pannello .ds-voce[data-liv="5"],
.ds-pannello .ds-voce[data-liv="6"],
.ds-pannello .ds-voce[data-liv="7"],
.ds-pannello .ds-voce[data-liv="8"]{ padding-left: calc(14px + 15px + 8px + 10px + 42px); }

/*
 * Un gruppo dentro a un gruppo pesa meno del suo.
 *
 * Se tutti i livelli fossero in grassetto pieno, aperto un menu' profondo si
 * vedrebbero sei righe forti una sotto l'altra e non si capirebbe piu' quale
 * contiene quale: il rientro da solo non basta a dirlo. Scendendo, il titolo
 * si spegne di un gradino e si avvicina alle voci che contiene.
 */
.ds-pannello .ds-gruppo-dentro > summary{
    font-size: 12.5px;
    color: var(--ds-testo-2);
}
.ds-pannello .ds-gruppo-dentro > summary .ds-frec{ font-size: 13px; }

/* Il velo spegne la pagina ma non il binario: da Preferiti si passa a
   Recenti senza dover prima chiudere tutto. */
.ds-velo{
    /*
     * inset:0 - tutto lo schermo, non "da sotto la fascia a destra del
     * binario".
     *
     * Ritagliarlo con left e right sembrava piu' preciso ed era la ragione
     * della barra di scorrimento orizzontale che restava: un elemento
     * ancorato a right:0 finisce sul bordo del riquadro di riferimento, che
     * NON e' sempre la parte di finestra che si vede - quando c'e' una barra
     * verticale i due bordi non coincidono, e l'avanzo e' esattamente la
     * larghezza di quella barra.
     *
     * Con inset:0 non c'e' niente da calcolare e non puo' sbordare. Il velo
     * non copre ne' la fascia ne' il binario lo stesso, perche' quelli
     * stanno sopra (1002 e 1001 contro 999): l'ordine bastava gia', il
     * ritaglio era una precauzione di troppo che si e' pagata cara.
     */
    position: fixed;
    inset: 0;
    z-index: 999;
    background: rgba(12,11,16,.42);
    opacity: 0; pointer-events: none;
    transition: opacity .18s ease;
}
html.ds-menu-aperto .ds-velo{ opacity: 1; pointer-events: auto; }
html.ds-pref-aperto .ds-velo{ opacity: 1; pointer-events: auto; }
html.ds-rec-aperto  .ds-velo{ opacity: 1; pointer-events: auto; }


/* --- il pannello dei preferiti ---------------------------------------- *
 *
 * Stessa scocca del pannello del menu' - stesso posto, stessa larghezza,
 * stessa animazione - perche' sono la stessa cosa: un elenco di pagine da cui
 * si sceglie dove andare. Cambia solo chi lo apre.
 */
html.ds-pref-aperto .ds-pannello-pref{
    transform: none; visibility: visible;
    transition: transform .2s ease, visibility 0s;
}

.ds-pref-comandi{ display: flex; align-items: center; gap: 4px; }

#ds-pref-modifica{
    display: inline-flex; align-items: center; gap: 5px;
    padding: 3px 9px;
    border: 1px solid var(--ds-filo);
    border-radius: 5px;
    background: var(--ds-cromo);
    color: var(--ds-testo-2);
    font: inherit; font-size: 11.5px; font-weight: 600;
    cursor: pointer;
}
#ds-pref-modifica:hover{ color: var(--ds-testo); border-color: var(--ds-testo-3); }
#ds-pref-modifica[hidden]{ display: none; }

/* In modifica il pulsante si accende: e' l'unico segnale che si e' in un modo
   diverso dal solito, e senza non si capisce perche' i collegamenti non
   portino piu' da nessuna parte. */
.ds-in-modifica #ds-pref-modifica{
    background: var(--ds-accento);
    border-color: var(--ds-accento);
    color: #fff;
}

.ds-pref-riga{ display: flex; align-items: center; }
.ds-pref-riga .ds-voce{ flex: 1 1 auto; min-width: 0; }

.ds-pref-testi{ display: flex; flex-direction: column; min-width: 0; }
.ds-pref-nome{ white-space: nowrap; overflow: hidden; text-overflow: ellipsis; }

/* Il percorso serve a distinguere due voci che si chiamano uguale sotto
   gruppi diversi. Non e' un titolo: sta sotto, piu' piccolo e piu' spento. */
.ds-pref-strada{
    font-size: 11px;
    color: var(--ds-testo-3);
    white-space: nowrap; overflow: hidden; text-overflow: ellipsis;
}

/* --- i comandi di riordino --- */

.ds-pref-azioni{ display: none; align-items: center; gap: 2px; padding-right: 8px; }
.ds-in-modifica .ds-pref-azioni{ display: flex; }

.ds-pref-azioni button{
    display: grid; place-items: center;
    width: 24px; height: 24px;
    padding: 0;
    border: 0; border-radius: 4px;
    background: transparent;
    color: var(--ds-testo-2);
    font-size: 16px;
    cursor: pointer;
}
.ds-pref-azioni button:hover{ background: var(--ds-cromo); color: var(--ds-testo); }

/* Spenta e non nascosta: la riga non cambia larghezza quando una voce arriva
   in cima o in fondo, e l'elenco non balla mentre lo si riordina. */
.ds-pref-azioni button[disabled]{ opacity: .25; cursor: default; }
.ds-pref-azioni button[disabled]:hover{ background: transparent; color: var(--ds-testo-2); }

.ds-pref-azioni .ds-pref-togli:hover{ background: var(--ds-male-tenue); color: var(--ds-male); }

/* In modifica il collegamento non porta piu' da nessuna parte, e si vede:
   niente mano del mouse, niente colore che cambia al passaggio. */
.ds-in-modifica .ds-pref-riga .ds-voce{ cursor: default; }
.ds-in-modifica .ds-pref-riga .ds-voce:hover{ background: transparent; }

.ds-pref-vuoto{
    margin: 0; padding: 18px 16px;
    font-size: 12.5px; line-height: 1.5;
    color: var(--ds-testo-3);
}

/* --- il pannello dei recenti ------------------------------------------ */

html.ds-rec-aperto .ds-pannello-rec{
    transform: none; visibility: visible;
    transition: transform .2s ease, visibility 0s;
}

/* La casella del filtro, fra l'intestazione e l'elenco. Non scorre con le
   righe: e' un comando del pannello, non una di quelle. */
.ds-rec-filtro{
    position: relative;
    flex: 0 0 auto;
    padding: 8px 10px;
    border-bottom: 1px solid var(--ds-filo-tenue);
}
.ds-rec-filtro > i{
    position: absolute; left: 20px; top: 50%;
    transform: translateY(-50%);
    font-size: 13px; line-height: 1;
    color: var(--ds-testo-3);
    pointer-events: none;
}
.ds-rec-filtro input{
    width: 100%; height: 28px;
    padding: 2px 8px 2px 28px;
    font: inherit; font-size: 12.5px;
    color: var(--ds-testo);
    background: var(--ds-cromo);
    border: 1px solid transparent;
    border-radius: 5px;
}
.ds-rec-filtro input::placeholder{ color: var(--ds-testo-3); }
.ds-rec-filtro input:focus{
    outline: 0;
    background: var(--ds-carta);
    border-color: var(--ds-accento);
}

/* Il giorno, sopra al gruppo di righe che gli appartengono. Appiccicato in
   alto mentre si scorre: scendendo di venti righe si continua a sapere di
   che giorno si sta guardando, che e' l'unica domanda che si fa chi apre
   questo pannello. */
.ds-rec-giorno{
    position: sticky; top: 0;
    z-index: 1;
    margin: 0;
    padding: 8px 14px 4px;
    background: var(--ds-carta);
    font-size: 11px; font-weight: 700;
    text-transform: uppercase; letter-spacing: .04em;
    color: var(--ds-testo-3);
}
.ds-rec-giorno:not(:first-child){ padding-top: 14px; }

.ds-rec-riga{ display: flex; align-items: center; gap: 8px; }

/* Il record e' quello che distingue due schede della stessa pagina: va letto,
   non intravisto. Quindi non e' spento come il percorso - e' scritto con il
   colore del testo di servizio, non con quello delle cose secondarie. */
.ds-rec-record{
    font-size: 11.5px;
    color: var(--ds-testo-2);
    white-space: nowrap; overflow: hidden; text-overflow: ellipsis;
}

/* L'ora a destra, in cifre a larghezza fissa: incolonnate si confrontano con
   l'occhio senza leggerle. */
.ds-rec-ora{
    flex: 0 0 auto;
    margin-left: auto;
    padding-left: 8px;
    font-size: 11px;
    font-variant-numeric: tabular-nums;
    font-family: ui-monospace, SFMono-Regular, Menlo, Consolas, monospace;
    color: var(--ds-testo-3);
}


/* --- la stella in cima agli elenchi --- */

/* Spenta e' un pulsante come gli altri. Accesa e' gialla: e' l'unico colore
   in quella barra, e ci sta perche' non e' un'azione fra le altre - dice uno
   stato, e uno stato si legge con un colpo d'occhio o non serve. */
.ds-tasto.ds-stella.accesa{ color: #d6a441; }
.ds-tasto.ds-stella.accesa i{ color: #d6a441; }


/* --- il corpo --------------------------------------------------------- */
/*
 * Il piano di lavoro arriva fino ai bordi. Lo spazio a sinistra ce l'ha gia'
 * il binario e in alto la fascia: aggiungerne dell'altro vuol dire togliere
 * larghezza alla tabella, che e' la cosa per cui si apre il programma.
 */
.ds-corpo{
    background: var(--ds-fondo);
    margin-left: var(--ds-binario-w);
    padding: var(--ds-fascia-h) 0 0;
}

/*
 * IL FONDO LO PAGA IL BODY, NON IL CORPO
 *
 * Qui c'era min-height:100vh, e serviva a una cosa sola: che il colore del
 * piano di lavoro arrivasse in fondo allo schermo anche con due righe di
 * contenuto.
 *
 * Ma 100vh non e' "l'altezza della finestra": e' l'altezza della finestra
 * SENZA contare la barra di scorrimento orizzontale. Basta che qualcosa
 * sbordi di un pixel in larghezza - una tabella larga, un riquadro con un
 * margine di troppo - perche' compaia la barra in basso, che si mangia
 * quindici pixel di altezza; ma il corpo resta alto 100vh, che adesso e'
 * quindici pixel piu' della finestra, e compare anche la barra verticale.
 * Due barre, nessuna delle quali serve a scorrere qualcosa: e' il difetto
 * classico di questa misura, e si vede sempre e solo "a volte", che e' il
 * motivo per cui e' cosi' antipatico da trovare.
 *
 * Il colore lo mette il body, che lo passa alla pagina intera per conto
 * suo: stesso risultato a vedersi, e niente altezza imposta a nessuno.
 */
html{ height: 100%; }
body{ min-height: 100%; }

/*
 * LA BARRA ORIZZONTALE - il colpevole vero
 *
 * Una .row di Bootstrap ha i margini NEGATIVI (-12px per lato): e' fatta per
 * stare dentro a un contenitore che ha 12px di padding, cosi' i due si
 * annullano e le colonne arrivano a filo del bordo. Fuori da un contenitore
 * cosi', quei -12px sbordano e basta.
 *
 * Le maschere generate escono cosi':
 *
 *     <div class="gmcedesign_form"><div class="gmcedesign_master">
 *         <div class="row "><div class="col-md-12 "> ...
 *
 * e .ds-corpo di padding laterale non ne ha - gliel'ho tolto io, apposta,
 * perche' la tabella si prendesse tutta la larghezza. Risultato: ogni scheda
 * sbordava di 12 pixel a destra. Dodici pixel sono pochi da vedere e
 * abbastanza per una barra di scorrimento, ed e' per questo che c'era
 * sempre e non si capiva di cosa.
 *
 * Si rida' il padding al contenitore delle maschere - che e' il suo posto,
 * non quello del corpo - e i conti tornano: -12 + 12 = 0, le colonne a filo
 * del bordo come devono, niente sbordo. Le liste non hanno una .row nuda e
 * restano larghe come prima.
 */
.ds-corpo > .gmcedesign_form,
.ds-corpo > form > .gmcedesign_form{ padding-left: 12px; padding-right: 12px; }

/* E per tutto quello che verra' dopo: una .row lasciata nuda nel corpo non
   sborda comunque. Meglio perdere il rientro delle colonne che ritrovarsi la
   barra. */
.ds-corpo > .row,
.ds-corpo > form > .row{ margin-left: 0; margin-right: 0; }

/*
 * La rete, per quello che non abbiamo previsto.
 *
 * In denso la PAGINA non scorre mai di lato: quello che e' troppo largo -
 * una tabella con venti colonne, la griglia - scorre dentro alla propria
 * scatola, che ha la sua barra al posto giusto. Quindi qui si taglia.
 *
 * clip e non hidden, e non auto: hidden e auto fanno del corpo una scatola
 * che scorre anche in verticale, e si porterebbero dietro le tendine che si
 * aprono verso il basso. clip e' l'unico valore che si puo' mettere su un
 * asse solo lasciando l'altro libero.
 */
.ds-corpo{ overflow-x: clip; }

/*
 * I riquadri di primo livello vanno da bordo a bordo: niente angoli
 * arrotondati ne' fili laterali, che a filo del bordo non separano niente da
 * niente. Resta il filo sotto, che divide un riquadro dal successivo.
 * Quelli annidati tengono la loro forma.
 */
.ds-corpo > .card,
.ds-corpo > * > .card{
    border-left: 0;
    border-right: 0;
    border-radius: 0;
    margin-bottom: 0;
    border-top: 0;
    border-bottom: 1px solid var(--ds-filo);
}

/* Dentro alla cornice (tmpl=component) un po' d'aria ci vuole: li' non c'e'
   ne' fascia ne' binario a fare da margine. */
.ds-solo-corpo .ds-corpo{ padding: 10px 12px; min-height: 0; }
.ds-solo-corpo .ds-corpo > .card,
.ds-solo-corpo .ds-corpo > * > .card{
    border: 1px solid var(--ds-filo);
    border-radius: 4px;
    margin-bottom: 10px;
}


/* --- la barra delle azioni -------------------------------------------- */
/*
 * Una riga sola, alta 34. Il tema di prima li metteva grandi e allineati
 * a destra: 54px di altezza per sei pulsanti che si premono col mignolo.
 */
.ds-azioni{
    display: flex; align-items: center; gap: 2px;
    height: 34px;
    margin: 0;
    padding: 0 10px;
    background: var(--ds-carta);
    border-bottom: 1px solid var(--ds-filo);
    overflow-x: auto; scrollbar-width: none;
    position: sticky; top: var(--ds-fascia-h); z-index: 3;
}

/* Dentro alla cornice (tmpl=component) non c'e' fascia: la barra si appiccica
   in cima alla finestrella e basta. */
.ds-solo-corpo .ds-azioni{ top: 0; }
.ds-azioni::-webkit-scrollbar{ display: none; }
.ds-azioni .ds-divisore{ width: 1px; height: 18px; background: var(--ds-filo); margin: 0 6px; flex: 0 0 auto; }

/*
 * Lo stacco prima di Annulla.
 *
 * Non e' decorazione: e' distanza voluta fra i pulsanti che producono
 * qualcosa e l'unico che la butta via. Un click sbagliato di 30 pixel non
 * deve poter costare mezz'ora di compilazione.
 *
 * Non spinge Annulla al bordo destro con un margin-left:auto, che su uno
 * schermo largo lo manderebbe a dieci centimetri dagli altri: la' non lo
 * troverebbe piu' nessuno. Uno stacco fisso, largo abbastanza da leggersi
 * come "questo e' un altro gruppo", con la sua riga in mezzo.
 */
.ds-azioni .ds-stacco-azioni{
    flex: 0 0 auto;
    width: 1px;
    height: 18px;
    margin: 0 18px;
    background: var(--ds-filo);
}
/*
 * I pulsanti della barra sono tutti uguali: fondo bianco, testo scuro. A
 * separarli ci pensa la barretta fra uno e l'altro.
 *
 * Il colore qui non aggiungeva niente. Sei pulsanti di sei colori diversi si
 * annullano a vicenda: quando tutto e' evidenziato, niente lo e'. Il colore
 * resta per le pastiglie di stato nella tabella, dove dice qualcosa.
 */
.ds-azioni .ds-tasto{
    background: var(--ds-carta);
    border-color: transparent;
    color: var(--ds-testo);
    padding: 3px 8px;
}
.ds-azioni .ds-tasto:hover{ background: var(--ds-cromo); color: var(--ds-testo); }

/* Anche le icone sono dello stesso nero della scritta. Nessuna eccezione:
   ne' per l'azione principale ne' per quella che cancella. A distinguere i
   pulsanti ci sono la parola e la barretta, e basta cosi'. */
.ds-azioni .ds-tasto > i{ color: inherit; }


/* --- il piede della tabella ------------------------------------------- */
.ds-piede{
    display: flex; align-items: center; gap: 12px;
    padding: 6px 10px;
    border-top: 1px solid var(--ds-filo);
    font-size: 12.5px;
    color: var(--ds-testo-2);
}
.ds-piede .ds-totale{ margin-left: auto; }
.ds-piede b{ color: var(--ds-testo); }


/* --- schermi stretti --------------------------------------------------- */
@media (max-width: 767.98px){
    .ds-briciole{ display: none; }
    .ds-cerca{ width: 140px; }
    .ds-corpo{ padding-left: 8px; padding-right: 8px; }
}


/* --- il selettore di unita' organizzativa ------------------------------ */
/*
 * Era una tendina di sistema in mezzo alla fascia. Qui e' un pulsante come
 * quello dell'utente: si vede quale unita' e' in uso, si preme e si sceglie.
 *
 * Il <select> vero resta nella pagina, nascosto: e' quello che la funzione
 * sys_setComboboxBU() legge da sempre, e cambiarlo avrebbe voluto dire
 * toccare il componente generato per una questione di aspetto.
 */
.ds-bu > button{
    display: flex; align-items: center; gap: 5px;
    height: 26px;
    max-width: 190px;
    padding: 0 8px;
    border: 1px solid var(--ds-fascia-tocco);
    border-radius: 4px;
    background: transparent;
    color: var(--ds-fascia-testo);
    font-size: 12.5px; font-weight: 600;
    cursor: pointer;
}
.ds-bu > button:hover{ background: var(--ds-fascia-tocco); }
.ds-bu .ds-bu-nome{ overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
.ds-bu .ds-bu-frec{ font-size: 14px; opacity: .7; flex: 0 0 auto; }
.ds-bu .dropdown-menu{ max-height: 60vh; overflow-y: auto; min-width: 220px; }
.ds-bu .dropdown-item{ display: flex; align-items: center; gap: 6px; }
.ds-bu .dropdown-item .ri-check-line{ margin-left: auto; color: var(--ds-accento-legg); }
.ds-bu-nascosto{ display: none !important; }


/* =====================================================================
   10. L'ACCESSO
   ---------------------------------------------------------------------
   Fuori non c'e' scocca: niente fascia, niente binario, niente menu'.
   Solo un riquadro al centro, diviso in due.

   A sinistra il modulo su fondo chiaro, a destra un pannello del colore
   d'accento del progetto. Il colore e' l'unica cosa che cambia da un
   progetto all'altro, ed e' abbastanza: si riconosce il proprio
   programma prima ancora di leggere il nome.
   ===================================================================== */

body.ds-fuori{ background: var(--ds-fondo); }

.ds-accesso{
    min-height: 100vh;
    display: grid;
    place-items: center;
    padding: 24px 16px;
}
.ds-accesso-avvisi{ width: 100%; max-width: 860px; margin-bottom: 12px; }

.ds-scheda{
    display: grid;
    grid-template-columns: 1fr 1fr;
    width: 100%;
    max-width: 860px;
    min-height: 430px;
    background: var(--ds-carta);
    border-radius: 10px;
    overflow: hidden;
    box-shadow: 0 12px 40px rgba(20,18,26,.14), 0 2px 6px rgba(20,18,26,.06);
}

/* --- sinistra: il modulo ---------------------------------------------- */
.ds-scheda-modulo{
    display: flex;
    flex-direction: column;
    justify-content: center;
    padding: 36px 40px;
}

.ds-scheda-modulo .ds-titolo{
    margin: 0 0 22px;
    font-size: 26px;
    font-weight: 700;
    letter-spacing: -.01em;
    text-align: center;
}

.ds-modulo .ds-campo{ margin-bottom: 12px; }

/* Qui i campi sono piu' alti che nel resto del programma, di proposito: e' una
   pagina in cui si scrivono due cose una volta al giorno, non una schermata in
   cui si sta dentro otto ore. */
.ds-modulo .form-control{ height: 40px; min-height: 40px; padding: 8px 12px; font-size: 14px; }

/* --- il campo con l'icona accanto --------------------------------------- */
/*
 * Il bordo passa dal campo al gruppo: dentro, il campo e' senza bordo e senza
 * fondo. Cosi' icona, campo e occhio sono un pezzo solo - se il bordo restasse
 * sul campo si vedrebbe una scatola dentro un'altra scatola, e all'apparire
 * dell'anello del fuoco le due si sfalserebbero di un pixel.
 *
 * Solo qui dentro (.ds-modulo): nel programma i campi sono quaranta per
 * schermata e quaranta icone non aiutano nessuno.
 */
.ds-modulo .ds-campo-gruppo{
    display: flex;
    align-items: stretch;
    height: 40px;
    background: var(--ds-carta);
    border: 1px solid var(--ds-filo);
    border-radius: 3px;
    overflow: hidden;
}

/* L'anello del fuoco si accende sul gruppo, non sul campo: e' il gruppo che
   ha il bordo. */
.ds-modulo .ds-campo-gruppo:focus-within{
    border-color: var(--ds-accento);
    box-shadow: 0 0 0 2px var(--ds-accento-tenue);
}

.ds-modulo .ds-campo-gruppo .form-control{
    flex: 1 1 auto;
    min-width: 0;
    height: 100%;
    border: 0;
    border-radius: 0;
    background: transparent;
}
/* L'anello ce l'ha gia' il gruppo: se lo mettesse anche il campo se ne
   vedrebbero due, uno dentro l'altro. */
.ds-modulo .ds-campo-gruppo .form-control:focus{ border: 0; box-shadow: none; }

/* Il campo pieno automaticamente dal browser si porta dietro un fondo suo:
   dentro al gruppo diventerebbe una macchia azzurra a meta' della scatola. */
.ds-modulo .ds-campo-gruppo .form-control:-webkit-autofill{
    -webkit-box-shadow: 0 0 0 40px var(--ds-carta) inset;
    -webkit-text-fill-color: var(--ds-testo);
}

.ds-modulo .ds-campo-icona,
.ds-modulo .ds-occhio{
    flex: 0 0 auto;
    width: 38px;
    display: grid;
    place-items: center;
    border: 0;
    background: transparent;
    color: var(--ds-testo-3);
    font-size: 16px;
    line-height: 1;
}

/* L'icona di sinistra non e' un pulsante: non prende i clic, cosi' cliccarci
   sopra porta comunque dentro al campo. */
.ds-modulo .ds-campo-icona{ pointer-events: none; }

.ds-modulo .ds-occhio{ cursor: pointer; padding: 0; }
.ds-modulo .ds-occhio:hover{ color: var(--ds-testo); }
.ds-modulo .ds-occhio[aria-pressed=true]{ color: var(--ds-accento-legg); }
.ds-modulo .ds-occhio:focus-visible{
    outline: 2px solid var(--ds-accento);
    outline-offset: -2px;
}

.ds-scheda-riga{
    display: flex;
    align-items: center;
    justify-content: space-between;
    gap: 10px;
    margin: 14px 0 18px;
    font-size: 12.5px;
}

.ds-entra{
    width: 100%;
    height: 40px;
    justify-content: center;
    font-size: 14px;
    letter-spacing: .02em;
    border-radius: 20px;
}

.ds-minuto{ font-size: 12.5px; color: var(--ds-testo-2); }
.ds-minuto a{ color: var(--ds-accento-legg); font-weight: 600; }
.ds-centro{ margin: 20px 0 0; text-align: center; }

/* --- destra: il pannello del progetto ---------------------------------- */
.ds-scheda-saluto{
    display: flex;
    flex-direction: column;
    align-items: center;
    justify-content: center;
    gap: 14px;
    padding: 36px 40px;
    text-align: center;

    /* Una sfumatura appena accennata fra l'accento e la sua versione scura:
       serve a dare profondita', non a farsi notare. */
    background: linear-gradient(135deg, var(--ds-accento) 0%, var(--ds-accento-scuro) 100%);

    /* Il testo qui sopra non e' scelto: lo calcola attributi.php in base a
       quanto e' chiaro l'accento. Un accento giallo con sopra del bianco non
       si legge, e chi sceglie il colore non deve doverci pensare. */
    color: var(--ds-accento-testo, #fff);
}

.ds-scheda-logo{ max-width: 150px; max-height: 44px; width: auto; height: auto; }

.ds-scheda-saluto h2{
    margin: 0;
    font-size: 24px;
    font-weight: 700;
    color: inherit;
    letter-spacing: -.01em;
}
.ds-scheda-saluto p{
    margin: 0;
    max-width: 26ch;
    font-size: 13.5px;
    opacity: .88;
}

.ds-scheda-tasto{
    margin-top: 6px;
    padding: 8px 26px;
    border: 1px solid currentColor;
    border-radius: 20px;
    color: inherit;
    font-size: 12.5px;
    font-weight: 700;
    letter-spacing: .04em;
    text-transform: uppercase;
}
.ds-scheda-tasto:hover{
    background: currentColor;
    text-decoration: none;
}
/* Al passaggio del mouse il fondo diventa il colore del testo: la scritta
   deve tornare del colore del pannello, o sparisce. */
.ds-scheda-tasto:hover > *{ color: var(--ds-accento); }
.ds-scheda-tasto:hover{ color: var(--ds-accento-testo, #fff); }

/* --- schermi stretti --------------------------------------------------- */
/*
 * Sotto i 720px le due colonne non ci stanno. Il pannello colorato va SOPRA e
 * si accorcia: e' la parte che si guarda una volta, mentre il modulo e' quello
 * che si usa, e deve restare vicino alla tastiera che si apre.
 */
@media (max-width: 720px){
    .ds-scheda{ grid-template-columns: 1fr; min-height: 0; max-width: 420px; }
    .ds-scheda-saluto{ order: -1; padding: 24px; gap: 10px; }
    .ds-scheda-saluto h2{ font-size: 20px; }
    .ds-scheda-modulo{ padding: 26px 24px 30px; }
}


/* --- le pagine di servizio (promemoria, recupero password) ------------- */
/*
 * Stesso riquadro dell'accesso: cambia solo il modulo che ci sta dentro. La
 * riga di spiegazione sopra ai campi serve piu' qui che nell'accesso - la
 * pagina la si vede una volta sola, quando qualcosa non e' andato.
 */
.ds-intro{
    margin: -6px 0 16px;
    line-height: 1.5;
}

/* L'asterisco dei campi obbligatori. Non colora il campo di rosso: il campo
   non ha ancora nessun errore, e' solo obbligatorio. */
.ds-obbl{ color: var(--ds-male); margin-left: 2px; }

/* Il captcha, quando c'e', si porta dietro le sue misure: qui gli si dice
   solo di stare dentro al riquadro invece di sfondarlo. */
.ds-modulo .g-recaptcha,
.ds-modulo iframe{ max-width: 100%; }


/* =====================================================================
   11. I BIGLIETTI (i messaggi)
   ---------------------------------------------------------------------
   In basso a destra, impilati, con l'ultimo arrivato in fondo - cioe'
   piu' vicino all'angolo, dove sta l'occhio.

   Stanno sopra a tutto ma non prendono i clic se non addosso a loro:
   il contenitore e' alto quanto serve e trasparente ai clic, cosi' non
   copre i pulsanti della pagina sotto.
   ===================================================================== */

.ds-biglietti{
    position: fixed;
    right: 14px;
    bottom: 14px;
    z-index: 1080;
    display: flex;
    flex-direction: column;
    gap: 8px;
    width: min(360px, calc(100vw - 28px));
    pointer-events: none;
}

.ds-biglietto{
    pointer-events: auto;              /* i clic li prende solo il biglietto */
    display: flex;
    align-items: flex-start;
    gap: 9px;
    padding: 10px 11px;
    background: var(--ds-carta);
    border: 1px solid var(--ds-filo);
    border-left: 3px solid var(--ds-testo-3);
    border-radius: 5px;
    box-shadow: 0 6px 22px rgba(20,18,26,.16), 0 1px 3px rgba(20,18,26,.08);
    font-size: 13px;
    line-height: 1.4;
    color: var(--ds-testo);

    /* Entrano scivolando da destra. Chi ha chiesto meno animazioni li vede
       comparire e basta: il movimento qui e' un vezzo, il messaggio no. */
    opacity: 0;
    transform: translateX(16px);
    transition: opacity .18s ease, transform .18s ease;
}

.ds-biglietto.ds-dentro{ opacity: 1; transform: none; }
.ds-biglietto.ds-via{ opacity: 0; transform: translateX(16px); }

.ds-biglietto > i:first-child{ font-size: 16px; line-height: 1.25; flex: 0 0 auto; }

.ds-biglietto-testo{ flex: 1 1 auto; min-width: 0; word-wrap: break-word; }
.ds-biglietto-testo p:last-child{ margin-bottom: 0; }

.ds-biglietto-chiudi{
    flex: 0 0 auto;
    border: 0; background: transparent;
    padding: 0; margin: -1px -2px 0 0;
    color: var(--ds-testo-3);
    font-size: 15px; line-height: 1;
    cursor: pointer;
}
.ds-biglietto-chiudi:hover{ color: var(--ds-testo); }

/*
 * Il colore sta sul filo di sinistra e sull'icona, non su tutto il fondo: un
 * biglietto tutto verde su una pagina bianca urla, e quando ne arrivano tre
 * di fila diventa una semaforata. Il fondo resta quello della carta.
 */
.ds-biglietto.ds-bene{   border-left-color: var(--ds-bene); }
.ds-biglietto.ds-bene   > i:first-child{ color: var(--ds-bene); }

.ds-biglietto.ds-info{   border-left-color: var(--ds-accento); }
.ds-biglietto.ds-info   > i:first-child{ color: var(--ds-accento-legg); }

.ds-biglietto.ds-attesa{ border-left-color: var(--ds-attesa); }
.ds-biglietto.ds-attesa > i:first-child{ color: var(--ds-attesa); }

.ds-biglietto.ds-male{   border-left-color: var(--ds-male); }
.ds-biglietto.ds-male   > i:first-child{ color: var(--ds-male); }

/* Gli errori restano finche' non li si chiude, quindi si vedono un po' di
   piu': hanno qualcosa da dire. */
.ds-biglietto.ds-male{ background: var(--ds-male-tenue); border-color: var(--ds-male); }

@media (prefers-reduced-motion: reduce){
    .ds-biglietto{ transition: opacity .18s ease; transform: none; }
    .ds-biglietto.ds-via{ transform: none; }
}

/*
 * Sull'accesso i biglietti non si usano affatto: li' i messaggi stanno dentro
 * al riquadro, sopra al modulo, e li disegna ds_avvisi(). Se ne restasse uno
 * qui sarebbe una barra bianca che galleggia in cima alla pagina, staccata
 * dalla scheda a cui si riferisce.
 */
.ds-fuori .ds-biglietti{ display: none; }


/* =====================================================================
   GLI AVVISI DENTRO AL RIQUADRO DELL'ACCESSO
   ===================================================================== */

.ds-avvisi{ margin: 0 0 16px; display: flex; flex-direction: column; gap: 6px; }

.ds-avviso{
    display: flex;
    align-items: flex-start;
    gap: 8px;
    padding: 8px 10px;
    border-radius: 4px;
    font-size: 12.5px;
    line-height: 1.4;
}
.ds-avviso > i{ font-size: 15px; line-height: 1.2; flex: 0 0 auto; }
.ds-avviso span{ min-width: 0; }
.ds-avviso p:last-child{ margin-bottom: 0; }

/* Qui il fondo colorato ci sta: e' un avviso solo, dentro a un riquadro
   piccolo, e deve fermare chi stava per premere di nuovo Accedi. */
.ds-avviso.ds-bene{   background: var(--ds-bene-tenue);   color: var(--ds-bene); }
.ds-avviso.ds-info{   background: var(--ds-accento-tenue); color: var(--ds-accento-scuro); }
.ds-avviso.ds-attesa{ background: var(--ds-attesa-tenue); color: var(--ds-attesa); }
.ds-avviso.ds-male{   background: var(--ds-male-tenue);   color: var(--ds-male); }


/* =====================================================================
   12. IL VELO DI CARICAMENTO
   ---------------------------------------------------------------------
   Copre la pagina mentre qualcosa sta girando. Non e' nero pieno: sotto
   si intravede quello che c'era, cosi' si capisce che la pagina non e'
   sparita, sta solo lavorando.
   ===================================================================== */

.splash{
    position: fixed;
    inset: 0;
    z-index: 2000;
    display: grid;
    place-items: center;
    background: rgba(255,255,255,.72);
    backdrop-filter: blur(1.5px);

    opacity: 0;
    pointer-events: none;
    transition: opacity .15s ease;
}
[data-bs-theme=scuro] .splash{ background: rgba(18,17,22,.72); }

/* Acceso: prende anche i clic, cosi' non si preme due volte Salva mentre il
   primo salvataggio e' ancora in viaggio. */
.splash.active{ opacity: 1; pointer-events: auto; }

.splash-icon{ display: grid; place-items: center; }

.atlasloading-header{
    display: flex;
    flex-direction: column;
    align-items: center;
    gap: 14px;
}
.atlasloading-header img{ max-width: 130px; max-height: 38px; opacity: .9; }

/* La rotellina. Un cerchio con un quarto di colore diverso che gira: sono
   sei righe, e non serve portarsi dietro nient'altro. */
.ds-giro{
    width: 26px; height: 26px;
    border: 2.5px solid var(--ds-filo);
    border-top-color: var(--ds-accento);
    border-radius: 50%;
    animation: ds-gira .7s linear infinite;
}
@keyframes ds-gira{ to{ transform: rotate(360deg); } }

/* Chi ha chiesto meno animazioni vede la rotellina ferma: il velo dice gia'
   che si sta aspettando, il movimento e' un di piu'. */
@media (prefers-reduced-motion: reduce){
    .ds-giro{ animation: none; border-top-color: var(--ds-accento); }
    .splash{ transition: none; }
}


/* --- il selettore delle lingue ---------------------------------------- */
/*
 * Sta fra l'unita' organizzativa e il menu' dell'utente, e ha la stessa
 * forma della prima: sono cose della sessione e devono somigliarsi.
 *
 * La sigla al posto della bandiera. Due lettere si leggono da lontano meglio
 * di un rettangolino da 16px, funzionano anche per chi non distingue i
 * colori, e non costringono a decidere quale bandiera dare al portoghese.
 */
.ds-lingue > button{
    display: flex; align-items: center; gap: 3px;
    height: 26px;
    padding: 0 6px 0 7px;
    border: 1px solid var(--ds-fascia-tocco);
    border-radius: 4px;
    background: transparent;
    color: var(--ds-fascia-testo);
    cursor: pointer;
}
.ds-lingue > button:hover{ background: var(--ds-fascia-tocco); }

.ds-sigla{
    font-size: 11.5px;
    font-weight: 700;
    letter-spacing: .06em;
    font-variant-numeric: tabular-nums;
}

.ds-lingue .dropdown-menu{ min-width: 190px; }
.ds-lingue .dropdown-item{ display: flex; align-items: center; gap: 8px; }

/* La sigla nell'elenco sta in una colonna sua, cosi' i nomi delle lingue
   partono tutti dallo stesso punto. */
.ds-lingue .dropdown-item .ds-sigla{
    flex: 0 0 auto;
    width: 24px;
    color: var(--ds-testo-3);
}
.ds-lingue .dropdown-item.attiva .ds-sigla{ color: var(--ds-accento-legg); }
.ds-lingue .dropdown-item.attiva{ font-weight: 600; }
.ds-lingue .dropdown-item .ds-lingua-nome{ flex: 1 1 auto; min-width: 0; }
.ds-lingue .dropdown-item .ri-check-line{ margin-left: auto; color: var(--ds-accento-legg); }


/* --- i tasti dentro alla tabella --------------------------------------- */
/*
 * Il menu' azioni di riga e il tasto che svuota i filtri. Sono la stessa
 * cosa - un'icona sola in una colonna stretta - e si vestono uguale.
 *
 * Prima erano pulsanti pieni colorati, ripetuti su ogni riga: su venti
 * righe sono venti macchie che gridano tutte la stessa cosa. Qui si
 * accendono solo quando ci passi sopra.
 */
.ds-col-azioni{
    width: 1%;
    white-space: nowrap;
    text-align: center;
    padding-left: 4px !important;
    padding-right: 4px !important;
}

.ds-tasto-riga{
    display: inline-grid;
    place-items: center;
    width: 22px; height: 22px;
    padding: 0;
    border: 0; border-radius: 3px;
    background: transparent;
    color: var(--ds-testo-3);
    font-size: 15px; line-height: 1;
    cursor: pointer;
}
.ds-tasto-riga:hover,
.ds-tasto-riga[aria-expanded=true]{
    background: var(--ds-cromo);
    color: var(--ds-testo);
}
.ds-tasto-riga:focus-visible{ outline: 2px solid var(--ds-accento); outline-offset: -2px; }

/* Il tema di Bootstrap disegnerebbe una freccetta dopo il pulsante: qui
   l'icona sono gia' i tre puntini, e due segni per la stessa cosa sono uno
   di troppo. */
.ds-azioni-riga .dropdown-toggle::after,
.ds-tasto-riga::after{ display: none !important; }


/* --- l'intestazione che ordina ----------------------------------------- */
.table thead .ds-ordina{
    display: inline-flex;
    align-items: center;
    gap: 2px;
    cursor: pointer;
    user-select: none;
}
.table thead .ds-ordina:hover{ color: var(--ds-testo); }

/* La freccia c'e' solo sulla colonna su cui si sta ordinando davvero: una
   freccetta spenta su ognuna delle venti intestazioni e' rumore. */
.table thead .ds-ord{ font-size: 14px; color: var(--ds-accento-legg); }


/* =====================================================================
   13. IL FILTRO "DA DATA A DATA"
   ---------------------------------------------------------------------
   Il componente genera questo, e non si puo' cambiare da qui:

       <div class="input-group">
         <input type="date">
         <div class="input-group-append">        <- Bootstrap 4
           <button class="dropdown-toggle"><i class="dropdown-caret"></i>
           <div class="dropdown-menu dropdown-menu-right">
             <input type="date" name="..._da"> <br> <input ..._a">

   Tre cose non esistono piu' in Bootstrap 5: input-group-append,
   dropdown-menu-right e dropdown-caret (quest'ultima era del tema di
   prima). Il risultato e' il pulsantino staccato e senza icona che si
   vede in pagina.

   Si sistema qui invece che nel generatore: quel markup lo scrivono
   tutte le liste di tutti i progetti gia' fatti, e cambiarlo li'
   vorrebbe dire rigenerarli tutti.
   ===================================================================== */

/* Il contenitore torna a essere un pezzo unico della fila. */
.table .filtri .input-group{ flex-wrap: nowrap; }

.table .filtri .input-group-append{
    display: flex;
    align-items: stretch;
    margin-left: -1px;          /* i due bordi diventano uno */
    position: relative;         /* la tendina si appende qui */
}

/* Il campo data e il pulsantino si saldano. */
.table .filtri .input-group > .form-control{
    border-top-right-radius: 0;
    border-bottom-right-radius: 0;
}

.table .filtri .input-group-append > .btn{
    height: 24px;
    min-height: 24px;
    padding: 0 5px;
    border: 1px solid var(--ds-filo);
    border-radius: 0 3px 3px 0;
    background: var(--ds-cromo);
    color: var(--ds-testo-2);
}
.table .filtri .input-group-append > .btn:hover{ background: var(--ds-filo-tenue); color: var(--ds-testo); }

/* dropdown-caret era una classe del tema di prima e non disegnava piu'
   niente: qui le si da' la freccetta di Remix. */
.dropdown-caret::before{
    content: "\ea4e";           /* ri-arrow-down-s-line */
    font-family: remixicon;
    font-style: normal;
    font-weight: 400;
    font-size: 14px;
    line-height: 1;
}
/* Bootstrap ne aggiungerebbe una seconda, disegnata col bordo. */
.table .filtri .dropdown-toggle::after{ display: none !important; }

/*
 * La tendina con le due date. Di serie i due campi escono uno sopra
 * l'altro separati da un <br>, senza dire quale sia il "da" e quale
 * l'"a": si capisce solo provando. Le etichette non posso metterle -
 * il markup arriva dal generatore - ma almeno le due caselle si
 * riconoscono come una coppia e hanno l'aria giusta intorno.
 */
.table .filtri .dropdown-menu{
    min-width: 190px;
    padding: 8px;
}
.table .filtri .dropdown-menu.dropdown-menu-right{ right: 0; left: auto; }

.table .filtri .dropdown-menu .form-control{
    width: 100%;
    height: 28px;
    min-height: 28px;
    font-size: 12.5px;
}
/* Il <br> fra i due campi diventa lo spazio fra loro. */
.table .filtri .dropdown-menu br{ display: block; content: ""; margin-bottom: 6px; }

/* Il calendarietto di serie del browser: piu' piccolo, in tinta. */
.table .filtri input[type=date]::-webkit-calendar-picker-indicator{
    padding: 0;
    margin-left: 2px;
    opacity: .55;
    cursor: pointer;
}
.table .filtri input[type=date]::-webkit-calendar-picker-indicator:hover{ opacity: 1; }


/* =====================================================================
   14. IL PIEDE DELLA TABELLA (paginazione)
   ---------------------------------------------------------------------
   Joomla la stampa dentro a una riga della tabella:

       <tr><td align="center" colspan="7"> ...la paginazione... </td></tr>

   Quindi eredita tutto quello che vale per una cella - il filo sotto,
   il padding stretto, il "centrato" - e viene fuori una riga di roba
   schiacciata contro il bordo. Qui quella cella smette di comportarsi
   da cella e torna a essere una fascia di servizio.
   ===================================================================== */

/* La cella che contiene la paginazione. Si riconosce dal colspan: e'
   l'unica cella che attraversa tutta la tabella. */
.table tbody td[colspan],
.table tfoot td[colspan]{
    padding: 7px 10px !important;
    background: var(--ds-cromo);
    border-bottom: 0;
    border-top: 1px solid var(--ds-filo);
    text-align: left !important;   /* l'align="center" del markup */
}

.gmce-paginazione{
    font-size: 12.5px;
    color: var(--ds-testo-2);
}

/* "Visualizza n." e la sua tendina: una cosa di servizio, non un campo
   da compilare. Non deve pesare come i filtri qui sopra. */
.gmce-paginazione .form-select,
.gmce-paginazione select{
    width: auto;
    height: 24px;
    min-height: 24px;
    padding: 1px 22px 1px 7px;
    font-size: 12px;
    background-color: var(--ds-carta);
    border-color: var(--ds-filo);
}

/* --- i numeri di pagina ------------------------------------------------ */
/*
 * UNA REGOLA SOLA PER DUE POSTI
 *
 * Queste regole valgono sia per la paginazione delle liste - che disegna
 * Joomla, vestita in html/layouts/joomla/pagination - sia per quella delle
 * tabelle dentro alle schede, che scrive la generazione.
 *
 * Non perche' i selettori siano due: perche' il markup e' lo stesso. Se le
 * schede fossero rimaste con il loro - <ul class="pagination
 * justify-content-center"> - da qui non ci sarebbe stato niente da fare:
 * justify-content-center e' una utility di Bootstrap 5, quindi !important, e
 * quella fila sarebbe rimasta centrata per sempre. Si e' cambiato il markup
 * la' (HelperInputCustom::creaHtmlTableFooterPagination) invece di
 * combattere qui.
 */
.gmce-paginazione .pagination{ gap: 2px; }

.gmce-paginazione .page-link{
    display: grid;
    place-items: center;
    min-width: 24px;
    height: 24px;
    padding: 0 6px;
    font-size: 12.5px;
    line-height: 1;
    color: var(--ds-testo-2);
    background: transparent;
    border: 1px solid transparent;
    border-radius: 3px;
}
.gmce-paginazione .page-link:hover{
    background: var(--ds-carta);
    border-color: var(--ds-filo);
    color: var(--ds-testo);
    text-decoration: none;
}

/* La pagina in cui si e' non e' un pulsante: e' dove sei. Un rettangolo
   pieno del colore d'accento su una fascia grigia grida troppo per
   un'informazione cosi' tranquilla. */
.gmce-paginazione .page-item.active .page-link{
    background: var(--ds-carta);
    border-color: var(--ds-filo);
    color: var(--ds-testo);
    font-weight: 700;
    cursor: default;
}

/* Le frecce che non portano da nessuna parte restano nella fila con lo
   stesso ingombro: toglierle farebbe ballare i numeri a ogni cambio
   pagina, e si finirebbe per premere quello sbagliato. */
.gmce-paginazione .page-item.disabled .page-link{
    color: var(--ds-testo-3);
    opacity: .45;
    background: transparent;
    border-color: transparent;
}

.gmce-paginazione .page-link i,
.gmce-paginazione .page-link span{ font-size: 15px; line-height: 1; }

/* Nelle liste la fila sta a destra, accanto a "Visualizza n."; nelle schede
   non c'e' nient'altro nella cella, quindi ce la si porta da sola. */
.gmce-paginazione-scheda{ display: flex; justify-content: flex-end; }


/* --- le icone di Font Awesome ------------------------------------------
 * Non si rimappano da qui, e non e' una dimenticanza: ci pensa gia'
 * sistemaFa() in script.js, che le classi fa- le TOGLIE dall'elemento e ci
 * mette al posto loro quella di Remix Icon. Qualunque regola scritta qui
 * contro un selettore .fa-qualcosa arriva quando quella classe non c'e'
 * piu', e non fa niente - ci ho perso mezza giornata.
 *
 * Se un'icona esce sbagliata, o esce come un pallino, il nome manca nella
 * tabella mappaFa di script.js: si aggiunge li'.
 * --------------------------------------------------------------------- */
/* La versione, in fondo al binario. Piccolissima e spenta: si legge se la
   si cerca, e non si nota se non la si cerca. E' la prima domanda al
   telefono quando qualcosa non va, quindi deve esserci sempre - ma non ha
   nessun motivo di prendersi attenzione. */
.ds-versione{
    margin-top: auto;              /* la spinge in fondo */
    padding: 6px 2px;
    font-size: 9.5px;
    font-weight: 600;
    letter-spacing: .02em;
    line-height: 1.2;
    color: var(--ds-testo-3);
    text-align: center;
    white-space: nowrap;
    overflow: hidden;
    max-width: 100%;
    cursor: default;
    font-variant-numeric: tabular-nums;
}


/* =====================================================================
   15. I TITOLI DI SEZIONE
   ---------------------------------------------------------------------
   Su una scheda da trenta campi il titolo non e' decorazione: e' quello
   che dice dove finisce un gruppo e ne comincia un altro. Senza, la
   scheda e' un muro di campi tutti uguali.

   Tre livelli, e bastano:

       .ds-sezione        il titolo grosso col filo sotto
       .ds-sottosezione   la scritta piccola in maiuscoletto
       .ds-sezione-azione il collegamento a destra del titolo

   Si usano cosi':

       <h2 class="ds-sezione">Generale <a class="ds-sezione-azione">…</a></h2>
       <div class="ds-sottosezione">Indirizzo</div>
   ===================================================================== */

.ds-sezione{
    display: flex;
    align-items: baseline;
    justify-content: space-between;
    gap: 12px;

    margin: 18px 0 12px;
    padding-bottom: 5px;

    /* Il filo corre per tutta la larghezza della sezione, non solo sotto
       alla parola: e' quello che fa da linea di partenza per i campi. */
    border-bottom: 1px solid var(--ds-filo);

    font-size: 17px;
    font-weight: 600;
    letter-spacing: -.01em;
    color: var(--ds-testo);
}
/* Il primo titolo della pagina non si stacca dal nulla. */
.ds-sezione:first-child{ margin-top: 4px; }

.ds-sezione-azione{
    font-size: 12.5px;
    font-weight: 400;
    color: var(--ds-accento-legg);
    white-space: nowrap;
    flex: 0 0 auto;
}

/*
 * Il secondo livello: piccolo, in maiuscoletto, spento. Non ha il filo -
 * due fili a otto pixel di distanza fanno una scaletta - e non ha bisogno
 * di gridare, perche' sta gia' dentro a una sezione che si e' presentata.
 */
.ds-sottosezione{
    margin: 14px 0 8px;
    font-size: 11px;
    font-weight: 700;
    letter-spacing: .08em;
    text-transform: uppercase;
    color: var(--ds-testo-2);
}
.ds-sottosezione:first-child{ margin-top: 0; }

/* Le due colonne di una scheda. Sotto ai 992px diventa una: due colonne di
   campi con l'etichetta a sinistra su uno schermo stretto vuol dire quattro
   colonne di roba, e non ci sta niente. */
.ds-colonne{
    display: grid;
    grid-template-columns: 1fr 1fr;
    column-gap: 40px;
    row-gap: 0;
}
@media (max-width: 991.98px){
    .ds-colonne{ grid-template-columns: 1fr; column-gap: 0; }
}


/* =====================================================================
   16. I CAMPI DELLE SCHEDE - la struttura vera
   ---------------------------------------------------------------------
   Il generatore scrive questo, e non si tocca:

       <div class="form-group form-group-default input-group [required]"
            id="NOME_container">
         [prepend]
         <div class="form-input-group">
           <label class="control-label">[icona] Etichetta</label>
           <input class="form-control input-sm" …>
         </div>
         [append]
       </div>

   form-group-default e control-label vengono dal tema di prima, dove
   l'etichetta stava dentro al riquadro del campo, piccola e sopra al
   valore. In Bootstrap 5 non vogliono dire niente e uscivano una sopra
   l'altra senza allineamento.

   Qui diventano l'impaginazione di un gestionale: etichetta a sinistra,
   puntini, campo a destra. Cambia solo il foglio di stile.
   ===================================================================== */

.form-group-default{
    margin: 0 0 4px;
    padding: 0;
    border: 0;
    background: none;
}

/* Il contenitore e' anche un input-group, perche' puo' avere i pulsanti
   di ricerca attaccati: resta una fila, e la parte dei campi si prende
   quello che avanza. */
.form-group-default.input-group{
    flex-wrap: nowrap;
    align-items: center;
}
.form-group-default > .form-input-group{
    flex: 1 1 auto;
    min-width: 0;
}

/* --- la coppia etichetta + campo --------------------------------------- */
/*
 * La colonna dell'etichetta ha una larghezza FISSA, non una percentuale.
 * In percentuale un campo con i pulsanti attaccati - che si porta via
 * spazio - avrebbe l'etichetta piu' stretta degli altri, e i campi della
 * stessa colonna partirebbero da punti diversi: una scheda in cui i
 * riquadri non sono incolonnati sembra fatta male anche se nessuno sa
 * dire perche'.
 *
 * Si puo' cambiare da qui per tutta la scheda, o su un contenitore solo
 * se una maschera ha etichette molto lunghe.
 */
.form-input-group{
    --ds-etichetta: 190px;
    --ds-campo-min: 100px;

    display: grid;
    grid-template-columns: minmax(0, var(--ds-etichetta)) minmax(var(--ds-campo-min), 1fr);
    align-items: center;
    column-gap: 8px;
    min-height: 30px;
}

/*
 * PERCHE' DUE minmax E NON UNA MISURA FISSA
 *
 * L'etichetta ha una larghezza fissa perche' i campi della stessa colonna
 * devono partire tutti dallo stesso punto: una scheda in cui i riquadri non
 * sono incolonnati sembra fatta male anche se nessuno sa dire perche'.
 *
 * Ma fissa voleva dire fissa davvero, e in una colonna stretta - un col-md-2
 * con dentro "% Asbestos" e un numero - quei 190 pixel se li prendeva
 * comunque, lasciando al campo quello che avanzava: cinquanta pixel per
 * scriverci dentro. L'incolonnamento era perfetto e il campo inservibile.
 *
 * Adesso l'etichetta puo' arrivare A 190, non DEVE stare a 190, e il campo
 * ha un minimo sotto cui non si scende. Chi cede per primo e' l'etichetta,
 * che una parola accorciata la si legge lo stesso.
 *
 * L'incolonnamento non si perde: le colonne larghe uguali stringono
 * l'etichetta della stessa quantita', e quello che conta e' che i campi
 * VICINI siano allineati fra loro - non che lo siano con quelli di una
 * colonna che ha meta' della larghezza.
 */

.form-input-group > .control-label{
    grid-column: 1;
    grid-row: 1;
    display: flex;
    align-items: baseline;
    gap: 6px;

    margin: 0;
    padding: 0;
    min-width: 0;
    font-size: 12.5px;
    font-weight: 400;
    color: var(--ds-testo-2);
    white-space: nowrap;
    overflow: hidden;
}

/* I puntini: riempiono quello che avanza fra la parola e il campo, e
   portano l'occhio dall'una all'altro senza perdere la riga. */
.form-input-group > .control-label::after{
    content: "";
    flex: 1 1 auto;
    min-width: 10px;
    border-bottom: 1px dotted var(--ds-filo);
    transform: translateY(-3px);
}

.form-input-group > .form-control,
.form-input-group > .form-select,
.form-input-group > .select2-container{
    grid-column: 2;
    grid-row: 1;
    height: 28px;
    min-height: 28px;
    padding: 3px 8px;
    font-size: 13px;
    line-height: 1.4;
}
.form-input-group > textarea.form-control{
    height: auto;
    min-height: 56px;
    padding: 5px 8px;
}
/* Con una textarea l'etichetta sta in alto, non a meta' altezza. */
.form-input-group:has(textarea){ align-items: start; }
.form-input-group:has(textarea) > .control-label{ padding-top: 5px; }

/* L'icona che il generatore mette davanti all'etichetta. */
.form-input-group > .control-label > i,
.form-input-group > .control-label .pg-icon{
    flex: 0 0 auto;
    font-size: 14px;
    color: var(--ds-testo-3);
}

/*
 * LA FRECCIA DELLE CASELLE A SCELTA
 *
 * Il generatore scrive le tendine come <select class="form-control">, non
 * come form-select: in Bootstrap 5 la freccina la disegna solo la seconda
 * classe, quindi una tendina e una casella di testo erano identiche. Chi
 * guarda la scheda non ha modo di sapere che li' c'e' un elenco: lo scopre
 * cliccandoci sopra.
 *
 * La freccia non e' un'immagine e non e' un carattere: sono due sfumature
 * tagliate a meta' che insieme fanno un angolo. Un disegno vero andrebbe
 * scritto dentro all'indirizzo dell'immagine, e li' il colore e' un valore
 * fisso: al buio resterebbe nero su fondo scuro. Cosi' invece prende la
 * variabile del testo e segue il tema da sola.
 */
.form-input-group > select.form-control,
.form-input-group > select.form-select{
    -webkit-appearance: none;
    appearance: none;

    padding-right: 22px;

    background-image:
        linear-gradient(45deg,  transparent 50%, var(--ds-testo-2) 50%),
        linear-gradient(135deg, var(--ds-testo-2) 50%, transparent 50%);
    background-position: calc(100% - 13px) 12px, calc(100% - 9px) 12px;
    background-size: 4px 4px, 4px 4px;
    background-repeat: no-repeat;
}

/* Aperta o col fuoco sopra, la freccia si accende come il bordo. */
.form-input-group > select.form-control:focus{
    background-image:
        linear-gradient(45deg,  transparent 50%, var(--ds-accento) 50%),
        linear-gradient(135deg, var(--ds-accento) 50%, transparent 50%);
}

/* Una tendina spenta non promette un elenco che non si puo' aprire. */
.form-input-group > select.form-control:disabled,
.form-input-group > select.form-control[readonly]{
    background-image:
        linear-gradient(45deg,  transparent 50%, var(--ds-testo-3) 50%),
        linear-gradient(135deg, var(--ds-testo-3) 50%, transparent 50%);
}

/*
 * Quando la tendina la prende in mano select2, il <select> vero sparisce e
 * al suo posto c'e' un altro pezzo di HTML: la freccia la disegna lui, e
 * questa non deve andarci sopra.
 */
.form-input-group > select.select2-hidden-accessible{ background-image: none; }


/*
 * OBBLIGATORIO
 *
 * Un asterisco rosso in fondo ai puntini, appena prima del campo. Non si
 * colora il campo: un campo che non ha ancora nessun errore non deve
 * sembrare sbagliato appena si apre la scheda.
 *
 * L'asterisco e' un ::before spostato in fondo con "order": l'etichetta e'
 * una fila flessibile - parola, puntini, asterisco - e i pseudo-elementi
 * seguono l'ordine come tutti gli altri. Serviva un terzo pezzo e i pseudo
 * disponibili sono due, quindi il ::before va a finire ultimo.
 */
.form-group-default.required > .form-input-group > .control-label::before{
    content: "*";
    order: 3;
    flex: 0 0 auto;
    margin-left: 5px;
    color: var(--ds-obbl);
    font-size: 20px;
    font-weight: 700;
    line-height: 1;
    transform: translateY(4px);
}

/*
 * Anche i puntini diventano rossi.
 *
 * L'asterisco e' un segno solo, in fondo a una riga: su una scheda di venti
 * campi si vede solo se lo si cerca. I puntini invece sono lunghi quanto lo
 * spazio fra la parola e il campo, e sono gia' li' per portare l'occhio da
 * una all'altro: colorandoli, l'obbligatorieta' si legge scorrendo la
 * colonna, senza fermarsi su ogni riga.
 *
 * Sono tenui di proposito - il rosso pieno per venti righe sarebbe una
 * scheda che sembra tutta sbagliata prima ancora di toccarla. Il segnale
 * forte resta l'asterisco; questo e' l'eco.
 */
.form-group-default.required > .form-input-group > .control-label::after{
    border-bottom-color: var(--ds-obbl);
    opacity: .45;
}

/* --- i pulsanti attaccati ai campi -------------------------------------
 *
 * Il generatore li avvolge in un input-group-append - una classe di
 * Bootstrap 4 che in Bootstrap 5 non esiste piu'. E non ne mette uno: ne
 * mette uno PER PULSANTE, uno accanto all'altro, e quando e' acceso il
 * modulo degli aiuti AI ne infila anche uno dentro l'altro:
 *
 *     <div class="form-group form-group-default input-group required">
 *       <div class="form-input-group"> etichetta + campo </div>
 *       <div class="input-group-append">
 *         <a class="btn …_button_prepend"><i class="pg-icon">search</i></a>
 *         <a class="btn …_button_append"><i class="pg-icon">bin</i></a>
 *         <div class="input-group-append"> … </div>      <- a volte
 *       </div>
 *
 * I pulsanti ci sono gia' tutti, cestino compreso: quello che mancava era
 * il vestito. Invece di inseguire quei contenitori con una regola per
 * ogni forma che possono prendere, li si toglie di mezzo: display:contents
 * li fa sparire dal disegno lasciando dentro i pulsanti, che diventano
 * cosi' figli della fila del campo comunque siano annidati. Una regola
 * sola copre tutti i casi, anche quelli che il generatore non fa ancora.
 * -------------------------------------------------------------------- */

.form-group-default .input-group-append,
.form-group-default .input-group-prepend{
    display: contents;
}

.form-group-default .btn,
.form-group-default .input-group-text{
    flex: 0 0 auto;
    height: 28px;
    min-width: 28px;
    padding: 0 6px;
    display: inline-grid;
    place-items: center;

    border: 1px solid var(--ds-filo);
    border-left: 0;
    border-radius: 0;
    background: var(--ds-cromo);
    color: var(--ds-testo-2);
    font-size: 14px;
    line-height: 1;
    text-decoration: none;
    cursor: pointer;
}

.form-group-default .btn > i,
.form-group-default .btn .pg-icon{ font-size: 14px; line-height: 1; }

/* Solo l'ultimo arrotonda: in mezzo gli angoli tondi farebbero una
   catenella invece di un blocco unico. */
.form-group-default > .btn:last-child,
.form-group-default > .input-group-append:last-child > .btn:last-child,
.form-group-default > .input-group-append:last-child
    > .input-group-append:last-child > .btn:last-child{
    border-radius: 0 3px 3px 0;
}

.form-group-default .btn:hover{
    background: var(--ds-filo-tenue);
    color: var(--ds-accento-legg);
}

/*
 * Il cestino si tinge di rosso solo mentre ci si passa sopra: prima e' un
 * tasto come gli altri, ma nel momento in cui si sta per svuotare il campo
 * lo dice.
 *
 * Si riconosce dalla classe che gli mette il generatore - _button_append
 * contro _button_prepend - e non dalla posizione: la posizione cambia
 * appena si accende un modulo, il mestiere del pulsante no. Il nome del
 * componente sta davanti alla classe e cambia da progetto a progetto,
 * quindi si guarda la fine.
 */
.form-group-default .btn[class*="_button_append"]:hover{
    background: var(--ds-male-tenue);
    color: var(--ds-male);
}

/*
 * LA LENTE CHE GIRA
 *
 * Mentre la ricerca lavora, il disegno dentro al pulsante diventa un
 * cerchio che gira. Non si cambia l'icona con javascript: si nasconde
 * quella che c'e' e si disegna il cerchio col ::after. Cosi' il pulsante
 * resta della stessa misura, non salta niente intorno, e quando si
 * smette l'icona e' ancora quella di prima - non una ricostruita a mano
 * che il traduttore delle icone dovrebbe ritradurre.
 */
.form-group-default .btn{ position: relative; }

.form-group-default .btn.ds-cerca-lavora > i,
.form-group-default .btn.ds-cerca-lavora > .pg-icon{ visibility: hidden; }

.form-group-default .btn.ds-cerca-lavora::after{
    content: "";
    position: absolute;
    width: 13px;
    height: 13px;
    border: 2px solid var(--ds-filo);
    border-top-color: var(--ds-accento);
    border-radius: 50%;
    animation: ds-gira .7s linear infinite;
}

/* Chi ha chiesto di non vedere le cose muoversi non le vede muovere: il
   cerchio resta fermo, ma il colore dice lo stesso che sta lavorando. */
@media (prefers-reduced-motion: reduce){
    .form-group-default .btn.ds-cerca-lavora::after{ animation: none; }
}

/* Un pulsante prima del campo si attacca dall'altra parte. */
.form-group-default > .input-group-prepend > .btn,
.form-group-default > .input-group-prepend > .input-group-text{
    border-left: 1px solid var(--ds-filo);
    border-right: 0;
}
.form-group-default > .input-group-prepend:first-child > .btn:first-child{
    border-radius: 3px 0 0 3px;
}

/* Il campo che ha dei pulsanti attaccati non arrotonda l'angolo di quel
   lato, o fra i due resta una fessura. */
.form-group-default.input-group:has(.input-group-append) .form-input-group > .form-control,
.form-group-default.input-group:has(.input-group-append) .form-input-group > .form-select,
.form-group-default.input-group:has(> .btn) .form-input-group > .form-control{
    border-top-right-radius: 0;
    border-bottom-right-radius: 0;
}

/* Su schermo stretto l'etichetta torna sopra al campo, e i puntini
   spariscono: a quel punto non collegano piu' niente. */
@media (max-width: 575.98px){
    .form-input-group{ grid-template-columns: 1fr; row-gap: 2px; }
    .form-input-group > .control-label{ grid-column: 1; }
    .form-input-group > .form-control,
    .form-input-group > .form-select{ grid-column: 1; }
    .form-input-group > .control-label::after{ display: none; }
}


/* --- il pulsante chiaro/scuro ------------------------------------------ */
/*
 * Due icone sovrapposte, una sola visibile: si vede quella dell'ALTRO
 * modo, perche' un pulsante dice cosa fa se lo premi, non dove sei
 * adesso. Col fondo chiaro si vede la luna - "premi per il buio".
 */
.ds-tema{ position: relative; }
.ds-tema > i{ line-height: 1; }

.ds-tema .ds-tema-chiaro{ display: none; }
.ds-tema .ds-tema-scuro{ display: block; }

[data-bs-theme=scuro] .ds-tema .ds-tema-chiaro{ display: block; }
[data-bs-theme=scuro] .ds-tema .ds-tema-scuro{ display: none; }


/* =====================================================================
   17. L'OGGETTO GRIGLIA (table_design2)
   ---------------------------------------------------------------------
   La griglia arriva col suo foglio di stile, che sta negli assets del
   generatore ed e' di tutti i template: non si tocca. Ma e' scritta
   bene - tutto passa da variabili --gg-* - e le variabili si possono
   riempire da fuori.

   Il trucco e' DOVE si riempiono. Il suo foglio le mette su :root, e si
   carica dopo il nostro (viene dal <jdoc:include type="head" />), quindi
   su :root vincerebbe lui. Messe invece su .gg-grid - sull'elemento
   stesso - vincono sempre: una variabile scritta sull'elemento batte
   quella ereditata da un antenato, qualunque sia l'ordine dei fogli.

   Cosi' la griglia prende i colori del progetto senza che nessuno
   modifichi il generatore, e domani un altro template ne prendera'
   altri.
   ===================================================================== */

/*
 * Non solo .gg-grid.
 *
 * Tre pezzi della griglia non stanno dentro alla griglia: il menu' che si
 * apre dall'imbuto, il menu' delle azioni di riga e il cartellino che segue
 * il dito quando si sposta una colonna vengono attaccati in fondo alla
 * pagina, non alla tabella - devono poter uscire dai suoi bordi senza essere
 * tagliati, ed e' l'unico modo.
 *
 * Ma allora non sono discendenti di .gg-grid, e le variabili scritte li'
 * non li raggiungevano: restavano del blu di serie mentre tutto il resto era
 * gia' del colore del progetto. Si scrivono su tutti e quattro.
 */
.gg-grid,
.gg-fpop,
.gg-actpop,
.gg-drag-ghost,
.gg-toast-wrap{
    /* --- i colori: sono i nostri, con i loro nomi --- */
    --gg-bg:            var(--ds-fondo);
    --gg-surface:       var(--ds-carta);
    --gg-surface-2:     var(--ds-cromo);
    --gg-header-bg:     var(--ds-cromo);
    --gg-row-hover:     var(--ds-accento-tenue);
    --gg-row-selected:  var(--ds-accento-tenue);

    /* Niente righe a zebra: nel resto del programma le tabelle non ce
       l'hanno, e due tabelle diverse nella stessa pagina si notano. */
    --gg-row-alt:       transparent;

    --gg-border:        var(--ds-filo-tenue);
    --gg-border-strong: var(--ds-filo);
    --gg-text:          var(--ds-testo);
    --gg-text-soft:     var(--ds-testo-2);
    --gg-text-invert:   var(--ds-accento-testo, #fff);

    --gg-primary:       var(--ds-accento);
    --gg-primary-600:   var(--ds-accento-scuro);
    --gg-primary-soft:  var(--ds-accento-tenue);

    --gg-success:       var(--ds-bene);   --gg-success-soft: var(--ds-bene-tenue);
    --gg-warning:       var(--ds-attesa); --gg-warning-soft: var(--ds-attesa-tenue);
    --gg-danger:        var(--ds-male);   --gg-danger-soft:  var(--ds-male-tenue);

    /* --- la forma: piatta e bassa --- */
    --gg-radius:    0;
    --gg-radius-sm: 3px;
    --gg-radius-xs: 3px;
    --gg-shadow:     none;
    --gg-shadow-pop: 0 4px 14px rgba(0,0,0,.14);
    --gg-font:      var(--ds-testo-font);
    --gg-row-h:     26px;
    --gg-header-h:  28px;
}

/*
 * Da qui in giu' e' geometria, e la geometria nel suo foglio e' scritta
 * a numeri fissi, non a variabili: 42 pixel di riga, 36 di pulsante, 12
 * di raccordo. Va riscritta a mano, e va riscritta con una zampa in piu'
 * (.gg-grid.gg-grid) perche' il suo foglio arriva dopo il nostro e a
 * parita' di forza vincerebbe lui.
 */
.gg-grid.gg-grid{
    border-radius: 0;
    border-color: var(--ds-filo);
    box-shadow: none;
    font-size: 13px;
}

/* --- la barra sopra --- */
.gg-grid.gg-grid .gg-toolbar{
    padding: 5px 8px;
    gap: 6px;
    background: var(--ds-cromo);
    border-bottom: 1px solid var(--ds-filo);
}
.gg-grid.gg-grid .gg-toolbar .gg-title{ font-size: 13px; font-weight: 600; letter-spacing: 0; }
.gg-grid.gg-grid .gg-toolbar .gg-title .gg-dot{ width: 7px; height: 7px; box-shadow: none; }

.gg-grid.gg-grid .gg-search input{
    height: 26px; min-width: 190px;
    padding: 0 8px 0 26px;
    font-size: 12.5px;
    border-radius: 3px;
    border-color: var(--ds-filo);
    background: var(--ds-carta);
}
.gg-grid.gg-grid .gg-search input:focus{ box-shadow: 0 0 0 2px var(--ds-accento-tenue); }
.gg-grid.gg-grid .gg-search svg{ left: 7px; width: 14px; height: 14px; }

.gg-grid.gg-grid .gg-btn{
    height: 26px; padding: 0 8px; gap: 5px;
    font-size: 12.5px; font-weight: 600;
    border-radius: 3px;
    border-color: var(--ds-filo);
}
.gg-grid.gg-grid .gg-btn svg{ width: 14px; height: 14px; }
.gg-grid.gg-grid .gg-btn:active{ transform: none; }
.gg-grid.gg-grid .gg-btn.gg-icon{ padding: 0 6px; }
.gg-grid.gg-grid .gg-btn.gg-primary{ color: var(--ds-accento-testo, #fff); }

/* --- l'intestazione --- */
/*
 * Il maiuscoletto spaziato lo toglie: nel resto del programma le
 * intestazioni sono scritte normali, e "NOME PAZIENTE" in mezzo a una
 * pagina di "Nome paziente" e' la stessa parola detta con un'altra voce.
 */
.gg-grid.gg-grid .gg-table thead th{
    height: 28px;
    padding: 0 8px;
    font-size: 12px;
    font-weight: 600;
    text-transform: none;
    letter-spacing: 0;
    color: var(--ds-testo-2);
    background: var(--ds-cromo);
    border-bottom: 1px solid var(--ds-filo);
    border-right: 1px solid var(--ds-filo-tenue);
}
.gg-grid.gg-grid .gg-table thead th.gg-sorted{ color: var(--ds-testo); }
.gg-grid.gg-grid .gg-table thead th.gg-sorted .gg-sort{ color: var(--ds-accento-legg); }
.gg-grid.gg-grid .gg-table thead th .gg-sort svg{ width: 12px; height: 12px; }
.gg-grid.gg-grid .gg-table thead th .gg-sort-rank{ color: var(--ds-accento-legg); }
.gg-grid.gg-grid .gg-th-inner{ padding-right: 18px; gap: 5px; }

.gg-grid.gg-grid .gg-funnel{
    right: 6px; width: 17px; height: 17px; border-radius: 3px;
}
.gg-grid.gg-grid .gg-funnel svg{ width: 12px; height: 12px; }
.gg-grid.gg-grid .gg-funnel:hover{ color: var(--ds-accento-legg); }
.gg-grid.gg-grid .gg-funnel.active{ color: var(--ds-accento-testo, #fff); }

/* --- la riga dei filtri --- */
.gg-grid.gg-grid .gg-table thead tr.gg-filters th{
    top: 28px;
    padding: 3px 4px;
    background: var(--ds-carta);
}
.gg-grid.gg-grid .gg-table thead tr.gg-filters input,
.gg-grid.gg-grid .gg-table thead tr.gg-filters select{
    height: 24px; padding: 0 6px; font-size: 12px;
    border-radius: 3px;
    border-color: var(--ds-filo);
    background: var(--ds-carta);
}
.gg-grid.gg-grid .gg-table thead tr.gg-filters input:focus,
.gg-grid.gg-grid .gg-table thead tr.gg-filters select:focus{
    box-shadow: 0 0 0 2px var(--ds-accento-tenue);
}

/* --- il corpo --- */
.gg-grid.gg-grid .gg-table tbody td{
    height: 26px;
    padding: 2px 8px;
    font-size: 13px;
    border-bottom: 1px solid var(--ds-filo-tenue);
    border-right: 1px solid var(--ds-filo-tenue);
}
.gg-grid.gg-grid .gg-table th.gg-rownum-th,
.gg-grid.gg-grid .gg-table td.gg-rownum{
    width: 36px; min-width: 36px; max-width: 36px; font-size: 11.5px;
}
.gg-grid.gg-grid .gg-table td a{ color: var(--ds-accento-legg); }

/* --- i tasti in fondo alla riga --- */
.gg-grid.gg-grid .gg-actions{ gap: 3px; }
.gg-grid.gg-grid .gg-actions .gg-act{
    width: 22px; height: 22px; border-radius: 3px;
    border-color: var(--ds-filo);
}
.gg-grid.gg-grid .gg-actions .gg-act svg{ width: 13px; height: 13px; }
.gg-grid.gg-grid .gg-actions .gg-act:hover{ color: var(--ds-accento-legg); }
.gg-grid.gg-grid .gg-rowbtn{
    padding: 2px 8px; border-radius: 3px; font-size: 12px;
    border-color: var(--ds-filo);
}
.gg-grid.gg-grid .gg-rowbtn:hover{ color: var(--ds-accento-legg); border-color: var(--ds-accento); }

/* --- le etichette colorate --- */
.gg-grid.gg-grid .gg-badge{ border-radius: 3px; padding: 1px 6px; font-size: 11px; font-weight: 600; }
.gg-grid.gg-grid .gg-bool-lbl{ border-radius: 3px; font-size: 11.5px; padding: 0 6px; }
.gg-grid.gg-grid .gg-filelink{ border-radius: 3px; color: var(--ds-accento-legg); }
.gg-grid.gg-grid .gg-progress .bar{ height: 6px; border-radius: 2px; }
.gg-grid.gg-grid .gg-progress .bar > span{ border-radius: 2px; background: var(--ds-accento); }
.gg-grid.gg-grid .gg-avatar img{ width: 22px; height: 22px; }

/* --- il piede e le pagine --- */
.gg-grid.gg-grid .gg-table tfoot td{
    height: 28px; padding: 0 8px; font-weight: 600;
    background: var(--ds-cromo);
    border-top: 1px solid var(--ds-filo);
}
.gg-grid.gg-grid .gg-pager{
    padding: 4px 8px; gap: 8px; font-size: 12px;
    background: var(--ds-cromo);
    border-top: 1px solid var(--ds-filo);
}
.gg-grid.gg-grid .gg-pager select{ height: 24px; border-radius: 3px; border-color: var(--ds-filo); font-size: 12px; }
.gg-grid.gg-grid .gg-pager .gg-pbtn{
    min-width: 24px; height: 24px; padding: 0 6px;
    border-radius: 3px; font-size: 12px; font-weight: 600;
    border-color: var(--ds-filo);
}
.gg-grid.gg-grid .gg-pager .gg-pbtn:hover{ color: var(--ds-accento-legg); border-color: var(--ds-accento); }
.gg-grid.gg-grid .gg-pager .gg-pbtn.active{ color: var(--ds-accento-testo, #fff); }

/* --- le finestrelle e i biglietti --- */
.gg-grid.gg-grid .gg-menu-pop{ border-radius: 3px; padding: 4px; min-width: 210px; border-color: var(--ds-filo); }
.gg-grid.gg-grid .gg-menu-pop .gg-mi{ font-size: 12.5px; }
.gg-grid.gg-grid .gg-bulkbar{ padding: 5px 8px; font-size: 12.5px; color: var(--ds-accento-testo, #fff); }
.gg-toast{ border-radius: 3px; padding: 8px 12px; font-size: 12.5px; }

/* --- la cella in modifica --- */
.gg-grid.gg-grid .gg-editwrap .gg-ed{ border-width: 1px; padding: 0 6px; font-size: 13px; }
.gg-grid.gg-grid .gg-ed-save,
.gg-grid.gg-grid .gg-ed-cancel{ width: 24px; flex: 0 0 24px; border-width: 1px; }
.gg-grid.gg-grid .gg-ed-save svg,
.gg-grid.gg-grid .gg-ed-cancel svg{ width: 13px; height: 13px; }

/* L'asterisco dell'obbligatorio: lo stesso rosso delle schede, non un
   secondo rosso che vuol dire la stessa cosa. */
.gg-grid.gg-grid .gg-req-star{ color: var(--ds-obbl); }
.gg-grid.gg-grid .gg-req{ border-color: var(--ds-male) !important; }

/* --- al buio --- */
/*
 * script.js scrive anche data-theme="dark", che e' l'attributo che la
 * griglia si aspetta: cosi' le sue regole del buio - ombre e velo di
 * caricamento - si accendono da sole. I colori restano i nostri: le
 * variabili qui sotto stanno di nuovo sull'elemento e vincono comunque.
 */
[data-bs-theme=scuro] .gg-grid,
[data-bs-theme=scuro] .gg-fpop,
[data-bs-theme=scuro] .gg-actpop,
[data-bs-theme=scuro] .gg-drag-ghost,
[data-bs-theme=scuro] .gg-toast-wrap{
    --gg-bg:            var(--ds-fondo);
    --gg-surface:       var(--ds-carta);
    --gg-surface-2:     var(--ds-cromo);
    --gg-header-bg:     var(--ds-cromo);
    --gg-row-hover:     var(--ds-accento-tenue);
    --gg-row-selected:  var(--ds-accento-tenue);
    --gg-row-alt:       transparent;
    --gg-border:        var(--ds-filo-tenue);
    --gg-border-strong: var(--ds-filo);
    --gg-text:          var(--ds-testo);
    --gg-text-soft:     var(--ds-testo-2);
    --gg-primary:       var(--ds-accento);
    --gg-primary-600:   var(--ds-accento-scuro);
    --gg-primary-soft:  var(--ds-accento-tenue);
    --gg-success:       var(--ds-bene);   --gg-success-soft: var(--ds-bene-tenue);
    --gg-warning:       var(--ds-attesa); --gg-warning-soft: var(--ds-attesa-tenue);
    --gg-danger:        var(--ds-male);   --gg-danger-soft:  var(--ds-male-tenue);
}

/* I due verdi e i due rossi scritti a mano nel suo foglio - non passano
   da variabile, quindi al buio restavano quelli del chiaro. */
.gg-grid.gg-grid .gg-bool.is-yes{ color: var(--ds-bene); }
.gg-grid.gg-grid .gg-bool.is-no{  color: var(--ds-male); }
.gg-grid.gg-grid .gg-star.on,
.gg-grid.gg-grid .gg-star2-fg{ color: var(--ds-attesa); }


/* =====================================================================
   18. LE FINESTRE
   ---------------------------------------------------------------------
   Piatte come il resto: niente angoli tondi grandi, niente ombre da
   biglietto da visita. Una finestra qui e' una scrivania appoggiata
   sopra a quella di prima, non un oggetto che galleggia.
   ===================================================================== */

.ds-finestra{
    position: fixed;
    inset: 0;
    z-index: 2100;
    display: grid;
    place-items: center;
    padding: 18px;

    opacity: 0;
    pointer-events: none;
    transition: opacity .16s ease;
}
.ds-finestra.ds-aperta{ opacity: 1; pointer-events: auto; }

.ds-finestra-velo{
    position: absolute;
    inset: 0;
    background: rgba(12,11,16,.44);
}

.ds-finestra-scatola{
    position: relative;
    display: flex;
    flex-direction: column;

    width: 100%;
    max-width: 100%;
    height: 88vh;
    max-height: 100%;

    background: var(--ds-carta);
    border: 1px solid var(--ds-filo);
    border-radius: 4px;
    box-shadow: 0 12px 40px rgba(12,11,16,.30);
    overflow: hidden;

    transform: translateY(-8px) scale(.995);
    transition: transform .16s ease;
}
.ds-finestra.ds-aperta .ds-finestra-scatola{ transform: none; }

/* Le misure. Il generatore ne chiede quattro e le chiama come Bootstrap,
   quindi si chiamano cosi' anche qui. */
.ds-mis-sm  { max-width: 460px; }
.ds-mis-md  { max-width: 700px; }
.ds-mis-lg  { max-width: 1000px; }
.ds-mis-xl  { max-width: 1400px; }
.ds-mis-full{ max-width: none; height: 100%; }

/*
 * Una finestra con dentro del testo non deve essere alta 88vh: quattro
 * righe di spiegazione in mezzo a mezzo schermo vuoto sembrano un errore.
 * Con una maschera invece l'altezza serve tutta, perche' quanto e' lunga
 * non si sa prima.
 */
.ds-finestra.ds-a-misura .ds-finestra-scatola{ height: auto; max-height: 88vh; }

.ds-finestra-testa{
    flex: 0 0 auto;
    display: flex;
    align-items: center;
    gap: 10px;
    height: 34px;
    padding: 0 6px 0 12px;
    background: var(--ds-cromo);
    border-bottom: 1px solid var(--ds-filo);
}
.ds-finestra-titolo{
    flex: 1 1 auto;
    min-width: 0;
    margin: 0;
    font-size: 13px;
    font-weight: 600;
    color: var(--ds-testo);
    white-space: nowrap;
    overflow: hidden;
    text-overflow: ellipsis;
}
.ds-finestra-chiudi{
    flex: 0 0 auto;
    width: 26px; height: 26px;
    display: grid; place-items: center;
    padding: 0;
    border: 0;
    border-radius: 3px;
    background: transparent;
    color: var(--ds-testo-2);
    font-size: 17px;
    cursor: pointer;
}
.ds-finestra-chiudi:hover{ background: var(--ds-male-tenue); color: var(--ds-male); }

.ds-finestra-corpo{
    position: relative;
    flex: 1 1 auto;
    min-height: 0;
    display: flex;
    background: var(--ds-fondo);
}

/*
 * La cornice si prende tutto quello che resta.
 *
 * Prima era alta 75vh fissi, e le due altezze non c'entravano niente
 * l'una con l'altra: se la maschera era piu' corta restava del vuoto in
 * fondo, se era piu' lunga si scorreva due volte - una dentro la cornice
 * e una fuori. Cosi' invece la barra di scorrimento e' una sola, ed e'
 * quella della maschera.
 */
.ds-finestra-cornice{
    flex: 1 1 auto;
    width: 100%;
    border: 0;
    display: block;
}

/* Il testo, quando dentro non c'e' una maschera ma una spiegazione. */
.ds-finestra-testo{
    flex: 1 1 auto;
    padding: 12px 14px;
    overflow: auto;
    background: var(--ds-carta);
    font-size: 13px;
    line-height: 1.55;
}

/* L'attesa mentre la maschera arriva: senza, per un secondo si guarda un
   rettangolo bianco vuoto e non si sa se sta caricando o se e' rotto. */
.ds-finestra-attesa{
    position: absolute;
    inset: 0;
    display: grid;
    place-items: center;
    background: var(--ds-fondo);
    z-index: 2;
    transition: opacity .18s ease;
}
.ds-finestra.ds-pronta .ds-finestra-attesa{ opacity: 0; pointer-events: none; }

.ds-finestra-piede{
    flex: 0 0 auto;
    display: flex;
    align-items: center;
    justify-content: flex-end;
    gap: 6px;
    padding: 6px 10px;
    background: var(--ds-cromo);
    border-top: 1px solid var(--ds-filo);
}

/* Su schermo piccolo la finestra prende tutto: i margini di cortesia,
   quando lo schermo e' quello di un telefono, sono spazio tolto al
   lavoro. */
@media (max-width: 575.98px){
    .ds-finestra{ padding: 0; }
    .ds-finestra-scatola{ height: 100%; border-radius: 0; border: 0; }
}


/* --- il menu' dell'imbuto ---------------------------------------------- */
/*
 * Stesse misure del resto: righe basse, spigoli vivi, il tasto che conferma
 * del colore del progetto e quello che annulla neutro. Prima erano due
 * pulsanti alti 34 con gli angoli tondi, uno blu, in una finestrella
 * arrotondata: sembrava arrivare da un altro programma, ed e' esattamente
 * quello che era.
 */
.gg-fpop.gg-fpop{
    width: 250px;
    border-radius: 3px;
    border-color: var(--ds-filo);
    font-size: 12.5px;
    box-shadow: 0 6px 22px rgba(12,11,16,.22);
}
.gg-fpop.gg-fpop .gg-fpop-head{
    padding: 6px 10px;
    font-size: 12.5px;
    font-weight: 600;
    background: var(--ds-cromo);
    border-bottom: 1px solid var(--ds-filo);
}
.gg-fpop.gg-fpop .gg-fpop-sort,
.gg-fpop.gg-fpop .gg-fpop-freeze,
.gg-fpop.gg-fpop .gg-fpop-auto{ padding: 3px; gap: 0; }

.gg-fpop.gg-fpop .gg-fpop-sort button,
.gg-fpop.gg-fpop .gg-fpop-freeze button,
.gg-fpop.gg-fpop .gg-fpop-auto button{
    padding: 4px 7px;
    font-size: 12.5px;
    border-radius: 3px;
    gap: 7px;
}
.gg-fpop.gg-fpop .gg-fpop-sort button svg,
.gg-fpop.gg-fpop .gg-fpop-freeze button svg,
.gg-fpop.gg-fpop .gg-fpop-auto button svg{ width: 14px; height: 14px; color: var(--ds-testo-2); }

.gg-fpop.gg-fpop .gg-fpop-search{ padding: 6px 8px 3px; }
.gg-fpop.gg-fpop .gg-fpop-search svg{ left: 15px; width: 13px; height: 13px; }
.gg-fpop.gg-fpop .gg-fpop-search input{
    height: 24px;
    padding: 0 7px 0 26px;
    font-size: 12.5px;
    border-radius: 3px;
    border-color: var(--ds-filo);
    background: var(--ds-carta);
}
.gg-fpop.gg-fpop .gg-fpop-search input:focus{ box-shadow: 0 0 0 2px var(--ds-accento-tenue); }

.gg-fpop.gg-fpop .gg-fpop-all,
.gg-fpop.gg-fpop .gg-fp-item{ padding: 3px 10px; gap: 7px; font-size: 12.5px; }
.gg-fpop.gg-fpop .gg-fpop-list{ max-height: 200px; padding: 2px 0; }
.gg-fpop.gg-fpop input[type=checkbox]{ width: 13px; height: 13px; }

.gg-fpop.gg-fpop .gg-fpop-actions{
    padding: 6px 8px;
    gap: 6px;
    background: var(--ds-cromo);
    border-top: 1px solid var(--ds-filo);
}
.gg-fpop.gg-fpop .gg-fpop-actions .gg-btn{ height: 26px; border-radius: 3px; font-size: 12.5px; }
.gg-fpop.gg-fpop .gg-fpop-actions .gg-btn.gg-primary{ color: var(--ds-accento-testo, #fff); }

.gg-fpop.gg-fpop .gg-fpop-range{ padding: 8px; gap: 6px; }
.gg-fpop.gg-fpop .gg-fpop-range label{ font-size: 11px; text-transform: none; letter-spacing: 0; }
.gg-fpop.gg-fpop .gg-fpop-range input{ height: 24px; border-radius: 3px; border-color: var(--ds-filo); font-size: 12.5px; }
.gg-fpop.gg-fpop .gg-fpop-hint{ padding: 0 10px 8px; font-size: 11px; }

/* Il menu' delle azioni di riga e il cartellino del trascinamento. */
.gg-actpop.gg-actpop{ border-radius: 3px; border-color: var(--ds-filo); padding: 4px; font-size: 12.5px; }
.gg-actpop.gg-actpop .gg-mi{ padding: 4px 8px; border-radius: 3px; font-size: 12.5px; }
.gg-drag-ghost.gg-drag-ghost{
    border-radius: 3px; padding: 3px 8px; font-size: 12px;
    color: var(--ds-accento-testo, #fff);
}


/* =====================================================================
   19. LE CASELLE A SPUNTA, VESTITE DA INTERRUTTORE
   ---------------------------------------------------------------------
   Il generatore le scrive cosi':

       <div class="form-check primary [required]" id="X_container">
         <input type="checkbox" class="..." name="..." id="X" value="1">
         <label for="X">Etichetta</label>
       </div>

   e' markup di Bootstrap 4: in Bootstrap 5 .form-check si aspetta
   .form-check-input sull'input e .form-check-label sull'etichetta, e
   senza quelle due classi il contenitore applica un rientro di 1.5em
   che non compensa niente e la casella resta quella grezza del sistema,
   incollata alla parola. E' il "problema di html" che si vede.

   Non si tocca il generatore: quel markup ce l'hanno tutti i progetti
   gia' fatti. Si veste da qui, e si vestono anche meglio.

   .primary e' la maniglia: quella classe la mette solo il generatore, e
   gli interruttori restano confinati ai suoi campi. Le caselle scritte a
   mano - il "ricordami" dell'accesso - restano caselle.
   ===================================================================== */

.form-check.primary{
    /*
     * Stessa griglia degli altri campi: etichetta, puntini, comando. Una
     * riga di scheda deve leggersi come tutte le altre - se la spunta
     * fosse l'unica cosa allineata a sinistra, l'occhio che scorre la
     * colonna dei comandi ci inciamperebbe ogni volta.
     */
    --ds-etichetta: 190px;
    --ds-campo-min: 100px;

    display: grid;
    grid-template-columns: minmax(0, var(--ds-etichetta)) minmax(var(--ds-campo-min), 1fr);
    align-items: center;
    column-gap: 8px;
    min-height: 30px;
    padding-left: 0;
    margin: 0;
}

/* L'etichetta e' scritta DOPO l'input, ma va disegnata prima: con la
   griglia si dice in quale colonna sta e l'ordine nel documento non
   conta piu'. */
.form-check.primary > label{
    /*
     * Riga 1 detta esplicitamente, non solo la colonna.
     *
     * L'input nel documento viene PRIMA dell'etichetta, e la griglia
     * sistema quello che trova andando avanti e senza mai tornare
     * indietro: messo l'input in riga 1 colonna 2, l'etichetta che chiede
     * la colonna 1 non poteva piu' rientrare in quella riga e finiva in
     * una riga tutta sua, sotto. Si vedeva come un interruttore sfasato in
     * alto rispetto alla sua parola.
     */
    grid-column: 1;
    grid-row: 1;
    display: flex;
    align-items: baseline;
    gap: 6px;

    margin: 0;
    padding: 0;
    min-width: 0;
    font-size: 12.5px;
    font-weight: 400;
    color: var(--ds-testo-2);
    white-space: nowrap;
    overflow: hidden;
    cursor: pointer;
}
.form-check.primary > label::after{
    content: "";
    flex: 1 1 auto;
    min-width: 6px;
    border-bottom: 1px dotted var(--ds-filo);
    transform: translateY(-3px);
}

/* --- l'interruttore ----------------------------------------------------
 *
 * Disegnato a mano e non con .form-switch di Bootstrap, perche' quella
 * vuole .form-check-input sull'input - che qui non c'e' - e perche' il
 * suo pallino e' un'immagine con dentro un colore fisso: acceso
 * resterebbe blu Bootstrap qualunque accento abbia il progetto.
 *
 * Qui il pallino e' un ::after e il fondo acceso e' la variabile
 * dell'accento: cambia col progetto senza che nessuno lo riscriva.
 */
.form-check.primary > input[type="checkbox"]{
    grid-column: 2;
    grid-row: 1;
    justify-self: start;

    -webkit-appearance: none;
    appearance: none;

    position: relative;
    flex: 0 0 auto;
    width: 32px;
    height: 18px;
    margin: 0;
    padding: 0;
    border: 0;
    border-radius: 9px;
    background: var(--ds-filo);
    cursor: pointer;
    transition: background .15s ease;
}

.form-check.primary > input[type="checkbox"]::after{
    content: "";
    position: absolute;
    top: 2px; left: 2px;
    width: 14px; height: 14px;
    border-radius: 50%;
    background: #fff;
    box-shadow: 0 1px 2px rgba(12,11,16,.30);
    transition: transform .15s ease;
}

.form-check.primary > input[type="checkbox"]:checked{
    background: var(--ds-accento);
}
.form-check.primary > input[type="checkbox"]:checked::after{
    transform: translateX(14px);
}

.form-check.primary > input[type="checkbox"]:focus-visible{
    outline: 0;
    box-shadow: 0 0 0 3px var(--ds-accento-tenue);
}

/*
 * Spento: si vede che c'e' e si vede che non risponde. Il generatore lo
 * fa con onclick="return false" invece che con disabled - l'input resta
 * abilitato per poterlo mandare al server - quindi lo si riconosce dal
 * cursore che ci mette sull'etichetta.
 */
.form-check.primary > input[type="checkbox"]:disabled,
.form-check.primary > label[style*="not-allowed"] ~ input[type="checkbox"]{
    opacity: .55;
    cursor: not-allowed;
}
.form-check.primary > label[style*="not-allowed"]{ cursor: not-allowed; }

/* L'asterisco anche qui, con la stessa regola delle altre righe. */
.form-check.primary.required > label::before{
    content: "*";
    order: 3;
    flex: 0 0 auto;
    margin-left: 5px;
    color: var(--ds-obbl);
    font-size: 20px;
    font-weight: 700;
    line-height: 1;
    transform: translateY(4px);
}
.form-check.primary.required > label::after{
    border-bottom-color: var(--ds-obbl);
    opacity: .45;
}

/* Su schermo stretto l'etichetta torna sopra, come per gli altri campi. */
@media (max-width: 575.98px){
    .form-check.primary{ grid-template-columns: 1fr; row-gap: 2px; }
    .form-check.primary > label{ grid-column: 1; }
    .form-check.primary > input[type="checkbox"]{ grid-column: 1; }
    .form-check.primary > label::after{ display: none; }
}


/* =====================================================================
   20. I RESIDUI DEL TEMA DI PRIMA
   ---------------------------------------------------------------------
   Il generatore scrive markup nato su Bootstrap 3 e 4 e sul tema Pages,
   e quel markup e' in tutte le maschere di tutti i progetti gia' fatti:
   non si tocca. Le classi che li' volevano dire qualcosa e qui non
   vogliono dire piu' niente si rimettono in piedi da questa parte.

   Non e' pignoleria. Una classe morta di solito non si vede - e' un
   margine che non c'e', una parola che non e' maiuscola - ma alcune di
   queste NASCONDONO roba, e una classe che nasconde e non funziona piu'
   non lascia le cose come stanno: le fa comparire.
   ===================================================================== */

/*
 * .hide - questa e' la piu' importante di tutte.
 *
 * E' Bootstrap 3. Il generatore la usa per tenere fuori dalla vista i
 * campi di servizio delle tendine che caricano da sole, e per i tasti
 * "apri file" e "scarica file" finche' un file non c'e'. In Bootstrap 5
 * la classe non esiste piu': quei campi si vedevano tutti, e su ogni
 * campo file comparivano due pulsanti che non avevano niente da aprire.
 */
.hide{ display: none !important; }

/*
 * LA GRIGLIA DI BOOTSTRAP 3
 *
 * col-xs-* e' diventato col-* in Bootstrap 4. Senza, quelle colonne non
 * hanno larghezza e si mettono una sotto l'altra. Si rimettono SOLO sotto
 * i 576px: sopra c'e' gia' col-sm-*, e se valessero sempre gli
 * andrebbero contro.
 */
@media (max-width: 575.98px){
    .col-xs-1{ flex: 0 0 auto; width: 8.33333333%; }
    .col-xs-2{ flex: 0 0 auto; width: 16.66666667%; }
    .col-xs-3{ flex: 0 0 auto; width: 25%; }
    .col-xs-4{ flex: 0 0 auto; width: 33.33333333%; }
    .col-xs-5{ flex: 0 0 auto; width: 41.66666667%; }
    .col-xs-6{ flex: 0 0 auto; width: 50%; }
    .col-xs-7{ flex: 0 0 auto; width: 58.33333333%; }
    .col-xs-8{ flex: 0 0 auto; width: 66.66666667%; }
    .col-xs-9{ flex: 0 0 auto; width: 75%; }
    .col-xs-10{ flex: 0 0 auto; width: 83.33333333%; }
    .col-xs-11{ flex: 0 0 auto; width: 91.66666667%; }
    .col-xs-12{ flex: 0 0 auto; width: 100%; }
}

/*
 * LE SPAZIATURE DEL TEMA PAGES
 *
 * m-l-5, m-t-10, no-margin: la vecchia convenzione, dove il numero erano
 * pixel. In Bootstrap 5 i margini si chiamano ms-*, mt-*, e il numero e'
 * un passo, non una misura. Si traducono, invece di lasciarle cadere:
 * sono quasi sempre il respiro fra un'icona e la parola che segue.
 */
.no-margin{ margin: 0 !important; }
.m-l-5 { margin-left: 5px; }
.m-l-10{ margin-left: 10px; }
.m-r-5 { margin-right: 5px; }
.m-r-10{ margin-right: 10px; }
.m-t-5 { margin-top: 5px; }
.m-t-10{ margin-top: 10px; }
.m-t-20{ margin-top: 20px; }
.m-b-5 { margin-bottom: 5px; }
.m-b-10{ margin-bottom: 10px; }
.m-b-20{ margin-bottom: 20px; }

/* pl-2 e' Bootstrap 4: in Bootstrap 5 e' diventata ps-2, perche' i lati
   si chiamano start ed end per via delle lingue che si scrivono al
   contrario. Stessa cosa per le altre quattro. */
.pl-1{ padding-left:  .25rem; } .pr-1{ padding-right:  .25rem; }
.pl-2{ padding-left:  .5rem; }  .pr-2{ padding-right:  .5rem; }
.pl-3{ padding-left:  1rem; }   .pr-3{ padding-right:  1rem; }
.ml-1{ margin-left:   .25rem; } .mr-1{ margin-right:   .25rem; }
.ml-2{ margin-left:   .5rem; }  .mr-2{ margin-right:   .5rem; }
.ml-3{ margin-left:   1rem; }   .mr-3{ margin-right:   1rem; }
.ml-auto{ margin-left: auto; }  .mr-auto{ margin-right: auto; }

/* py-6 e h-xl-100 non esistono in Bootstrap 5: i passi arrivano a 5, e
   le altezze non hanno la versione per schermo. */
.py-6{ padding-top: 4rem; padding-bottom: 4rem; }
@media (min-width: 1200px){ .h-xl-100{ height: 100%; } }

/* Le briciole del tema Pages: quello che dicevano lo dicono ancora. */
.all-caps{ text-transform: uppercase; letter-spacing: .4px; }
.pointer{ cursor: pointer; }
.font-montserrat{ font-family: var(--ds-testo-font); }
.text-gray-400{ color: var(--ds-testo-3); }
.btn-xs{ --bs-btn-padding-y: 1px; --bs-btn-padding-x: 6px; --bs-btn-font-size: 11.5px; }

/* Metronic chiamava cosi' i pezzi di un riquadro. Qui il riquadro e' gia'
   un .card e queste servono solo a mettere in fila quello che contengono. */
.card-toolbar{ display: flex; align-items: center; gap: 6px; margin-left: auto; }
.card-label{ font-size: 13px; font-weight: 600; color: var(--ds-testo); }
.card-controls{ display: flex; align-items: center; gap: 4px; margin-left: auto; }
.card-flush > .card-header{ background: transparent; border-bottom: 0; }

/*
 * LE LINGUETTE CHE SCORRONO
 *
 * Il generatore avvolge le linguette in un carrello con due frecce ai
 * lati, per quando sono piu' larghe dello spazio. Senza foglio di stile
 * le due frecce restavano due caratteri sciolti sopra e sotto la fila -
 * si vedevano come due segni misteriosi - e il carrello non scorreva.
 */
.gmcedesign-navtabs-wrapper{
    display: flex;
    align-items: stretch;
    gap: 2px;
    border-bottom: 1px solid var(--ds-filo);
    margin-bottom: 10px;
}
.gmcedesign-navtabs-scroll{
    flex: 1 1 auto;
    min-width: 0;
    overflow-x: auto;
    scrollbar-width: none;
}
.gmcedesign-navtabs-scroll::-webkit-scrollbar{ display: none; }
.gmcedesign-navtabs-scroll > .nav-tabs{ border-bottom: 0; flex-wrap: nowrap; }

.gmcedesign-navtabs-arrow{
    flex: 0 0 auto;
    width: 20px;
    display: flex;
    align-items: center;
    justify-content: center;
    color: var(--ds-testo-3);
    font-size: 11px;
    cursor: pointer;
    user-select: none;
}
.gmcedesign-navtabs-arrow:hover{ color: var(--ds-testo); background: var(--ds-cromo); }

/* Le frecce si mostrano solo quando c'e' davvero qualcosa fuori: il
   javascript del generatore ci mette una classe quando serve. Finche'
   non serve, non si vedono - due frecce sempre accese accanto a tre
   linguette che ci stanno tutte sono due bugie. */
.gmcedesign-navtabs-arrow[style*="display: none"],
.gmcedesign-navtabs-arrow.disabled{ visibility: hidden; }

/* Il triangolino sotto la linguetta scelta: nel tema di prima era un
   disegno, qui la linguetta scelta si riconosce gia' dal filo colorato.
   La classe resta viva ma non aggiunge niente. */
.nav-tabs-linetriangle{ /* niente: la linguetta si riconosce dal filo */ }

/* Vecchi nomi delle voci: le mette il generatore accanto a nav-item e
   nav-link, che sono quelle che contano. */
.navtab, .navitem{ /* niente: valgono nav-item e nav-link */ }

/* ---------------------------------------------------------------------
 * IL WIDGET CHE SI STA CARICANDO
 *
 * Il nome della classe inganna, e ci sono cascato: "widget-loader-circle"
 * sembra il nome di una rotellina, e qui dentro era disegnata come tale -
 * sedici pixel, bordo, e ds-gira addosso.
 *
 * Solo che quella classe il generatore NON la mette su una rotellina: la
 * mette sulla SCHEDA del widget.
 *
 *     <div class="card no-margin widget-loader-circle h-100" id="widget_x">
 *       <div class="card-header"> titolo + tasto ricarica </div>
 *       <div class="card-body" id="widget_x_content"></div>
 *
 * Quindi la scheda diventava un cerchietto di sedici pixel che girava su
 * se stesso trascinandosi dietro il proprio titolo - il titolo che gira
 * inclinato in mezzo alla maschera, e sotto il pallino della lista dei
 * comandi. Una trottola, letteralmente.
 *
 * La scheda resta una scheda. La rotellina va dove serve davvero: dentro
 * al corpo, e solo finche' e' vuoto. Quando getWidgetContent_x() ci
 * scrive dentro, :empty smette di valere e la rotellina sparisce da sola -
 * senza che nessuno debba ricordarsi di toglierla.
 * ------------------------------------------------------------------- */
.widget-loader-circle > .card-body:empty{
    position: relative;
    min-height: 90px;
}
.widget-loader-circle > .card-body:empty::after{
    content: "";
    position: absolute;
    top: 50%; left: 50%;
    width: 20px; height: 20px;
    margin: -10px 0 0 -10px;
    border: 2px solid var(--ds-filo);
    border-top-color: var(--ds-accento);
    border-radius: 50%;
    animation: ds-gira .7s linear infinite;
}

/* I comandi della scheda sono una <ul>: senza questa riga restano i
   pallini dell'elenco puntato accanto a ogni pulsantino. */
.card-controls ul{
    display: flex;
    align-items: center;
    gap: 2px;
    margin: 0; padding: 0;
    list-style: none;
}
.card-controls ul > li{ display: block; }
.card-controls a{
    display: inline-grid; place-items: center;
    width: 24px; height: 24px;
    border-radius: 3px;
    color: var(--ds-testo-3);
    font-size: 15px;
    text-decoration: none;
}
.card-controls a:hover{ background: var(--ds-cromo); color: var(--ds-testo); }

/* La freccina della tendina, quando il generatore la scrive a parte. */
.dropdown-toggle-icon{ margin-left: 4px; font-size: 11px; opacity: .7; }
.brief-dropdown-menu{ min-width: 180px; }
.colorpicker-input-addon{ display: inline-flex; align-items: center; padding: 0 6px; }


/* =====================================================================
   21. LE TENDINE DI RICERCA (select2)
   ---------------------------------------------------------------------
   select2 porta un suo foglio di stile, e quel foglio e' del 2015: un
   riquadro alto 28 con gli angoli tondi, il fondo bianco scritto a mano
   e il blu di serie sulla voce puntata. In denso stonava due volte -
   una perche' non somiglia agli altri campi, e una perche' al buio
   restava bianco: quei colori sono scritti come valori fissi, non
   passano da nessuna variabile, e quindi il tema non li tocca.

   Qui la tendina diventa un campo di denso: stessa altezza, stesso filo,
   stessi angoli, e i colori presi dalle variabili - quindi segue il tema
   e l'accento del progetto senza che nessuno li riscriva.
   ===================================================================== */

/* --- il campo chiuso --------------------------------------------------- */
.select2-container--default .select2-selection--single{
    height: 28px;
    padding: 0;
    border: 1px solid var(--ds-filo);
    border-radius: 3px;
    background: var(--ds-carta);
    outline: 0;
}
.select2-container--default .select2-selection--single .select2-selection__rendered{
    height: 26px;
    padding: 0 24px 0 8px;
    line-height: 26px;
    font-size: 13px;
    color: var(--ds-testo);
}
.select2-container--default .select2-selection--single .select2-selection__placeholder{
    color: var(--ds-testo-3);
}

/* La freccia: la stessa dei select normali, disegnata con due sfumature
   invece che col bordo triangolare di select2, cosi' le due tendine -
   quella con la ricerca e quella senza - sono identiche a vedersi. */
.select2-container--default .select2-selection--single .select2-selection__arrow{
    height: 26px;
    width: 22px;
    right: 0;
}
.select2-container--default .select2-selection--single .select2-selection__arrow b{
    border: 0;
    margin: 0;
    top: 0; left: 0;
    width: 22px; height: 26px;
    background-image:
        linear-gradient(45deg,  transparent 50%, var(--ds-testo-2) 50%),
        linear-gradient(135deg, var(--ds-testo-2) 50%, transparent 50%);
    background-position: 9px 12px, 13px 12px;
    background-size: 4px 4px, 4px 4px;
    background-repeat: no-repeat;
}
.select2-container--default.select2-container--open .select2-selection--single .select2-selection__arrow b{
    background-image:
        linear-gradient(135deg, transparent 50%, var(--ds-accento) 50%),
        linear-gradient(45deg,  var(--ds-accento) 50%, transparent 50%);
}

.select2-container--default.select2-container--open .select2-selection--single,
.select2-container--default.select2-container--focus .select2-selection--single{
    border-color: var(--ds-accento);
    box-shadow: 0 0 0 2px var(--ds-accento-tenue);
}

/* Spenta: come un campo qualsiasi che non si tocca. */
.select2-container--default.select2-container--disabled .select2-selection--single{
    background: var(--ds-cromo);
}
.select2-container--default .select2-selection--single .select2-selection__clear{
    color: var(--ds-testo-3);
    margin-right: 22px;
}

/* --- l'elenco che si apre ---------------------------------------------- */
.select2-container--default .select2-dropdown{
    border: 1px solid var(--ds-filo);
    border-radius: 3px;
    background: var(--ds-carta);
    box-shadow: 0 6px 22px rgba(12,11,16,.18);
    z-index: 2200;   /* sopra alle finestre, che stanno a 2100 */
}
.select2-container--default .select2-search--dropdown{ padding: 5px; }
.select2-container--default .select2-search--dropdown .select2-search__field{
    height: 26px;
    padding: 0 7px;
    font-size: 12.5px;
    border: 1px solid var(--ds-filo);
    border-radius: 3px;
    background: var(--ds-carta);
    color: var(--ds-testo);
    outline: 0;
}
.select2-container--default .select2-search--dropdown .select2-search__field:focus{
    border-color: var(--ds-accento);
}
.select2-container--default .select2-results__option{
    padding: 4px 8px;
    font-size: 13px;
    color: var(--ds-testo);
}
.select2-container--default .select2-results__option--highlighted[aria-selected],
.select2-container--default .select2-results__option--highlighted{
    background: var(--ds-accento-tenue);
    color: var(--ds-accento-legg);
}
.select2-container--default .select2-results__option[aria-selected=true]{
    background: var(--ds-cromo);
    color: var(--ds-testo);
    font-weight: 600;
}
.select2-container--default .select2-results__message{ color: var(--ds-testo-2); font-size: 12.5px; }

/* --- la versione a piu' scelte -----------------------------------------
 *
 * Qui tocco il meno possibile: solo i colori, che senza sarebbero bianchi
 * fissi e al buio sparirebbero. Niente display, niente order, niente
 * position: la disposizione delle pastiglie se la fa select2, ed e' l'unico
 * pezzo dove un mio ritocco poteva spostare qualcosa che non si vede da
 * qui.
 */
.select2-container--default .select2-selection--multiple{
    min-height: 28px;
    border: 1px solid var(--ds-filo);
    border-radius: 3px;
    background: var(--ds-carta);
}
.select2-container--default .select2-selection--multiple .select2-selection__choice{
    border: 1px solid var(--ds-accento);
    border-radius: 3px;
    background: var(--ds-accento-tenue);
    color: var(--ds-accento-legg);
    font-size: 12px;
}
.select2-container--default .select2-selection--multiple .select2-selection__choice__remove{
    color: var(--ds-accento-legg);
}
.select2-container--default .select2-selection--multiple .select2-search__field{
    color: var(--ds-testo);
}
.select2-container--default.select2-container--focus .select2-selection--multiple{
    border-color: var(--ds-accento);
}

/*
 * Dentro alla riga di filtri di una tabella le tendine sono ancora piu'
 * basse, come i campi di testo che le stanno accanto.
 */
.table .filtri .select2-container--default .select2-selection--single{ height: 24px; }
.table .filtri .select2-container--default .select2-selection--single .select2-selection__rendered{
    height: 22px; line-height: 22px; font-size: 12px;
}
.table .filtri .select2-container--default .select2-selection--single .select2-selection__arrow,
.table .filtri .select2-container--default .select2-selection--single .select2-selection__arrow b{
    height: 22px;
}


/* =====================================================================
   22. LA FINESTRA CHE SCEGLIE UN RECORD
   ---------------------------------------------------------------------
   Quella che si apre dalla lente di un campo di selezione. Il markup lo
   scrive getStructSelection ed e' quello di un tema di tre versioni fa:

       <div class="panel table-responsive table-briefmodal">
         <div class="row" style="margin: auto">
           <div class="input-group">
             <input class="form-control" name="f_search" ...>
             <div class="input-group-append"><button class="btn">…

   Il campo di ricerca sta dentro a una .row messa li' per centrarlo. Una
   .row di Bootstrap non centra niente: e' una fila con i margini
   negativi, fatta per stare dentro a un contenitore con del padding. Qui
   il contenitore padding non ne ha, quindi il campo usciva di dodici
   pixel da una parte e sbatteva contro il bordo dall'altra - sfalsato
   rispetto alla tabella che gli sta sotto, che e' esattamente quello che
   si vedeva.

   Non si tocca il generatore: quel markup lo condividono tutti i
   progetti. Si rimette in riga da qui.
   ===================================================================== */

.table-briefmodal{
    border: 0;
    padding: 0;
    margin: 0;
}

/* La riga della ricerca diventa una barra vera, alta come le altre barre
   del programma, con il filo sotto che la stacca dalla tabella. */
.table-briefmodal > .row{
    display: block;
    margin: 0 !important;
    padding: 7px 10px;
    background: var(--ds-cromo);
    border-bottom: 1px solid var(--ds-filo);
}

/* Il campo non si prende tutta la larghezza: una casella di ricerca lunga
   un metro sembra un campo da compilare, non un filtro. Si ferma dove
   serve e resta a sinistra, incolonnata con la prima colonna. */
.table-briefmodal > .row > .input-group{
    width: min(420px, 100%);
    flex-wrap: nowrap;
}

/* Bootstrap da' dodici pixel di padding ai figli di una .row - e' la
   meta' della gronda fra due colonne. Qui dentro non ci sono colonne, e
   quei dodici pixel erano il disallineamento fra il campo di ricerca e
   la prima colonna della tabella sotto. */
.table-briefmodal > .row > *{ padding-left: 0; padding-right: 0; }

.table-briefmodal .input-group > .form-control{
    height: 28px;
    min-height: 28px;
    padding: 3px 8px;
    font-size: 13px;
    border: 1px solid var(--ds-filo);
    border-radius: 3px 0 0 3px;
    background: var(--ds-carta);
    color: var(--ds-testo);
}
.table-briefmodal .input-group > .form-control:focus{
    border-color: var(--ds-accento);
    box-shadow: 0 0 0 2px var(--ds-accento-tenue);
}

/* input-group-append e' di Bootstrap 4: qui non vuol dire niente e
   lasciava il pulsante staccato sotto al campo. */
.table-briefmodal .input-group-append{
    display: flex;
    align-items: center;
    flex: 0 0 auto;
}
.table-briefmodal .input-group-append > .btn{
    height: 28px;
    width: 30px;
    padding: 0;
    display: inline-grid;
    place-items: center;

    border: 1px solid var(--ds-filo);
    border-left: 0;
    border-radius: 0 3px 3px 0;
    background: var(--ds-cromo);
    color: var(--ds-testo-2);
    font-size: 15px;
}
.table-briefmodal .input-group-append > .btn:hover{
    background: var(--ds-filo-tenue);
    color: var(--ds-accento-legg);
}

/* --- la tabella dei risultati ------------------------------------------ */
/*
 * Arriva con table-bordered e table-striped, cioe' la gabbia di righe
 * verticali piu' la zebra. Qui si sta scegliendo una riga fra tante e
 * l'unica differenza che deve saltare all'occhio e' quella sotto il
 * mouse: tutto il resto e' rumore che ci gareggia contro.
 */
.table-briefmodal > .table{
    margin: 0;
    border: 0;
}
.table-briefmodal > .table > thead > tr > th{
    position: sticky;
    top: 0;
    z-index: 2;
    padding: 5px 10px;
    border-bottom: 1px solid var(--ds-filo);
}
.table-briefmodal > .table > tbody > tr > td{
    padding: 3px 10px;
    border-bottom: 1px solid var(--ds-filo-tenue);
    border-right: 0;
    vertical-align: middle;
}
.table-briefmodal > .table > tbody > tr:hover > td{ background: var(--ds-accento-tenue); }

/* Tutta la cella e' cliccabile, non solo la parola: si sta scegliendo
   una riga, e mirare al testo di una cella vuota e' impossibile. */
.table-briefmodal > .table > tbody > tr > td.pointer{ cursor: pointer; }
.table-briefmodal > .table > tbody > tr > td > a{
    display: block;
    color: var(--ds-accento-legg);
    text-decoration: none;
}
.table-briefmodal > .table > tbody > tr > td > a:hover{ text-decoration: none; }

/* Il piede con la paginazione. */
.table-briefmodal > .table > tfoot > tr > td{
    padding: 5px 10px;
    background: var(--ds-cromo);
    border-top: 1px solid var(--ds-filo);
}
.table-briefmodal > .table > tfoot > tr > td:empty{ display: none; }

/* La riga "nessun record trovato" non e' un dato: si scrive in grigio e
   al centro, cosi' non si prova a cliccarla. */
.table-briefmodal > .table > tbody > tr > td[colspan] > i{
    display: block;
    padding: 18px;
    text-align: center;
    color: var(--ds-testo-2);
    font-style: normal;
}
