html, body {
    font-family: 'Segoe UI', 'Helvetica Neue', Helvetica, Arial, sans-serif;
    margin: 0;
    height: 100%;
}

a, .btn-link { color: #006bb7; }

.btn-primary { color: #fff; background-color: #1b6ec2; border-color: #1861ac; }

.btn:focus, .btn:active:focus, .btn-link.nav-link:focus, .form-control:focus, .form-check-input:focus {
    box-shadow: 0 0 0 0.1rem white, 0 0 0 0.25rem #258cfb;
}

.content { padding-top: 1.1rem; }

h1:focus { outline: none; }

.valid.modified:not([type=checkbox]) { outline: 1px solid #26b050; }
.invalid { outline: 1px solid #e50000; }
.validation-message { color: #e50000; }

/* ══════════ Login ══════════ */
.login-wrap {
    min-height: 100vh; min-height: 100dvh;
    display: flex; align-items: center; justify-content: center;
    background: linear-gradient(135deg, #0d3b66 0%, #12263a 100%);
    padding: 1rem;
}
.login-card {
    width: 100%; max-width: 380px; background: #fff; border-radius: 1rem;
    box-shadow: 0 12px 40px rgba(0,0,0,.3); padding: 1.75rem;
}
.login-brand { display: flex; align-items: center; gap: .75rem; margin-bottom: 1.5rem; }
.login-brand i { font-size: 2.2rem; color: #0d6efd; }
/* FIX A7: ora è un <h1>; margin:0 perché il margine di default delle intestazioni
   scomporrebbe l'allineamento con il sottotitolo. */
.login-title { font-size: 1.35rem; font-weight: 700; line-height: 1; margin: 0; }
.login-sub { font-size: .8rem; color: #6c757d; }
/* Il riquadro delle credenziali dimostrative non esiste piu' (pubblicava utente e password
   a chiunque aprisse la pagina). Al suo posto, l'avviso che il database va ancora configurato:
   stesse misure, colore d'attenzione invece che grigio di servizio. */
.login-setup {
    margin-top: 1.25rem; padding: .75rem .85rem; border-radius: .5rem;
    background: #fff8e6; border: 1px solid #ffe1a8; color: #6b4d00;
    font-size: .78rem; line-height: 1.6;
}
.login-setup code { background: #fff1cc; padding: .05rem .3rem; border-radius: 4px; color: #7a4b00; }

/* ══════════ Procedura guidata di configurazione (/setup) ══════════
   Riusa la cornice della pagina di accesso: chi ci arriva non ha ancora un'applicazione
   con cui confrontarsi, e presentargli una terza estetica non aiuterebbe nessuno. Piu'
   larga della login perche' contiene un modulo, non due caselle. */
.setup-wrap {
    min-height: 100vh; min-height: 100dvh;
    display: flex; align-items: flex-start; justify-content: center;
    background: linear-gradient(135deg, #0d3b66 0%, #12263a 100%);
    padding: 2rem 1rem;
}
.setup-card {
    width: 100%; max-width: 640px; background: #fff; border-radius: 1rem;
    box-shadow: 0 12px 40px rgba(0,0,0,.3); padding: 1.75rem;
}
.setup-titolo { font-size: 1.35rem; font-weight: 700; margin: 0 0 1.1rem; }
.setup-sezione {
    font-size: .72rem; font-weight: 700; text-transform: uppercase; letter-spacing: .06em;
    color: #0d3b66; margin: 1.4rem 0 .6rem; padding-bottom: .3rem; border-bottom: 1px solid #e9ecef;
}
.setup-card fieldset { border: 0; padding: 0; margin: 0; min-width: 0; }
.setup-card legend { float: none; width: auto; }
/* Il dettaglio dell'errore arriva dal provider: puo' essere lungo, contenere percorsi e non
   avere spazi dove andare a capo. Senza break-word sfonderebbe la scheda su schermo stretto. */
.setup-dettaglio {
    font-family: ui-monospace, SFMono-Regular, Menlo, Consolas, monospace;
    font-size: .74rem; line-height: 1.5; overflow-wrap: anywhere; word-break: break-word;
}
.setup-comandi { display: flex; flex-wrap: wrap; gap: .6rem; margin-top: 1.4rem; }
.setup-comandi .btn { flex: 1 1 12rem; }
.setup-nota { font-size: .75rem; color: #6c757d; margin: 1rem 0 0; line-height: 1.6; }
.setup-passi { margin-top: 1rem; }
.setup-card code {
    background: #f1f3f5; padding: .05rem .3rem; border-radius: 4px; color: #0d3b66;
    overflow-wrap: anywhere;
}

/* ══════════ FIX S14: recupero del circuito Blazor Server ══════════
   Il markup di questi due pannelli sta in Components/App.razor. blazor.web.js li
   cerca PER ID e vi scrive sopra delle classi di stato: senza il CSS qui sotto il
   pannello di errore resterebbe visibile su ogni pagina e quello di riconnessione
   mostrerebbe i tre messaggi (in corso / fallito / scaduto) tutti insieme.
   Regola d'oro: il default è nascosto, la visibilità la decide la classe che
   applica il framework. */

/* Barra d'errore: Blazor imposta style="display:block" in linea quando scatta. */
#blazor-error-ui {
    display: none;
    position: fixed; bottom: 0; left: 0; right: 0; z-index: 1080;
    padding: .7rem 1.25rem;
    background: #ffe8a1; color: #4a3800;
    border-top: 1px solid #e0c26a;
    box-shadow: 0 -.25rem .75rem rgba(0,0,0,.15);
    font-size: .9rem;
}
#blazor-error-ui .reload,
#blazor-error-ui .dismiss { color: #6a4d00; margin-left: .75rem; cursor: pointer; }
#blazor-error-ui .dismiss { float: right; text-decoration: none; }

/* Riconnessione: le classi components-reconnect-* le applica il framework. */
#components-reconnect-modal { display: none; }
#components-reconnect-modal.components-reconnect-show,
#components-reconnect-modal.components-reconnect-failed,
#components-reconnect-modal.components-reconnect-rejected {
    display: flex; align-items: center; justify-content: center;
    position: fixed; inset: 0; z-index: 1090;
    background: rgba(15,23,42,.55);
}
#components-reconnect-modal.components-reconnect-hide { display: none; }

.fi-reconnect-box {
    background: #fff; border-radius: .5rem; padding: 1.25rem 1.5rem;
    max-width: 26rem; margin: 1rem; text-align: center;
    box-shadow: 0 1rem 2rem rgba(0,0,0,.3);
    font-size: .95rem; color: #212529;
}
/* Un solo messaggio alla volta, scelto dallo stato del contenitore. */
.fi-reconnect-show, .fi-reconnect-failed, .fi-reconnect-rejected { display: none; }
#components-reconnect-modal.components-reconnect-show .fi-reconnect-show,
#components-reconnect-modal.components-reconnect-failed .fi-reconnect-failed,
#components-reconnect-modal.components-reconnect-rejected .fi-reconnect-rejected { display: block; }

.fi-reconnect-link {
    display: inline-block; margin-top: .75rem;
    color: #0d6efd; font-weight: 600; text-decoration: none;
}
.fi-reconnect-link:hover { text-decoration: underline; }

.fi-spinner {
    display: block; width: 1.75rem; height: 1.75rem; margin: 0 auto .75rem;
    border: .2rem solid #dee2e6; border-top-color: #0d6efd; border-radius: 50%;
    animation: fi-spin 1s linear infinite;
}
@keyframes fi-spin { to { transform: rotate(360deg); } }
/* Rispetta chi ha chiesto meno animazioni a livello di sistema operativo. */
@media (prefers-reduced-motion: reduce) { .fi-spinner { animation: none; } }

/* Su schermi molto piccoli riduci il padding globale */
@media (max-width: 575.98px) {
    .content { padding-top: .5rem; }
}

/* ══════════ FIX S13: icone locali (sostituiscono bootstrap-icons da CDN) ══════════
   Il foglio di stile bootstrap-icons veniva scaricato da cdn.jsdelivr.net senza
   integrity/SRI: una dipendenza esterna con pieno controllo del CSS di ogni pagina
   (e quindi capace di alterare il layout del login o di esfiltrare dati tramite
   selettori di attributo + background-image), oltre a rompere l'applicazione su reti
   senza uscita verso Internet.
   Qui le icone sono rese con caratteri Unicode dei font di sistema: nessuna richiesta
   di rete, nessun file da distribuire. Non sono le icone originali — sono segnaposto
   riconoscibili. Per riavere il set completo va copiato il font sotto
   wwwroot/bootstrap-icons/ e referenziato da qui (la CSP consente solo 'self'),
   NON va ripristinato il link al CDN. */
.bi {
    display: inline-block;
    min-width: 1em;
    font-style: normal;
    font-weight: normal;
    font-variant: normal;
    line-height: 1;
    text-align: center;
    text-transform: none;
    vertical-align: -.125em;
}

/* Segnaposto neutro per ogni icona non mappata esplicitamente qui sotto. */
.bi::before { content: "\2022"; }

/* Frecce e navigazione */
.bi-arrow-left::before { content: "\2190"; }
.bi-chevron-left::before { content: "\2039"; }
.bi-arrow-right-circle::before,
.bi-box-arrow-in-right::before,
.bi-box-arrow-right::before,
.bi-truck::before { content: "\2192"; }
.bi-arrow-left-right::before { content: "\21C4"; }
.bi-arrow-repeat::before { content: "\21BB"; }
.bi-graph-up-arrow::before,
.bi-bar-chart::before { content: "\2197"; }
.bi-link-45deg::before { content: "\221E"; }

/* Stato ed esiti */
.bi-exclamation-triangle::before,
.bi-exclamation-octagon::before { content: "\26A0"; }
.bi-check-circle::before,
.bi-check2-circle::before,
.bi-shield-check::before { content: "\2713"; }
.bi-x-circle::before { content: "\2717"; }
.bi-info-circle::before { content: "\2139"; }
.bi-trash::before { content: "\232B"; }

/* Elenchi, griglie, documenti */
.bi-list::before,
.bi-list-ul::before,
.bi-card-list::before,
.bi-sliders::before { content: "\2261"; }
.bi-grid::before,
.bi-grid-1x2::before,
.bi-diagram-3::before { content: "\229E"; }
.bi-inbox::before,
.bi-files::before,
.bi-file-earmark-excel::before,
.bi-save::before,
.bi-box-seam::before,
.bi-cloud-upload::before { content: "\25A4"; }

/* Ricerca e filtri */
.bi-search::before,
.bi-funnel::before { content: "\2315"; }

/* Anagrafiche */
.bi-shop::before,
.bi-building-slash::before { content: "\2302"; }
.bi-person::before,
.bi-person-circle::before,
.bi-person-badge::before,
.bi-person-gear::before,
.bi-people::before { content: "\263A"; }
.bi-person-plus::before,
.bi-plus-lg::before { content: "+"; }
.bi-send::before { content: "\2709"; }
.bi-gear::before,
.bi-hammer::before,
.bi-database-gear::before,
.bi-tag::before { content: "\2699"; }
.bi-capsule::before,
.bi-capsule-pill::before { content: "\271A"; }

/* Le icone della procedura guidata. Senza una regola propria ricadrebbero sul segnaposto
   generico di .bi::before — un punto elenco accanto a «Prova connessione» e, peggio, accanto
   a un errore bloccante, dove il glifo è metà del messaggio. */
.bi-plug::before { content: "\26A1"; }
.bi-x-octagon::before { content: "\2717"; }

/* Sicurezza — il lucchetto usa la presentazione testuale (\FE0E) per restare monocromo */
.bi-lock::before,
.bi-lock-fill::before,
.bi-unlock::before,
.bi-shield-lock::before,
.bi-key::before { content: "\1F512\FE0E"; }
