/* /Dashboard/Widgets/AnomalieWidget.razor.rz.scp.css */
.anomalia-lista[b-ht1vjeszab] {
    display: flex;
    flex-direction: column;
}

.anomalia-riga[b-ht1vjeszab] {
    display: flex;
    align-items: center;
    gap: var(--app-space-3);
    padding: var(--app-space-3) 0;
    color: var(--app-text);
    text-decoration: none;
    border-bottom: 1px solid var(--app-divider);
}

.anomalia-riga:last-child[b-ht1vjeszab] {
    border-bottom: none;
}

.anomalia-riga:hover[b-ht1vjeszab] {
    color: var(--app-brand-primary);
}

.anomalia-label[b-ht1vjeszab] {
    flex: 1;
    font-size: var(--app-fs-body);
}

.anomalia-conteggio[b-ht1vjeszab] {
    font-weight: var(--app-fw-semibold);
    font-size: var(--app-fs-body);
}

.anomalia-freccia[b-ht1vjeszab] {
    color: var(--app-text-subtle);
    font-size: var(--app-fs-body-sm);
}
/* /Dashboard/Widgets/AzioniRapideWidget.razor.rz.scp.css */
.azioni[b-u3pkyephz5] {
    display: flex;
    flex-direction: column;
    gap: var(--app-space-2);
}

.azione[b-u3pkyephz5] {
    display: flex;
    align-items: center;
    gap: var(--app-space-2);
    padding: var(--app-space-2) var(--app-space-3);
    border: 1px solid var(--app-border);
    border-radius: var(--app-radius);
    color: var(--app-text);
    text-decoration: none;
    font-size: var(--app-fs-body);
}

.azione:hover[b-u3pkyephz5] {
    background: var(--app-surface-alt);
    border-color: var(--app-border-strong);
}

.azione .bi[b-u3pkyephz5] {
    color: var(--app-brand-primary);
}
/* /Dashboard/Widgets/NoteSpeseRecentiWidget.razor.rz.scp.css */
.note-spese-lista[b-bexh7g2mqd] {
    display: flex;
    flex-direction: column;
}

.note-spese-riga[b-bexh7g2mqd] {
    display: flex;
    align-items: center;
    gap: var(--app-space-3);
    padding: var(--app-space-2) 0;
    color: var(--app-text);
    text-decoration: none;
    border-bottom: 1px solid var(--app-divider);
}

.note-spese-riga:last-child[b-bexh7g2mqd] {
    border-bottom: none;
}

.note-spese-riga:hover[b-bexh7g2mqd] {
    color: var(--app-brand-primary);
}

.note-spese-testo[b-bexh7g2mqd] {
    display: flex;
    flex: 1;
    flex-direction: column;
    overflow: hidden;
}

.note-spese-titolo[b-bexh7g2mqd] {
    font-size: var(--app-fs-body);
    overflow: hidden;
    text-overflow: ellipsis;
    white-space: nowrap;
}

.note-spese-meta[b-bexh7g2mqd] {
    color: var(--app-text-muted);
    font-size: var(--app-fs-body-sm);
    overflow: hidden;
    text-overflow: ellipsis;
    white-space: nowrap;
}

.note-spese-importo[b-bexh7g2mqd] {
    font-weight: var(--app-fw-semibold);
    font-size: var(--app-fs-body);
    font-variant-numeric: tabular-nums;
}

.note-spese-freccia[b-bexh7g2mqd] {
    color: var(--app-text-subtle);
    font-size: var(--app-fs-body-sm);
}

.note-spese-tutte[b-bexh7g2mqd] {
    display: inline-block;
    margin-top: var(--app-space-3);
    font-size: var(--app-fs-body-sm);
}
/* /Dashboard/Widgets/RichiesteRecentiWidget.razor.rz.scp.css */
.recenti[b-fljuhxif6s] {
    width: 100%;
    border-collapse: collapse;
    font-size: var(--app-fs-body);
}

.recenti th[b-fljuhxif6s] {
    text-align: left;
    font-weight: var(--app-fw-medium);
    color: var(--app-text-muted);
    font-size: var(--app-fs-body-sm);
    padding: 0 var(--app-space-3) var(--app-space-2);
    border-bottom: 1px solid var(--app-border);
}

.recenti td[b-fljuhxif6s] {
    padding: var(--app-space-2) var(--app-space-3);
    border-bottom: 1px solid var(--app-divider);
}

.recenti tbody tr:last-child td[b-fljuhxif6s] {
    border-bottom: none;
}

/* Nessun hover di riga: la riga non è più cliccabile per intero — il link è il protocollo, e solo
   dove c'è qualcosa da aprire. Evidenziare l'intera riga prometterebbe di nuovo un clic che non
   c'è. */
.recenti tbody a[b-fljuhxif6s] {
    font-variant-numeric: tabular-nums;
}

.recenti-tutte[b-fljuhxif6s] {
    display: inline-block;
    margin-top: var(--app-space-3);
    font-size: var(--app-fs-body-sm);
}
/* /Dashboard/Widgets/ScadenzeInArrivoWidget.razor.rz.scp.css */
.scadenze-ritardo[b-uzg5kknnxy] {
    display: flex;
    align-items: center;
    gap: var(--app-space-2);
    padding: var(--app-space-2) var(--app-space-3);
    margin-bottom: var(--app-space-3);
    background: var(--app-warning-bg);
    color: var(--app-warning-fg);
    border-radius: var(--app-radius-sm);
    font-size: var(--app-fs-body-sm);
    font-weight: var(--app-fw-medium);
    text-decoration: none;
}

.scadenze-ritardo:hover[b-uzg5kknnxy] {
    text-decoration: underline;
}

.scadenze-lista[b-uzg5kknnxy] {
    display: flex;
    flex-direction: column;
}

.scadenze-riga[b-uzg5kknnxy] {
    display: flex;
    align-items: center;
    gap: var(--app-space-2);
    padding: var(--app-space-2) 0;
    color: var(--app-text);
    text-decoration: none;
    border-bottom: 1px solid var(--app-divider);
}

.scadenze-riga:last-child[b-uzg5kknnxy] {
    border-bottom: none;
}

.scadenze-riga:hover[b-uzg5kknnxy] {
    color: var(--app-brand-primary);
}

.scadenze-data[b-uzg5kknnxy] {
    min-width: 42px;
    color: var(--app-text-muted);
    font-size: var(--app-fs-body-sm);
    font-variant-numeric: tabular-nums;
}

.scadenze-swatch[b-uzg5kknnxy] {
    display: inline-block;
    width: 10px;
    height: 10px;
    border-radius: 2px;
    flex: none;
}

.scadenze-desc[b-uzg5kknnxy] {
    flex: 1;
    overflow: hidden;
    font-size: var(--app-fs-body);
    text-overflow: ellipsis;
    white-space: nowrap;
}

.scadenze-vuoto[b-uzg5kknnxy] {
    margin: 0;
    color: var(--app-text-muted);
    font-size: var(--app-fs-body-sm);
}

.scadenze-tutte[b-uzg5kknnxy] {
    display: inline-block;
    margin-top: var(--app-space-3);
    font-size: var(--app-fs-body-sm);
}
/* /Pages/Amministrazione/ChiusuraMensile.razor.rz.scp.css */
.check-list[b-96ykawcpqu] {
    list-style: none;
    margin: var(--app-space-4) 0 0;
    padding: 0;
    border: 1px solid var(--app-border);
    border-radius: var(--app-radius);
}

.check-voce[b-96ykawcpqu] {
    display: flex;
    align-items: flex-start;
    gap: var(--app-space-3);
    padding: var(--app-space-3) var(--app-space-4);
}

.check-voce + .check-voce[b-96ykawcpqu] {
    border-top: 1px solid var(--app-divider);
}

.check-icona[b-96ykawcpqu] {
    font-size: var(--app-fs-h3);
    line-height: 1;
}

.check-icona.ok[b-96ykawcpqu] {
    color: var(--app-success);
}

.check-icona.ko[b-96ykawcpqu] {
    color: var(--app-danger);
}

.check-icona.warn[b-96ykawcpqu] {
    color: var(--app-warning);
}

.check-testo[b-96ykawcpqu] {
    flex: 1;
    font-size: var(--app-fs-body);
}

.check-conteggio[b-96ykawcpqu] {
    font-size: var(--app-fs-body-sm);
    font-weight: var(--app-fw-semibold);
}

.check-conteggio.ko[b-96ykawcpqu] {
    color: var(--app-danger);
}

.check-conteggio.warn[b-96ykawcpqu] {
    color: var(--app-warning);
}

.check-link[b-96ykawcpqu] {
    align-self: center;
    font-size: var(--app-fs-body-sm);
    white-space: nowrap;
}

.storico-azioni[b-96ykawcpqu] {
    display: flex;
    align-items: center;
    gap: var(--app-space-2);
}

.storico-sub[b-96ykawcpqu] {
    display: block;
    color: var(--app-text-muted);
    font-size: var(--app-fs-sm);
}

.storico-nota[b-96ykawcpqu] {
    margin: var(--app-space-3) 0 0;
    color: var(--app-text-muted);
    font-size: var(--app-fs-body-sm);
}
/* /Pages/Amministrazione/Esportazioni.razor.rz.scp.css */
.exp-form[b-9n8j144wdj] {
    display: flex;
    flex-direction: column;
    gap: var(--app-space-4);
    max-width: 560px;
}
/* /Pages/Configurazione/Licenza.razor.rz.scp.css */
/* Colore usato semanticamente per lo stato licenza (vincoli estetici CLAUDE.md). */
.lic-stato-enabled[b-bunqvjy4yk] {
    color: var(--app-success);
}

.lic-stato-disabled[b-bunqvjy4yk] {
    color: var(--app-danger);
}

.lic-stato-unreachable[b-bunqvjy4yk] {
    color: var(--app-warning);
}

.lic-pager-info[b-bunqvjy4yk] {
    align-self: center;
    color: var(--app-text-muted, inherit);
    font-size: 0.875rem;
}
/* /Pages/Index.razor.rz.scp.css */
/* La dashboard non è una griglia: è una pila di ZONE, ognuna con la propria regola di flusso.
   Prima era una sola griglia a 4 colonne con span 1/2/4 posizionati in ordine di dichiarazione:
   quando il resto della riga era 1 e il widget successivo ne chiedeva 2, la riga restava scoperta.
   Poiché l'insieme dei widget cambia a runtime (ruolo, policy, modulo opzionale), nessun ordine
   poteva restare corretto: la cella vuota era una proprietà della combinazione, non una svista.
   Qui il vuoto strutturale non ha dove nascere — vedi le due invarianti sotto. */
.dashboard[b-57r9tlnz8p] {
    display: flex;
    flex-direction: column;
    gap: var(--app-space-4);
}

/* Il ritmo verticale lo dà il gap della zona. Il margine inferiore che la card porta per
   impilarsi nelle pagine normali qui raddoppierebbe il passo solo per i widget incorniciati. */
.dashboard[b-57r9tlnz8p]  .app-card {
    margin-bottom: 0;
}

/* ── Avvisi: banner impilati a piena larghezza, senza cornice di card ─────────────────── */
.dash-avvisi[b-57r9tlnz8p] {
    display: flex;
    flex-direction: column;
    gap: var(--app-space-2);
}

/* Il banner ha margini propri, pensati per stare in mezzo al contenuto di una pagina: dentro
   la zona rompono l'allineamento col gap. */
.dash-avvisi[b-57r9tlnz8p]  .app-message {
    margin: 0;
}

/* ── Indicatori: 1ª invariante — ogni cella cresce a riempire il residuo (`flex-grow`), quindi il
      resto di riga è per definizione zero, per qualunque numero di indicatori e a qualunque
      larghezza. Non c'è nessuna traccia dichiarata da riempire.
      Serve flex e non una griglia `auto-fit` con traccia cappata: il conteggio delle ripetizioni
      si calcola sul massimo della traccia quando è una lunghezza fissa, quindi il cap produceva
      due colonne e mandava il terzo indicatore a capo. ─────────────────────────────────────── */
.dash-kpi[b-57r9tlnz8p] {
    display: flex;
    flex-wrap: wrap;
    gap: var(--app-space-3);
}

/* Cap sulla cella: un indicatore è un numero, non una superficie da riempire. Su schermi larghi
   lo spazio che resta a destra è fondo pagina, non una card mezza vuota.
   Altezze pari: serve la catena completa (cella + card), perché la cella non ha né display né
   altezza e la card non ha height:100%. La quota minima è quella della card a regime, così lo
   stato di caricamento — più basso — non fa saltare la riga quando il dato arriva. */
.dash-kpi > .dashboard-cella[b-57r9tlnz8p] {
    display: flex;
    flex: 1 1 220px;
    flex-direction: column;
    max-width: 360px;
    min-height: 96px;
}

.dash-kpi[b-57r9tlnz8p]  .app-kpi {
    flex: 1 1 auto;
}

/* ── Lavoro: 2ª invariante — dentro una colonna i widget si IMPILANO a piena larghezza. Un
      contenitore i cui figli occupano tutti la larghezza intera non ha spazio residuo di riga
      per nessun numero di widget: è qui che il vuoto strutturale diventa impossibile, e non
      «assente per l'ordine giusto». Non c'è più nemmeno un vicino di riga di altezza diversa,
      quindi sparisce il vuoto verticale sotto gli indicatori affiancati alle liste. ───────── */
.dash-lavoro[b-57r9tlnz8p] {
    display: grid;
    grid-template-columns: minmax(0, 2fr) minmax(0, 1fr);
    /* Tante righe quanti sono i widget della colonna più lunga: le dichiara la pagina, perché
       il numero dipende dai widget effettivamente visibili. */
    grid-template-rows: repeat(var(--dash-righe, 1), auto);
    gap: var(--app-space-4);
}

/* Una sola colonna popolata ⇒ una sola traccia: la colonna laterale non viene dichiarata vuota. */
.dash-lavoro.sola[b-57r9tlnz8p] {
    grid-template-columns: minmax(0, 1fr);
}

/* Le colonne CONDIVIDONO le righe del contenitore (subgrid): i widget affiancati stanno sulla
   stessa riga, quindi i bordi superiori e inferiori si allineano fra le due colonne. Senza questo
   ogni colonna impilava con altezze proprie e bastavano i 10px di differenza fra il primo widget
   di sinistra e quello di destra per sfalsare tutte le coppie successive.
   I widget restano impilati dentro la colonna, quindi l'invariante sul vuoto strutturale non
   cambia: la riga condivisa aggiunge solo l'allineamento.
   Dove subgrid non è supportato la dichiarazione viene ignorata e la colonna torna a impilare
   con le proprie altezze (il `gap` sotto serve a quel caso): si perde l'allineamento, non il
   layout. */
.dash-col[b-57r9tlnz8p] {
    display: grid;
    grid-row: 1 / -1;
    grid-template-rows: subgrid;
    gap: var(--app-space-4);
    min-width: 0;
}

/* La card riempie la riga condivisa, così i fondi combaciano invece di lasciare uno scalino:
   serve la catena completa, perché la cella non ha display e la card non ha altezza propria. */
.dash-col > .dashboard-cella[b-57r9tlnz8p] {
    display: flex;
    flex-direction: column;
}

.dash-col[b-57r9tlnz8p]  .app-card {
    flex: 1 1 auto;
}

/* Rete di sicurezza per la cella che non produce contenuto (widget che si auto-nasconde, o le due
   valutazioni di policy che divergono): senza queste regole resterebbe il solo gap. */
.dashboard-cella:empty[b-57r9tlnz8p] {
    display: none;
}

.dash-col:empty[b-57r9tlnz8p] {
    display: none;
}

.dash-lavoro:has(> .dash-col:empty)[b-57r9tlnz8p] {
    grid-template-columns: minmax(0, 1fr);
}

/* Breakpoint: gli stessi due già usati dal back office. */
@media (max-width: 1100px) {
    .dash-lavoro[b-57r9tlnz8p],
    .dash-lavoro.sola[b-57r9tlnz8p] {
        grid-template-columns: minmax(0, 1fr);
        grid-template-rows: none;
    }

    /* Una colonna sotto l'altra: niente righe condivise da allineare, e la laterale torna in coda
       alla principale invece di intrecciarsi con essa. */
    .dash-col[b-57r9tlnz8p] {
        grid-row: auto;
        grid-template-rows: none;
    }
}

@media (max-width: 700px) {
    .dash-kpi > .dashboard-cella[b-57r9tlnz8p] {
        flex-basis: 100%;
        max-width: none;
    }
}
/* /Shared/Components/UI/KpiCard.razor.rz.scp.css */
.app-kpi[b-n4zemk308e] {
    display: flex;
    flex-direction: column;
    gap: var(--app-space-1);
    padding: var(--app-space-4);
    background: var(--app-surface);
    border: 1px solid var(--app-border);
    border-left: 3px solid var(--app-border);
    /* Angoli quadri sul lato con l'accento (regola design system), arrotondati a destra. */
    border-radius: 0 var(--app-radius-lg) var(--app-radius-lg) 0;
    color: var(--app-text);
    text-decoration: none;
}

a.app-kpi:hover[b-n4zemk308e] {
    background: var(--app-surface-alt);
}

.app-kpi-label[b-n4zemk308e] {
    display: flex;
    align-items: center;
    gap: var(--app-space-2);
    font-size: var(--app-fs-sm);
    color: var(--app-text-muted);
    text-transform: uppercase;
    letter-spacing: 0.02em;
}

.app-kpi-value[b-n4zemk308e] {
    font-size: var(--app-fs-h2);
    font-weight: var(--app-fw-semibold);
    line-height: 1.1;
}

.app-kpi-detail[b-n4zemk308e] {
    font-size: var(--app-fs-sm);
    color: var(--app-text-muted);
}

.app-kpi.info[b-n4zemk308e] {
    border-left-color: var(--app-info);
}

.app-kpi.warning[b-n4zemk308e] {
    border-left-color: var(--app-warning);
}

.app-kpi.success[b-n4zemk308e] {
    border-left-color: var(--app-success);
}

.app-kpi.danger[b-n4zemk308e] {
    border-left-color: var(--app-danger);
}
