/* /Components/Layout/MainLayout.razor.rz.scp.css */
/*
    Struttura della shell, e solo struttura: i colori arrivano dai token globali attraverso
    il bridge Bootstrap, non da qui. Nessun valore letterale di colore vive fuori da
    sg-tokens.scss — questo file non fa eccezione, e un test di architettura lo verifica.

    Il punto di rottura e' 992px e non un valore scelto qui: e' il `lg` di Bootstrap, cioe'
    quello a cui .offcanvas-lg smette di essere un pannello e torna un blocco. Due soglie
    diverse darebbero una fascia di larghezze in cui la sidebar e' visibile e il pulsante
    che la apre pure.
*/

/*
    Skip link. Fuori schermo finche' non ha il focus, e a quel punto VISIBILE davvero: un
    link che resta a -9999px anche da focalizzato esiste per il test automatico e non per
    la persona che sta tabulando. z-index sopra la topbar sticky, altrimenti compare
    sotto di essa (WCAG 2.2 · 2.4.11, focus non oscurato).
*/
.sg-skip-link[b-5asyvwsmct] {
    position: absolute;
    inset-inline-start: var(--ev-space-3);
    top: calc(-1 * var(--ev-space-7));
    z-index: 1050;
    padding: var(--ev-space-2) var(--ev-space-4);
    border-radius: var(--ev-radius);
    background-color: var(--ev-surface-raised);
    color: var(--ev-text);
    box-shadow: var(--ev-shadow);
    text-decoration: none;
    transition: top var(--ev-dur-fast) var(--ev-ease-out);
}

.sg-skip-link:focus-visible[b-5asyvwsmct] {
    top: var(--ev-space-3);
}

@media (prefers-reduced-motion: reduce) {
    .sg-skip-link[b-5asyvwsmct] {
        transition: none;
    }
}

.page[b-5asyvwsmct] {
    position: relative;
    display: flex;
    flex-direction: column;
    min-height: 100vh;
    /* minmax implicito: senza min-width, un figlio largo (una tabella, un grafico) sfonda
       il contenitore flex invece di scorrere dentro il proprio riquadro. */
    min-width: 0;
}

.main-column[b-5asyvwsmct] {
    display: flex;
    flex-direction: column;
    flex: 1;
    min-width: 0;
}

/*
    La topbar: appiccicosa e in vetro.

    ⚠️ Il velo funziona solo se il fondo e' TRASLUCIDO: --ev-glass e' un rgba, quindi
    background-color e non background, e nessuna tinta piatta sotto. Dove
    backdrop-filter non e' supportato resta comunque un fondo al 78/86% sopra il
    contenuto — leggibile, senza sfocatura. Il degrado e' voluto e non va "corretto"
    con un fallback opaco: sarebbe la stessa barra in due prodotti diversi.
*/
.top-row[b-5asyvwsmct] {
    display: flex;
    align-items: center;
    gap: var(--ev-space-3);
    min-height: 3.375rem;
    padding-inline: var(--ev-space-5);
    border-bottom: 1px solid var(--ev-hairline);
    position: sticky;
    top: 0;
    z-index: 1020;
    /* isolation: il velo qui sotto sta a z-index -1, e senza un contesto di
       impilamento proprio finirebbe dietro al fondo della pagina invece che
       dietro al solo contenuto della barra. */
    isolation: isolate;
}

/*
    IL VELO STA IN UN ::before, E NON SULLA BARRA. Non e' un vezzo: `filter` e
    `backdrop-filter` rendono l'elemento un CONTAINING BLOCK per i discendenti in
    `position: fixed`. Il pannello della guida e' reso da <HelpDrawer />, che vive
    dentro questa barra: col filtro sulla barra, il pannello «fisso» si ancorava
    alla barra invece che alla finestra e diventava una scheggia alta 53px
    all'angolo destro. Si apriva davvero — classe `is-open`, aria-hidden false —
    e non si vedeva, che e' il modo peggiore in cui un comando puo' rompersi.

    Su uno pseudo-elemento il filtro produce lo stesso velo e non crea alcun
    containing block per i fratelli, perche' lo pseudo-elemento discendenti non ne
    ha. ⚠️ Vale per QUALUNQUE superficie in vetro che contenga componenti: prima
    di mettere `backdrop-filter` su un contenitore, si guarda che cosa ci vive
    dentro.
*/
.top-row[b-5asyvwsmct]::before {
    content: "";
    position: absolute;
    inset: 0;
    z-index: -1;
    background-color: var(--ev-glass);
    backdrop-filter: var(--ev-glass-blur);
    -webkit-backdrop-filter: var(--ev-glass-blur);
}

.top-row__spacer[b-5asyvwsmct] {
    flex: 1;
}

.top-row__icon[b-5asyvwsmct] {
    width: 1.125rem;
    height: 1.125rem;
    display: block;
    fill: currentColor;
}

.content[b-5asyvwsmct] {
    flex: 1;
    /* In fondo piu' spazio che in testa: l'ultima sezione di una pagina lunga non deve
       finire incollata al bordo della finestra, dove sembra tagliata. */
    padding: var(--ev-space-5) var(--ev-space-4) var(--ev-space-7);
}

/* <main> e' focalizzabile per ricevere il salto dello skip link, ma non e' un controllo:
   l'anello del focus su un'area di pagina non aggiunge nulla e sembra un guasto. */
.content:focus[b-5asyvwsmct] {
    outline: none;
}

.bottom-row[b-5asyvwsmct] {
    padding: var(--ev-space-4) var(--ev-space-5);
    border-top: 1px solid var(--ev-hairline);
    color: var(--ev-text-muted);
    font-size: var(--ev-fs-sm);
}

/*
    La sidebar, in vetro come la topbar. Sotto lg e' un offcanvas: li' il velo sta sopra
    il contenuto della pagina, ed e' proprio il caso in cui serve.
*/
.sidebar[b-5asyvwsmct] {
    /*
        COLONNA FLEX, e serve perche' la tessera in fondo ci arrivi davvero.
        `.nav-pulse` si spinge in basso con `margin-block-start: auto`, che in un
        blocco normale non fa nulla: sotto lg funzionava — Bootstrap mette
        `display: flex; flex-direction: column` su `.offcanvas` — e sopra lg, dove
        `.offcanvas-lg` quel display lo toglie, la tessera restava appiccicata
        all'ultima voce di menu con il vuoto sotto. Due comportamenti diversi ai
        due lati dello stesso punto di rottura, cioe' il difetto piu' facile da
        non vedere: si guarda la finestra larga e sembra un margine sbagliato.
    */
    display: flex;
    flex-direction: column;
    background-color: var(--ev-glass-side);
    /* Stessa cautela della topbar: qui il filtro resta sull'elemento perche' la
       barra non contiene nulla in position: fixed — ma se un giorno ce lo si
       mette, va spostato in un ::before come sopra. */
    backdrop-filter: var(--ev-glass-blur);
    -webkit-backdrop-filter: var(--ev-glass-blur);
}

@media (min-width: 992px) {
    .page[b-5asyvwsmct] {
        flex-direction: row;
    }

    .sidebar[b-5asyvwsmct] {
        /* flex-shrink a 0 ma con una base dichiarata: `flex: none` sul fratello di un
           contenuto elastico e' il modo classico per affamare il campo portante. Qui la
           sidebar ha una larghezza fissa e main-column ha flex:1, quindi il conto torna. */
        flex: 0 0 248px;
        width: 248px;
        height: 100vh;
        position: sticky;
        top: 0;
        /* La barra e' piu' alta della finestra appena i gruppi si riempiono: senza
           questo, le ultime voci non si raggiungono e non c'e' modo di accorgersene
           perche' la pagina accanto scorre. */
        overflow-y: auto;
        border-inline-end: 1px solid var(--ev-border);
    }

    .content[b-5asyvwsmct] {
        padding: var(--ev-space-5) var(--ev-space-6) var(--ev-space-7);
    }

    /*
        La barra ridotta alla sola colonna delle icone.

        L'ancora e' html[data-sg-nav] e non una classe su .page, e non e' una scelta di
        stile: l'attributo lo scrive sg-nav.js PRIMA del primo paint, quando .page non
        esiste ancora. Partire da <html> e' l'unico modo perche' la larghezza sia gia'
        giusta al primo fotogramma invece di assestarsi dopo che Blazor si e' connesso.
        La CSS isolation scopa il selettore in coda (.sidebar[b-xxx]), quindi la regola
        resta confinata a questo componente pur partendo da fuori.

        Solo dentro la media query di lg, e questo e' il vincolo che rende il comando
        onesto: sotto lg la barra e' un offcanvas, cioe' o coperta o assente, e una rail
        di sole icone dentro un pannello aperto a pieno schermo sarebbe un elenco di
        simboli senza nome. La preferenza resta persistita e torna a valere appena la
        finestra si riallarga — non si perde, semplicemente non si applica.
    */
    html[data-sg-nav="collapsed"] .sidebar[b-5asyvwsmct] {
        flex-basis: 4rem;
        width: 4rem;
    }

    /* La transizione sta sulla sola sidebar e non sul contenuto: il contenuto e' elastico
       e si riassesta da se'. Animare anche quello vorrebbe dire animare la larghezza di un
       grafico, che ApexCharts ridisegna a ogni passo. */
    .sidebar[b-5asyvwsmct] {
        transition: flex-basis var(--ev-dur-fast) var(--ev-ease-out),
                    width var(--ev-dur-fast) var(--ev-ease-out);
    }
}

/* prefers-reduced-motion risolve allo STATO FINALE e non a meta' strada: la barra e'
   ridotta subito, senza passaggi. E' la stessa regola dello skip link qui sopra e la
   Definition of Done di M7 la chiede su ogni animazione. */
@media (prefers-reduced-motion: reduce) {
    .sidebar[b-5asyvwsmct] {
        transition: none;
    }
}

/*
    L'avviso di errore del circuito. color-scheme: light only e i colori espliciti sono
    voluti: quando questo riquadro compare il circuito e' caduto, quindi e' l'ultima cosa
    che l'utente vede, e deve essere leggibile anche se il tema non fosse stato applicato.
*/
#blazor-error-ui[b-5asyvwsmct] {
    color-scheme: light only;
    background: var(--ev-warning-subtle);
    color: var(--ev-text);
    border-top: 2px solid var(--ev-warning);
    bottom: 0;
    box-sizing: border-box;
    display: none;
    left: 0;
    padding: var(--ev-space-3) var(--ev-space-5);
    position: fixed;
    width: 100%;
    z-index: 1080;
}

#blazor-error-ui .dismiss[b-5asyvwsmct] {
    cursor: pointer;
    position: absolute;
    inset-inline-end: var(--ev-space-3);
    top: var(--ev-space-2);
}
/* /Components/Layout/NavCollapse.razor.rz.scp.css */
/*
    L'icona del pulsante ha bisogno delle proprie regole, e la ragione e' K-101.

    .top-row__icon e' dichiarata in MainLayout.razor.css, quindi porta l'attributo
    b-xxxxx di QUEL componente: la CSS isolation di Blazor scopa ogni regola al markup
    scritto nel proprio .razor, e un <svg class="top-row__icon"> scritto qui dentro non
    viene toccato da nessuna di quelle regole. L'effetto non e' una sfumatura di stile —
    e' un SVG senza larghezza ne' altezza, che il browser rende alla dimensione
    predefinita di 300x150 px: il pulsante occupa un quarto della topbar.

    Si vede solo guardando la pagina, esattamente come la voce di menu col blu di
    Bootstrap prima di M6.3. Riusare il nome di una classe definita in un altro
    componente e' il modo tipico di caderci: il nome suggerisce che la regola arrivi, e
    la regola non arriva.
*/
.top-row__icon[b-nh600i4tpa] {
    width: 1.125rem;
    height: 1.125rem;
    display: block;
    fill: currentColor;
}
/* /Components/Layout/NavMenu.razor.rz.scp.css */
/*
    Solo struttura, come per MainLayout: nessun letterale di colore.
    Le icone sono lo sprite SVG di Bootstrap Icons e prendono il colore da currentColor,
    quindi seguono il tema senza una riga in più.
*/

.nav-brand[b-o4eejhm67l] {
    display: flex;
    align-items: center;
    min-height: 3.375rem;
    padding-inline: var(--ev-space-3);
    border-bottom: 1px solid var(--ev-hairline);
}

.navbar-brand[b-o4eejhm67l] {
    display: flex;
    align-items: center;
    gap: var(--ev-space-2);
    font-size: 1.0625rem;
    font-weight: 700;
    letter-spacing: -.02em;
    color: var(--ev-text);
    text-decoration: none;
}

/*
    La parola del marchio in gradiente — M11.1.

    background-clip: text toglie il colore al testo, e in forced-colors il fondo
    non viene disegnato affatto: la parola sparirebbe proprio per chi ha attivato il
    contrasto alto. Il blocco piu' sotto la riporta a tinta piatta. Per lo stesso
    motivo il colore di partenza resta --ev-text: se il gradiente non si applica,
    quello che resta e' leggibile e non trasparente.
*/
@supports (background-clip: text) or (-webkit-background-clip: text) {
    .navbar-brand__text[b-o4eejhm67l] {
        background-image: var(--ev-grad-title);
        -webkit-background-clip: text;
        background-clip: text;
        color: transparent;
    }
}

@media (forced-colors: active) {
    .navbar-brand__text[b-o4eejhm67l] {
        background-image: none;
        color: CanvasText;
    }
}

.nav-item[b-o4eejhm67l] {
    padding: 1.5px var(--ev-space-3);
}

.nav-item:first-of-type[b-o4eejhm67l] {
    padding-top: var(--ev-space-3);
}

/*
    ::deep, e non e' un vezzo. <NavLink> rende l'<a> DA SE', quindi quell'elemento non
    porta l'attributo b-xxxxx della CSS isolation: la scoping di Blazor lo applica al
    markup scritto in questo .razor, non a cio' che un componente figlio genera. Senza
    ::deep queste regole non colpiscono nulla e la voce di menu resta col blu dei link di
    Bootstrap — che e' esattamente cio' che faceva prima di M6.3, senza che niente lo
    segnalasse. Vedi K-101.

    L'ancora e' .nav-item, che sta in questo file ed e' quindi scopata: ::deep parte da li'.
*/
.nav-item[b-o4eejhm67l]  .nav-link {
    display: flex;
    align-items: center;
    gap: var(--ev-space-3);
    padding: var(--ev-space-2) var(--ev-space-3);
    border-radius: var(--ev-radius);
    color: var(--ev-text-muted);
    font-size: var(--ev-fs-body);
    font-weight: 500;
    /* La barra di selezione è sempre presente ma trasparente: se comparisse solo da attiva,
       la voce si sposterebbe di 3px al cambio di pagina. */
    border-inline-start: 3px solid transparent;
    transition: background-color var(--ev-dur) var(--ev-ease-out),
                box-shadow var(--ev-dur) var(--ev-ease-out);
}

.nav-item[b-o4eejhm67l]  .nav-link:hover {
    background-color: var(--ev-accent-hover);
    color: var(--ev-text);
}

/* La voce attiva porta anche aria-current="page", che NavLink aggiunge da sé: il colore
   qui è ridondanza, non l'unico segnale. */
/*
    La voce attiva: pastiglia sfumata, filetto interno d'accento e un alone.

    Il colore NON e' l'unico segnale, e non per scrupolo formale: aria-current="page" lo
    dice all'assistiva, il peso del testo sale a 600 e la barra di selezione a sinistra
    resta. Tolto il colore — daltonismo, stampa, forced-colors — la voce corrente si
    riconosce comunque.
*/
.nav-item[b-o4eejhm67l]  .nav-link.active {
    background-image: linear-gradient(90deg, var(--ev-accent-tint), transparent);
    background-color: transparent;
    border-inline-start-color: var(--ev-accent);
    box-shadow: inset 0 0 0 1px var(--ev-accent-line), var(--ev-glow-card);
    color: var(--ev-text);
    font-weight: 600;
}

/* L'icona della voce attiva prende l'accento: e' il secondo segnale non testuale,
   e in barra ridotta — dove l'etichetta e' fuori schermo — diventa il primo. */
.nav-item[b-o4eejhm67l]  .nav-link.active .nav-icon {
    color: var(--ev-primary);
}

.nav-item[b-o4eejhm67l]  .nav-icon {
    width: 1.125rem;
    height: 1.125rem;
    flex: 0 0 auto;
    fill: currentColor;
}

.nav-brand[b-o4eejhm67l] {
    /* justify-content: space-between con la X di chiusura, che esiste solo sotto lg.
       Sopra lg il pulsante non c'e' e il marchio resta dov'e'. */
    justify-content: space-between;
    gap: var(--ev-space-3);
}

/* Intestazione di gruppo, non una voce: e' un <h2> perche' la navigazione ha una
   struttura e uno screen reader deve poterla saltare per titoli, non solo per link. */
.nav-group[b-o4eejhm67l] {
    margin: var(--ev-space-5) 0 var(--ev-space-2);
    padding-inline: var(--ev-space-4);
    font-size: var(--ev-fs-xs);
    font-weight: 600;
    letter-spacing: .12em;
    text-transform: uppercase;
    color: var(--ev-text-faint);
}

/* I tre stati non-Ready dell'elenco dei siti. Il vuoto e' quello che si legge piu'
   spesso, quindi ha il testo per esteso e non un'abbreviazione. */
.nav-state[b-o4eejhm67l] {
    padding: var(--ev-space-2) var(--ev-space-4) var(--ev-space-3);
}

.nav-state__title[b-o4eejhm67l] {
    margin: 0 0 var(--ev-space-1);
    font-size: var(--ev-fs-sm);
    font-weight: 600;
    color: var(--ev-text);
}

.nav-state__body[b-o4eejhm67l] {
    margin: 0;
    font-size: var(--ev-fs-sm);
    line-height: var(--ev-lh-body);
    color: var(--ev-text-muted);
}

.nav-state__trace[b-o4eejhm67l] {
    margin: 0 0 var(--ev-space-2);
    font-family: var(--ev-font-mono);
    font-size: var(--ev-fs-xs);
    color: var(--ev-text-muted);
    /* Un traceId non ha spazi e non si spezza: senza questo sfonda la sidebar. */
    overflow-wrap: anywhere;
}

.nav-state--error .nav-state__title[b-o4eejhm67l] {
    color: var(--ev-danger);
}

/* ---------------------------------------------------------------------------
   La barra ridotta: resta la sola colonna delle icone.

   Tutto dentro la media query di lg, perche' sotto lg la barra e' un offcanvas e
   ridurla non avrebbe senso — vedi MainLayout.razor.css, dove sta il resto della
   geometria e la ragione per cui l'ancora e' html[data-sg-nav].

   Le etichette si nascondono con position:absolute + clip, cioe' la ricetta di
   .visually-hidden, e NON con display:none. La differenza non e' estetica: con
   display:none il nome della voce sparisce dall'albero di accessibilita', e ogni
   <a> del menu resterebbe senza nome accessibile — una barra di link anonimi per
   chi usa uno screen reader, prodotta da un comando che voleva solo risparmiare
   spazio sullo schermo. Cosi' invece il testo continua a esserci e a essere letto,
   e a non occupare larghezza.
   --------------------------------------------------------------------------- */
@media (min-width: 992px) {
    html[data-sg-nav="collapsed"] .nav-item[b-o4eejhm67l]  .nav-link > span {
        position: absolute;
        width: 1px;
        height: 1px;
        padding: 0;
        margin: -1px;
        overflow: hidden;
        clip-path: inset(50%);
        white-space: nowrap;
        border: 0;
    }

    html[data-sg-nav="collapsed"] .nav-item[b-o4eejhm67l]  .nav-link {
        justify-content: center;
        gap: 0;
        /* La barra di selezione resta: e' il solo segnale di pagina attiva che
           sopravvive alla sparizione del testo, e toglierla lascerebbe la voce
           corrente indistinguibile dalle altre. */
        padding-inline: var(--ev-space-2);
    }

    html[data-sg-nav="collapsed"] .nav-brand[b-o4eejhm67l] {
        justify-content: center;
    }

    /*
        Le intestazioni di gruppo e i tre stati non-Ready spariscono del tutto, e
        qui display:none e' corretto: non sono nomi di un controllo ma testo di
        contorno, e un <h2> "SITI" letto sopra una colonna di icone senza elenco
        visibile non aiuta nessuno. Chi ha bisogno di leggerli riallarga la barra —
        il comando che l'ha ridotta e' lo stesso, ed e' due tab piu' in la'.
    */
    html[data-sg-nav="collapsed"] .nav-group[b-o4eejhm67l],
    html[data-sg-nav="collapsed"] .nav-state[b-o4eejhm67l] {
        display: none;
    }
}


/* Il segno del marchio. Il colore viene dal token primario e non da --ev-text:
   e' l'unico elemento cromatico della barra, ed e' cio' che rende riconoscibile
   l'applicazione quando la colonna e' ridotta alle sole icone. currentColor sui
   path lo fa commutare col tema senza una seconda regola. */
.navbar-brand__mark[b-o4eejhm67l] {
    flex: none;
    color: var(--ev-primary);
}

/* ---------------------------------------------------------------------------
   Barra ridotta: sparisce la PAROLA, resta il SEGNO.

   Prima di questa regola spariva tutto il marchio, e nella colonna ridotta non
   restava nulla che dicesse quale applicazione si stesse guardando — proprio
   nello stato in cui un segno grafico serve di piu', perche' e' l'unico spazio
   rimasto (K-131). La parola si nasconde con la ricetta di .visually-hidden e
   non con display:none, per la stessa ragione delle etichette delle voci: il
   marchio e' un <a> e senza testo resterebbe un link anonimo.
   --------------------------------------------------------------------------- */
@media (min-width: 992px) {
    html[data-sg-nav="collapsed"] .navbar-brand__text[b-o4eejhm67l] {
        position: absolute;
        width: 1px;
        height: 1px;
        padding: 0;
        margin: -1px;
        overflow: hidden;
        clip-path: inset(50%);
        white-space: nowrap;
        border: 0;
    }
}

/* ---------------------------------------------------------------------------
   Il conteggio a destra di una voce — M11.1.

   margin-inline-start:auto e non una colonna: la voce resta un flex a due
   elementi (icona, nome) e il numero si spinge in fondo da se', senza che una
   griglia imponga una larghezza al nome che deve poter troncare.

   Cifre tabulari: i numeri sono incolonnati fra voci diverse, e senza
   font-variant-numeric un 4 e un 2 hanno larghezze diverse e la colonna balla.
   --------------------------------------------------------------------------- */
.nav-item[b-o4eejhm67l]  .nav-count {
    margin-inline-start: auto;
    font-family: var(--ev-font-mono);
    font-size: var(--ev-fs-xs);
    font-variant-numeric: tabular-nums;
    color: var(--ev-text-faint);
}

/* In barra ridotta il numero sparisce con l'etichetta: accanto a una sola icona
   sarebbe una cifra senza soggetto. Resta nell'albero di accessibilita' perche'
   e' la stessa ricetta di .visually-hidden usata per i nomi delle voci. */
@media (min-width: 992px) {
    html[data-sg-nav="collapsed"] .nav-item[b-o4eejhm67l]  .nav-count {
        position: absolute;
        width: 1px;
        height: 1px;
        padding: 0;
        margin: -1px;
        overflow: hidden;
        clip-path: inset(50%);
        white-space: nowrap;
        border: 0;
    }
}

/* ---------------------------------------------------------------------------
   Il badge delle anomalie aperte — M11.1.

   Cifra su fondo pieno, non un pallino: il numero e' l'informazione, e un
   pallino avrebbe detto «c'e' qualcosa» costringendo ad aprire la pagina per
   sapere quanto.

   L'animazione e' un anello che pulsa, e si ferma con prefers-reduced-motion
   risolvendo allo stato finale — cioe' al badge fermo, che resta perfettamente
   leggibile. Un allarme che lampeggia e non si puo' spegnere e' un problema di
   accessibilita', non un richiamo.
   --------------------------------------------------------------------------- */
.nav-item[b-o4eejhm67l]  .nav-badge {
    margin-inline-start: auto;
    padding: 1px var(--ev-space-2);
    border-radius: var(--ev-radius-pill);
    background-color: var(--ev-danger);
    color: var(--ev-danger-on);
    font-family: var(--ev-font-mono);
    font-size: var(--ev-fs-xs);
    font-weight: 600;
    font-variant-numeric: tabular-nums;
    animation: sg-nav-pulse-b-o4eejhm67l 2.6s var(--ev-ease-out) infinite;
}

/* L'anello parte da --ev-glow-danger e non da --ev-danger-subtle, che e' un
   FONDO: al primo tentativo l'animazione c'era e non si vedeva, perche' partiva
   da un rosso quasi uguale alla superficie sotto. E il fotogramma iniziale deve
   avere raggio ZERO e colore PIENO — un'onda parte dal bordo e si allarga
   sbiadendo; partire gia' larga e' un alone che lampeggia, non un battito. */
@keyframes sg-nav-pulse-b-o4eejhm67l {
    0% { box-shadow: 0 0 0 0 var(--ev-glow-danger); }
    70% { box-shadow: 0 0 0 7px transparent; }
    100% { box-shadow: 0 0 0 0 transparent; }
}

@media (prefers-reduced-motion: reduce) {
    .nav-item[b-o4eejhm67l]  .nav-badge {
        animation: none;
    }
}

/* ---------------------------------------------------------------------------
   La tessera in fondo: l'ora dell'ultimo dato.

   margin-block-start:auto la spinge in fondo alla colonna; la sidebar e' un
   flex verticale, e senza questo la tessera resterebbe attaccata all'ultima
   voce di menu con un vuoto sotto.
   --------------------------------------------------------------------------- */
.nav-pulse[b-o4eejhm67l] {
    /* `auto` sul solo lato SUPERIORE, esplicito: la scorciatoia `margin: auto …`
       mette auto anche a destra e a sinistra, e in una colonna flex quello centra
       la tessera invece di farle occupare la larghezza della barra. */
    margin-block-start: auto;
    margin-inline: var(--ev-space-3);
    margin-block-end: var(--ev-space-3);
    padding: var(--ev-space-3);
    border-radius: var(--ev-radius);
    background-color: var(--ev-accent-tint);
    box-shadow: inset 0 0 0 1px var(--ev-accent-line);
}

.nav-pulse__title[b-o4eejhm67l] {
    margin: 0;
    font-size: var(--ev-fs-sm);
    font-weight: 600;
    color: var(--ev-text);
}

.nav-pulse__value[b-o4eejhm67l] {
    margin: var(--ev-space-1) 0 0;
    font-family: var(--ev-font-mono);
    font-size: var(--ev-fs-xs);
    color: var(--ev-text-muted);
}

/* In barra ridotta la tessera sparisce: e' prosa, non un comando, e in 4rem di
   larghezza diventerebbe una parola per riga. Chi la vuole riallarga la barra. */
@media (min-width: 992px) {
    html[data-sg-nav="collapsed"] .nav-pulse[b-o4eejhm67l] {
        display: none;
    }
}
/* /Components/Shared/SgPwaBanner.razor.rz.scp.css */
/*
    Il banner sta dentro la shell, sopra il contenuto: e' un avviso che riguarda
    l'applicazione intera e la sua posizione non deve dipendere da quale pagina sia
    aperta. Solo struttura, nessun letterale di colore — i colori sono quelli di .alert,
    che il bridge rimappa sui token.
*/

/*
    IL MARGINE LATERALE DEVE COMBACIARE COL PADDING DI .content, e non e' un
    dettaglio: il banner sta FUORI da <main> — e' un avviso sull'applicazione, non
    sulla pagina — quindi non eredita quel padding. Aveva 16px fissi mentre il
    contenuto ne ha 32 sopra lg, e il risultato era un banner che cominciava mezzo
    centimetro piu' a sinistra del titolo e delle tessere sotto. Si vede subito e
    non si capisce da dove venga, perche' i due valori stanno in due file diversi.

    ⚠️ Chi cambia il padding di .content in MainLayout.razor.css deve cambiare
    anche questo. E' il prezzo di tenere il banner fuori dal contenuto, ed e' un
    prezzo accettabile: dentro <main>, la sua posizione dipenderebbe da quale
    pagina e' aperta.
*/
.sg-pwa-banner[b-t1a1yf26g5] {
    display: flex;
    align-items: center;
    justify-content: space-between;
    /* Su XS il testo e le azioni vanno a capo invece di comprimersi: un pulsante largo
       tre caratteri e' un bersaglio che si manca. */
    flex-wrap: wrap;
    gap: var(--ev-space-3);
    margin: var(--ev-space-4) var(--ev-space-4) 0;
    border: 0;
    border-radius: var(--ev-radius-lg);
    box-shadow: inset 0 0 0 1px var(--ev-accent-line);
}

/* La fascia del design: velatura d'accento invece del fondo pieno di .alert-secondary.
   Solo sull'invito a INSTALLARE — quello di aggiornamento resta un alert-info, perche'
   dice una cosa diversa e piu' urgente. */
.sg-pwa-banner.alert-secondary[b-t1a1yf26g5] {
    background: var(--ev-grad-banner);
    color: var(--ev-text);
}

@media (min-width: 992px) {
    .sg-pwa-banner[b-t1a1yf26g5] {
        margin-inline: var(--ev-space-6);
    }
}

.sg-pwa-banner__actions[b-t1a1yf26g5] {
    display: flex;
    gap: var(--ev-space-2);
}
