/* TEMA: Indice — massima densita' per chi vive nella griglia tutto il giorno.
   Monocromo, un solo accento blu-petrolio desaturato, niente serif.
   Griglia editoriale condivisa (grid-editorial.css) in versione compatta. */
@import url("layout-structure.css");
@import url("gestionale-immobiliare.css");
@import url("grid-editorial.css");
@import url("filter-editorial.css");

:root {
    /* Il sans di default del tema, al TOKEN di scala (§4 livello 1): DevExpress alimenta
       da qui il font di OGNI .dxbl-text-edit (valori della scheda + caselle fuori-form) e
       lo dichiara sull'input, che nessun contenitore raggiunge (§8.43) → senza, rende
       Segoe di SISTEMA. Le regole font-family !important piu' in basso vincono comunque
       (chrome/griglia/menu). Nota lunga e misure in theme-repertorio.css (§26.7 punto 10). */
    --dxds-font-family-sans-serif: "IBM Plex Sans", "Segoe UI", "Helvetica Neue", Arial, sans-serif;

    /* Icone dei titoli di sezione a TINTA UNITA = teal del titolo #3b7991 (--dxds-primary-90).
       Catena filter dal solver su canvas, scarto 3.0. Meccanismo in layout-structure.css. */
    --icon-tint-filter: brightness(0) invert(0.553) sepia(0.917) saturate(8.83) hue-rotate(161deg) brightness(0.603) contrast(0.618);

    /* --- Colore: rampa petrolio (hue 197) desaturata --- */
    --dxds-primary-10: #ebf2f4;
    --dxds-primary-20: #d7e6ec;
    --dxds-primary-30: #c1dbe5;
    --dxds-primary-40: #accfdd;
    --dxds-primary-50: #96c2d4;
    --dxds-primary-60: #7eb5cb;
    --dxds-primary-70: #65a6c0;
    --dxds-primary-80: #4791af;
    --dxds-primary-90: #3b7991;
    --dxds-primary-100: #377086;
    --dxds-primary-110: #306174;
    --dxds-primary-120: #275061;
    --dxds-primary-130: #214350;
    --dxds-primary-140: #1a353f;
    --dxds-primary-150: #142830;
    --dxds-primary-160: #0e1c21;
    --dxds-primary-170: #081114;

    /* --- Spaziatura compressa: densita' massima --- */
    --dxds-spacing-160: 0.625rem;
    --dxds-spacing-200: 0.875rem;

    /* --- DIMENSIONE DEL CARATTERE: +1px su tutte le superfici ---
       Indice nasce come il tema denso, ma il corpo era troppo piccolo da leggere.
       ⚠️ NON esiste una manopola sola: servono QUATTRO leve, e le due che c'erano
       qui prima ne governavano solo una parte (misurato superficie per superficie).
         --bs-body-font-size        -> body, voci di menu, linguette   14 -> 15
         --dxbl-grid-font-size      -> celle della griglia             14 -> 15  (piu' sotto)
         --dxds-font-size-140       -> bottoni del ribbon, filtro      12 -> 13 -> 14
                                      ⚠️ e ANCHE le voci del menu laterale, che il primo
                                      censimento attribuiva a --bs-body-font-size: quella
                                      vale 15px mentre il menu ne rende 14, quindi non e'
                                      lei a governarlo. Misurato, non deducibile dai nomi.
         .dxbl-grid-header-content  -> intestazioni di griglia         11 -> 12  (piu' sotto)
       ⚠️ --dxds-font-size-base-md sembra la manopola del body ma NON lo e': vale 12px
       mentre il body ne rende 14, perche' la regola del foglio Bootstrap
       (--bs-body-font-size) viene dopo e vince. Alzarla non produce alcun effetto.
       ⚠️ --dxds-font-size-160 non e' stata trovata su NESSUNA superficie misurata:
       resta qui, alzata di pari passo, per non lasciare indietro eventuali componenti
       non ispezionati — ma non aspettarti che muova qualcosa.
       💡 L'altezza di riga NON dipende dal font ma dal padding: misurata a 29px prima
       e dopo, su tutte le prove. L'aumento non costa spazio verticale. */
    --bs-body-font-size: 15px;
    --dxds-font-size-160: 0.875rem;
    --dxds-font-size-140: 0.875rem;

    /* --- Griglia editoriale: monocromo cool + righe compatte --- */
    --grid-header-color: #5B6672;
    --grid-line: #D8DCDF;
    --grid-cell-color: #14171A;
    --grid-title-color: #14171A;
    --grid-hover-bg: #E6EEF0;
    /* Barra delle azioni: la STESSA carta di .app/sidebar/body. */
    --toolbar-bg: #EBEDEF;
    /* Linea sotto la barra: --grid-line (#D8DCDF) scurita di uno scalino HSL,
       tinta 206 e saturazione invariate -> resta fredda. */
    --toolbar-line: #C8CED2;

    /* Titolo di un box reso dal componente (LayoutBoxGroup / .fl-box-titolo).
       ⚠️ Non e' un colore nuovo: e' lo STESSO #5B6672 che questo tema gia' da' al
       titolo del gruppo annidato dentro un box (regola della "terza forma", piu' in
       basso in questo foglio) — misurato a runtime rgb(91,102,114). Serve dichiararlo
       come token perche' il componente non ha piu' un .dxbl-group-header da agganciare.
       Gli altri sei temi lo dichiareranno quando ci passeranno: fino ad allora li' il
       titolo eredita il colore del testo, e si nota. */
    --fl-box-titolo-color: #5B6672;

    /* --- L'HOVER DEL CHROME: un colore solo per tre superfici (8a sessione) ---------
       Segnalato dall'utente come hover "fuori tono", ed era letterale: non era il volume
       a essere sbagliato, era la TINTA. Misurate, le tre superfici usavano tre colori che
       si muovevano in tre direzioni diverse rispetto al fondo comune #EBEDEF:
         voce di menu   #F4F4F3 (di serie DevExpress)  +9/+7/+4   contrasto 1.066
         azione barra   #F4F4F3 (di serie DevExpress)  +9/+7/+4   contrasto 1.066
         header griglia --dxds-primary-20 #D7E6EC     -20/-7/-3   contrasto 1.090
       ⚠️⚠️ IL DIFETTO DEL GRIGIO DI SERIE NON E' LA LUMINOSITA': e' che il BLU sale meno
       di rosso e verde (+4 contro +9). Il fondo di Indice ha il blu piu' alto di tutti
       (235/237/239, carta fredda), quindi quel grigio arriva a 244/244/243 — cioe' r=g>b,
       neutro-CALDO. L'hover cambiava temperatura, ed e' esattamente cio' che l'orecchio
       chiama "fuori tono". Il petrolio dell'header sbagliava nell'altro verso, saturando.
       💡 IL DATO CHE HA RESO OVVIA L'OMOLOGAZIONE: le tre superfici hanno lo STESSO
       identico fondo — sidebar, barra delle azioni e testata di griglia misurano tutte
       #EBEDEF. Non e' un'armonizzazione estetica fra contesti diversi: e' lo stesso
       problema tre volte, e tre valori dove ne bastava uno.
       ⚠️ NON si e' potuto riusare --grid-hover-bg, che pure e' "il tenue del tema": su
       questa carta misura -5/+1/+1, cioe' contrasto 1.002 — la soglia dell'INVISIBILE
       misurata al §22.8. E soprattutto su Indice quella variabile non e' un hover: la
       consumano la voce di menu SELEZIONATA, la linguetta attiva e la fascia dei titoli
       di gruppo. Spenderla anche per l'hover farebbe dire la stessa cosa a "sotto il
       mouse" e a "scelto" (§24.9).
       💡 Il valore e' costruito, non scelto: e' il fondo comune con tinta (210) e
       saturazione INVARIATE e la sola luminosita' alzata di 4 punti HSL — lo stesso
       metodo con cui il §5 ha scurito le linee di ogni tema restando nella sua
       temperatura. Risultato +11/+10/+9, contrasto 1.094, e resta FREDDO (246/247/248,
       b>g>r) invece di virare come faceva il grigio di serie.
       ⚠️ Si e' scelto di SCHIARIRE e non di scurire, a parita' di forza (l'equivalente
       scuro sarebbe #E0E3E6, contrasto 1.098): il verso chiaro e' quello che l'utente ha
       gia' sotto gli occhi da sempre, quindi la correzione si legge come "ora e'
       intonato" e non come un comportamento nuovo. E non compete con la voce
       SELEZIONATA, che qui e' un blocco pieno di petrolio. */
    --hover-chrome: #F6F7F8;

    /* L'INCHIOSTRO DEL CHROME: il testo delle azioni in barra (8a sessione).
       Segnalato dall'utente come "risalta poco", e il file lo aveva gia' previsto: accanto
       alla regola che colora i pulsanti del ribbon c'era scritto che, se fosse risultato
       troppo schiarito, il gradino intermedio era "hsl(215,10%,28%) circa #40474F". E'
       quello, non un numero nuovo: la previsione era gia' stata pagata.
       ⚠️⚠️ E SOPRATTUTTO NON SI SCURISCE --grid-header-color, che era il valore usato
       finora. Quella variabile e' il colore delle ETICHETTE D'INTESTAZIONE DI GRIGLIA:
       ritoccarla per sistemare la barra avrebbe mosso anche quelle, cioe' una manopola
       sola per due decisioni (§8.33, corollario di manutenzione). Il chrome prende un
       token suo, e le due cose possono divergere quando serve.
       💡 Resta comunque piu' chiaro dei DATI, ed e' voluto: la cella di griglia sta a
       17.98 sul bianco. Il chrome deve leggersi bene senza competere con il contenuto.
       ⚠️ 12a sessione: SCURITO ANCORA a #2C3035 (hsl 215,10%,19%; stesso hue/saturazione
       freddi, scesa la sola LUMINOSITA' — §5), su richiesta dell'utente ("piu' scuro"). Il
       contrasto sulla barra sale da 8.02 a 11.32 e RESTA sotto i DATI (inchiostro #161616,
       15.42): il chrome si legge meglio senza competere col contenuto. Misurato che gli altri
       candidati (#33373E 10.18, #25282D 12.6) stavano tutti sotto i dati — scelto quello di
       mezzo. Il gradino #40474F dell'8a e' storia. */
    --chrome-ink: #2C3035;

    --grid-link-color: #306174;
    --grid-cell-pad-y: 4px;
    --grid-cell-pad-x: 10px;
}

/* --- CHROME IN BAHNSCHRIFT: menu laterale e barra superiore ---
   Segoe UI e' il default di Windows, cioe' l'assenza di una scelta: il menu era l'unica
   superficie del tema senza un tratto proprio. Bahnschrift e' il DIN di Windows, il
   carattere della segnaletica tecnica — geometrico e appena condensato, che e' esattamente
   il registro di Indice.
   ⚠️ Verificato INSTALLATO prima di adottarlo, non solo dichiarato: su questa macchina
   rende 201.23px sulla stringa campione contro i 200.66 di Segoe. E' la trappola del
   §8.22 — un font Apple dichiarato e mai installato, con getComputedStyle che riportava
   tranquillamente la dichiarazione — e si smaschera solo confrontando le LARGHEZZE rese.
   ⚠️ Nella stessa prova "Arial Narrow" risultava presente ma rendeva ESATTAMENTE come
   sans-serif: stava ricadendo su Arial, non era condensato affatto. Scartato.
   💡 La quasi identita' di larghezza con Segoe (+0.3%) e' anche il motivo per cui il
   cambio e' sicuro: nessuna voce di menu va a capo, la sidebar non va riallargata.
   ⚠️ Scopato al CHROME e non a tutta l'app: restano in Segoe le etichette del form e le
   celle di griglia, che stanno accanto ai DATI e devono restare neutre. E' una divergenza
   VOLUTA — chrome e contenuto con due voci diverse — non una copertura incompleta.
   ⚠️ .xaf-navmenu e .dxbl-ribbon .dxbl-btn vanno nominati esplicitamente: la regola
   tipografica generale piu' in basso li elenca uno per uno, e una dichiarazione su un
   antenato perderebbe contro la loro (§8.18). Il bottone del ribbon sale a (0,2,0) per
   battere il .dxbl-btn (0,1,0) di quella regola.
   ⚠️⚠️ `.xaf-sidebar *` E' DELIBERATO, non pigrizia. Due ragioni, entrambe misurate:
   1. DevExpress dichiara font-family DIRETTAMENTE su .dxbl-treeview-item-container, e una
      dichiarazione diretta batte sempre una ereditata a prescindere da ordine e
      specificita': con il solo .xaf-sidebar il menu restava a Segoe mentre il ribbon era
      gia' convertito. Risalendo la catena il salto si vede al pixel — item-content in
      Bahnschrift, il suo figlio item-container di nuovo in Segoe.
   2. Il menu ha DUE stili commutabili a runtime (§20, azione "Menu"): a pannelli usa
      .dxbl-accordion-*, a indice .dxbl-treeview-*, e in ciascuno i selettori dell'altro
      hanno ZERO occorrenze. Nominarli uno per uno vuol dire mantenere due liste e
      scoprire il buco solo dopo aver commutato. Qui la scopatura e' gia' stretta —
      il menu laterale — quindi l'universale non fa danni fuori. */
.xaf-sidebar,
.xaf-sidebar *,
.xaf-navmenu,
.dxbl-ribbon,
.dxbl-ribbon .dxbl-btn,
.dxbl-ribbon .dxbl-tabs-item,
.dxbl-ribbon .dxbl-tabs-text-overflow {
    font-family: "IBM Plex Sans", "Segoe UI", "Helvetica Neue", Arial, sans-serif !important;
}
/* ⚠️⚠️ IBM PLEX SANS AL POSTO DI ARCHIVO 85% (8a sessione) — ed e' caduto il font-stretch.
   Chiesto dall'utente: una voce sola per il tema, chrome e contenuto sulla stessa famiglia.
   ⚠️ IL `font-stretch: 85%` E' STATO TOLTO, NON LASCIATO LI'. IBM Plex Sans non ha l'asse
   di larghezza — la sua @font-face dichiara `font-stretch: 100%` e basta — quindi quella
   riga sarebbe stata perfettamente INERTE: applicata, presente nel CSSOM, e senza alcun
   effetto (§8.17). Una regola che non fa niente ma sembra farlo e' peggio di nessuna regola,
   ed e' la stessa ragione per cui in 3a sessione fu tolto il `font-family: "Segoe UI
   Semibold"` da Dossier.
   💡 E QUI CADE ANCHE LA RAGIONE DELL'85%, non solo la sua possibilita'. Quel valore aveva
   DUE motivi (§24.5): il registro "segnaletica tecnica", e l'evitare la collisione con
   Nitido, che usa la stessa famiglia a larghezza normale. Passando a Plex il secondo motivo
   sparisce da se' — Archivo resta di Nitido e di nessun altro — quindi restava solo il
   gusto, e l'utente ha scelto la larghezza piena.
   ⚠️ Scartata "IBM Plex Sans Condensed", che pure avrebbe tradotto in Plex l'idea "una
   famiglia, due larghezze": e' una famiglia SEPARATA e NON variabile (pesi statici
   400/600/700), cioe' sei file invece di uno, e romperebbe la regola per cui tutte le
   famiglie spedite da questa app sono variabili (§24.1).
   💡 Misurato prima di decidere, sulla voce di menu piu' lunga a 14px: Archivo 85% 94.53
   contro Plex 108.8, cioe' +15.1%. Il chrome si ALLARGA, che e' il verso rischioso — ma la
   voce piu' lunga resa e' 97.8px su 270 di sidebar, quindi il margine non e' mai stato in
   discussione: il vincolo era estetico, non di spazio. */
/* ═══ STORIA, NON STATO ATTUALE ═══ Quanto segue descrive il chrome com'era fino alla 7a
   sessione compresa — Archivo condensato all'85%. Dall'8a e' IBM Plex Sans a larghezza
   piena, vedi la nota qui sopra. Si tiene perche' contiene le MISURE e il ragionamento che
   hanno portato all'85%, e se un giorno si volesse tornare a un chrome condensato quei
   numeri sono gia' pagati. Va letto al passato.

   ⚠️ ARCHIVO AL POSTO DI BAHNSCHRIFT, spedito dall'app (§24). Bahnschrift e' il DIN di
   Windows: non si puo' incorporare (licenza Microsoft), quindi il registro "segnaletica
   tecnica" del chrome esisteva solo su questa macchina.
   💡 IL font-stretch NON E' UN GUSTO, e' l'unica cosa che separa questo chrome dal tema
   Nitido, che usa la STESSA famiglia. Archivo e' variabile a due assi, quindi la
   distinzione si ottiene senza scaricare una seconda famiglia. Misurato a 14px sulle
   voci di menu reali: Bahnschrift 360.75 · Archivo 100% 356.99 (−1.0%, sarebbe stato un
   rimpiazzo metricamente esatto) · Archivo 85% 312.31 (−13.4%).
   ⚠️ Si e' scelto 85% e non 100% proprio PER non ricreare la collisione che il §23.6
   aveva evitato dando Archivo a Nitido: li' e' il testo a larghezza normale, qui e' il
   chrome condensato. Sono due voci, non una riusata due volte.
   💡 Il −13.4% e' nel verso sicuro: il chrome si stringe, quindi nessuna voce puo'
   andare a capo e la sidebar guadagna spazio invece di perderne.
   ⚠️ Il font-stretch resta valido anche sul fallback: Bahnschrift e' a sua volta
   variabile in larghezza, quindi se il woff2 non fosse servito il chrome resterebbe
   condensato invece di saltare a una larghezza diversa. */

/* Le altre due leve della dimensione del carattere (vedi la nota nel :root).
   ⚠️ --dxbl-grid-font-size va messa sulla GRIGLIA, non sul :root: DevExpress la
   definisce lei stessa su .dxbl-grid, e una definizione locale batte sempre il
   valore ereditato da un antenato — impostarla sul :root non arriverebbe mai. */
.dxbl-grid {
    --dxbl-grid-font-size: 15px;
}

/* --- INTESTAZIONI DI GRIGLIA rese come i TITOLI DI GRUPPO del form ---
   Le due superfici dicono la stessa cosa — il nome di un dato — e il §21.8 aveva gia'
   allineato il titolo di gruppo ALL'IDIOMA delle intestazioni di griglia (11px/650
   maiuscolo spaziato). Qui si chiude il cerchio dall'altro capo: l'intestazione prende
   anche il colore, il fondo e la barra del titolo di gruppo.
   ⚠️ Tutto scopato a questo tema e NON messo in grid-editorial.css, che e' condiviso:
   i titoli-sezione esistono solo su Indice (su Repertorio e Dossier i gruppi sono
   ancora riquadri), quindi portare questo trattamento nel foglio comune darebbe agli
   altri due temi la meta' di un disegno che non hanno.
   ⚠️ Il font torna a 11px, cioe' ANNULLA il ritocco a 12 del §21.7: quello era stato
   deciso per leggibilita' quando le intestazioni erano un elemento a se', ma "uguale ai
   titoli di gruppo" vuol dire 11. Se la leggibilita' dovesse pesare, il numero da
   rialzare e' questo — sapendo che le due superfici divergono di nuovo.
   ⚠️ Il COLORE resta --grid-header-color (il grigio freddo di sempre) e NON passa
   all'accento come nel titolo di gruppo: provato e rifiutato. Le due superfici non sono
   simmetriche — un titolo di gruppo e' uno per sezione, un'intestazione di colonna e'
   una per colonna, e su quindici colonne l'accento smette di essere un segnale e diventa
   il colore della griglia. Dell'idioma del titolo di gruppo qui restano tipografia,
   fondo e barra; il colore del testo e' l'unica cosa che resta indietro, apposta. */
.dxbl-grid-header-content {
    font-size: 11px !important;
    color: var(--grid-header-color) !important;
}

/* Il fondo va sul THEAD, non sul TH.
   ⚠️ Misurato: il th e' GIA' trasparente, a dipingere il bianco e' il thead — e sotto
   di lui la catena e' opaca per altri quattro livelli (table, scroll-viewer-content,
   scroll-viewer, grid), tutti bianchi. E' il motivo per cui un "header trasparente" non
   avrebbe prodotto NULLA: sotto sarebbe rimasto comunque il bianco della griglia. Si
   dipinge invece, e l'effetto e' quello voluto senza dover bucare cinque livelli.
   ⚠️ Tinta: --toolbar-bg, cioe' LA CARTA DEL TEMA — lo stesso fondo di .app, sidebar,
   body e barra delle azioni (§19). L'header smette di essere una fascia colorata e
   diventa il proseguimento della pagina: stacca solo verso il BIANCO delle righe, che e'
   dove la distinzione serve davvero.
   ⚠️ Percorso completo, perche' le tappe scartate dicono piu' della scelta finale:
     --toolbar-bg (carta)      -> l'header si fonde con la pagina        <- ATTIVA
     --grid-hover-bg (#E6EEF0) -> la tinta della voce di menu selezionata: coerente col
                                  resto dell'app, ma verso la carta dista -5/+1/+1 su 255,
                                  cioe' non stacca, e verso il bianco pesa
     --dxds-primary-20 (#d7e6ec) -> staccava da entrambe, ma introduceva in griglia un
                                  azzurro che nel resto dell'app non esiste
   Le ultime due sono state provate a video e giudicate PESANTI: su quindici colonne una
   fascia colorata compete con i dati, ed e' la griglia il posto dove il dato deve vincere.
   💡 Resta valido il legame creato allora fra la voce di menu attiva e --grid-hover-bg:
   quel token continua a dire "elemento in evidenza" (hover di riga, voce selezionata),
   solo che l'header non e' piu' fra i suoi clienti. */
.dxbl-grid-table thead {
    background: var(--toolbar-bg) !important;
}

/* La cella d'intestazione di una COLONNA FISSA (ColumnFixedPosition, §36) ridipinta con
   la carta del tema, come il resto dell'header. Stessa diagnosi di Repertorio: il thead
   dipinge la carta e le celle non fisse la lasciano vedere (trasparenti), ma la serie
   DevExpress da' alla cella fissa un fondo OPACO proprio (#FFFFFE) che, stando sul TH,
   copre il thead — su carta #EBEDEF la colonna fissa restava una lastra bianca.
   → si ridipinge la sola cella fissa dell'HEADER con --toolbar-bg (il fondo del thead);
   la cella fissa del CORPO resta opaca, li' serve a coprire le righe che scorrono.
   ⚠️ Stessa decisione del thead qui sopra: se cambia quella tinta, cambia questa.
   ⚠️ Nel tema e non nel condiviso: il difetto si vede solo dove l'header e' carta !=
   bianco (qui e Repertorio); forzare --toolbar-bg nel condiviso farebbe stonare i temi
   con header bianco. L'hover resta a --hover-chrome (:hover ha specificita' maggiore). */
.dxbl-grid-table thead th.dxbl-grid-fixed-cell {
    background-color: var(--toolbar-bg) !important;
}

/* FOOTER della griglia (barra del pager) sulla stessa carta dell'header. Simmetrica del
   thead: la fascia .dxbl-grid-bottom-panel e' trasparente e mostra il fondo bianco di
   .dxbl-grid, quindi appariva bianca mentre l'header e' carta. Header e footer sono le due
   fasce che racchiudono le righe → stessa carta --toolbar-bg, staccano insieme verso il
   bianco delle righe. I controlli interni (page-size, input) restano col loro fondo.
   ⚠️ Stessa tinta del thead; nel tema e non nel condiviso (i temi a foglio bianco hanno
   gia' footer = header, i dark sono scuri di serie). */
.dxbl-grid .dxbl-grid-bottom-panel {
    background: var(--toolbar-bg) !important;
}

/* Via il contorno grigio della griglia.
   ⚠️ Non e' un bordo dell'header: e' il bordo di .dxbl-grid, 0.8px #D3D3D2 su tutti e
   QUATTRO i lati — lo si nota attorno all'intestazione solo perche' li' passa accanto a
   una fascia ora colorata. Spegnendolo sparisce il contorno dell'INTERA griglia, che
   resta comunque leggibile: la delimitano il proprio fondo bianco, la barra d'accento in
   testa e le linee di riga.
   ⚠️ Si spegne il COLORE, non il bordo (§21.8): con "border: none" la griglia perderebbe
   0.8px per lato e tutto il contenuto slitterebbe. Con un colore la geometria resta
   identica al pixel.
   ⚠️⚠️ MA NON BASTA "transparent", ed e' una trappola nuova: un bordo trasparente non e'
   un bordo assente. Con background-clip: border-box — il default — il FONDO dell'elemento
   si estende SOTTO il bordo, quindi attraverso un bordo trasparente si vede il fondo
   dell'elemento stesso. Qui .dxbl-grid ha fondo BIANCO, e il risultato era una cornice
   bianca da 0.8px tutt'intorno, visibilissima sopra l'header azzurro.
   Misurato: .dxbl-grid parte a x=286.0 e il thead a x=286.8 — quei 0.8px di scarto sono
   esattamente il bordo, e li' si vedeva il bianco della griglia.
   → si dipinge il bordo del colore del fondo dell'header, cosi' sparisce dove confina con
   lui. Il bordo prosegue anche ai lati e in fondo, dove resta una linea tenue contro il
   bianco delle righe: e' il prezzo, ed e' un contorno discreto invece di una cornice
   bianca.
   ⚠️ DEVE SEGUIRE IL FONDO DELL'HEADER, sempre: sono la stessa decisione scritta in due
   punti. Quando l'header e' passato da --grid-hover-bg a --toolbar-bg, lasciare qui il
   vecchio valore avrebbe fatto RICOMPARIRE la cornice — stavolta azzurrina invece che
   bianca. Se un giorno si ritocca il fondo dell'header, questo va con lui.
   💡 L'alternativa era azzerare la larghezza, ma quella slitta il contenuto di 0.8px per
   lato — la ragione per cui il §21.8 prescrive di agire sul colore. */
.dxbl-grid {
    border-color: var(--toolbar-bg) !important;
}

/* La barra d'accento sotto l'intestazione, al posto della linea di riga.
   ⚠️ Sostituisce il border-bottom da 1px --grid-line che grid-editorial.css mette su
   th.dxbl-grid-header: se si aggiungesse senza sostituirlo resterebbero DUE linee
   sovrapposte (§8.1, la stessa trappola dei separatori nativi). */
.dxbl-grid-table th.dxbl-grid-header {
    border-bottom: 3px solid var(--dxds-primary-90) !important;
}

/* L'HOVER sulla cella di intestazione, riportato in famiglia.
   Di serie DevExpress la schiarisce con un grigio NEUTRO: finche' l'header era bianco
   passava inosservato, ma su un fondo azzurrino stona — due temperature diverse sulla
   stessa superficie. Si sostituisce con il gradino successivo della rampa dell'accento,
   cosi' il passaggio del mouse scurisce di un passo restando nella stessa famiglia.
   ⚠️ Va sul TH e non sul thead: il fondo a riposo lo dipinge il thead (una superficie
   sola), ma l'hover deve accendere la SINGOLA colonna sotto il mouse. Il th e' sopra il
   thead nell'ordine di pittura, quindi lo copre dove serve senza toccare il resto.
   ⚠️ Il grigio di serie non e' stato misurato: eseguire JS nel browser pane perde lo
   stato di hover (matches(':hover') torna false subito dopo), ed e' la stessa trappola
   del §8.29 sul fuoco. Qui non serviva conoscerlo — bastava scavalcarlo — ma se un
   giorno servisse il valore, la via e' la classe simulata o la lettura del CSSOM.
   💡 Non si tocca l'hover di RIGA (--grid-hover-bg su tbody): quello segnala "record
   sotto il mouse" ed e' un'altra cosa dal "colonna ordinabile sotto il mouse". */
/* ⚠️ Era --dxds-primary-20 (#D7E6EC): un petrolio schiarito, cioe' la terza direzione dei
   tre hover del chrome. Ora prende --hover-chrome come il menu e la barra — vedi la nota
   estesa nel :root. */
/* ⚠️⚠️ SI ILLUMINA SOLO CIO' CHE RISPONDE AL CLIC (07/08/2026, §110).
   Il selettore diceva `th.dxbl-grid-header`, cioe' OGNI testata: si accendevano anche la
   casella di selezione, la colonna dei comandi e le colonne aggiunte da codice, che non
   sono associate a nessun dato e al clic non fanno niente. Misurato sulla lista immobili:
   clic su PROPRIETARIO -> nessun ordinamento, ordine dei dati identico; su AGENTE -> ordina.
   📌 Non e' un cambio di rotta: e' l'intenzione che il commento qui sopra dichiarava gia'
   ("colonna ORDINABILE sotto il mouse"), scritta finalmente anche nel selettore.
   ⚠️ La specificita' sale da 3 a 4 pseudo-classi/classi: continua a vincere dove vinceva
   prima, e sulle testate non ordinabili non si applica piu' affatto — li' resta il fondo a
   riposo, che e' quello che devono avere. Notturno non ha mai avuto questa regola. */
.dxbl-grid-table th.dxbl-grid-header.dxbl-grid-header-sortable:hover {
    background: var(--hover-chrome) !important;
}

/* ===================================================================================
   L'HOVER DEL CHROME, OMOLOGATO — menu (in due stili), barra delle azioni, header
   ===================================================================================
   Le tre superfici stanno tutte su #EBEDEF e ora dicono "sotto il mouse" con lo stesso
   colore. Il valore e il perche' stanno nel :root; qui ci sono solo i selettori. */

/* Barra delle azioni. Il fondo di serie era il grigio caldo #F4F4F3. */
.xaf-ribbon .dxbl-btn-toolbar .dxbl-btn:not(.dxbl-disabled):hover {
    background: var(--hover-chrome) !important;
}

/* Menu, stile "a pannelli". ⚠️⚠️ E QUI SERVONO DUE SELETTORI, non uno: dentro
   l'intestazione di ogni voce — anche di quelle FUORI dai raggruppamenti — c'e' un
   `button.dxbl-btn` col chevron che e' FRATELLO del contenuto, non un suo discendente.
   Dipingendo il solo `.dxbl-accordion-item-content` l'hover uscirebbe a pezzi: una parte
   di riga nel colore nuovo e la parte del chevron nel grigio di serie, che e' precisamente
   il difetto trovato su Notturno nell'8a sessione. Si dipinge l'HEADER, che e' largo quanto
   la voce, e si spegne il fondo proprio del pulsante.
   💡 Il contenuto lo si dipinge comunque: le foglie DENTRO un raggruppamento non stanno in
   un group-header, quindi il solo selettore dell'header le lascerebbe fuori. Due selettori
   coprono due strutture diverse, non due strati dello stesso elemento. */
.xaf-sidebar .dxbl-accordion-group-header:hover,
.xaf-sidebar .dxbl-accordion-item-content:hover {
    background: var(--hover-chrome) !important;
}

/* Menu, stile "a indice". ⚠️ E' un COMPONENTE DIVERSO (§20): i selettori dell'accordion
   qui hanno zero occorrenze. La leva pulita e' la variabile di componente, che DevExpress
   definisce su `.dxbl-treeview` e che va impostata li' e non su un antenato (§8.21);
   il `:hover` sul contenuto copre la parte di riga che la variabile non raggiunge, cioe'
   quella occupata dall'espansore. */
.xaf-sidebar .dxbl-treeview {
    --dxbl-treeview-item-hover-bg: var(--hover-chrome);
}
.xaf-sidebar .dxbl-treeview-item > .dxbl-treeview-item-content:hover {
    background: var(--hover-chrome) !important;
}

/* ...e nessun pulsante della sidebar si porta un fondo suo, in nessuno stato: chevron,
   espansore dell'albero e i bottoni della casella di filtro. Elencarli a uno a uno
   significherebbe mantenere due liste per due stili di menu e scoprire il buco dopo aver
   commutato (§8.38). */
.xaf-sidebar .dxbl-btn,
.xaf-sidebar .dxbl-btn:hover,
.xaf-sidebar .dxbl-btn:active {
    background-color: transparent !important;
}

/* ⚠️ PROVATA E SCARTATA: una pastiglia colorata dietro al solo testo di ogni
   intestazione, per imitare alla lettera il titolo di gruppo (che ce l'ha). Due motivi,
   entrambi emersi solo DOPO averla messa a video:
   1. Non si vedeva. La tinta era --grid-hover-bg su fondo carta: -5/+1/+1 su 255, cioe'
      contrasto 1.00. L'anteprima disegnata prima la mostrava "diversa" perche' nessuno
      aveva calcolato la distanza fra i due colori — anche un mockup va misurato.
   2. Non era aderente al testo. Lo span che porta il nome della colonna e' largo 162px
      su 200 di colonna (se lo prende tutto), quindi la pastiglia vestiva la colonna e
      non la parola, che e' l'opposto dell'effetto voluto nel form.
   Il disegno regge senza: l'intestazione si distingue per FONDO, colore d'accento e
   barra. Se un giorno la si volesse rimettere servono entrambe le correzioni — una tinta
   piu' marcata E un width: fit-content sullo span.
   Struttura del th per riferimento, mappata a runtime:
     DXBL-GRID-HEADER-CONTENT > SPAN (testo, senza classe)
                              + SPAN.dxbl-grid-sort-asc (freccia)
                              + DIV.dxbl-grid-filter-menu-funnel-btn (imbuto) */

/* VALORI DEI CAMPI nella scheda: 13 -> 15px, come le celle di griglia. Le ETICHETTE
   restano a 13 (richiesta esplicita) — e si puo' fare con precisione perche' le due
   cose hanno variabili SEPARATE:
     --dxbl-text-edit-font-size    -> il valore dentro la casella   (questa)
     --dxbl-fl-caption-font-size   -> l'etichetta                   (NON toccata)
   Ne esce una gerarchia voluta: etichetta piu' quieta del dato che introduce.

   ⚠️ VA MESSA SULLA CASELLA, non sul form. DevExpress definisce questa variabile
   sulla .dxbl-text-edit stessa, e una definizione locale batte sempre il valore
   ereditato da un antenato: impostarla su .dxbl-fl e' PERFETTAMENTE INERTE (provato,
   13px identici). Stessa trappola di --dxbl-grid-font-size qui sopra — le variabili
   "di componente" di DevExpress vanno impostate al livello del componente.
   ⚠️ Inerte anche la variante --dxbl-text-edit-font-size-m, per lo stesso motivo.

   ⚠️ Lo scoping a .dxbl-fl e' OBBLIGATORIO: le stesse classi .dxbl-text-edit vivono
   anche FUORI dal form (filtro della griglia, ricerca del menu) e li' non vanno
   toccate. Verificato a runtime: quelle restano a 13px.
   💡 Copre anche l'area di testo (Descrizione): il memo e' una .dxbl-text-edit
   annidata, quindi eredita senza bisogno di una regola propria.
   ⚠️ La CASELLA DI SPUNTA e' deliberatamente esclusa: li' non c'e' testo, e il suo
   font-size governa la dimensione del segno di spunta — sarebbe geometria, non
   caratteri. (Le caselle non sono mai state stilate: vedi §11 del LAYOUT-CONTEXT.) */
.dxbl-fl .dxbl-text-edit {
    --dxbl-text-edit-font-size: 15px;
    /* Meno vuoto sopra e sotto il testo: 5 -> 3px. La casella passa da 31.6 a 27.6px
       e la scheda da 442 a 422. Coerente con Indice, che e' il tema denso.
       ⚠️ Qui il padding NON e' inerte, al contrario del caso delle linguette (§17.4):
       nessuna regola impone un'altezza all'input, quindi l'altezza e' il RISULTATO di
       line-height + padding (20+3+3) e ridurre il padding stringe davvero.
       ⚠️ Il "height: 30px" che getComputedStyle riporta sull'input NON e' una
       dichiarazione: e' il valore USATO, calcolato dal layout. Scambiarlo per un
       vincolo porta a concludere che il padding non serva a niente — e a cercare una
       leva che non esiste.
       ⚠️ NON ridurre anche --dxbl-text-edit-line-height: provato a 18px, i campi
       SENZA bottoni interni scendono a 23.6 ma il lookup Categoria resta a 25.6,
       perche' il bottone interno (18px) fa da pavimento. I campi si disallineano fra
       loro. Il padding invece li stringe tutti allo stesso modo.
       Se servisse ancora piu' stretto la strada e' 2px (casella 25.6): provato, i
       bottoni interni ci stanno ancora. */
    --dxbl-text-edit-padding-y: 3px;

}

/* ...E I BOTTONI DELLA BARRA DI UNA GRIGLIA SEGUONO LA CASELLA — 31,6 -> 27,6 (19/08, §155).
   Sua segnalazione guardando «Form con griglie»: «i button delle action sopra le griglie sono
   piu' alti della casella di test del search che si trova sempre nella stessa toolbar».
   ⚠️ IL DIFETTO NASCE DALLA REGOLA QUI SOPRA, non dai bottoni: quel `--dxbl-text-edit-padding-y`
   e' agganciato a `.dxbl-fl`, e la barra di una griglia annidata sta DENTRO `.dxbl-fl` — cosi'
   la ricerca si prende un padding pensato per i CAMPI DEL FORM (20+3+3+1,6 = 27,6) mentre i
   bottoni restano al default DevExpress (20+5+5+1,6 = 31,6). Quattro pixel di scarto.
   📌 E' un difetto SOLO DI INDICE, misurato cambiando tema davvero: su Nitido bottoni e casella
   stanno tutt'e due a 31,6, perche' nessun altro tema tocca quel token. Percio' la cura sta QUI
   e non in layout-structure.css: la' pareggerebbe Indice e SPAIEREBBE tutti gli altri.
   ⚠️⚠️ IL BERSAGLIO E' `.dxbl-btn.dxbl-btn-secondary`, NON `.dxbl-toolbar-btn`. Provata prima
   la via ovvia e MISURATA sbagliata: `.dxbl-toolbar-btn` sta anche sui CONTENITORI adattivi e
   sui bottoni split, che hanno padding 0 — dandogliene 3+3 la riga cresce e tutti si allineano
   al piu' alto, cioe' i bottoni a video passavano da 31,6 a **37,6**. Il contrario di quanto
   chiesto. Con il bersaglio stretto vanno tutti a 27,6, contenitori compresi, che seguono.
   💡 *Una classe che sta sia sul comando sia sulla scatola che lo contiene non e' un bersaglio:
   e' due bersagli con lo stesso nome.*
   ⚠️ Scartata anche `align-items: center` sull'item: schiaccia un bottone-icona a 21,6.
   ⚠️ Il padding verticale si scrive PER ESTESO: `--dxbl-btn-padding-y` e' inerte (§ la nota in
   theme-notturno.css), governa il longhand `padding-block`.
   📌 I 3px sono gli stessi della casella qui sopra, e i due numeri vanno tenuti insieme: chi
   cambia il padding della casella cambia anche questo, o lo scarto torna. */
/* ⚠️⚠️ ...E IL PADDING DA SOLO NON BASTA: SERVE ANCHE UN PAVIMENTO (21/08, §176).
   Sua segnalazione: «nella toolbar degli allegati le action risultano troppo basse -
   deformate», e «la misura giusta e' quella dei consensi». Le due barre stanno nella
   stessa linguetta e hanno UNA SOLA differenza: i Consensi hanno la casella di ricerca.
   🔑 MISURATO, non dedotto: nascosta la casella nella barra Consensi, i suoi bottoni
   scendono da 27,6 a 21,6 ESATTI, cioe' identici a quelli degli Allegati; rimessa la
   casella, tornano a 27,6. La casella e' l'UNICA cosa che li teneva su — li stira
   perche' `.dxbl-toolbar-group` ha `align-self: stretch` e la riga prende la misura
   del suo elemento piu' alto.
   ⚠️⚠️ IL PERCHE' STANNO SOTTO: QUI I BOTTONI SONO SOLO-ICONA. Dentro c'e' una sola
   `img.xaf-toolbar-item-icon` da 14x14 e NESSUN testo, e senza testo non c'e' il
   pavimento del `line-height`: il contenuto vale 14 e non 20. 14 + 3 + 3 + 1,6 = 21,6.
   📌 Il §155 aveva misurato una barra con bottoni TESTUALI (New/Link/Unlink/Delete) —
   la' il pavimento da 20 c'era davvero, e i suoi conti tornavano. Qui no.
   📌 E il padding qui sopra NON e' la causa, e' un aggravante: spegnendolo in pagina gli
   Allegati fanno 25,6 (14+5+5+1,6), non 27,6. Il difetto c'era gia' prima del §155.
   💡 *Un pareggio ottenuto da un elemento che puo' sparire non e' un pareggio: e' una
   coincidenza con una scadenza.* Legare l'altezza alla casella voleva dire perderla il
   giorno in cui la casella se ne va — ed e' successo, togliendola dai Consensi.
   ✅ LA CURA E' UN PAVIMENTO, non altro padding: `min-height` con `box-sizing:
   border-box` puo' solo ALZARE chi sta sotto la misura, quindi non gonfia mai la riga.
   Il valore e' scritto come l'ARITMETICA del bottone testuale di questo tema — il
   `line-height` piu' il padding qui sopra piu' i due bordi — cosi' resta legato ai 3px
   invece di essere un terzo numero da tenere a mano: 20 + 3 + 3 + 1,6 = 27,6.
   ❌ SCARTATA la strada elegante — ridare il pavimento con un `::before` alto `1lh` —
   che sarebbe stata valida per tutti i temi senza numeri: MISURATA, su Nitido gonfia la
   barra Consensi da 31,6 a 39,6. Lo pseudo-elemento diventa un flex item e la riga
   cresce con lui. 💡 *La regola piu' generale non e' la piu' sicura: e' solo quella che
   sbaglia in piu' posti.*
   📌 Per lo stesso motivo la regola sta QUI e non in `layout-structure.css`: il bersaglio
   e' l'altezza del bottone testuale, che vale 27,6 su questo tema e 31,6 sugli altri.
   Un pavimento unico a 27,6 alzerebbe **Ardesia** di 2px (v. il blocco gemello la').
   ✅ GIRATI TUTTI E SETTE I TEMI su questa scheda, misurando le due barre con e senza
   casella: si muovono solo Indice (21,6 -> 27,6) e Ardesia (25,6 -> 31,6, curato nel suo
   foglio). Nitido, Repertorio, Vespro, Ampio e Notturno restano a 31,6 — li' l'icona
   vale 20 o 22, cioe' e' gia' >= al `line-height`, e il pavimento e' un no-op. */
.dxbl-fl .nested-toolbar .dxbl-btn.dxbl-btn-secondary {
    padding-top: 3px;
    padding-bottom: 3px;
    min-height: calc(1lh + 3px + 3px + 1.6px);
}

/* --- IL CAMPO PRENDE UN FONDO: UNA VASCHETTA APPENA GRIGIA -------------------------
   Chiesto dall'utente ("una leggera variazione del bianco verso il grigio"), e sul
   contenuto del campo, non sulla scatola che lo contiene.
   Prima: campo #FFFFFE su scatola #FFFFFE — bianco su bianco, a distinguerlo c'era il
   solo bordo.

   💡 IL COLORE E' RICAVATO, NON SCELTO. La famiglia fredda di questo tema e' hue 210 con
   saturazione ~11%: --toolbar-bg #EBEDEF (il chrome) e --hover-chrome #F6F7F8 stanno
   entrambi li', e differiscono per la sola luminosita' (metodo del §5). #F4F5F6 e' lo
   stesso hue e la stessa saturazione, portati a L 96%.
   💡💡 E LA MISURA E' STATA SCELTA CONFRONTANDO LO SCARTO CON UN RIFERIMENTO CHE IL TEMA
   GIA' USA, non guardando la tinta (§23.5b): l'hover del chrome vale 11/10/9 sul proprio
   fondo — cioe' e' lo scarto che questo tema considera "visibile ma quieto". #F4F5F6 dista
   -11/-10/-8 dal foglio, quindi da' al campo esattamente lo stesso peso percettivo che
   l'hover ha sul chrome. Scala misurata, per chi volesse muoverla:
     #F7F8F9   -8/-7/-5    appena percettibile
     #F4F5F6   -11/-10/-8  <- ATTIVO, = lo scarto dell'hover del chrome
     #F0F2F4   -15/-13/-10
     #EBEDEF   -20/-18/-15 il chrome stesso: il campo diventa una fascia
   ⚠️ Il valore resta leggibilissimo: 16.58 sul nuovo fondo (era 18.09 sul bianco).

   ⚠️⚠️ SI IMPOSTA LA VARIABILE E NON background-color, e gli stati vanno resi DISGIUNTI
   (§8.44). Su questo controllo DevExpress esprime ANCHE gli stati attraverso la stessa
   --dxbl-text-edit-bg: senza il :not() la regola li travolge tutti e disabilitato e sola
   lettura prendono il grigio come i campi attivi. Verificato producendo gli stati.
   ✅ E con l'esclusione si guadagna un segnale GRATIS: disabilitato e sola lettura hanno
   fondo ad alpha 0 (§8.58), quindi tornano a mostrare il FOGLIO — cioe' restano piu'
   CHIARI dei campi attivi. "Qui non si scrive" lo dice il fondo, senza aggiungere una
   tinta. Non era l'obiettivo della richiesta: e' venuto dal renderli disgiunti.
   ⚠️ Scopato a .dxbl-fl come tutto il blocco qui sopra: le stesse classi .dxbl-text-edit
   vivono nel filtro del menu e nella ricerca in barra, che non vanno toccate. */
/* ⚠️⚠️ I LOOKUP vanno aggiunti a mano, e per DUE motivi distinti (25/07/2026, difetto
   segnalato sul gestionale: `Cliente_DetailView` > "Altre info", il campo Categoria
   restava BIANCO mentre gli altri erano grigi).
   1) Il loro `.dxbl-readonly` NON vuol dire "campo in sola lettura": e' la casella di
      testo che non si digita, perche' il valore si sceglie dalla tendina. Misurato: quel
      controllo ha i bottoni "Clear" e "Find" ABILITATI, quindi il dato e' modificabile a
      tutti gli effetti. L'esclusione :not(.dxbl-readonly) qui sotto lo scambiava per un
      campo spento e lo lasciava fuori dal grigio.
   2) Anche rientrandoci non basterebbe: XAF, in styles.css, dipinge questi editor con un
      `background:` DIRETTO (`.dxbl-theme-fluent .dxbl-text-edit.xaf-lookup-search:...`,
      e le sorelle xaf-object-editor / xaf-file-data-editor / xaf-combo-box-list), non con
      la variabile — quindi la variabile non verrebbe mai letta. Serve il blocco piu' sotto
      che reindirizza quel background alla variabile.
   💡 Causalita' separata a runtime commutando le classi: togliendo solo `dxbl-readonly`
   restava bianco (quindi non era il readonly); togliendo solo `xaf-lookup-search` tornava
   ad alpha 0; togliendo entrambe diventava #F4F5F6. */
/* ⚠️ `fl-edit-buttons` (§57) e' la QUINTA voce, ed e' NOSTRA, non di XAF: la mette il
   componente dell'uploader in linea sulla sua casella. Stessa storia delle quattro
   sopra — `dxbl-readonly` li' significa "non ci si digita", ma il valore si cambia coi
   bottoni — solo che quel controllo non porta nessuna classe `xaf-*`, quindi restava
   l'unico campo bianco fra campi grigi (misurato su Indice: alpha 0 contro i #F4F5F6
   degli altri sette).
   ⚠️⚠️ NON gli si e' data `xaf-file-data-editor` per riusare la riga gia' presente: XAF
   dipinge quella classe con un `background` DIRETTO bianco #FFFFFE, e sui temi che il
   campo non lo dipingono affatto (Repertorio, Vespro, Ardesia) sarebbe diventata una
   macchia bianca — su due dark, per giunta. Una classe propria non eredita nulla.
   💡 Per lo stesso motivo `fl-edit-buttons` NON va aggiunta al "ponte" qui sotto: quel
   blocco serve a disinnescare il background diretto di XAF, che su questo campo non c'e'. */
/* IL FONDO DEI CAMPI, promosso a token del FORM (02/08).
   Il valore e' lo stesso di prima e la sua derivazione sta nel commento qui sopra: cambia
   solo DOVE e' dichiarato. Serviva perche' ora lo legge un SECONDO meccanismo — le righe
   delle griglie dentro un box (layout-structure.css, blocco "fondo righe come i campi") —
   e `--dxbl-text-edit-bg` non era riusabile: e' dichiarata SUGLI elementi `.dxbl-text-edit`,
   quindi non scende per eredita' fino alla griglia. Dichiarata su `.dxbl-fl` scende a
   entrambi, e il letterale resta scritto UNA volta sola.
   ⚠️ Scopata a `.dxbl-fl` e non a `:root`: e' "il fondo dei campi DEL FORM", e fuori dal
   form (filtro del menu, casella di ricerca della griglia di primo livello) non deve
   arrivare — quelle vivono anche fuori da `.dxbl-fl` (§8.x, nota su `.dxbl-text-edit`). */
.dxbl-fl {
    --fl-campo-bg: #F4F5F6;
    /* Il CONTORNO e il RAGGIO del campo, promossi accanto al fondo per la stessa ragione:
       le due variabili di serie — `--dxbl-text-edit-border-color` e
       `--dxbl-text-edit-border-radius` — sono dichiarate SUGLI elementi `.dxbl-text-edit`
       (misurate li': #E1E1E0 e 0.25rem) e quindi non scendono per eredita' alla griglia.
       Le legge la cornice attorno alle righe, in layout-structure.css.
       ⚠️ Il letterale del bordo NON e' duplicato: la dichiarazione di serie piu' sotto
       (`.dxbl-text-edit`) e' stata puntata su questa variabile, con lo stesso valore come
       ripiego per le caselle FUORI dal form, dove `.dxbl-fl` non c'e'. */
    --fl-campo-bordo: #E1E1E0;
    --fl-campo-raggio: 0.25rem;
    /* Il COLORE DELL'ETICHETTA di campo. ⚠️ NON si e' potuto riusare `--form-label-color`:
       quella la dichiarano solo Vespro e Repertorio, mentre qui l'etichetta prende il colore
       da un LETTERALE nella regola `.dxbl-fl .dxbl-fl-cpt` piu' sotto. Puntare alla variabile
       "che somigliava" avrebbe fatto cadere l'intestazione della griglia sul RIPIEGO #545A54
       — successo, e misurato: etichetta rgb(127,140,153) contro intestazione rgb(84,90,84).
       Ora il letterale sta qui, e lo legge sia l'etichetta sia l'intestazione della griglia
       dentro un box (layout-structure.css). */
    --fl-etichetta-colore: #7F8C99;
    /* Corpo e peso dell'etichetta, stessa logica del colore: il letterale sta QUI e lo
       leggono sia la regola d'etichetta di questo tema sia l'intestazione della griglia nel
       box. Il corpo non si dichiara perche' 13px e' gia' il ripiego condiviso; il peso si',
       perche' il 600 e' una scelta di Indice (schiarire il colore toglie peso, il 600 lo
       restituisce — vedi la nota sulla regola piu' sotto). */
    --fl-etichetta-peso: 600;
    /* Lo stacco SOPRA una fila di pastiglie affiancate, che deve pareggiare quello che un
       campo normale si prende dalla sua etichetta. Il valore e' l'avanzamento della
       caption di questo tema: height 22 + margin-bottom −4 = 18, piu' lo 0.8 del bordo
       della pastiglia. ⚠️ MISURATO QUI, non copiato: su Repertorio la stessa caption ha
       margin-bottom −6 e il valore giusto e' 16. Chi porta il token su un altro tema lo
       rimisuri (fila a 12 dalla cima della riga, campo a 30.8: la differenza e' questa). */
    --fl-pastiglia-stacco-sopra: 18.8px;
}

.dxbl-fl .dxbl-text-edit:not(.dxbl-disabled):not(.dxbl-readonly),
.dxbl-fl .dxbl-text-edit.xaf-lookup-search:not(.dxbl-disabled),
.dxbl-fl .dxbl-text-edit.xaf-object-editor:not(.dxbl-disabled),
.dxbl-fl .dxbl-text-edit.xaf-file-data-editor:not(.dxbl-disabled),
.dxbl-fl .dxbl-text-edit.xaf-combo-box-list:not(.dxbl-disabled),
.dxbl-fl .dxbl-text-edit.fl-edit-buttons:not(.dxbl-disabled) {
    --dxbl-text-edit-bg: var(--fl-campo-bg);
}

/* Il ponte: XAF scrive `background` diretto su questi quattro editor, quindi la variabile
   qui sopra non basta. Reindirizzandolo alla variabile stessa, il fondo del lookup segue
   da solo la logica gia' tarata: grigio se attivo, e per il DISABILITATO la variabile
   resta al default ad alpha 0, cioe' torna a mostrare il foglio — il segnale "qui non si
   scrive" del blocco qui sopra resta intatto, senza doverlo riscrivere.
   ⚠️ Serve !important: la regola di XAF e' a (0,4,0) contro la (0,3,0) di questa, e non
   usa !important — quindi si vince cosi', non per specificita'. */
.dxbl-fl .dxbl-text-edit.xaf-lookup-search,
.dxbl-fl .dxbl-text-edit.xaf-object-editor,
.dxbl-fl .dxbl-text-edit.xaf-file-data-editor,
.dxbl-fl .dxbl-text-edit.xaf-combo-box-list {
    background: var(--dxbl-text-edit-bg) !important;
}

/* ⚠️ Conseguenza del padding qui sopra: la casella scende a 27.6px, e il cap dell'altezza
   delle caselle di SPUNTA (layout-structure.css) deve seguirlo. Senza, le righe di due
   colonne affiancate divergono di 2.4px l'una dall'altra — su tre righe fanno 4.8px, ed
   era il difetto aperto piu' visibile della 5a sessione (§22.6).
   ⚠️ Va su .dxbl-fl e NON nel blocco qui sopra: deve essere visibile dal contenitore
   della SPUNTA, che di una casella di testo non e' discendente. E' lo stesso motivo per
   cui il valore non si puo' leggere da --dxbl-text-edit-padding-y (§8.21/§8.24).
   💡 Piu' in basso in questo foglio c'e' un altro blocco .dxbl-fl (fondo e bordo del
   form): proprieta' diverse, quindi non si fanno ombra — ma sono due, non uno. */
.dxbl-fl {
    --form-row-h: calc(20px + 3px + 3px + 1.6px);   /* interlinea + padding + due bordi */
    /* L'etichetta SOPRA tirata verso il proprio campo (--form-cap-pull). Stessa geometria
       di DIDASCALIA di Ampio (5/14, senza tirata ~1.67), MA il campo di Indice e' piu' corto
       (27.6 contro 32): a -7 come Ampio l'etichetta arrivava a 0.4px dal VALORE, sfiorandolo.
       Quindi -4, che da' la STESSA aria di Ampio sul valore (clearance 3.4 contro 3.2) con
       rap_c 2.59 - pende chiaro senza toccare il testo. ⚠️ Gemelli sulla didascalia NON vuol
       dire gemelli sulla tirata sicura: la governa l'ALTEZZA DEL CAMPO. Misura fresca e
       correzione del numero 9a-stantio (§8.50) per esteso in theme-ampio.css. A VIDEO (11a).
       ➕➕ 19/08, §158.11 — DA -4 A -2, cioe' +2px di respiro sotto OGNI etichetta. Chiesto da lui
       guardando Indice: *«lo spazio minimo che c'e' tra fine etichetta e l'inizio del suo relativo
       elemento di sotto… vorrei aumentarli entrambi di un paio di pixel, prova con 2 pixel»*.
       🔑 «Entrambi» sono l'etichetta-campo del form E il titolo-riga delle griglie interne, e si
       muovono con QUESTA sola riga: il `margin-bottom` dell'intestazione di griglia e' scritto in
       `layout-structure.css` come `padding dell'etichetta + --form-cap-pull - filetto`, cioe' legge
       la stessa geometria. Una leva, due distanze — ed e' anche il motivo per cui erano gia' pari
       prima di toccarle (misurato: 3,5 contro 3,3 dalla linea di base, dove lo 0,2 e' il filetto a
       DPR 1.25). ⚠️ Chi volesse muoverne una sola deve rompere quel legame, e sarebbe un peggioramento.
       ⚠️ IL VERSO E' SICURO: il vincolo scritto qui sopra e' che a -7 l'etichetta arrivava a 0,4px
       dal VALORE. -2 la allontana, quindi la clearance cresce da 3,4 a 5,4 — il limite sta dall'altra
       parte. Il costo e' in ALTEZZA: +2px per ogni item e per ogni griglia con intestazione. */
    --form-cap-pull: -2px;
}

/* BORDO UNIFORME SUI QUATTRO LATI, a riposo — su OGNI casella di testo dell'app.
   ⚠️ Il lato inferiore NON era piu' spesso: misurato, tutti e quattro sono 0.8px.
   Era piu' SCURO — #3f3f3e sotto contro #d3d3d2 sugli altri tre — perche' DevExpress lo
   governa con una variabile a parte, --dxbl-text-edit-underline-color, residuo dello
   stile "a sottolineatura" di Fluent. Sembrava spessore, era colore.
   Si punta alla variabile del BORDO invece di ricopiarne il valore, cosi' il lato
   inferiore segue automaticamente gli altri tre, hover compreso.
   ⚠️ Regola GLOBALE e non scopata a .dxbl-fl: le caselle fuori dai form sono quattro
   (ricerca full text nel ribbon, filtro del menu, e due nel pannello impostazioni di
   DevExpress) e avevano tutte la stessa asimmetria. Elencarle una per una avrebbe
   voluto dire mantenere una lista destinata a diventare incompleta.
   ⚠️ Il FUOCO invece resta scopato al form (piu' sotto): fuori dai form la riga
   d'accento e' ancora solo sul lato inferiore, come di serie. */
.dxbl-text-edit {
    /* --- Bordo a riposo SCHIARITO: #d3d3d2 -> #E1E1E0 ---
       Stessa tinta di prima (neutro, hue 60) con la sola luminosita' alzata da 82.5% a
       88%: si alleggerisce il contorno del campo senza introdurre colori.
       ⚠️ Su DPR 1.25 un bordo da 1px rende 0.8px, cioe' UN pixel fisico: sotto il pixel
       pieno il COLORE e' l'unica leva del peso percepito (§8.9). E' il motivo per cui
       schiarire funziona — ma anche il motivo per cui oltre L 88% il bordo non diventa
       "piu' tenue", diventa invisibile su certi monitor. Questo e' il gradino limite.
       ⚠️ Si dichiara la variabile e non il border-color: cosi' la seguono anche gli stati
       che DevExpress deriva da lei, incluso il lato inferiore agganciato qui sotto.
       💡 Valutata e scartata --grid-line (#D8DCDF), che sarebbe stata la scelta "di
       sistema" — la stessa linea che separa le righe in griglia, e per giunta fredda come
       il resto del tema. Non scelta perche' schiariva meno: qui si voleva alleggerire. */
    --dxbl-text-edit-border-color: var(--fl-campo-bordo, #E1E1E0);
    /* L'hover schiarito DELLO STESSO PASSO, non lasciato dov'era.
       ⚠️ Di serie e' #c8c8c7 (L 78.4%): contro un riposo a 82.5% era uno scalino di 4
       punti, contro 88% ne diventerebbe uno di quasi 10 — il passaggio del mouse
       "sbatterebbe" invece di accennare. Portandolo a L 84% lo scalino torna 4 punti,
       cioe' il rapporto che DevExpress aveva scelto. Si sposta il livello, non la
       relazione. */
    --dxbl-text-edit-border-hovered-color: #D7D7D6;
    /* ⚠️ Le due righe che agganciavano il lato inferiore al bordo
       (--dxbl-text-edit-underline-color e la sua gemella hovered) sono state HOISTATE in
       `layout-structure.css` §7 nella 7a sessione, insieme alla terza che mancava
       (-active-color). Motivo: non contengono un colore, e gli altri quattro temi avevano
       tutti la stessa asimmetria — la correzione era scritta qui e valeva per il solo
       Indice. Stesso caso dell'icona dei rami al §23.11.
       💡 Restano qui le due dichiarazioni SOPRA, che invece un colore lo portano: quelle
       sono la scelta di Indice, non una regola di struttura. Puntando il foglio condiviso
       alla variabile del bordo, il lato inferiore segue automaticamente proprio questi due
       valori. */
}

/* AL FUOCO: si colorano TUTTI E QUATTRO i lati, non il solo lato inferiore.
   Di serie DevExpress non colora il bordo: genera un ::after in posizione assoluta
   ancorato in basso (bottom/left/right: -1px) che disegna un solo border-bottom da 2px
   nel colore d'accento. Quindi non basta cambiare un colore — quel pseudo-elemento va
   spento, e il colore va messo sul bordo vero della casella.
   ⚠️ Si cambia solo il COLORE di bordi che esistono gia' su tutti e quattro i lati:
   nessuna larghezza cambia, quindi il testo non si sposta di un pixel al clic. E' il
   rischio che il §15 segnala per Repertorio, dove invece l'anello viene AGGIUNTO e
   percio' li' e' fatto col box-shadow.
   ⚠️ Servono tutte e tre le forme del selettore: DevExpress usa sia la classe
   .dxbl-focused sia :focus-within sia :has(:focus), e non sono intercambiabili.
   💡 Per provarlo NON serve inseguire il fuoco vero — eseguire JS nel browser lo
   sposta sul body e si finisce per misurare lo stato a riposo (§8.10). Basta
   aggiungere a mano la classe .dxbl-focused alla casella e misurare. */
.dxbl-fl .dxbl-text-edit.dxbl-focused::after,
.dxbl-fl .dxbl-text-edit:focus-within::after,
.dxbl-fl .dxbl-text-edit:has(:focus)::after {
    content: none;
}
.dxbl-fl .dxbl-text-edit.dxbl-focused,
.dxbl-fl .dxbl-text-edit:focus-within,
.dxbl-fl .dxbl-text-edit:has(:focus) {
    border-color: var(--dxbl-text-edit-underline-focused-color) !important;
}

/* CASELLE DI SPUNTA (i flag bool) piu' grandi nella scheda: 10 -> 16px.
   ⚠️⚠️ LA CAUSA DEI 10px NON ERA UNA SCELTA SULLE CASELLE, era un effetto collaterale
   di QUESTO tema: la dimensione discende da --dxds-spacing-160, che Indice comprime a
   0.625rem nel blocco "spaziatura compressa" in cima al foglio. Stringendo un token
   generico di spaziatura si sono rimpiccioliti anche i flag, senza che nessuno lo
   decidesse. Da tenere a mente prima di toccare quel blocco: non governa solo i vuoti.
   ⚠️ Serve specificita' (0,4,0): DevExpress dichiara queste variabili su
   .dxbl-checkbox:not(.dxbl-checkbox-switch):not(.dxbl-checkbox-radio), cioe' (0,3,0),
   e un semplice ".dxbl-fl .dxbl-checkbox" (0,2,0) PERDE — provato, del tutto inerte.
   Si ricalca la loro struttura invece di alzare il peso a caso (§8.15). */
/* ⚠️ REGOLA GLOBALE, non piu' scopata al form. La prima stesura diceva ".dxbl-fl
   .dxbl-checkbox" perche' in quel momento si stava lavorando alla scheda, ma il difetto
   non era della scheda: --dxds-spacing-160 e' un token GENERICO di spaziatura, e Indice
   lo comprime per tutta l'app. Le caselle erano quindi a 10px OVUNQUE — in griglia
   (colonna di selezione, 73 in scena) esattamente come nel form, solo che li' nessuno le
   aveva ancora guardate. Correggere solo il form voleva dire lasciare due misure diverse
   per lo stesso oggetto.
   E' la stessa scelta gia' fatta poco piu' sotto per i bordi delle caselle di testo:
   quando il difetto viene da un token generico, la correzione va dove sta il difetto.
   ⚠️ Serve "body" davanti per arrivare a (0,3,1): DevExpress dichiara queste variabili su
   .dxbl-checkbox:not(...):not(...), cioe' (0,3,0), e a parita' di peso il §8.15 avverte
   che vince il loro foglio, non il nostro. Un antenato basta a scavalcare senza gonfiare
   il selettore con classi inventate.
   ⚠️ Restano fuori switch e radio, che sono altri due componenti con la stessa classe
   base: ingrandirli con la stessa regola li deformerebbe. */
body .dxbl-checkbox:not(.dxbl-checkbox-switch):not(.dxbl-checkbox-radio) {
    --flag-dim: 16px;
    --dxbl-checkbox-check-element-checkbox-size-m: var(--flag-dim);
    --dxbl-checkbox-check-element-width: var(--flag-dim);
    --dxbl-checkbox-check-element-height: var(--flag-dim);
}

/* ⚠️ Ingrandendola, la casella cresce VERSO IL BASSO da un bordo superiore fisso: il
   suo centro scendeva di 3px rispetto all'etichetta del campo (scarto misurato da -1 a
   +2). Si recupera con meta' della crescita, espressa come calcolo sul valore di
   partenza invece che col numero -3 scritto a mano: cosi' se un giorno si cambia
   --flag-dim o la spaziatura del tema, la compensazione segue da sola.
   ⚠️ NON si risolve centrando col flex (align-self / align-items sul controllo):
   provati entrambi, numeri IDENTICI. Il contenitore e' gia' alto quanto la casella,
   quindi non c'e' nessuno spazio da ridistribuire — regola applicata e inerte. */
.dxbl-fl .dxbl-checkbox .dxbl-checkbox-check-element {
    /* Meta' della crescita, PIU' un pixel. Quel pixel non e' un ritocco a occhio: e' il
       BORDO che il campo di testo ha e la casella no. Senza, la casella restava 0.8px
       piu' in alto dei campi che le stanno ACCANTO SULLA STESSA RIGA (Locali|Ascensore,
       Bagni|Garage, Piano|Ristrutturato) — ed e' li' che si vedeva la sfasatura.
       Misurato sul centro dei GLIFI dell'etichetta, non delle scatole: campi -1.8,
       casella -2.6 prima, -1.6 dopo. I 0.2px residui sono sotto la soglia percepibile.
       ⚠️ Si allinea ai CAMPI VICINI, non al proprio ottimo ottico: centrandola sul
       centro dei glifi (scarto 0) finirebbe 1.8px PIU' IN BASSO dei campi sulla stessa
       riga, cioe' si sposterebbe la sfasatura invece di toglierla.
       ⚠️ NON usare var(--dxbl-text-edit-border-width) al posto di 1px: quella variabile
       non e' visibile da qui (e' del componente text-edit), il calc diventa invalido e
       cade l'INTERA dichiarazione — margin-top 0, non "il calc senza quel termine".
       Una variabile inesistente non vale zero: avvelena tutta la proprieta'. */
    margin-top: calc((var(--dxds-spacing-160) - var(--flag-dim)) / 2 + 1px);
}

/* ETICHETTE DEI CAMPI: piu' piccole, piu' chiare, con un semigrassetto a compensare.
   Le tre leve si compensano a vicenda ed e' il motivo per cui vanno mosse insieme:
   schiarire il colore toglie peso, il 600 lo restituisce. Muovendole nello stesso verso
   l'etichetta o sparisce o grida. Da 14px/400 quasi nero a 13px/600 #7F8C99: ne esce una
   gerarchia dichiarata — l'etichetta nomina, il valore (15px) dice.
   ⚠️ #7F8C99 su bianco da' circa 3.4:1, sotto la soglia AA. E' lo stesso baratto accettato
   per le linguette chiuse, ma qui il rischio e' diverso: li' il grigio CODIFICA uno stato
   (non sei su questa scheda), qui l'etichetta e' l'unica cosa che dice cosa contiene il
   campo. Scelta consapevole, guardando il risultato: se un giorno stona, il gradino
   sopra e' --grid-header-color (#5B6672, circa 5.9:1). */
.dxbl-fl .dxbl-fl-cpt {
    font-size: var(--fl-etichetta-corpo, 13px);
    font-weight: var(--fl-etichetta-peso, 600);
    color: var(--fl-etichetta-colore, #7F8C99);
}
/* Caption di CAMPO con help-info (§44): colore muto come un'etichetta normale, non l'accento
   da titolo di gruppo. L'inner eredita (color:inherit in layout-structure). */
.dxbl-fl .dxbl-fl-cpt.dxbl-fl-caption-tmpl:has(> .caption-container),
.dxbl-fl .dxbl-fl-cpt.dxbl-fl-caption-tmpl:has(> .caption-container-inline) {
    color: #7F8C99 !important;
}

/* ...MA NON dove il controllo e' una casella di spunta.
   ⚠️ Il problema: una casella di spunta NON ha testo proprio — l'ispezione mostra che
   sotto .dxbl-fl-ctrl c'e' il solo quadratino (.dxbl-checkbox-check-element). Quindi
   "Ascensore" e' la LABEL del campo, la stessa classe di "Titolo", e qualunque regola
   sulle etichette la colpisce. Ma nelle altre righe l'etichetta e' accompagnata da un
   valore a 15px che porta il peso della riga, mentre qui e' l'unico testo in scena:
   rimpicciolita e schiarita, la riga sbiadisce accanto alle vicine.
   La regola quindi non e' "le etichette sono cosi'" ma "il testo che fa le veci del
   VALORE si scrive come un valore": 15px/400 nel nero dei dati, gli stessi numeri
   misurati dentro le caselle di testo.
   ⚠️ Selettore per STRUTTURA e non per nome di campo: :has(+ ...) prende l'etichetta il
   cui fratello successivo contiene una spunta. Elencare xaf-item-ascensore, -garage,
   -ristrutturato funzionerebbe oggi e sarebbe una lista da aggiornare a ogni bool nuovo.
   💡 Disponibile resta fuori di proposito: usa l'editor custom DisponibileBadge, che un
   suo contenuto visibile ce l'ha (il pill), quindi la sua etichetta puo' restare quieta.

   ⚠️⚠️ 03/08 — LA CATENA E' DIVENTATA `> .dxbl-fl-ctrl >`, FIGLIO DIRETTO. Scritta
   discendente la condizione prendeva qualunque spunta a qualunque profondita', quindi
   anche gli editor che di spunte ne contengono TANTE dentro un loro contenitore:
   misurato su DemoEditors/Lavoratore, etichetta «Categoria» (modo checkBox, un DxListBox
   con 4 spunte) resa 15px/400/rgb(22,22,22) come una spunta nuda, mentre «Nome» e
   «Caratteristiche» accanto stavano a 13px/600/rgb(127,140,153). **Era un difetto gia'
   li', non introdotto dal nuovo editor a pastiglie: quello ci si e' solo aggiunto.**
   📌 E la cura non cambia l'intenzione, la RISPETTA: il criterio scritto qui sopra e'
   «il testo che fa le veci del valore si scrive come un valore». Un DxListBox e una fila
   di pastiglie un contenuto visibile CE L'HANNO — sono nella stessa condizione di
   Disponibile, che il commento dichiarava gia' fuori. La catena stretta li esclude per
   struttura invece che per elenco.
   ✅ Verificato che la regola continua a scattare DOVE DEVE, e col numero: su LayoutLab
   (scheda immobile, 43 caption in pagina) il selettore stretto aggancia **10** elementi,
   esattamente gli stessi **10** di quello largo — sulle spunte vere non cambia nulla, e
   «Trattabile» resta 15px/400/rgb(22,22,22). Su DemoEditors invece tornano a
   13px/600/rgb(127,140,153) le tre che non dovevano esserci: Dotazioni, Categoria e
   Professione.
   ⚠️ La riga qui sopra e' nata SBAGLIATA: diceva «verificato» prima che lo fosse, ed e'
   stata corretta misurando. E' il difetto del §90.1 — un commento che afferma un
   meccanismo senza il numero che lo dimostra — commesso mentre lo si documentava.
   💡 Nitido questa lezione l'aveva gia' imparata (§51, difetto arrivato dal gestionale) e
   scrive `> .dxbl-fl-ctrl > .dxbl-checkbox` da allora. Qui era rimasta la forma larga. */
.dxbl-fl .dxbl-fl-cpt:has(+ .dxbl-fl-ctrl > .dxbl-checkbox) {
    font-size: 15px;
    font-weight: 400;
    color: rgb(22, 22, 22);
}

/* GRUPPI DI LAYOUT: via il contorno della carta, e una barra d'accento sotto il titolo.
   Il gruppo smette di essere un riquadro e diventa una sezione introdotta da un titolo
   sottolineato — la stessa grammatica delle linguette, riusata su un'altra superficie.

   ⚠️ Si spegne il COLORE del bordo, non il bordo: con "border: none" la carta perde
   0.8px per lato e TUTTO il contenuto slitta (misurato: carta 320 -> 318.4, primo campo
   da x 309.6 a 308.8, form 422 -> 421). Con "transparent" la geometria resta identica
   al pixel e sparisce solo la riga. Vale anche come promemoria generale: togliere un
   bordo non e' mai neutro sul layout, cambiargli colore si.
   ⚠️ Resta il FONDO BIANCO della carta sulla carta grigia del tema: non e' stato
   chiesto di toglierlo, ma e' lui che fa ancora leggere il gruppo come un riquadro.

   La barra e' copiata dal ::after della linguetta attiva (§17.4), misurato sul posto:
   position absolute, bottom 0, left/right 12px, altezza 3px, raggio 2px, accento del
   tema. 💡 I 12px coincidono con il padding orizzontale della didascalia, quindi la
   barra parte esattamente dove inizia il testo del titolo — non e' stato scelto, e'
   emerso dal fatto che le due superfici usano lo stesso passo.
   ⚠️ Serve position: relative sulla didascalia (era static), altrimenti il ::after si
   ancorerebbe a un antenato qualsiasi.
   ⚠️ Si usa .dxbl-fl-caption-tmpl e non .dxbl-group-header a secco: il §15 avverte che
   quest'ultima colpisce anche i rami del menu laterale. */
.dxbl-fl .dxbl-group.expanded {
    border-color: transparent;
}

/* ...e via anche il FONDO BIANCO: e' l'ultimo residuo che faceva leggere il gruppo come
   un riquadro anche senza contorno (carta bianca #FFFFFE sul grigio #EBEDEF del tema).
   Con il fondo trasparente il gruppo smette del tutto di essere una scheda e diventa una
   sezione, delimitata solo dal titolo e dalla sua barra.
   ⚠️ I fondi da spegnere sono DUE, non uno: la carta esterna (.dxbl-group) e la
   didascalia (.dxbl-fl-caption-tmpl), che ne dichiara uno proprio. Spegnendo solo la
   prima resterebbe una banda bianca dietro al titolo — e sarebbe l'unica cosa visibile,
   quindi il difetto piu' evidente dei due. */
.dxbl-fl .dxbl-group.expanded,
.dxbl-fl .dxbl-fl-caption-tmpl {
    background-color: transparent;
}

/* ...ma il BIANCO torna sul solo CORPO del gruppo, da sotto la barra in giu': il titolo
   resta sulla carta grigia del tema, il contenuto ha il suo foglio bianco.
   💡 Non serve calcolare nessun offset: la carta ha esattamente DUE figli — la
   didascalia e .dxbl-group-body — e il corpo inizia al pixel dove finisce la didascalia
   (misurato: didascalia y 226 + altezza 36 = 262, corpo y = 262). Dipingere il corpo
   fa partire il bianco esattamente sotto la barra, per costruzione.
   Angoli: tondi solo IN BASSO, cosi' il bianco si chiude sotto e resta a filo con la
   barra sopra, che fa da tappo. */
/* ⚠️ DUE SUPERFICI, UNA REGOLA SOLA: la vista a gruppi affiancati e quella a schede
   sono lo stesso disegno reso da componenti diversi, e vanno tenute nella stessa regola
   o divergono al primo ritocco.
     .dxbl-group-body        -> il corpo di un LayoutGroup, sotto la didascalia
     .dxbl-tabs-content-panel -> il pannello di un TabbedGroup, sotto le linguette
   💡 Nella vista a schede la barra d'accento NON va aggiunta: c'e' gia', ed e' il
   ::after sotto la linguetta attiva (§17.4) — cioe' proprio quello da cui era stata
   copiata la barra dei titoli. Le due viste convergono sullo stesso disegno partendo
   da capi opposti.
   ⚠️ .dxbl-tabs-content-panel esiste ANCHE nel ribbon (vedi §19): va scopato a
   .dxbl-fl-gt, il contenitore del TabbedGroup, non lasciato libero. */
.dxbl-fl .dxbl-group-body,
.dxbl-fl .dxbl-fl-gt .dxbl-tabs-content-panel {
    background-color: #FFFFFE;
    border-radius: 0 0 4px 4px;
    /* Gli altri tre lati chiudono il foglio bianco: sopra ci pensa gia' la barra.
       Colore = --toolbar-line, cioe' il token che il tema ha GIA' per "linea di uno
       scalino piu' marcata" (e' --grid-line scurita in HSL a tinta invariata). Si
       preferisce ai #d3d3d2 di serie di DevExpress perche' quello e' neutro, mentre
       tutta la scala di Indice e' FREDDA: a fianco delle righe di griglia si vedrebbe
       la differenza di temperatura.
       ⚠️ Il bordo va sul CORPO, non sulla carta: cosi' delimita esattamente il bianco e
       parte al pixel dove finisce la barra. Sulla carta avvolgerebbe anche il titolo,
       che invece deve restare sulla carta grigia.
       ⚠️ Costa 0.8px: il contenuto rientra di altrettanto e il form cresce di 1px.
       Inevitabile aggiungendo un bordo — misurato, non stimato. */
    border-left: 1px solid var(--toolbar-line);
    border-right: 1px solid var(--toolbar-line);
    border-bottom: 1px solid var(--toolbar-line);
}

/* ⚠️ Il bordo SUPERIORE serve SOLO alla versione a schede, ed e' l'unica differenza
   voluta fra le due. Motivo: nei LayoutGroup la barra d'accento e' larga quanto il
   foglio e quindi lo chiude da sola; fra le schede invece e' larga quanto la sola
   linguetta attiva, e tutto il resto del lato superiore resterebbe aperto — si
   vedrebbe il gradino fra il grigio e il bianco dove la barra non arriva.
   Non va quindi aggiunto anche a .dxbl-group-body: li' raddoppierebbe la barra. */
.dxbl-fl .dxbl-fl-gt .dxbl-tabs-content-panel {
    border-top: 1px solid var(--toolbar-line);
    /* ...e il pannello sale di 2px per togliere il vuoto fra la barra della linguetta
       attiva e il bordo superiore del foglio.
       ⚠️ QUEI 2px NON SONO DECORATIVI e non vanno tolti alla fonte: sono il
       padding-bottom della <ul> delle linguette, e vale
       calc(--dxbl-tabs-tab-focus-outline-size + --dxbl-tabs-tab-focus-outline-offset),
       cioe' lo spazio riservato all'ANELLO DI FUOCO della linguetta. Azzerarlo lo
       ritaglierebbe durante la navigazione da tastiera — una regressione di
       accessibilita' per un dettaglio estetico. (E comunque non ci si arriva: quella
       regola e' (0,5,0) e vince.)
       Percio' si lascia il padding dov'e' e si sovrappone il pannello, con lo STESSO
       calcolo che genera lo spazio: se DevExpress cambia la dimensione dell'anello, la
       compensazione lo segue da sola. Un -2px letterale darebbe lo stesso risultato
       oggi e sarebbe sbagliato domani.
       ⚠️ Prezzo da sapere: sovrapponendosi, il pannello copre l'ultimo lembo
       dell'anello di fuoco della linguetta attiva. E' il punto in cui linguetta e
       foglio si fondono, quindi e' convenzionale — ma e' una scelta, non un pareggio. */
    margin-top: calc(-1 * (var(--dxbl-tabs-tab-focus-outline-size) + var(--dxbl-tabs-tab-focus-outline-offset)));
}

/* --- IL PANNELLO A SCHEDE NON E' PIU' UN FOGLIO BIANCO (richiesta utente) -------------
   Il box che le linguette formano prende il FONDO GENERALE della pagina invece del
   bianco. Misurato prima su "Form Tabs": pannello #FFFFFE dentro una pagina #EBEDEF —
   era l'unica lastra bianca larga della vista.
   Si scavalca la sola meta' che riguarda il pannello: la regola del "foglio" qui sopra
   dichiara insieme `.dxbl-fl .dxbl-group-body` (i box) e il pannello, e i BOX restano
   bianchi.
   ⚠️⚠️ SERVE !important, e il motivo e' istruttivo: il bianco del pannello NON lo metteva
   la regola del foglio qui sopra — la mette XAF, in `styles.css`, con un selettore lungo
   `.dxbl-theme-fluent .main-ribbon-template.app .detail-view-content > .dxbl-fl:not(:has(…))
   … .dxbl-tabs-content-panel` che vale `var(--dxds-color-surface-neutral-default-rest)`
   = #fffffe. Misurato: una prima stesura senza !important, a (0,3,0) e piazzata DOPO il
   foglio, era nel CSSOM col selettore giusto e il pannello restava bianco lo stesso —
   cioe' anche la regola del tema, su questo elemento, e' inerte da sempre.
   💡 Prima di dire "il mio selettore non funziona", controllare CHI dipinge davvero: qui
   il colpevole era in un altro foglio, con specificita' fuori portata.
   ⚠️ CONSEGUENZA DA SAPERE, non un effetto collaterale nascosto: i box dentro le schede
   sono TRASPARENTI per scelta (§29.3 — "i campi restano sul foglio del pannello"), quindi
   ora appoggiano direttamente su questo grigio. Il contorno del pannello e la barra della
   linguetta restano, quindi il box si legge ancora; ma "Scheda descrittiva", che sta FUORI
   dalle schede, tiene il suo foglio bianco: dentro e fuori dai tab ora sono due registri.
   Se non convince, la via alternativa e' ridare il foglio ai due box interni. */
.dxbl-fl .dxbl-fl-gt .dxbl-tabs-content-panel {
    background-color: var(--toolbar-bg, #EBEDEF) !important;
    /* ...e senza foglio non serve nemmeno il contorno: il pannello smette di essere una
       scatola e resta solo la striscia delle linguette. Sono QUATTRO bordi in due regole
       (i tre laterali dal card, il superiore dalla regola qui sopra), per questo `border`
       e non `border-left/right/bottom`. */
    border: none !important;
    /* Contenuto a filo: i 14px di rientro laterale li mette
       `.dxbl-fl .dxbl-fl-gt .dxbl-fl-tab-content { padding: var(…-y) var(…-x) }` di
       core.min.css. Si azzera il TOKEN invece del padding — il verticale resta intatto e
       non serve !important, perche' la variabile la si scrive dove poi viene letta. */
    --dxbl-fl-tab-group-content-padding-x: 0;
}

/* ⚠️ E NON BASTAVANO QUELLE DUE. Spegnendole non cambiava NULLA a video, perche' il
   bianco che si vedeva non era dei gruppi: lo dipinge il contenitore dell'INTERO form,
   dxbl-form-layout.dxbl-fl (1003x422, bianco + bordo #d3d3d2). I gruppi erano davvero
   trasparenti, appoggiati su una carta piu' grande.
   Ennesima applicazione della regola "chi dipinge non e' chi sembra contenere": avevo
   setacciato il sottoalbero DENTRO i gruppi e non la catena degli antenati SOPRA.
   Metodo giusto: risalire dal nodo fino al body e fermarsi al primo fondo opaco.
   ⚠️ Serve !important, e di parecchio: qui il bianco NON viene da DevExpress ma da XAF,
   in styles.css, con
     .dxbl-theme-fluent .main-ribbon-template.app .detail-view-content > .dxbl-fl:has(...)
   cioe' circa (0,6,0). Un ".dxbl-fl" (0,1,0) non perde per un soffio: perde di un ordine
   di grandezza, e senza misurare sembra che la regola "non funzioni". */
.dxbl-fl {
    background-color: transparent !important;
    border-color: transparent !important;
}

/* ⚠️ QUI C'ERA UNA REGOLA CHE DIPINGEVA LA CARTA DA SE', TOLTA IL 22/08/2026.
   Diceva: `.dxbl-fl:not(:has(.dxbl-fl-caption-tmpl)):not(:has(.fl-box)):not(:has(.dxbl-grid))`
   -> fondo #FFFFFE, cioe' "se in questa vista nessun gruppo porta un titolo, il foglio lo
   faccio io". Era l'UNICO punto in tutti e sette i temi dove una carta compariva senza
   essere stata dichiarata. Tre motivi per toglierla, tutti misurati:
   1. La spia era sbagliata. `.dxbl-fl-caption-tmpl` non lo mettono solo i titoli di gruppo:
      lo mette anche l'help-info. Due icone "?" bastavano a spegnere la carta — la modale
      Telefono del gestionale non ce l'aveva e l'Indirizzo si', per questo e per nient'altro.
   2. Dipingeva la RADICE del form, che ha `padding: 0`: la carta usciva coi campi appiccicati
      al bordo. Un box vero e' un GRUPPO, e il gruppo il padding ce l'ha (vedi qui sotto).
   3. Era gia' inerte sul suo caso d'origine: `Immobile_DetailView_DueColonne` in palestra oggi
      ha 3 `fl-box` e zero gruppi titolati, quindi li' non agganciava piu' nessuno.
   L'idioma di casa resta uno solo: un box o ha una didascalia (e la carta la fa DevExpress),
   oppure si dichiara dal Model con `fl-box`. Non si indovina dal DOM. */

/* --- BOX DICHIARATI DAL MODEL: fogli separati senza caption ---
   Terzo uso di CustomCSSClassName in questo progetto (dopo il knob per-gruppo del §17.1),
   e qui risolve un problema che il CSS da solo non poteva: un LayoutGroup senza caption
   non genera la carta, quindi non c'e' NIENTE da colorare — la sola via era distinguere
   i gruppi radice dai loro figli, cosa che il CSS non sa fare senza contare i livelli.
   Marcandoli dal Model si dice esplicitamente QUALI gruppi sono box, e restano box anche
   se un giorno il layout viene riorganizzato.
   💡 Rispetto alla regola qui sopra (il foglio unico per le viste senza titoli), questa
   permette PIU' fogli staccati nella stessa vista: e' il motivo per cui quella si
   autoesclude con :not(:has(.fl-box)) — altrimenti si sommerebbero, foglio dentro foglio.
   ⚠️ Il padding e' necessario: senza, i campi toccherebbero il bordo del box. Il margine
   inferiore e' cio' che rende i box "staccati" invece che adiacenti.
   ⚠️ Niente margine sull'ULTIMO box, o il form guadagnerebbe uno spazio morto in fondo. */
/* ⚠️ Il secondo selettore e' la VISTA ANNIDATA dentro una linguetta (§52): li' il box non
   si puo' dichiarare dal Model. Provato e RIPRISTINATO: quelle due viste annidate
   (SchedaDotazioni/SchedaAmbiente) sono customizzazioni di viste GENERATE, non nodi
   dichiarati con IsNewNode, e ri-annidare i loro LayoutItem sotto un gruppo nuovo rompe il
   diff — XAF scarta la personalizzazione e rigenera il layout di default (misurato:
   spariva la disposizione a due colonne e compariva la caption "Scheda Dotazioni").
   💡 Quindi qui il box lo fa il CSS, sul form della vista annidata, e sta nello STESSO
   blocco di .fl-box perche' i due devono restare identici per costruzione: un valore
   cambiato qui vale per entrambi. */
/* ⚠️ 28/07 — aggiunto il selettore COMPOSTO: `fl-box` puo' stare sul LayoutGroup RADICE
   (`Main`), che e' il `.dxbl-fl` stesso e non un suo discendente (§66.3). */
.dxbl-fl .fl-box,
.dxbl-fl.fl-box,
.dxbl-fl .dxbl-fl-gt .dxbl-tabs-content-panel .nested-frame .dxbl-fl,
/* ⚠️ E IL DIALOGO DELLA RICORRENZA (29/08/2026), per la stessa ragione della vista annidata:
   li' `fl-box` NON SI PUO' DICHIARARE. Richiesta dell'utente: «il box della ricorrenza si apre
   con gli elementi direttamente su carta, vanno messi in un box» — ma quel dialogo non e' una
   vista XAF (non esiste nessun `RecurrenceInfo_DetailView`: la ricorrenza e' la stringa
   `RecurrenceInfoXml`, e il popup lo disegna `SchedulerRecurrenceInfoPopupComponent` come un
   `DxPopup` con tre template privati). Quindi il box lo fa il CSS, e sta in QUESTO blocco
   perche' il suo vestito ogni tema lo dipinge a modo suo — una regola sola nel foglio del
   gestionale avrebbe dato il fondo di Indice anche sui tre temi scuri. Cronaca: §214. */
.dxbl-apt-edit-dialog .dxbl-apt-edit-dialog-body > .dxbl-fl {
    background: #FFFFFE;
    border: 1px solid var(--toolbar-line);
    border-radius: 4px;
    padding: 14px 16px;
    margin-bottom: 14px;
}

/* ⚠️ La vista annidata e' l'ULTIMO (e unico) contenuto della sua linguetta: senza questo
   il margine inferiore del box si somma allo stacco gia' pareggiato piu' sotto.
   ⚠️⚠️ E servono i due !important, per una differenza fra le DUE linguette che si vede
   solo misurando: su .dxbl-fl il tema dichiara `background-color: transparent !important`
   (§21.8, il foglio del form spento). Nella linguetta DOTAZIONI quel transparent era gia'
   scavalcato dal "foglio unico" del §22.9 — che pero' si esclude da solo quando la vista
   ha un titolo di gruppo (`:not(:has(.dxbl-fl-caption-tmpl))`), ed e' il caso di AMBIENTE,
   che ha "Servizi di zona". Risultato: senza !important il box compariva su una linguetta
   e non sull'altra (misurato: bg #FFFFFE contro rgba(0,0,0,0)). */
.dxbl-fl .dxbl-fl-gt .dxbl-tabs-content-panel .nested-frame .dxbl-fl {
    background-color: #FFFFFE !important;
    border-color: var(--toolbar-line) !important;
    margin-bottom: 0;
}

.dxbl-fl .fl-box:last-child {
    margin-bottom: 0;
}

/* ⚠️⚠️ E AL BOX SULLA RADICE SERVE IL PESO — la riga del §62.9 in un caso nuovo.
   Questo tema dichiara `.dxbl-fl { background-color: transparent !important }` in
   ASSOLUTO (§21.8, il foglio del form spento): sui box discendenti non c'entra, ma il box
   dichiarato sulla RADICE *e'* quel `.dxbl-fl`, e quella regola vince sul selettore
   composto qui sopra. Misurato: fondo `rgba(0,0,0,0)` col padding e il raggio gia' presi.
   💡 Sta separata e non con un `!important` nel blocco sopra, perche' riguarda solo questo
   caso: i box normali il peso non ce l'hanno mai avuto e non serve darglielo.
   ⚠️ Vale per i tre temi che spengono il foglio in assoluto — Indice, Ampio e Nitido. */
.dxbl-fl.fl-box,
/* ⚠️ E IL DIALOGO DELLA RICORRENZA (29/08/2026), per la stessa ragione della vista annidata:
   li' `fl-box` NON SI PUO' DICHIARARE. Richiesta dell'utente: «il box della ricorrenza si apre
   con gli elementi direttamente su carta, vanno messi in un box» — ma quel dialogo non e' una
   vista XAF (non esiste nessun `RecurrenceInfo_DetailView`: la ricorrenza e' la stringa
   `RecurrenceInfoXml`, e il popup lo disegna `SchedulerRecurrenceInfoPopupComponent` come un
   `DxPopup` con tre template privati). Quindi il box lo fa il CSS, e sta in QUESTO blocco
   perche' il suo vestito ogni tema lo dipinge a modo suo — una regola sola nel foglio del
   gestionale avrebbe dato il fondo di Indice anche sui tre temi scuri. Cronaca: §214. */
.dxbl-apt-edit-dialog .dxbl-apt-edit-dialog-body > .dxbl-fl {
    background-color: #FFFFFE !important;
    border-color: var(--toolbar-line) !important;
}

/* --- I BOX DENTRO LE SCHEDE: rimettere il GUTTER che i margini negativi si mangiano ----
   Difetto segnalato sulla scheda "Ubicazione": i due box-colonna si toccavano (varco 0) e
   il secondo sforava a destra rispetto al box indipendente sotto le schede.
   ⚠️ LA CAUSA sono i margini negativi di `.dxbl-row` (-16px per lato, la compensazione del
   gutter DevExpress): il box, che e' una colonna, si riprende esattamente i 16px di
   padding che la colonna gli mette a sinistra e a destra, e finisce a filo dei vicini.
   E' la stessa trappola del §53 e del §56.1 — "i margini negativi altrui mangiano lo
   spazio" — qui in una terza forma.
   Misurato prima, scheda Ubicazione: box 270→842 e 842→1414, cioe' varco 0 e bordo destro
   a 1414 contro i 1397 di "Scheda descrittiva".
   💡 Non si tocca il padding della colonna (e' quello che regge il gutter di TUTTE le
   viste): si azzera il margine negativo della SOLA riga che contiene un box, cosi' il box
   torna dentro il proprio spazio e i 16+16 riappaiono come distanza fra i due.
   ⚠️ Scopato al pannello a schede: i box del §22.9 (vista a 2 colonne) stanno in una riga
   diversa e restano come sono. */
/* ⚠️ 28/07 — SALITA IN `layout-structure.css`, senza lo scope del pannello a schede:
   il difetto non era delle schede ma di ogni riga che porta box, e si vede peggio in
   MODALE (i campi a 0.8px dal bordo visibile). Il commento sopra resta: e' la misura. */

/* --- Lo STACCO SOTTO il blocco a schede, pareggiato a quello fra due box ---------------
   Difetto segnalato: "fra la fine di Scheda descrittiva e i due box sotto c'e' meno spazio
   che fra le schede e Scheda descrittiva" — ed e' vero, misurato sulla stessa vista:
     ultimo box DENTRO le schede -> caption di Scheda descrittiva   51.6px
     Scheda descrittiva          -> caption di Valutazione          26.0px
   ⚠️ LA CAUSA (l'ipotesi dell'utente, verificata risalendo la catena): il pannello continua
   per 27px sotto l'ultimo box — 12px di margine della colonna + 14px di padding-bottom del
   contenuto + 1px di bordo — e quei 27 si SOMMANO ai 24 di margine fra i due gruppi
   (12 sotto + 12 sopra) che invece, fuori dalle schede, sono tutto lo stacco.
   💡 Si tolgono solo quei 27: lo stacco scende a ~26 e i due varchi si pareggiano. Il
   padding SUPERIORE resta, perche' li' separa dalla striscia delle linguette.
   ⚠️ Il margine si azzera solo sull'ULTIMA riga: fra due righe di box dentro la stessa
   scheda quei 12px servono ancora. */
/* ⚠️ 28/07 — LE DUE REGOLE SONO SALITE IN `layout-structure.css` (§63.14-3 chiuso).
   Sono geometria pura e ora la condizione del §62.9 e' vera su tutti e sette i temi.
   Il commento qui sopra resta: e' la misura da cui i due azzeramenti sono nati. */
/* TITOLO DI SEZIONE — un idioma solo per le DUE superfici che introducono una sezione
   della scheda: la didascalia di un LayoutGroup e la linguetta di un TabbedGroup.
   Sono due modi di rendere la stessa cosa e avevano due tipografie diverse; qui vengono
   scritte una volta sola, ed e' la linguetta ad adeguarsi al gruppo (non il contrario:
   lo stile del gruppo e' una scelta motivata, vedi sotto, e andava esteso).

   Perche' 11px/650/MAIUSCOLO spaziato: Indice usa GIA' due volte questo idioma per le
   etichette di sezione — intestazioni di griglia (11px/650, MAIUSCOLE, tracking 0.06em,
   #5B6672) e rami del menu a indice (11px/600, MAIUSCOLE, tracking ~0.09em). Il titolo di
   gruppo era l'unico elemento di sezione a non seguirlo, e le linguette erano il secondo:
   13px/600 tondo, cioe' a un solo grado da un'etichetta di campo — ed e' per questo che
   non staccavano.
   ⚠️ UNA REGOLA, DUE SELETTORI, come per il corpo del gruppo e il pannello delle schede
   (§21.8): tenendole separate divergerebbero al primo ritocco.
   ⚠️ Il peso va messo sullo SPAN, non sulla linguetta: .dxbl-tabs-item risulta gia' a
   600, ma .dxbl-tabs-text-overflow di una linguetta spenta dichiara 400, e una
   definizione locale batte sempre il valore ereditato (§8.18 e §8.21) — puntare alla
   linguetta e' perfettamente inerte.
   💡 In una linguetta spenta gli span sono DUE: quello col testo e uno VUOTO in
   grassetto, che riserva in anticipo la larghezza cosi' la linguetta non "salta" quando
   diventa attiva. Il selettore li prende entrambi, ed e' quello che serve: se lo
   riservasse con misure vecchie le linguette ballerebbero al cambio scheda.
   ⚠️ Scopato a .dxbl-fl-gt: .dxbl-tabs-item e' UNA classe su TRE superfici (linguette
   delle viste aperte, del ribbon e dei TabbedGroup nel form — §17.4). Senza questo
   antenato si vestirebbe da titolo di sezione anche il ribbon. Verificato dopo: Home/View
   restano 13px, 600/400 come di serie. */
/* ⚠️⚠️ 27/07 — E NON SULLE CAPTION DI CAMPO. Segnalato dall'utente sul gestionale
   (`Cliente_DetailView` > Altre info): "le label col bottone info non sono allineate con
   quelle senza". Misurato sulla STESSA riga: *Categoria* (che ha l'icona) rendeva
   11px/650/maiuscolo/0.66px, *Professione* e *Lingue parlate* 13px/600/normale — cioe' la
   caption con l'icona prendeva la tipografia della FASCIA DI GRUPPO.
   La causa e' qui e non e' la specificita': `.dxbl-fl .dxbl-fl-cpt` (riga ~713, l'etichetta
   di campo) e questa regola pesano UGUALE (0,2,0) — vince questa perche' viene DOPO nel
   file (§8.15). Un campo con help-info ha entrambe le classi, quindi ci finiva dentro.
   ⚠️ E il commento qui sopra dichiarava gia' l'intenzione contraria ("le etichette restano
   13px, 600/400 come di serie"): l'intenzione c'era, il selettore no.
   💡 SI ESCLUDE, non si ricontrodichiara: togliendo la caption di campo dal selettore
   tornano ad applicarsi da se' i 13px/600 della regola dell'etichetta, senza ripetere qui
   due numeri che poi divergerebbero al primo ritocco (il §44 aveva gia' dovuto ripetere il
   colore, ~riga 720). Discriminante: la caption di CAMPO contiene la .caption-container del
   componente, la fascia di gruppo no (§41/§44, gia' misurato).
   ⚠️ `:not(:where(...))` e NON `:not(...)`: `:where()` non contribuisce specificita', quindi
   la regola resta a (0,2,0) e cambia solo COSA aggancia. Con un :not() normale sarebbe
   salita a (0,4,0), scavalcando eventuali regole tarate per batterla (§63.5).
   ⚠️ L'esclusione vale per il PRIMO selettore soltanto: il secondo e' il testo delle
   linguette, che con le caption di campo non c'entra.
   ⚠️ Il difetto c'era IDENTICO in palestra (`TestAllineamentoInfo_DetailView`: 4 caption con
   icona a 11px contro 4 senza a 13px) — non era un caso del solo gestionale. */
.dxbl-fl .dxbl-fl-caption-tmpl:not(:where(:has(> .caption-container), :has(> .caption-container-inline))),
.dxbl-fl .dxbl-fl-gt .dxbl-tabs-item .dxbl-tabs-text-overflow {
    font-size: 11px;
    font-weight: 650;
    letter-spacing: 0.06em;
    text-transform: uppercase;
}

/* Il COLORE e' l'unica cosa che distingue una sezione attiva da una spenta: il titolo di
   GRUPPO prende l'accento.
   ⚠️ 26/07: la linguetta e' USCITA da questa regola — le linguette del form ora seguono le
   linguette del RIBBON (v. il blocco "identita' del ribbon" qui sotto), non piu' il titolo
   di gruppo. Restano insieme la tipografia (11px/650 maiuscolo, §22.2) e la barra. */
.dxbl-fl .dxbl-fl-caption-tmpl {
    color: var(--dxds-primary-90);
}

/* ...e la linguetta NON selezionata si fa piu' tenue: deve leggersi "non sei qui".
   ⚠️ Di serie e' rgb(63,63,62), un grigio quasi nero — piu' SCURO del testo delle celle
   di griglia (#14171A a parte, e' il valore piu' marcato in scena). Non segnalava nulla:
   a distinguere una scheda aperta da una chiusa restavano solo l'accento e la barra, e il
   peso identico delle due (650) toglieva anche quell'appiglio.
   Si usa #7F8C99, che il tema ha GIA' per i rami del menu e per la riga del fuoco della
   casella di ricerca: e' il suo grigio da "etichetta strutturale che non stai
   guardando", ed e' esattamente il ruolo di una linguetta chiusa. Nessun colore nuovo in
   circolazione, e resta freddo come tutta la scala di Indice (il grigio di serie era
   neutro).
   ⚠️ Passaggio in DUE tappe, entrambe misurate sul fondo reale rgb(235,237,239):
     rgb(63,63,62) di serie -> circa 8.5:1   (piu' marcata dell'attiva: non segnalava)
     #5B6672 (intestazioni di colonna) -> 4.99:1   (piu' tenue, ma ANCORA sopra
             l'attiva, che sta a 4.13: la gerarchia restava affidata a tinta e barra)
     #7F8C99 (questo) -> 2.93:1   (finalmente SOTTO l'attiva)
   ⚠️⚠️ PREZZO DICHIARATO: 2.93:1 non e' sotto la sola soglia AA (4.5:1 per testo
   normale) ma anche sotto il 3:1 che varrebbe per il testo grande — e questo e' 11px,
   quindi la soglia applicabile resta la prima. E' testo CLICCABILE: e' un baratto
   leggibilita'/gerarchia fatto con gli occhi sul risultato, non una svista.
   ⚠️ Il 3.3 scritto qui in prima stesura era una STIMA mia, non una misura: il valore
   vero e' 2.93. Le altre due righe sopra sono misurate (la prima e' approssimata).
   Se un giorno serve rientrare in AA senza risalire, la leva non e' il colore ma il
   FONDO: schiarire la carta sotto le linguette alza il rapporto a parita' di tinta.
   ⚠️ Si colora lo SPAN, non la linguetta: il valore vive li' (§8.18), come per il peso. */
.dxbl-fl .dxbl-fl-gt .dxbl-tabs-item:not(.dxbl-active) .dxbl-tabs-text-overflow {
    color: #7F8C99;
}

/* --- LE LINGUETTE DEL FORM PRENDONO L'IDENTITA' DI QUELLE DEL RIBBON (26/07) ----------
   Richiesta dell'utente: "il colore del testo e della barretta come quello della toolbar
   in alto dove c'e' Home / View / Popup".
   Misurato il confronto, sullo SPAN del testo (§8.18: il valore vive li', non sulla
   linguetta):
     ribbon   attiva rgb(22,22,22)   spenta rgb(63,63,62)
     form     attiva rgb(59,121,145) spenta rgb(127,140,153)
   ⚠️ La BARRETTA era gia' identica: ::after 3px rgb(59,121,145) in entrambi — non c'era
   niente da allineare, e questa riga lo mette a verbale perche' la prossima volta non si
   rifaccia la misura.
   Quindi cambia solo l'INCHIOSTRO, e le due tinte arrivano dai token che il ribbon usa
   davvero: --chrome-ink per l'attiva e il grigio di serie per la spenta.
   ⚠️ Via anche la PASTIGLIA (chiesta dall'utente): la linguetta attiva prendeva
   --grid-hover-bg (#E6EEF0), il fondo della voce di menu selezionata. Nel ribbon non c'e':
   li' a dire "sei qui" bastano inchiostro forte e barra. Tolta, resta lo stesso segnale.
   💡 Con questa il registro delle linguette si stacca da quello dei TITOLI DI GRUPPO, che
   restano teal: era il punto della richiesta ("un'identita' diversa"). La tipografia
   invece resta condivisa (§22.2) — a separarsi e' solo il colore. */
.dxbl-fl .dxbl-fl-gt .dxbl-tabs-item.dxbl-active .dxbl-tabs-text-overflow {
    color: #161616;
}

.dxbl-fl .dxbl-fl-gt .dxbl-tabs-item:not(.dxbl-active) .dxbl-tabs-text-overflow {
    color: #3F3F3E;
    /* ⚠️ E il PESO scende a 400, sempre come il ribbon. Col solo colore lo stacco era
       troppo debole: misurato che li' attiva e spenta differiscono su DUE assi (600/400
       oltre a 22,22,22 / 63,63,62), mentre qui il peso restava 650 per entrambe — e su un
       11px maiuscolo il peso pesa piu' della tinta. Cosi' "sei qui" si legge da lontano
       anche senza guardare la barra. */
    font-weight: 400;
}

/* ⚠️ 26/07 — LA PASTIGLIA DELLA LINGUETTA ATTIVA E' STATA TOLTA (richiesta dell'utente).
   Prendeva --grid-hover-bg (#E6EEF0), cioe' il fondo della voce di menu selezionata: era
   la scelta della 5a sessione, "la linguetta attiva si comporta come la voce di menu
   attiva". Ora le linguette seguono il RIBBON, che a dire "sei qui" usa inchiostro forte
   e barra e basta — una pastiglia in piu' sarebbe un terzo segnale per la stessa cosa.
   Si lascia la regola cancellata a memoria del perche', non per riattivarla:
     .dxbl-fl .dxbl-fl-gt .dxbl-tabs-item.dxbl-active { background: var(--grid-hover-bg); }
   💡 Nota tecnica che resta valida se un domani servisse un fondo qui: il ::after della
   barra e' un pseudo-elemento e sta SOPRA lo sfondo dell'elemento che lo genera, quindi il
   fondo non la copre. */

/* Il vuoto fra il testo e la barra, pareggiato a quello del titolo di gruppo: 12.2 -> 6.2px.
   ⚠️ L'UNICA LEVA E' L'ALTEZZA. Il padding e' inerte (§8.17 e §17.4): la linguetta ha una
   height esplicita e il contenuto e' centrato dentro quell'altezza, quindi ridurre il
   padding-bottom da' numeri identici al default. Non ritentare quella strada.
   Il vuoto si muove di META' della variazione di altezza — il testo e' centrato, la barra
   e' ancorata in basso — quindi per togliere 6px di vuoto servono 12px di altezza:
   44 -> 32px. Misurato: vuoto 12.2 -> 6.2, esattamente il valore del gruppo.
   ⚠️ La formula del §17.4 (vuoto = altezza/2 - 13) qui NON torna: predice 9px dove se ne
   misurano 12.2. Non e' sbagliata, e' tarata su un altro caso — testo da 13px misurato
   sulla SCATOLA del testo. Qui il testo e' 11px e si misura il fondo dei GLIFI, quindi la
   costante vale circa 9.8 invece di 13. A reggere e' il coefficiente 1/2, che e'
   geometria (centratura + ancoraggio in basso) e non dipende dal carattere.
   ⚠️ Scopato a .dxbl-fl-gt come il resto: il §17.4 avverte che stringendo le linguette del
   RIBBON il pulsante applicazione (un bottone 44x44 in una linguetta con padding 0)
   sborderebbe. Qui non si arriva. */
.dxbl-fl .dxbl-fl-gt .dxbl-tabs-item {
    height: 32px;
}

/* Geometria della sola didascalia di gruppo (la linguetta ha la sua, nativa).
   ⚠️ Il rientro vale per il TESTO soltanto: la barra parte dal bordo della carta e
   arriva all'altro, cosi' il titolo appare inset DENTRO una riga a tutta larghezza.
   E' la seconda versione: nella prima la barra rientrava insieme al testo, e il rientro
   diventava invisibile perche' spostando entrambi non resta un riferimento per vederlo.
   Percio' --gruppo-pad-x governa SOLO il padding della didascalia, e il ::after e'
   inchiodato a 0: non vanno riaccoppiati.
   ⚠️ position: relative serve al ::after della barra (era static): senza, si
   ancorerebbe a un antenato qualsiasi. */
.dxbl-fl .dxbl-fl-caption-tmpl {
    --gruppo-pad-x: 24px;
    /* Vuoto SOPRA il testo, 10px di serie -> 4px. Non e' una limatura estetica: con 10px
       il testo non e' centrato nella pastiglia colorata, ha 12.4px sopra e 6.2px sotto.
       L'asimmetria c'era anche prima del fondo, ma senza una superficie che la delimiti
       non si vedeva — e' saltata fuori appena si e' provato a bordare la pastiglia.
       Il conto: i glifi cadono a (padding-top + 2.4) dal bordo, e sotto restano
       (altezza - 3 di barra - padding-top - 19.8). Uguagliando i due si ottiene 3.8px, e
       4px da' 6.4 sopra contro 6.2 sotto: 0.2px di scarto, sotto la soglia percepibile.
       💡 Cosi' il vuoto testo->barra resta 6.2px, cioe' il valore su cui sono state
       tarate le linguette: si corregge la simmetria SENZA rompere quel pareggio. La
       didascalia si accorcia da 36 a 30px, il che va bene a un tema denso.
       ⚠️ --gruppo-pad-top e' una variabile e non un numero perche' la pastiglia deve
       usare LO STESSO valore per debordare fin sul bordo (piu' sotto): scritti a mano in
       due punti, si scollegherebbero al primo ritocco. */
    --gruppo-pad-top: 4px;
    position: relative;
    padding-left: var(--gruppo-pad-x);
    padding-right: var(--gruppo-pad-x);
    padding-top: var(--gruppo-pad-top);
}

/* Lo stesso fondo della linguetta attiva (e della voce di menu selezionata) anche sul
   titolo di gruppo, ma SOLO DIETRO IL TESTO e non per tutta la riga.
   ⚠️ Il bersaglio non e' ne' la didascalia ne' il div che porta xaf-item-<gruppo>: sono
   larghi 1315 e 1267px, cioe' tutta la riga. Dentro c'e' un TERZO div, senza alcuna
   classe, che misura 127px contro 126.7 di glifi — e' gia' largo esattamente quanto il
   testo. Quindi qui non serve fit-content ne' un cambio di display: si colora e basta, e
   il layout non si muove di un pixel.
   ⚠️ Selettore STRUTTURALE per necessita', non per scelta: quel div non ha una classe da
   nominare. Se un giorno DevExpress cambia l'annidamento, questa regola smette di
   applicarsi in silenzio — ma non rompe nulla, e la struttura si rilegge in una sonda.
   ⚠️ PADDING E MARGIN NEGATIVO DELLO STESSO VALORE, su tutti e quattro i lati: e' cio'
   che fa debordare il fondo SENZA spostare il testo di un pixel. Il padding gonfia la
   scatola, il margine negativo restituisce lo spazio al layout — il contenuto resta
   inchiodato dov'era. Verificato: glifi a x=311 prima e dopo.
   Serve perche' il rientro di 24px e' una scelta deliberata (§21.8: la barra resta a
   tutta larghezza proprio perche' il testo rientri CONTRO un riferimento); un padding non
   compensato lo porterebbe a 32px e mangerebbe quel rapporto.

   I valori verticali NON sono a occhio, sono i vuoti della didascalia:
     sopra = --gruppo-pad-top, il suo padding-top, cosi' il fondo parte dal bordo della
             riga. E' una VARIABILE, non un numero ricopiato: quel padding lo decidiamo
             noi qui sopra (4px) per centrare il testo nella pastiglia, e se lo si
             ritocca il fondo lo segue da solo invece di scollarsi.
      3px sotto = il padding-bottom della didascalia (6px, questo si' di DevExpress) MENO
             l'altezza della barra (3px), cosi' il fondo arriva a filo della barra senza
             passarci sotto.
   Il risultato e' la stessa cosa che fa la linguetta attiva, dove il fondo copre l'intera
   altezza fino alla barra: prima qui copriva solo la riga di testo e restava un blocco
   sospeso a meta'.
   ⚠️ Il solo numero ancora agganciato a DevExpress e' il 3 (cioe' 6 meno 3): se cambiasse
   il loro padding-bottom si scollegherebbe, e il sintomo sarebbe il fondo che scavalca la
   barra o che si ferma prima.
   💡 8px laterali: il fondo inizia prima e finisce dopo il testo, come una pastiglia.
   Non deve pareggiare la linguetta, che ha un padding suo nativo. */
.dxbl-fl .dxbl-fl-caption-tmpl .dxbl-text > div {
    background: var(--grid-hover-bg);
    padding: var(--gruppo-pad-top) 8px 3px;
    margin: calc(-1 * var(--gruppo-pad-top)) -8px -3px;
    /* ⚠️ PROVATO E SCARTATO: un contorno tenue attorno alla pastiglia, come
       box-shadow inset a tre lati in --toolbar-line (il quarto no: sotto c'e' gia' la
       barra, e un bordo li' darebbe 1px di grigio incollato ai 3px di accento).
       Tecnicamente reggeva — l'inset non entra nel flusso, quindi il testo non si
       spostava di un pixel — ma il titolo ne usciva chiuso e pesante: la pastiglia deve
       restare una macchia di colore, non diventare un riquadro. Scartata anche l'ombra,
       che oltre a tutto solleverebbe il titolo, e in questo progetto il sollevamento
       significa gia' "campo al fuoco" (§15). Il fondo resta piatto, senza contorno. */
}
.dxbl-fl .dxbl-fl-caption-tmpl::after {
    content: "";
    position: absolute;
    bottom: 0;
    left: 0;      /* da bordo a bordo: NON agganciare a --gruppo-pad-x */
    right: 0;
    height: 3px;
    border-radius: 2px;
    background: var(--dxds-primary-90);
}

/* === BOX ANNIDATI: gerarchia fra SEZIONE e SOTTOSEZIONE ============================
   Nella vista "Form box annidato" (Immobile_DetailView_BoxAnnidati) ci sono box titolati
   DENTRO box titolati. Di serie il tema li rende IDENTICI (stessa pastiglia + barra teal +
   card bianco), e annidati diventano "card dentro card" — troppi riquadri. Qui la
   SOTTOSEZIONE (livello 2) scende a un registro piatto e subordinato. Deciso a video con
   l'utente (11a sessione).
   ⚠️ SCOPE: il discriminante e' `.dxbl-fl-group-body .dxbl-fl-group-body` = un corpo di
   gruppo DENTRO un altro corpo di gruppo, cioe' SOLO i gruppi annidati (12 su questa vista,
   0 sulla piatta). La sezione di primo livello e tutta la vista "Form box caption" NON sono
   toccate: tengono pastiglia, barra e foglio. Verificato: outer pill resta #E6EEF0.

   (a) via il CARD della sottosezione: niente foglio ne' bordo — dietro resta il foglio
       bianco della SEZIONE, quindi i campi non restano su un buco.
   ⚠️⚠️ 26/07: I BOX DENTRO I TAB SONO USCITI DA QUESTA FAMIGLIA — richiesta dell'utente,
   "il box Identita' dentro il tab Anagrafica deve avere lo stesso aspetto del box Scheda
   descrittiva che sta fuori dai tab". Nella 12a sessione ci erano stati messi (il box nel
   tab non e' una sottosezione — non ha il doppio group-body — ma gli si era dato lo stesso
   registro), e la cosa REGGEVA finche' il pannello a schede era un foglio bianco: i box
   trasparenti ci appoggiavano sopra. Ora il pannello ha il fondo della pagina e senza
   contorno, quindi un box trasparente resterebbe su un buco: i box tornano SEZIONI, con
   foglio, bordo e titolo come quelli fuori dai tab. Tolto qui e nei tre selettori sotto il
   discriminante `.dxbl-fl-gt .dxbl-tabs-content-panel …`.
   💡 La lezione e' che quelle due decisioni erano legate: il registro dei box interni
   dipendeva dal fondo del pannello, e cambiando il fondo andava rivisto anche il registro. */
.dxbl-fl-group-body .dxbl-fl-group-body {
    background: transparent;
    border: none;
}
/* (b) titolo della sottosezione: niente pastiglia (l'utente: "solo il bordo sotto il
       titolo"), grigio freddo strutturale invece del teal (subordinato), e compatto sul
       filetto. --gruppo-pad-x sceso a 6px per allineare il titolo ai campi, che ora vanno a
       filo (vedi (d)); padding-bottom a 2px per stringere il vuoto titolo->filetto (8.2->4.2).
   ⚠️ 26/07: anche qui il discriminante del TAB e' stato tolto (v. il blocco (a)): il titolo
   dei box dentro le schede torna quello di SEZIONE — pastiglia, teal, barra d'accento —
   come "Scheda descrittiva". Con esso se n'e' andata la regola che portava il loro
   --gruppo-pad-x a 13px, che serviva solo a quel registro. */
.dxbl-fl .dxbl-fl-group-body .dxbl-fl-caption-tmpl .dxbl-text > div { background: transparent; }
.dxbl-fl .dxbl-fl-group-body .dxbl-fl-caption-tmpl {
    color: #5B6672;          /* = intestazioni di colonna: il grigio "strutturale" del tema */
    --gruppo-pad-x: 6px;
    padding-bottom: 2px;
}
/* (c) il filetto: 1px in --toolbar-line invece della barra teal 3px della sezione */
.dxbl-fl .dxbl-fl-group-body .dxbl-fl-caption-tmpl::after {
    height: 1px;
    background: var(--toolbar-line);
    border-radius: 0;
}
/* (d) via il rientro laterale del corpo annidato: i controlli si estendono a tutta la
       colonna (input +24px). ⚠️ !important: DevExpress dichiara il padding del content con
       specificita' piu' alta e senza token esposto (cercato); lo scope "due group-body
       innestati" tiene la regola sui soli annidati. Il gutter di colonna (~14px) resta e
       separa le due sottocolonne, quindi i campi non si toccano. */
.dxbl-fl-group-body .dxbl-fl-group-body .dxbl-group-body-content {
    padding-left: 0 !important;
    padding-right: 0 !important;
}

/* === …E LO STESSO REGISTRO DENTRO IL BOX DELLA VISTA ANNIDATA (27/07) ==============
   Chiude il punto rimasto aperto dal §61.9: nella linguetta *Ambiente* di
   `TestVisteAnnidate_DetailView` il gruppo "Servizi di zona" restava un riquadro bianco
   col bordo DENTRO il box bianco della vista annidata — foglio dentro foglio, che il
   §22.9 sconsiglia e che qui sopra e' gia' stato risolto per i box annidati. Richiesta
   dell'utente: renderlo come in `Immobile_DetailView_BoxAnnidati`.
   ⚠️⚠️ E IL MOTIVO PER CUI IL BLOCCO SOPRA NON LO PRENDEVA NON E' LA SPECIFICITA', E' LA
   STRUTTURA — mappata a runtime, non dedotta:
     .nested-frame > .dxbl-fl                    <- LA CARTA, ma e' la NOSTRA (regola CSS)
       .dxbl-fl-group  ["Zona"]                  <- gruppo RADICE: nessuna caption, e
                                                    soprattutto NESSUN group-body proprio
         .dxbl-fl-group ["Servizi di zona"]
           .dxbl-fl-caption-tmpl
           .dxbl-fl-group-body                   <- l'UNICO group-body della vista
   Il discriminante `.dxbl-fl-group-body .dxbl-fl-group-body` chiede DUE carte annidate, e
   qui la prima non c'e': la carta esterna non e' un group-body di DevExpress ma il box che
   il §61.6 dipinge dal CSS, perche' li' dal Model non si puo' dichiarare. Un solo
   group-body dentro una carta che non e' un group-body → nessun match, e resta il registro
   di SEZIONE.
   💡 Quindi la condizione vera non era "due group-body annidati" ma "un corpo di gruppo
   dentro un'ALTRA CARTA": il blocco sopra ne conosceva una forma sola perche' quando fu
   scritto (11a sessione) l'altra non esisteva ancora. Qui si aggiunge la seconda forma
   invece di allargare la prima, cosi' ognuna resta leggibile insieme alla propria causa.
   ⚠️ Scopato al pannello a schede CONVERTITO (la catena completa fino a .nested-frame):
   una vista annidata che stia fuori da una linguetta non ha quel box, e li' il suo unico
   group-body e' la sola carta in scena — deve restare una sezione.
   ⚠️ I valori NON si ripetono a mano dove sono un token (--toolbar-line); il grigio
   #5B6672 e i due numeri del titolo sono gli stessi del blocco sopra, e se un domani si
   ritoccano vanno ritoccati in due punti: annotato qui perche' non si scopra rileggendo. */
.dxbl-fl .dxbl-fl-gt .dxbl-tabs-content-panel .nested-frame .dxbl-fl .dxbl-fl-group-body {
    background: transparent;
    border: none;
}
.dxbl-fl .dxbl-fl-gt .dxbl-tabs-content-panel .nested-frame .dxbl-fl .dxbl-fl-caption-tmpl .dxbl-text > div {
    background: transparent;
}
.dxbl-fl .dxbl-fl-gt .dxbl-tabs-content-panel .nested-frame .dxbl-fl .dxbl-fl-caption-tmpl {
    color: #5B6672;
    --gruppo-pad-x: 6px;
    padding-bottom: 2px;
}
.dxbl-fl .dxbl-fl-gt .dxbl-tabs-content-panel .nested-frame .dxbl-fl .dxbl-fl-caption-tmpl::after {
    height: 1px;
    background: var(--toolbar-line);
    border-radius: 0;
}
/* (d) come sopra: via il rientro laterale, cosi' i campi vanno a filo del box che li
   contiene invece di avere due incassi in fila. */
.dxbl-fl .dxbl-fl-gt .dxbl-tabs-content-panel .nested-frame .dxbl-fl .dxbl-group-body-content {
    padding-left: 0 !important;
    padding-right: 0 !important;
}

/* === …E LA TERZA FORMA: LA CARTA ESTERNA E' UN `fl-box` SENZA CAPTION (27/07) =======
   Segnalato dall'utente sul gestionale (`Cliente_DetailView` > Altre info > "Tipo di
   cliente"): il gruppo titolato dentro il box resta una SEZIONE — corpo bianco
   `rgb(255,255,254)` dentro il bianco del box, e pastiglia d'accento sul titolo.
   ⚠️ La causa e' la stessa del blocco qui sopra, mappata a runtime: `corpiDiGruppoAntenati: 0`.
   Un LayoutGroup con ShowCaption="False" — che e' come si dichiara un `fl-box` dal Model —
   NON riceve da XAF nessun `.dxbl-fl-group-body`. Quindi il discriminante della 11a sessione
   (`.dxbl-fl-group-body .dxbl-fl-group-body`) chiede due corpi e ne trova uno, e nemmeno la
   forma `.nested-frame` aiuta perche' qui la carta e' il box.
   💡 E' la TERZA forma della stessa condizione ("un corpo di gruppo dentro un'ALTRA CARTA"),
   dopo i due group-body annidati e il box del §61.6. Si aggiunge accanto, non si allarga
   nessuna delle due: ognuna resta leggibile con la propria causa.
   ⚠️ `.fl-box .dxbl-fl-group ...` e NON `.fl-box ...`: senza il gruppo intermedio la regola
   prenderebbe anche il corpo del BOX STESSO dove il box ha una caption propria (in palestra
   `Immobile_DetailView` ne ha sei titolati) e lo sbiancherebbe. Il gruppo intermedio c'e'
   solo per i gruppi davvero annidati — misurato sulla catena reale.
   ⚠️ Le tre regole del titolo sono scopate a `.dxbl-group-header.dxbl-fl-caption-tmpl`, cioe'
   alla fascia di GRUPPO: la caption di un CAMPO e' `.dxbl-fl-cpt` e non ha `.dxbl-group-header`
   (discriminante gia' misurato al §41/§44), quindi i campi dentro il box non sono toccati. */
.dxbl-fl .fl-box .dxbl-fl-group .dxbl-fl-group-body {
    background: transparent;
    border: none;
}
.dxbl-fl .fl-box .dxbl-fl-group .dxbl-group-header.dxbl-fl-caption-tmpl .dxbl-text > div {
    background: transparent;
}
.dxbl-fl .fl-box .dxbl-fl-group .dxbl-group-header.dxbl-fl-caption-tmpl {
    color: #5B6672;
    --gruppo-pad-x: 6px;
    padding-bottom: 2px;
}
.dxbl-fl .fl-box .dxbl-fl-group .dxbl-group-header.dxbl-fl-caption-tmpl::after {
    height: 1px;
    background: var(--toolbar-line);
    border-radius: 0;
}
.dxbl-fl .fl-box .dxbl-fl-group .dxbl-group-body-content {
    padding-left: 0 !important;
    padding-right: 0 !important;
}

/* --- Tipografia del CONTENUTO: grottesco stretto, niente serif in nessun punto ---
   ⚠️ .dxbl-ribbon e .xaf-navmenu NON sono piu' in questa lista: sono passati a
   Bahnschrift nel blocco "chrome" in cima al foglio. Erano rimasti qui e, stando piu' in
   BASSO nel file con lo stesso !important e la stessa specificita', vincevano il pareggio
   e riportavano tutto a Segoe: il menu e le linguette del ribbon restavano invariati
   mentre il solo bottone Save cambiava, perche' li' il selettore saliva a (0,2,0).
   Sintomo tipico da "la regola non si applica" con la regola perfettamente attiva —
   qui pero' non era ne' un commento rotto (§8.13) ne' la specificita' (§8.15): era
   l'ORDINE. Da controllare per terzo, ma da non dimenticare. */
body,
.dxbl-btn,
.dxbl-grid,
.dxbl-grid-table td,
.dxbl-grid-table th,
.dxbl-textbox,
.dxbl-combobox {
    font-family: "IBM Plex Sans", "Segoe UI", "Helvetica Neue", Arial, sans-serif !important;
}
/* ⚠️ IBM PLEX SANS anche qui (8a sessione): Indice smette di avere DUE voci e ne prende
   una sola. Era Manrope, ed era la "seconda voce neutra accanto ai dati" del §22.4.
   💡 Lo scambio e' metricamente quasi nullo — misurato sulla stessa stringa a 14px:
   Manrope 110.43, Plex 108.8, cioe' −1.5%. Griglia e form non si muovono di un pixel, che
   e' esattamente il rischio che il §24.3 impone di misurare PRIMA (li' un +4.4% su una
   stringa campione si era rivelato un +10% sulla superficie vera).
   ⚠️ Restano fuori da questa lista `.dxbl-ribbon` e `.xaf-navmenu`, e vanno lasciati fuori
   anche ora che chiedono la stessa famiglia: e' la lezione del §8.30 scritta qui sopra —
   stando piu' in BASSO nel file con lo stesso !important e la stessa specificita',
   vincerebbero il pareggio e scavalcherebbero il blocco del chrome. Oggi il valore
   coinciderebbe e non si vedrebbe nulla; al primo ritocco del chrome tornerebbe il difetto,
   e sembrerebbe di nuovo un problema di specificita' che non e'.
   💡 CON QUESTO CAMBIO CADE L'ULTIMA CONDIVISIONE del progetto: Manrope resta di Repertorio
   e di nessun altro. Cinque temi, cinque famiglie distinte — Repertorio Manrope, Notturno
   Source Sans 3, Indice IBM Plex Sans, Ampio Plus Jakarta Sans, Nitido Archivo. E' il
   punto 2 del §24.6, che prevedeva servissero "due famiglie in piu'": erano davvero due. */

/* --- Carta continua fredda: sidebar, shell e body sulla STESSA tinta, cosi' il
   menu non e' un pannello a se' ma parte del fondo (stessa famiglia di tinta
   della linea griglia, hue 210). La griglia dipinge il proprio bianco e resta
   il solo blocco chiaro. --- */
body,
.app,
.xaf-sidebar {
    background: #EBEDEF !important;
}

/* --- ...E ANCHE IL POPUP: la finestra modale sulla stessa carta ---------------------
   Misurato prima (LayoutLab, popup "Form caption"): modal-content, header e footer tutti
   a #FFFFFE contro il #EBEDEF di body/.app — la modale era l'unica lastra bianca larga e
   spezzava proprio la carta continua dichiarata qui sopra.
   ⚠️ Si riscrivono le VARIABILI del componente, non i background delle quattro classi:
   core.min.css dipinge con `background-color: var(--dxbl-popup-bg)` (misurato #fffffe,
   come --dxbl-popup-header-bg e --dxbl-popup-footer-bg). Scrivendole sull'elemento che le
   dichiara si resta dentro il meccanismo — niente !important e nessuna classe da inseguire.
   ⚠️⚠️ LO SCOPE `.dxbl-modal` NON E' DECORATIVO: la classe .dxbl-popup la portano ANCHE i
   menu a discesa (combo, lookup, calendari). Senza il prefisso ogni tendina diventerebbe
   grigia e perderebbe lo stacco dal campo. Misurato che la modale sta sotto .dxbl-modal
   e le tendine no.
   💡 --toolbar-bg e' la carta del tema, la stessa tinta che dipinge body/.app/.xaf-sidebar:
   il popup la eredita per costruzione, non per un valore ricopiato.
   ⚠️ Le variabili sono QUATTRO, non tre: dopo la prima stesura misurato che
   .dxbl-modal-body restava #FFFFFE — ha una sua --dxbl-popup-body-bg, che le altre tre
   non toccano. Il corpo e' proprio la parte larga, cioe' quella che si vede. */
.dxbl-modal .dxbl-popup {
    --dxbl-popup-bg: var(--toolbar-bg, #EBEDEF);
    --dxbl-popup-header-bg: var(--toolbar-bg, #EBEDEF);
    --dxbl-popup-body-bg: var(--toolbar-bg, #EBEDEF);
    --dxbl-popup-footer-bg: var(--toolbar-bg, #EBEDEF);
}

/* Via il contorno del menu (di default border-top + border-right #D3D3D2). */
.xaf-sidebar {
    border-top: none !important;
    border-right: none !important;
}

/* --- MENU: stessa STRUTTURA di Repertorio, tradotta nella palette petrolio ---
   Foglie a riposo sul grigio freddo delle intestazioni di griglia (--grid-header-color
   #5B6672); voce attiva su #306174 (primary-110), leggibile sulla banda chiara. */
.xaf-sidebar .dxbl-accordion-item-content {
    color: #5B6672 !important;
}
.xaf-sidebar .dxbl-accordion-item-content.dxbl-active {
    background: transparent !important;
    color: #306174 !important;
    font-weight: 600 !important;
    z-index: 0;                       /* confina il ::before, vedi Repertorio */
}
.xaf-sidebar .dxbl-accordion-item-content.dxbl-active::before {
    content: "" !important;
    position: absolute;
    left: 24px;
    right: 0;
    top: 0;
    bottom: 0;
    /* ⚠️ Era il letterale #E6EEF0, con a fianco un commento che diceva "= --grid-hover-bg".
       Quando la stessa tinta e' finita anche sotto le intestazioni di griglia, i valori
       scritti a mano sono diventati due — cioe' due numeri destinati a divergere al primo
       ritocco, con il commento a garantire un legame che il CSS non aveva. Ora il legame
       e' reale: voce di menu selezionata, hover di riga in griglia e fondo delle
       intestazioni pescano tutti dallo stesso token. */
    background: var(--grid-hover-bg);
    border-radius: 1px;               /* gli angoli quasi nulli di Indice */
    z-index: -1;
}

/* Via la sottolineatura: sta sul div annidato .xaf-nav-link, non sulla voce. */
.xaf-sidebar .xaf-nav-link {
    text-decoration: none !important;
}

/* Icone monocrome intonate al testo (le nav sono <img> SVG multicolore: serve il
   filter, vedi §13 del LAYOUT-CONTEXT). Catene ricavate per ricerca numerica su
   canvas: riposo -> rgb(87,99,121) contro #5B6672, scarto 8.6; attiva ->
   rgb(49,101,109) contro #306174, scarto 8.1. */
.xaf-sidebar .xaf-nav-menu-item-icon {
    filter: brightness(0) invert(0.32) sepia(1) saturate(1) hue-rotate(180deg) brightness(1.00) !important;
}
.xaf-sidebar .dxbl-active .xaf-nav-menu-item-icon {
    filter: brightness(0) invert(0.42) sepia(1) saturate(2) hue-rotate(140deg) brightness(0.70) !important;
}

/* Rami principali: etichette di sezione, piu' tenui delle foglie; via la cartella;
   il chevron e' un <svg> inline -> fill diretto, niente filter. Altezza a 36px.
   ⚠️ :not(:has(a[href])) e' OBBLIGATORIO: DevExpress rende come intestazione di
   gruppo anche una voce di primo livello fuori dai raggruppamenti, e senza questo
   filtro quella perderebbe l'icona e si vestirebbe da ramo. Il discriminante e' il
   LINK (un gruppo vero non ha <a href>) — non la classe ne' il chevron, identici.
   Le correzioni complementari, che non portano colori, stanno in
   layout-structure.css §6 e arrivano gia' da sole.
   ⚠️ Vale solo per il menu "a pannelli": nel menu "a indice" le voci a radice sono
   gia' foglie e il problema non si presenta. */
/* ⚠️ LA REGOLA CHE NASCONDEVA L'ICONA CARTELLA NON STA PIU' QUI: hoistata in
   layout-structure.css in 6a sessione — regola `.xaf-sidebar
   .dxbl-accordion-group-header:not(:has(a[href])) .xaf-nav-menu-item-icon`, si trova per
   selettore — perche' non conteneva colori ed era identica
   in tre temi. Qui resta solo il COLORE dei rami. */
.xaf-sidebar .dxbl-accordion-group-header:not(:has(a[href])) .dxbl-accordion-item-content,
.xaf-sidebar .dxbl-accordion-group-header:not(:has(a[href])) .dxbl-btn-tool {
    color: #7F8C99 !important;
}
/* ⚠️ QUI C'ERA UNA REGOLA `fill` GEMELLA DI QUELLA SOPRA (`fill: #7F8C99 !important`),
   TOLTA in 32a sessione (§189). L'icona DevExpress e' `fill: currentColor`, quindi il
   colore glielo da' gia' il `color` qui sopra: misurato togliendola, la resa non cambia
   di un byte — svg e <use> compresi — su tutti e cinque i temi che l'avevano.
   🔴 E costava: era l'unica regola della catena con `:has()` e universale `*` nella
   coda, la forma che obbliga OGNI nodo inserito a risalire agli antenati e a rifare li'
   la scansione del sottoalbero. Da sola valeva 284 ms su ogni apertura di scheda
   (Immobile 2553 -> 2269, cronometro del §188). Il `color` qui sopra non ha coda:
   la sua `:has()` chiude il selettore, e quella forma costa zero. */
.xaf-sidebar .dxbl-accordion-group-header:not(:has(a[href])) {
    padding-top: 2px !important;
    padding-bottom: 2px !important;
}

/* --- Casella di ricerca del menu: riga del fuoco piu' tenue ---
   E' un ::after che esiste SOLO al fuoco (content: none -> ""), con un border-bottom
   di 2px lungo tutta la casella, lente compresa. Di default prende l'accento pieno
   primary-90: qui l'accento NON si usa, ma il grigio freddo dei rami del menu, cosi'
   la riga segnala il fuoco senza portare colore. Spessore da 2px a 1px: su DPR 1.25
   rende 0.8px, cioe' UN pixel fisico — il minimo possibile. */
.xaf-sidebar .dxbl-navigation-filter::after {
    border-bottom-color: #7F8C99 !important;
    border-bottom-width: 1px !important;
}

/* --- Testo delle azioni nella barra superiore: piu' tenue ---
   Di serie e' rgb(22,22,22), quasi nero: su carta da' circa 15:1, cioe' lo stesso peso
   del DATO nelle celle di griglia. Ma i comandi sono chrome — dicono cosa puoi fare, non
   cosa c'e' — e stavano gridando piu' dei valori che governano.
   Si usa --grid-header-color (#5B6672), il grigio con cui questo tema scrive gia' tutto
   cio' che e' strutturale: intestazioni di colonna, etichette di sezione. Contrasto su
   carta circa 5.9:1, quindi resta ben sopra la soglia AA — e sono bersagli cliccabili,
   qui non si scende come si e' fatto per le linguette chiuse.
   ⚠️ Il colore va messo anche sullo SPAN: il testo del bottone vive li' (§8.18), e una
   dichiarazione sul solo .dxbl-btn verrebbe scavalcata dalla sua.
   ⚠️ Scopato a .dxbl-ribbon: gli stessi .dxbl-btn esistono dentro i campi del form
   (i pulsantini di cancella/modifica/elenco) e hanno un colore loro, tarato al §15.
   ⚠️⚠️ ESCLUSO IL PULSANTE PRIMARIO, e la prima stesura non lo faceva: e' un bug vero,
   non un dettaglio. Il Save resta piatto finche' non modifichi qualcosa, poi diventa
   .dxbl-btn-primary con FONDO PIENO d'accento e testo bianco — e questo colore, imposto
   con !important a tutti i .dxbl-btn del ribbon, lo riportava a grigio: #5B6672 su
   #3b7991, cioe' illeggibile. Il difetto si vede solo in uno STATO che a scheda appena
   aperta non esiste, quindi la verifica "a riposo" lo dichiarava a posto.
   💡 Lezione generale: quando si forza un colore di testo con !important su una FAMIGLIA
   di controlli, bisogna chiedersi quali membri di quella famiglia hanno un FONDO proprio.
   Il testo si taratura sul fondo, e un fondo pieno vuole sempre il suo colore.
   💡 Se dovesse risultare troppo schiarito, il gradino intermedio e' hsl(215,10%,28%)
   circa #40474F — piu' vicino al nero di partenza ma gia' staccato dai dati.
   ✅ 8a SESSIONE: E' SUCCESSO. L'utente ha segnalato che il testo "risalta poco", cioe'
   esattamente il caso previsto qui sopra, e si e' preso il gradino gia' indicato —
   #40474F, ora in --chrome-ink. Da 4.99 di contrasto sulla barra a ~7.9.
   💡 Vale la pena notarlo: la previsione era stata scritta senza sapere se sarebbe
   servita, ed e' costata una riga. Quando e' servita, la decisione era gia' presa e
   misurata — non si e' dovuto ricominciare dal "quale grigio?".
   ⚠️⚠️ AGGIUNTO `:not(.dxbl-disabled)`, e non e' pignoleria: la regola colorava TUTTI i
   pulsanti allo stesso valore (misurato: 9 su 9, disabilitato compreso), e a distinguere
   lo spento era solo l'opacita' che DevExpress gli applica. Scurendo il colore si sarebbe
   scurito anche il disabilitato, che sarebbe finito PIU' marcato di quanto fosse l'attivo
   prima — cioe' il difetto del §24.7 riprodotto per inerzia. Escludendolo, lo spento resta
   dov'era e la distanza fra i due stati si allarga invece di restringersi. E' la tecnica
   degli stati DISGIUNTI: non una gara di specificita', due insiemi che non si toccano. */
.dxbl-ribbon .dxbl-btn:not(.dxbl-btn-primary):not(.dxbl-disabled),
.dxbl-ribbon .dxbl-btn:not(.dxbl-btn-primary):not(.dxbl-disabled) span {
    color: var(--chrome-ink) !important;
}

/* --- Angoli quasi nulli: look tabellare/tecnico --- */
.dxbl-btn,
.dxbl-textbox,
.dxbl-combobox,
.dxbl-grid {
    border-radius: 1px !important;
}

/* --- Interlinea compatta nelle celle (il padding e' gia' guidato da --grid-cell-pad-y) --- */
.dxbl-grid-table td {
    line-height: 1.25 !important;
}

/* Righe alternate: Indice le accende (scelta dell'utente il 06/08).
   Il valore e' la carta smorzata di un soffio - la carta di Indice e' #FFFFFE e #F7F8F9 sta
   poco sotto: si legge come alternanza, non come una banda colorata.
   Il MECCANISMO sta in grid-editorial.css e il suo ripiego e' `transparent`: un tema che non
   dichiara questo token resta senza zebra, che e' come stanno oggi gli altri sei. */
:root {
    --fl-griglia-zebra: #F7F8F9;
}

/* --- VIA LA LINEA SOTTO L'INTESTAZIONE, SULLE SOLE GRIGLIE PIENE (19/08, §158.14) ---
   Suo, guardando un titolo andato a capo dopo il §158.13: *«la cosa brutta esteticamente, che
   si vede su indice, e' che quando ci sono due linee la spaziatura sotto si perde. per dare un
   effetto ottico piu' gradevole potremmo eliminare il bordo che c'e' sotto, che dovrebbe essere
   il bordo superiore della prima riga»* + *«ovviamente questo solo sulle griglie interne che non
   sono lite»*.
   🔑🔑 NON E' UN BORDO, ed e' il motivo per cui va tolto da un'altra parte: misurato, il `th` ha
   il filetto inferiore 0,8px ma di colore `rgba(0,0,0,0)`, e la prima riga ha `border-top: 0`.
   Sotto l'intestazione non c'e' NESSUN bordo. Quella linea e' il lato di sopra dell'ANELLO del
   02/08 (il `box-shadow` sul `tbody`, §158.1), che su Indice vale `#E1E1E0` e cade a 401→401,8
   contro un `th` che finisce a 401,8: cioe' incollato al fondo dell'intestazione, esattamente
   dove lui lo vede.
   💡 *Un bordo si cerca fra i `border`. Se li' non c'e', la linea la disegna qualcos'altro — e
   con un titolo su due righe si nota perche' l'aria sotto il testo si e' ridotta e la linea resta
   dov'era.*
   ✅ CURA: sulle griglie interne NON leggere, l'anello diventa una linea SOLO SOTTO. Un'ombra
   con offset invece che con spread: la forma e' la stessa traslata in giu' di 0,8px, quindi il
   lato di sopra finisce sotto il `tbody` e sparisce, e resta il filo in fondo — che e' dove
   stava prima e dove serve (chiude la pila delle righe).
   📌 GEOMETRIA INTATTA per costruzione: un `box-shadow` non partecipa al layout.
   📌 I fianchi non si perdono, perche' non si vedevano gia': cadono fuori dal ritaglio del
   viewer (§158.1). Qui non si sta rinunciando a niente che fosse a video.
   ⚠️ SOLO LE PIENE, per sua richiesta esplicita: le `fl-griglia-leggera` tengono l'anello
   intero, cioe' la loro linea sopra la prima riga resta. Da qui il `:not(.fl-griglia-leggera)`,
   che porta la specificita' a (0,5,1) contro la (0,4,1) del condiviso — vince senza `!important`
   perche' quella regola non ne ha.
   ⚠️ SOLO INDICE: su Ardesia l'anello e i fianchi formano apposta la scatola del campo
   (§158.7/§158.9) e toglierne il lato di sopra la spezzerebbe; su Nitido lui aveva detto «ok
   cosi'». Se un giorno lo vorra' anche la', si copia questo blocco nel foglio di quel tema. --- */
.dxbl-fl .dxbl-grid:not(.fl-grid-indipendente *):not(.fl-griglia-leggera) .dxbl-grid-table > tbody {
    box-shadow: 0 0.8px 0 0 var(--fl-campo-bordo, transparent);
}

/* ═══ BORDINO A DESTRA DELLA COLONNA FISSA (20/08, §169.1) ═══
   Suo: *«su tutte le griglie, tutti i temi, solo dove c'e' la colonna fissa agganciata sulla
   sinistra, aggiungiamo un piccolo bordino alla destra della colonna. colore del bordo
   inerente al tema»*, con *«prima di farlo su tutti fallo solo su indice»*.

   📌 LA CONDIZIONE E' GIA' NEL SELETTORE, non serve inventarla. DevExpress marca l'ultima
   cella agganciata a sinistra con `dxbl-grid-last-fixed-left-cell` — misurato al §36 e
   riverificato oggi sulla palestra: la cella Titolo porta
   `dxbl-grid-fixed-cell dxbl-grid-last-fixed-left-cell col-Titolo`. Quella classe esiste SOLO
   dove una colonna e' fissata a sinistra, quindi le griglie senza colonna fissa non vengono
   toccate **per costruzione**, non per un `:not()` da tenere aggiornato. Le colonne fissate a
   DESTRA hanno una classe loro e restano fuori (misurato: zero elementi `fixed-right` qui).

   📌 IL COLORE ARRIVA DAL TEMA SENZA SCRIVERNE UNO: `--grid-line` e' il token che
   grid-editorial.css dichiara come «colore delle linee (bordo inferiore riga/intestazione)» e
   che TUTTI E SETTE i temi valorizzano (verificato file per file; qui #D8DCDF). Quando questo
   blocco salira' in grid-editorial.css per gli altri sei, la tinta la portera' ognuno per conto
   suo — nessun colore da replicare sette volte, che e' la lezione §85.7.

   ⚠️ LE DUE BRANCHE SONO ESPLICITE PERCHE' MISURATE, non per abbondanza. Il selettore corto
   `.dxbl-grid-table .dxbl-grid-last-fixed-left-cell` mordeva sul `td` e NON sul `th`, pur
   risultando fra le regole che il `th` matcha e pur essendo `!important` contro avversarie che
   non lo sono. Sul perche' non ho speso altri giri: con `thead th` esplicito prende, e le due
   celle misurano 0,8px identici. *Una misura prova un fatto, non la sua causa.*

   ⚠️ Si scrive il `border-right` INTERO e non il solo colore: li' la larghezza non c'e'
   (misurato `0px none` su header e corpo prima della cura), e un `border-right-color` da solo
   dipingerebbe un bordo largo 0. Stessa avvertenza dei fianchi di Ardesia (§158.7). --- */
.dxbl-grid .dxbl-grid-table thead th.dxbl-grid-last-fixed-left-cell,
.dxbl-grid .dxbl-grid-table tbody td.dxbl-grid-last-fixed-left-cell {
    border-right: 1px solid var(--grid-line, #D8DCDF) !important;
}

/* ═══ VIA I FILETTI DI RIGA DOVE C'E' LA BANDA (20/08, §169.2) ═══
   Suo, subito dopo aver guardato il §169.1: *«sempre solo su indice e solo sulle griglie dove
   ci sono le bande proviamo a togliere i bordini sopra e sotto da ogni riga/banda»*.

   📌 «DOVE CI SONO LE BANDE» NON E' UNA CONDIZIONE NUOVA. La zebra la accende il token
   `--fl-griglia-zebra` (qui #F7F8F9, poche righe sopra) e la SPEGNE il redichiararlo a
   `transparent` dentro `.nested-content` e `.dxbl-popup` (grid-editorial.css, 14/08). Le
   griglie con le bande sono percio' esattamente le liste di pagina: si riusa quel
   discriminante invece di aggiungerne un secondo che poi va tenuto allineato a mano.

   🔑 E SI RIUSA ANCHE IL SUO MECCANISMO, non solo il suo perimetro. La prima stesura era
   `.dxbl-grid-table:not(.nested-content *):not(.dxbl-popup *) > tbody > tr > td`, provata dal
   vivo e funzionante — ma SCARTATA, perche' contraddice quello che quel foglio dichiara di
   fare tre righe sotto la zebra: *«si spegne il token, non si contraddice la regola»*. Qui il
   ripiego del token e' `0` (nessuna linea) e i due scope che gia' spengono la zebra la
   riaccendono a 1px. Nessuna guerra di specificita', nessun `!important` da rincorrere sui
   due lati, e alla propagazione il blocco sale accanto al suo gemello.

   📌 IL «SOPRA» ERA GIA' SPENTO A MONTE, e va saputo per non cercarlo qui: grid-editorial.css
   mette `border-top: none` sul `td` dei dati apposta (il separatore nativo DevExpress, #d3d3d2,
   sovrascriveva --grid-line). Misurato `0px none` prima E dopo la cura. Il separatore di riga
   e' il solo `border-bottom`, ed e' quello che cade qui.

   📌 RESTANO FUORI, E DEVONO RESTARCI — verificato dopo la cura:
     · la base dell'intestazione (`th.dxbl-grid-header`): qui e' 2,4px #3B7991, non e' una riga;
     · il bordino della colonna fissa del §169.1: misurato intatto a 0,8px #D8DCDF;
     · la banda stessa: riga pari ancora rgb(247,248,249), cioe' il token, non sbiadita.

   ⚠️ SOLO INDICE finche' non lo guarda sugli altri sei. Quando li approva, questo blocco sale
   in grid-editorial.css accanto alla zebra: li' il meccanismo vale per tutti e sette e ogni
   tema decide da se', esattamente come per le righe alternate. --- */
.dxbl-grid-table > tbody > tr > td {
    border-bottom-width: var(--fl-griglia-riga-linea, 0) !important;
}

.nested-content,
.dxbl-popup {
    --fl-griglia-riga-linea: 1px;
}

/* ═══ LA SELEZIONE SI VEDE SOLO SULLA COLONNA FISSA, DOVE C'E' LA BANDA (20/08, §169.14) ═══
   Suo: *«in quasi tutti i temi dobbiamo fare una correzione sempre alle stesse griglie indipendenti.
   quando seleziono il colore allo sfondo della riga selezionata lo mettiamo solo sulla colonna fissa,
   le altre rimangono invariate. attualmente viene colorata solo la riga/banda piu' chiara»* +
   *«iniziamo a farlo su indice»*.

   📌 IL DIFETTO CHE HA VISTO, MISURATO E SPIEGATO. La selezione DevExpress si dipinge sul **`tr`**
   (`--dxbl-grid-selection-bg`, qui #ebf2f4), non sulle celle. Da qui il comportamento a due facce:
     · riga SENZA banda → i `td` sono trasparenti, il colore del `tr` si vede: selezione su tutta la riga;
     · riga CON banda → i `td` portano il `background-color` della zebra (#F7F8F9) che sta SOPRA e la
       nasconde: della selezione resta solo la colonna FISSA, perche' DevExpress le da'
       `background: inherit` e la zebra la esclude apposta (§102.5).
   Cioe' il difetto non era «la banda non si colora»: era che **le due righe si comportavano in modo
   diverso**. La sua scelta e' tenere il comportamento della riga con banda, sempre.

   🔑 LA CURA E' IN TRE PEZZI, e nessuno inventa un colore — si riusano le due variabili di serie:
     1. il `tr` selezionato torna al fondo della riga NORMALE (`--dxbl-grid-row-bg`), cosi' le colonne
        non fisse restano identiche a come sarebbero da non selezionate: trasparenti sulle righe
        dispari, con la loro banda sulle pari. *«le altre rimangono invariate»*, alla lettera.
     2. la colonna fissa prende esplicitamente `--dxbl-grid-selection-bg`.
     3. dentro `.nested-content` / `.dxbl-popup` il token rimette la selezione sull'intera riga: li' la
        banda non c'e', quindi il difetto non esiste e non c'e' niente da correggere.
   ⚠️ IL PEZZO 2 DEVE RESTARE OPACO e non e' un dettaglio estetico: la cella fissa e' `sticky` e le
   altre le scorrono SOTTO (§87.2 — un ripiego `transparent` li' aveva gia' rotto la colonna fissa una
   volta). #ebf2f4 e' opaco.
   📌 Il pezzo 2 NON e' stato scopato, e per misura: sulle annidate dipinge la cella fissa dello stesso
   colore che la riga ha gia', quindi non cambia un pixel (verificato: tr e cella fissa tutt'e due
   rgb(235,242,244)).

   🔴🔴 LA TRAPPOLA CHE HA MORSO QUI, ED E' LA LEZIONE DEL §169.11 IN UNA FORMA NUOVA. La prima stesura
   dichiarava il token su **`.nested-content, .dxbl-popup`** e sull'annidata NON tornava niente: la
   selezione restava spenta e `--fl-riga-selezionata` si leggeva **VUOTO** sul `tr`. Causa misurata:
   `--dxbl-grid-selection-bg` e' dichiarata da `core.min.css` su **`.dxbl-grid`**, che sta PIU' IN BASSO
   di `.nested-content` — quindi lassu' quel `var()` non ha niente da risolvere e la proprieta' nasce
   invalida. Spostata la dichiarazione su `.nested-content .dxbl-grid`, dove la variabile esiste, il
   token risolve a #ebf2f4 e la riga torna.
   💡 *Non basta che un token sia dichiarato «abbastanza in alto»: il `var()` che gli si mette dentro
   deve poter risolvere PROPRIO LI'. Un token che dipende da una variabile piu' in basso va dichiarato
   piu' in basso.* E il sintomo e' muto: nessun errore, solo una regola che non torna.

   ⚠️ SOLO INDICE, e lui ha detto «quasi tutti i temi»: gli altri arrivano dopo averlo guardato qui. Il
   blocco e' copiabile tale e quale — non contiene un solo colore di tema, solo le due variabili di
   serie, quindi ogni tema ci mette le sue da se'. --- */
.dxbl-grid-table > tbody > tr.dxbl-grid-selected-row {
    background-color: var(--fl-riga-selezionata, var(--dxbl-grid-row-bg)) !important;
}

.nested-content .dxbl-grid,
.dxbl-popup .dxbl-grid {
    --fl-riga-selezionata: var(--dxbl-grid-selection-bg);
}

.dxbl-grid-table > tbody > tr.dxbl-grid-selected-row > td.dxbl-grid-fixed-cell {
    background-color: var(--dxbl-grid-selection-bg) !important;
}

/* Il bottone d'aiuto accanto al TITOLO DI UN BOX (§171.4): qui NON si tocca lo stacco, e la riga
   che lo allargava e' stata tolta apposta (§171.8).
   ⚠️ La storia, perche' non la si rifaccia: il §171.6 aveva messo `margin-left: calc(.5em + 8px)`
   per far uscire il bottone dal fondo dipinto del titolo, che porta `padding: 4px 8px 3px`. Il banco
   dei box annidati (§171.7) ha poi misurato che quel fondo lo DIPINGE SOLO il titolo di livello 0:
   sugli annidati la tinta e' trasparente - la spegne la regola dei box dentro una carta, piu' su in
   questo foglio - ma il padding resta, e con lui il +8px. Risultato: 15px dai glifi invece dei 7 di
   tutti gli altri temi, senza niente da scavalcare.
   📌 Scelta sua (21/08): stacco corto su ENTRAMBI i livelli, e se sull'esterno il bottone tocca la
   tinta va bene lo stesso, perche' quel fondo e' una velatura leggera. Quindi niente override: vale lo
   `.5em` di layout-structure.css, uguale a ogni altro tema. Resta solo l'1px in su, che e' un'altra
   cosa e ha un'altra causa. */
.dxbl-group-header .dxbl-text .caption-helpinfo-btn-ico {
    /* ⚠️ L'1px in su non corregge una misura sbagliata, corregge un'illusione: i centri delle
       scatole coincidono gia' (scarto 0,4px), ma qui il titolo e' MAIUSCOLETTO e le lettere
       maiuscole non hanno discendenti - il loro centro OTTICO sta piu' in alto del centro della
       riga, e un'icona tonda da 16px accanto a un testo da 11 sembra scivolata in basso.
       Vale solo dove il titolo e' in maiuscolo, cioe' qui. */
    position: relative;
    top: -1px;
}
