/* ==== css/design-tokens.css ==== */
/* ============================================================================
   ZcodedepthV — Design system condiviso (2026-10-08)

   UNICA fonte dei valori di base per TUTTA l'app: pannello admin, aree dei clienti,
   login. Ogni altro foglio di stile usa queste variabili, non valori scritti a mano.

   Direzione (decisa con il titolare): stile dei gestionali professionali.
   - Sfondo della pagina a TINTA UNITA, uguale ovunque: niente gradienti, righe,
     griglie, raggi o scene animate.
   - Menu laterale scuro blu notte (#0B0A20, lo stesso dell'icona dell'app).
   - Contenuti su card bianche con bordo sottile e ombra leggera.
   - Animazioni brevi e discrete; spente con prefers-reduced-motion.
   - Nei verticali il colore del settore resta come ACCENTO (pulsanti, selezioni),
     mai come sfondo: lo fornisce il tema MudBlazor del verticale (--mud-palette-primary).
   ============================================================================ */
:root {
    /* Superfici */
    --zd-canvas: #F3F5F9;          /* sfondo pagina, tinta unita */
    --zd-surface: #FFFFFF;         /* card, dialog, barra in alto */
    --zd-surface-2: #F8FAFC;       /* intestazioni tabelle, riquadri interni */
    --zd-surface-hover: #F1F5F9;
    --zd-border: #E2E8F0;
    --zd-border-strong: #CBD5E1;

    /* Testo */
    --zd-text: #0F172A;
    --zd-text-2: #475569;
    --zd-text-3: #64748B;
    --zd-text-inverse: #FFFFFF;

    /* Marchio (piattaforma e pannello admin) */
    --zd-brand: #4F46E5;
    --zd-brand-hover: #4338CA;
    --zd-brand-soft: #EEF2FF;      /* fondo di selezioni e chip del marchio */
    --zd-brand-ring: rgba(79, 70, 229, .28);
    --zd-brand-gradient: linear-gradient(135deg, #8B5CF6 0%, #22D3EE 100%); /* solo dettagli: logo, barretta attiva */

    /* Menu laterale */
    --zd-sidebar-bg: #0B0A20;
    --zd-sidebar-bg-2: #12112B;    /* gruppi aperti, hover */
    --zd-sidebar-border: rgba(255, 255, 255, .06);
    --zd-sidebar-text: #A9AEC9;
    --zd-sidebar-text-strong: #FFFFFF;
    --zd-sidebar-section: #6B7094; /* titoletti di sezione */
    --zd-sidebar-active-bg: rgba(139, 92, 246, .16);
    --zd-sidebar-width: 264px;

    /* Barra in alto */
    --zd-topbar-bg: #FFFFFF;
    --zd-topbar-height: 60px;

    /* Stati */
    --zd-success: #059669;  --zd-success-soft: #ECFDF5;
    --zd-warning: #D97706;  --zd-warning-soft: #FFFBEB;
    --zd-danger:  #DC2626;  --zd-danger-soft:  #FEF2F2;
    --zd-info:    #0284C7;  --zd-info-soft:    #F0F9FF;
    /* Stati usati come TESTO su fondo -soft (chip, avvisi): più scuri, reggono 4.5:1. */
    --zd-success-ink: #047857;
    --zd-warning-ink: #B45309;
    --zd-danger-ink:  #B91C1C;
    --zd-info-ink:    #0369A1;
    /* Con cosa si mescola un accento per usarlo come TESTO: scurito sul chiaro, schiarito sullo scuro. */
    --zd-ink-mix: #0F172A;

    /* Forma */
    --zd-radius-sm: 8px;
    --zd-radius: 12px;
    --zd-radius-lg: 16px;
    --zd-radius-pill: 999px;

    /* Profondità */
    --zd-shadow-1: 0 1px 2px rgba(15, 23, 42, .05);
    --zd-shadow-2: 0 1px 2px rgba(15, 23, 42, .04), 0 6px 16px -6px rgba(15, 23, 42, .10);
    --zd-shadow-3: 0 12px 32px -8px rgba(15, 23, 42, .18);   /* dialog, menu a comparsa */

    /* Spaziatura (scala 4) */
    --zd-space-1: 4px;  --zd-space-2: 8px;  --zd-space-3: 12px;
    --zd-space-4: 16px; --zd-space-5: 24px; --zd-space-6: 32px;

    /* Tipografia */
    --zd-font: "Inter", system-ui, -apple-system, "Segoe UI", Roboto, sans-serif;
    --zd-font-size: 14px;
    --zd-font-size-sm: 13px;
    --zd-h1: 22px;
    --zd-h2: 18px;

    /* Movimento */
    --zd-ease: cubic-bezier(.2, .8, .2, 1);
    --zd-dur-fast: 120ms;
    --zd-dur: 200ms;
    --zd-dur-slow: 280ms;

    color-scheme: light;
}

/* Al cambio di tema niente transizioni a metà strada (classe messa per un attimo da zcdTheme.set). */
html.zcd-theme-switching *, html.zcd-theme-switching *::before, html.zcd-theme-switching *::after { transition: none !important; }

@media (prefers-reduced-motion: reduce) {
    :root { --zd-dur-fast: 0ms; --zd-dur: 0ms; --zd-dur-slow: 0ms; }
}

/* ============================================================================
   Modalità SCURA (2026-10-09)

   Solo per l'area di lavoro e il pannello (MainLayout): l'attributo data-theme="dark"
   su <html> lo scrive js/theme.js leggendo la scelta salvata nel browser (localStorage
   "zcd-theme"), prima della prima pittura. Login, pagine pubbliche di prenotazione e
   pagine legali restano chiare: non passano da MainLayout e non ricevono l'attributo.

   Si ridefiniscono SOLO i token: tutti i fogli che li usano diventano scuri da soli.
   Le variabili --mud-palette-* che i fogli non riconducono già ai token si ridirigono
   qui (specificità 0,1,1, sopra il :root del MudThemeProvider): il tema C# resta chiaro
   e non serve un secondo giro di render lato server.
   ============================================================================ */
html[data-theme="dark"] {
    color-scheme: dark;

    --zd-canvas: #0E1016;
    --zd-surface: #161922;
    --zd-surface-2: #1B1F2A;
    --zd-surface-hover: #222736;
    --zd-border: #272C3A;
    --zd-border-strong: #384054;

    --zd-text: #E7E9F0;
    --zd-text-2: #A9B0C2;
    --zd-text-3: #808AA0;
    --zd-text-inverse: #0E1016;

    --zd-brand: #818CF8;
    --zd-brand-hover: #A5B4FC;
    --zd-brand-soft: rgba(129, 140, 248, .14);
    --zd-brand-ring: rgba(129, 140, 248, .35);

    --zd-sidebar-bg: #0A0B14;
    --zd-sidebar-bg-2: #12142A;
    --zd-sidebar-border: rgba(255, 255, 255, .05);

    --zd-topbar-bg: #161922;

    --zd-success: #34D399;  --zd-success-soft: rgba(52, 211, 153, .12);
    --zd-warning: #FBBF24;  --zd-warning-soft: rgba(251, 191, 36, .12);
    --zd-danger:  #F87171;  --zd-danger-soft:  rgba(248, 113, 113, .12);
    --zd-info:    #38BDF8;  --zd-info-soft:    rgba(56, 189, 248, .12);
    --zd-success-ink: #6EE7B7;
    --zd-warning-ink: #FCD34D;
    --zd-danger-ink:  #FCA5A5;
    --zd-info-ink:    #7DD3FC;

    --zd-shadow-1: 0 1px 2px rgba(0, 0, 0, .35);
    --zd-shadow-2: 0 1px 2px rgba(0, 0, 0, .30), 0 8px 20px -8px rgba(0, 0, 0, .55);
    --zd-shadow-3: 0 16px 40px -8px rgba(0, 0, 0, .70);

    --zd-ink-mix: #FFFFFF;

    /* MudBlazor: superfici, testi e stati dei controlli sui token scuri. */
    --mud-palette-background: var(--zd-canvas);
    --mud-palette-background-gray: var(--zd-surface-2);
    --mud-palette-background-grey: var(--zd-surface-2);
    --mud-palette-surface: var(--zd-surface);
    --mud-palette-appbar-background: var(--zd-topbar-bg);
    --mud-palette-appbar-text: var(--zd-text);
    --mud-palette-text-primary: var(--zd-text);
    --mud-palette-text-secondary: var(--zd-text-3);
    --mud-palette-text-disabled: rgba(231, 233, 240, .38);
    --mud-palette-action-default: var(--zd-text-2);
    --mud-palette-action-default-hover: rgba(255, 255, 255, .06);
    --mud-palette-action-disabled: rgba(231, 233, 240, .30);
    --mud-palette-action-disabled-background: rgba(231, 233, 240, .10);
    --mud-palette-lines-default: var(--zd-border);
    --mud-palette-lines-inputs: var(--zd-border-strong);
    --mud-palette-table-lines: var(--zd-border);
    --mud-palette-table-striped: var(--zd-surface-2);
    --mud-palette-table-hover: var(--zd-surface-hover);
    --mud-palette-divider: var(--zd-border);
    --mud-palette-divider-light: var(--zd-border);
    --mud-palette-overlay-dark: rgba(0, 0, 0, .6);
    --mud-palette-skeleton: rgba(255, 255, 255, .08);
    --mud-palette-dark: #2A3040;
    --mud-palette-dark-text: var(--zd-text);
    --mud-palette-success: var(--zd-success);
    --mud-palette-warning: var(--zd-warning);
    --mud-palette-error: var(--zd-danger);
    --mud-palette-success-text: #062A1E;
    --mud-palette-warning-text: #2A1E03;
    --mud-palette-error-text: #2A0909;
}

/* ==== css/app.css ==== */
/* ===========================================================
   ZcodedepthV — base globale dell'app (restyling 2026-10-08)
   -----------------------------------------------------------
   Stile da gestionale professionale, UGUALE per pannello admin,
   aree dei clienti e login:
   - sfondo pagina a tinta unita (--zd-canvas), niente gradienti,
     righe, aloni o scene animate;
   - barra in alto bianca, menu laterale scuro (--zd-sidebar-bg);
   - contenuti su card bianche con bordo sottile e ombra leggera;
   - animazioni brevi (--zd-dur*), spente con prefers-reduced-motion.
   I VALORI stanno in design-tokens.css (--zd-*): qui solo il loro uso.
   Il colore del settore resta come ACCENTO (--accent* per verticale,
   --mud-palette-primary dal tema MudBlazor), mai come sfondo.
   =========================================================== */

/* I font sono in css/fonts.css, ospitati in locale (niente IP dei visitatori a Google). */

:root {
    /* ---- Variabili storiche, ora ALIAS dei token condivisi ----
       Molti fogli e pagine usano ancora --canvas/--surface/--text/--border:
       puntano tutte al design system, quindi superfici, testi e bordi sono
       identici in ogni area. Per pagine nuove usare direttamente --zd-*. */
    --canvas: var(--zd-canvas);
    --drawer-bg: var(--zd-sidebar-bg);
    --surface: var(--zd-surface);
    --surface-2: var(--zd-surface-2);
    --surface-3: var(--zd-surface-hover);
    --text: var(--zd-text);
    --text-muted: var(--zd-text-2);
    --text-faint: var(--zd-text-3);
    --text-on-ink: #E2E8F0;
    --text-on-accent: #FFFFFF;
    --border: var(--zd-border);
    --border-strong: var(--zd-border-strong);
    --neutral-border: var(--zd-border);
    --neutral-border-hover: var(--zd-border-strong);
    --ink: var(--zd-sidebar-bg);
    --ink-soft: var(--zd-sidebar-bg-2);

    /* ---- Accento: di default il Primary del tema MudBlazor del verticale attivo (lo inietta
       MudThemeProvider), così anche i verticali senza un blocco qui sotto hanno il loro colore
       invece di quello di BarberFlow. I blocchi html[data-vertical] lo affinano a mano. ---- */
    --accent: var(--mud-palette-primary, #A87545);
    --accent-dark: var(--mud-palette-primary-darken, #8B5D38);
    --accent-darker: var(--mud-palette-primary-darken, #724A2B);
    --accent-light: var(--mud-palette-primary-lighten, #C99670);
    --accent-tint: rgba(var(--mud-palette-primary-rgb, 168, 117, 69), 0.09);
    --accent-tint-strong: rgba(var(--mud-palette-primary-rgb, 168, 117, 69), 0.18);

    /* alias retrocompatibili (le classi storiche usano --teal-*) */
    --teal: var(--accent);
    --teal-dark: var(--accent-dark);
    --teal-darker: var(--accent-darker);
    --teal-light: var(--accent-light);
    --teal-tint: var(--accent-tint);
    --teal-tint-strong: var(--accent-tint-strong);

    /* secondario + highlight del verticale (solo dettagli) */
    --sage: #5A7561;
    --sage-dark: #43594B;
    --sage-tint: rgba(90, 117, 97, 0.12);
    --brass: #C9A961;
    --brass-tint: rgba(201, 169, 97, 0.18);

    /* stati: uguali ovunque */
    --success: var(--zd-success);
    --success-tint: var(--zd-success-soft);
    --error: var(--zd-danger);
    --error-tint: var(--zd-danger-soft);
    --warning: var(--zd-warning);
    --warning-tint: var(--zd-warning-soft);
    --info: var(--zd-info);
    --info-tint: var(--zd-info-soft);

    /* geometria / ombre / movimento: alias dei token */
    --r-sm: var(--zd-radius-sm);
    --r-md: var(--zd-radius);
    --r-lg: var(--zd-radius-lg);
    --shadow-xs: var(--zd-shadow-1);
    --shadow-sm: var(--zd-shadow-2);
    --shadow-md: var(--zd-shadow-2);
    --shadow-lg: var(--zd-shadow-3);
    --ease: var(--zd-dur) var(--zd-ease);
    --ease-slow: var(--zd-dur-slow) var(--zd-ease);

    /* Altezza della barra in alto: stessa per ogni larghezza (prima 56/48/64 a gradini).
       Serve a chi resta "sticky" subito sotto: barre delle tab admin, sezioni del Budget. */
    --zcd-appbar-h: var(--zd-topbar-height);
}

/* ===========================================================
   ACCENTI PER VERTICALE — cambia SOLO il colore di accento, mai superfici o layout.
   Lo switch avviene via [data-vertical] su <html> (server-side
   in App.razor, riallineato via JS dalla shell).
   =========================================================== */

/* ---------- DentalFlow — teal clinico ---------- */
html[data-vertical="dentalflow"] {
    --accent: #0E7490; --accent-dark: #0B5E73; --accent-darker: #084A5C; --accent-light: #5EC9D6;
    --accent-tint: rgba(14, 116, 144, 0.09); --accent-tint-strong: rgba(14, 116, 144, 0.18);
    --sage: #0EA5A5; --sage-dark: #0B7C7C; --sage-tint: rgba(14, 165, 165, 0.12);
    --brass: #5EC9D6; --brass-tint: rgba(94, 201, 214, 0.20);
}

/* ---------- MedicoFlow — blu clinico ---------- */
html[data-vertical="medicoflow"] {
    --accent: #2563EB; --accent-dark: #1E40AF; --accent-darker: #1E3A8A; --accent-light: #93C5FD;
    --accent-tint: rgba(37, 99, 235, 0.09); --accent-tint-strong: rgba(37, 99, 235, 0.18);
    --sage: #3B82F6; --sage-dark: #1D4ED8; --sage-tint: rgba(59, 130, 246, 0.12);
    --brass: #93C5FD; --brass-tint: rgba(147, 197, 253, 0.20);
}

/* ---------- EsteticaFlow — rosa cipria/magenta ---------- */
html[data-vertical="esteticaflow"] {
    --accent: #BE185D; --accent-dark: #9D174D; --accent-darker: #831843; --accent-light: #F472B6;
    --accent-tint: rgba(190, 24, 93, 0.09); --accent-tint-strong: rgba(190, 24, 93, 0.18);
    --sage: #DB2777; --sage-dark: #BE185D; --sage-tint: rgba(219, 39, 119, 0.12);
    --brass: #F472B6; --brass-tint: rgba(244, 114, 182, 0.22);
}

/* ---------- VaultFlow — indaco/viola ---------- */
html[data-vertical="vaultflow"] {
    --accent: #6D28D9; --accent-dark: #5B21B6; --accent-darker: #4A1A93; --accent-light: #A78BFA;
    --accent-tint: rgba(109, 40, 217, 0.09); --accent-tint-strong: rgba(109, 40, 217, 0.18);
    --sage: #9333EA; --sage-dark: #7E22CE; --sage-tint: rgba(147, 51, 234, 0.12);
    --brass: #A78BFA; --brass-tint: rgba(167, 139, 250, 0.22);
}

/* ---------- BudgetFlow — verde smeraldo ---------- */
html[data-vertical="budgetflow"] {
    --accent: #047857; --accent-dark: #036249; --accent-darker: #024C39; --accent-light: #34D399;
    --accent-tint: rgba(4, 120, 87, 0.09); --accent-tint-strong: rgba(4, 120, 87, 0.18);
    --sage: #B45309; --sage-dark: #92400E; --sage-tint: rgba(180, 83, 9, 0.12);
    --brass: #10B981; --brass-tint: rgba(16, 185, 129, 0.20);
}

/* ---------- Palestra — arancio energia su antracite ---------- */
html[data-vertical="palestra"] {
    --accent: #EA580C; --accent-dark: #C2410C; --accent-darker: #9A3412; --accent-light: #FB923C;
    --accent-tint: rgba(234, 88, 12, 0.09); --accent-tint-strong: rgba(234, 88, 12, 0.18);
    --sage: #0EA5E9; --sage-dark: #0284C7; --sage-tint: rgba(14, 165, 233, 0.12);
    --brass: #FACC15; --brass-tint: rgba(250, 204, 21, 0.22);
}

/* ---------- StewardFlow — blu acciaio su grafite ---------- */
html[data-vertical="stewardflow"] {
    --accent: #1D4ED8; --accent-dark: #1E40AF; --accent-darker: #1E3A8A; --accent-light: #60A5FA;
    --accent-tint: rgba(29, 78, 216, 0.09); --accent-tint-strong: rgba(29, 78, 216, 0.18);
    --sage: #475569; --sage-dark: #334155; --sage-tint: rgba(71, 85, 105, 0.12);
    --brass: #38BDF8; --brass-tint: rgba(56, 189, 248, 0.20);
}

/* ---------- GuidaFlow — blu notte + oro (autoscuola) ---------- */
html[data-vertical="guidaflow"] {
    --accent: #1E3A8A; --accent-dark: #172E6E; --accent-darker: #122355; --accent-light: #3B82F6;
    --accent-tint: rgba(30, 58, 138, 0.09); --accent-tint-strong: rgba(30, 58, 138, 0.18);
    --sage: #CA8A04; --sage-dark: #A16207; --sage-tint: rgba(202, 138, 4, 0.14);
    --brass: #CA8A04; --brass-tint: rgba(202, 138, 4, 0.22);
}

/* ---------- SportFlow — alias palestra (retrocompatibilità) ---------- */
html[data-vertical="sportflow"] {
    --accent: #EA580C; --accent-dark: #C2410C; --accent-darker: #9A3412; --accent-light: #FB923C;
    --accent-tint: rgba(234, 88, 12, 0.09); --accent-tint-strong: rgba(234, 88, 12, 0.18);
    --sage: #0EA5E9; --sage-dark: #0284C7; --sage-tint: rgba(14, 165, 233, 0.12);
    --brass: #FACC15; --brass-tint: rgba(250, 204, 21, 0.22);
}

/* ---------- ScuolaFlow — alias guidaflow (retrocompatibilità) ---------- */
html[data-vertical="scuolaflow"] {
    --accent: #1E3A8A; --accent-dark: #172E6E; --accent-darker: #122355; --accent-light: #3B82F6;
    --accent-tint: rgba(30, 58, 138, 0.09); --accent-tint-strong: rgba(30, 58, 138, 0.18);
    --sage: #CA8A04; --sage-dark: #A16207; --sage-tint: rgba(202, 138, 4, 0.14);
    --brass: #CA8A04; --brass-tint: rgba(202, 138, 4, 0.22);
}

/* ---------- TattooFlow — crimson/ink ---------- */
html[data-vertical="tattooflow"] {
    --accent: #9B1B1B; --accent-dark: #7A1212; --accent-darker: #5C0D0D; --accent-light: #C94040;
    --accent-tint: rgba(155, 27, 27, 0.09); --accent-tint-strong: rgba(155, 27, 27, 0.18);
    --sage: #5C3317; --sage-dark: #3E2210; --sage-tint: rgba(92, 51, 23, 0.13);
    --brass: #D4AF37; --brass-tint: rgba(212, 175, 55, 0.22);
}

/* ---------- RistoFlow — terracotta/pomodoro ---------- */
html[data-vertical="ristoflow"] {
    --accent: #C0392B; --accent-dark: #A12C20; --accent-darker: #7F2018; --accent-light: #E07A6E;
    --accent-tint: rgba(192, 57, 43, 0.09); --accent-tint-strong: rgba(192, 57, 43, 0.18);
    --sage: #E67E22; --sage-dark: #CA6510; --sage-tint: rgba(230, 126, 34, 0.13);
    --brass: #D4A017; --brass-tint: rgba(212, 160, 23, 0.22);
}

/* ---------- Piattaforma (pre-login) — marchio ZcodedepthV ---------- */
html[data-vertical="platform"] {
    --accent: #4F46E5; --accent-dark: #4338CA; --accent-darker: #3730A3; --accent-light: #818CF8;
    --accent-tint: rgba(79, 70, 229, 0.09); --accent-tint-strong: rgba(79, 70, 229, 0.16);
    --sage: #7C3AED; --sage-dark: #6D28D9; --sage-tint: rgba(124, 58, 237, 0.12);
    --brass: #6366F1; --brass-tint: rgba(99, 102, 241, 0.20);
}

/* ---------- SuperAdmin — slate/indaco corporate ---------- */
html[data-vertical="superadmin"] {
    --accent: #4F46E5; --accent-dark: #4338CA; --accent-darker: #3730A3; --accent-light: #818CF8;
    --accent-tint: rgba(79, 70, 229, 0.09); --accent-tint-strong: rgba(79, 70, 229, 0.16);
    --sage: #475569; --sage-dark: #334155; --sage-tint: rgba(71, 85, 105, 0.12);
    --brass: #0EA5E9; --brass-tint: rgba(14, 165, 233, 0.16);
}

/* ---------- Tema scuro: accenti dal primario schiarito ----------
   Le tonalità "dark/darker" qui sopra servono come TESTO sul bianco; sul fondo scuro
   sparirebbero. In tema scuro tutte le varianti puntano al primario che la shell schiarisce
   per ogni verticale (VerticalThemeFactory.DarkAccentCss). Specificità 0,2,1: batte i blocchi sopra. */
html[data-theme="dark"][data-vertical] {
    --accent: var(--mud-palette-primary);
    --accent-dark: var(--mud-palette-primary);
    --accent-darker: var(--mud-palette-primary);
    --accent-light: var(--mud-palette-primary-lighten);
    --accent-tint: rgba(var(--mud-palette-primary-rgb), 0.12);
    --accent-tint-strong: rgba(var(--mud-palette-primary-rgb), 0.22);
}

/* ===================== KEYFRAMES ===================== */
/* Ingresso delle pagine: dissolvenza con 4px di salita. Fill "backwards": finita l'animazione
   non resta nessun transform, che altrimenti renderebbe l'elemento il riferimento dei figli
   position:fixed (overlay, menu) — trappola già vista con la vecchia pageIn. */
@keyframes zd-page-in {
    from { opacity: 0; transform: translateY(4px); }
    to   { opacity: 1; transform: none; }
}
@keyframes zd-pop-in {
    from { opacity: 0; transform: translateY(4px) scale(0.985); }
    to   { opacity: 1; transform: none; }
}
@keyframes zd-fade-in {
    from { opacity: 0; }
    to   { opacity: 1; }
}
/* Nomi storici ancora usati da altri fogli: stessa resa sobria. */
@keyframes pageIn { from { opacity: 0; transform: translateY(4px); } to { opacity: 1; transform: none; } }
@keyframes popIn  { from { opacity: 0; transform: scale(0.985); } to { opacity: 1; transform: none; } }

/* ===================== BASE ===================== */
* { box-sizing: border-box; }

html, body {
    font-family: var(--zd-font);
    height: 100%;
    margin: 0;
    color: var(--zd-text);
    -webkit-font-smoothing: antialiased;
    -moz-osx-font-smoothing: grayscale;
    text-rendering: optimizeLegibility;
    /* Base dei rem invariata (15px, 14px su telefono): MudBlazor e tutti i fogli misurano in
       rem, cambiarla ridimensionerebbe l'intera app. Il testo semplice usa il token. */
    font-size: 15px;
    line-height: 1.5;
}
body { font-size: var(--zd-font-size); }

/* Sfondo: TINTA UNITA, uguale per admin, clienti e login. !important perché
   MudThemeProvider inietta il proprio background sul body. */
html,
body { background: var(--zd-canvas) !important; }

/* Le superfici di MudLayout restano trasparenti: il colore è quello del body. */
.mud-layout,
.mud-main-content { background: transparent !important; }

/* Footer sempre in fondo (sticky footer). Catena flex completa a partire da
   .mud-layout: appbar e drawer sono position:fixed, l'unico figlio in flusso è il
   main-content, che a sua volta è colonna flex e spinge l'AppFooter in fondo. */
.mud-layout {
    display: flex;
    flex-direction: column;
    min-height: 100dvh;
    height: auto;
}
.mud-layout > .mud-main-content {
    flex: 1 0 auto;
    display: flex;
    flex-direction: column;
    min-height: 0;
    /* Barra in alto ad altezza unica (MudBlazor la riduce a gradini su telefono). */
    padding-top: var(--zd-topbar-height);
}
.mud-main-content > .mud-container {
    flex: 1 0 auto;
}

/* Contenitore della pagina: respiro uniforme, più stretto su telefono. */
.mud-main-content > .zd-content {
    padding-top: var(--zd-space-5);
    padding-bottom: var(--zd-space-6);
}

.mud-typography { font-family: var(--zd-font); }

h1, h2, h3, h4, h5, h6,
.mud-typography-h1, .mud-typography-h2, .mud-typography-h3,
.mud-typography-h4, .mud-typography-h5, .mud-typography-h6 {
    font-family: var(--zd-font);
    font-weight: 650;
    letter-spacing: -0.015em;
    color: var(--zd-text);
}

/* Titoli "hero" (onboarding/booking pubblico): stessa famiglia del resto, solo più peso.
   Il serif decorativo stonava con lo stile da gestionale. */
.auth-logo,
.mud-typography-h4.hero-title,
.mud-typography-h5.hero-title {
    font-family: var(--zd-font);
    font-weight: 700;
    letter-spacing: -0.02em;
}

.mud-typography-overline {
    color: var(--zd-text-3);
    letter-spacing: 0.06em;
    font-weight: 600;
}

.mud-text-secondary,
.mud-typography-body2.mud-text-secondary { color: var(--zd-text-2) !important; }

a, .mud-link { color: var(--accent-dark); }
a:hover { color: var(--accent-darker); }

::selection { background: var(--accent-tint-strong); color: var(--zd-text); }

:focus-visible {
    outline: 2px solid var(--accent);
    outline-offset: 2px;
    border-radius: 4px;
}

/* ===================== INGRESSO DELLE PAGINE =====================
   I figli diretti del contenitore pagina sono nodi NUOVI a ogni cambio pagina (Blazor
   rende @Body in linea): entrano con una dissolvenza breve. I re-render della stessa
   pagina riusano i nodi e non la ripetono. Zed e i banner del layout restano fermi. */
.mud-main-content > .zd-content > *:not(.layout-banner):not(.zed-assist):not(.zed-hero-bar) {
    animation: zd-page-in var(--zd-dur-slow) var(--zd-ease) backwards;
}

/* ===================== BARRA IN ALTO — bianca e piatta ===================== */
.mud-appbar {
    background: var(--zd-topbar-bg) !important;
    color: var(--zd-text) !important;
    box-shadow: none !important;
    border-bottom: 1px solid var(--zd-border);
}
.mud-appbar .mud-toolbar-appbar {
    height: var(--zd-topbar-height);
    gap: var(--zd-space-1);
    padding-inline: var(--zd-space-3) var(--zd-space-4);
}

.zd-topbar__brand {
    display: flex;
    align-items: center;
    gap: var(--zd-space-2);
    margin-left: var(--zd-space-2);
    min-width: 0;
}
.zd-topbar__name {
    font-weight: 700;
    font-size: 1rem;
    letter-spacing: -0.01em;
    color: var(--zd-text);
    white-space: nowrap;
    overflow: hidden;
    text-overflow: ellipsis;
}
/* Con il menu aperto su desktop il marchio è già in testa al menu: qui non si ripete. */
.zd-topbar__brand--when-closed { display: none; }
@media (max-width: 59.99em) {
    .zd-topbar__brand--when-closed { display: flex; }
}

/* Frase fissa al centro dell'header, uguale per tutti i verticali: discreta. */
.appbar-tagline {
    color: var(--zd-text-3) !important;
    font-size: var(--zd-font-size-sm) !important;
    white-space: nowrap;
}
@media (max-width: 74.99em) {
    .appbar-tagline { display: none; }
}

.mud-appbar .mud-icon-button {
    color: var(--zd-text-2) !important;
    transition: background-color var(--zd-dur-fast) var(--zd-ease), color var(--zd-dur-fast) var(--zd-ease);
}
.mud-appbar .mud-icon-button .mud-icon-root { color: inherit !important; }
.mud-appbar .mud-icon-button:hover {
    background: var(--zd-surface-hover) !important;
    color: var(--zd-text) !important;
}
.mud-appbar .mud-button-root { color: var(--zd-text-2) !important; }

.mud-appbar .mud-text-secondary,
.mud-appbar .mud-typography-body1,
.mud-appbar .mud-typography-body2 { color: var(--zd-text-2) !important; }

/* Utente collegato: solo l'email, in una pastiglia (sparisce su telefono). L'iniziale
   colorata accanto è stata tolta il 2026-10-09 su richiesta del titolare. */
.appbar-user {
    display: flex;
    align-items: center;
    gap: var(--zd-space-2);
    min-width: 0;
    padding: 5px 12px;
    border-radius: var(--zd-radius-pill);
    border: 1px solid var(--zd-border);
    background: var(--zd-surface);
}
.appbar-user__name {
    font-size: var(--zd-font-size-sm);
    color: var(--zd-text-2);
    white-space: nowrap;
    overflow: hidden;
    text-overflow: ellipsis;
    max-width: 240px;
}

/* Contatori della posta e di Telegram (MainLayout, solo SuperAdmin): pastiglia piccola
   appoggiata all'angolo, con un anello del colore della barra al posto del bordo. */
.mail-badge .mud-badge {
    min-width: 16px !important;
    height: 16px !important;
    padding: 0 4px !important;
    font-size: 0.62rem !important;
    font-weight: 700 !important;
    line-height: 16px !important;
    border-radius: var(--zd-radius-pill) !important;
    border: none !important;
    box-shadow: 0 0 0 2px var(--zd-topbar-bg) !important;
    transform: translate(30%, -30%) !important;
}
.mail-badge .mud-icon-button { padding: 8px; }

/* ===================== MENU LATERALE ===================== */
/* Scuro (--zd-sidebar-bg) in ogni area: admin e clienti. Del verticale resta solo
   l'accento della voce attiva e del marchio in testa. */
.mud-drawer.zd-sidebar {
    background: var(--zd-sidebar-bg) !important;
    color: var(--zd-sidebar-text) !important;
    border-right: 1px solid var(--zd-sidebar-border) !important;
    box-shadow: none;
    overflow: hidden;              /* scorre solo l'area delle voci (.zd-nav) */
}
.zd-sidebar .mud-drawer-content {
    display: flex;
    flex-direction: column;
    height: 100%;
    min-height: 0;
    overflow: hidden;
}

/* Marchio in testa al menu: tessera con l'icona del verticale + nome e area. */
.zd-sidebar__brand {
    flex: 0 0 auto;
    display: flex;
    align-items: center;
    gap: var(--zd-space-3);
    height: var(--zd-topbar-height);
    padding: 0 var(--zd-space-5);
    border-bottom: 1px solid var(--zd-sidebar-border);
}
.zd-sidebar__brand-text {
    display: flex;
    flex-direction: column;
    min-width: 0;
    line-height: 1.2;
}
.zd-sidebar__name {
    color: var(--zd-sidebar-text-strong);
    font-weight: 700;
    font-size: 0.98rem;
    letter-spacing: -0.01em;
    white-space: nowrap;
    overflow: hidden;
    text-overflow: ellipsis;
}
.zd-sidebar__sub {
    color: var(--zd-sidebar-section);
    font-size: 0.72rem;
    font-weight: 500;
}

.zd-brand-mark {
    flex: 0 0 auto;
    display: inline-grid;
    place-items: center;
    width: 34px;
    height: 34px;
    border-radius: 10px;
    background: var(--zd-brand-gradient);
    color: #FFFFFF;
}
.zd-brand-mark .mud-icon-root { color: #FFFFFF !important; font-size: 1.25rem; }
.zd-brand-mark--sm { width: 28px; height: 28px; border-radius: 8px; }
.zd-brand-mark--sm .mud-icon-root { font-size: 1.05rem; }
/* Nei verticali la tessera prende l'accento del settore (dettaglio, non sfondo). */
html:not([data-vertical="superadmin"]):not([data-vertical="platform"]) .zd-brand-mark {
    background: var(--mud-palette-primary, var(--accent));
}

/* Area delle voci: scorre, ma SENZA barra di scorrimento visibile. L'indizio che c'è
   altro sotto è una sfumatura in basso, accesa da js/nav.js solo quando serve. */
.zd-nav {
    flex: 1 1 auto;
    min-height: 0;
    overflow-y: auto;
    overflow-x: hidden;
    overscroll-behavior: contain;
    scrollbar-width: none;
    -ms-overflow-style: none;
    padding: var(--zd-space-3) 0 var(--zd-space-5);
}
.zd-nav::-webkit-scrollbar { display: none; width: 0; height: 0; }
.zd-nav.is-more-below {
    -webkit-mask-image: linear-gradient(to bottom, #000 calc(100% - 40px), transparent 100%);
            mask-image: linear-gradient(to bottom, #000 calc(100% - 40px), transparent 100%);
}
.zd-nav .mud-navmenu { padding: 0; }

/* Voce del menu */
.zd-sidebar .mud-nav-link {
    position: relative;
    display: flex;
    align-items: center;
    width: auto;
    flex: 1 1 auto;
    min-width: 0;
    min-height: 38px;
    margin: 1px var(--zd-space-3);
    padding: 7px var(--zd-space-3);
    border-radius: var(--zd-radius-sm);
    color: var(--zd-sidebar-text) !important;
    font-size: var(--zd-font-size);
    font-weight: 500;
    line-height: 1.35;
    border: 0 !important;
    transition: background-color var(--zd-dur-fast) var(--zd-ease), color var(--zd-dur-fast) var(--zd-ease);
}
.zd-sidebar .mud-nav-link .mud-nav-link-text { margin-left: var(--zd-space-3); margin-inline-start: var(--zd-space-3); min-width: 0; }
.zd-sidebar .mud-nav-link .mud-nav-link-icon,
.zd-sidebar .mud-nav-link .mud-icon-root {
    color: inherit !important;
    font-size: 1.2rem;
    opacity: 0.85;
    flex: 0 0 auto;
}
.zd-sidebar .mud-nav-link:hover:not(.mud-nav-link-disabled) {
    background: var(--zd-sidebar-bg-2) !important;
    color: var(--zd-sidebar-text-strong) !important;
}
.zd-sidebar .mud-nav-link.active:not(.mud-nav-link-disabled) {
    background: var(--zd-sidebar-active-bg) !important;
    color: var(--zd-sidebar-text-strong) !important;
    font-weight: 600 !important;
}
.zd-sidebar .mud-nav-link.active .mud-icon-root { opacity: 1; }
/* Barretta della voce attiva: il gradiente del marchio, dentro la pillola (mud-ripple ha
   overflow:hidden e taglierebbe tutto ciò che sporge). */
.zd-sidebar .mud-nav-link.active:not(.mud-nav-link-disabled)::before {
    content: "";
    position: absolute;
    left: 0;
    top: 8px;
    bottom: 8px;
    width: 3px;
    border-radius: 0 3px 3px 0;
    background: var(--zd-brand-gradient);
}
.zd-sidebar .mud-nav-link:focus-visible {
    outline: 2px solid rgba(139, 92, 246, 0.7);
    outline-offset: -2px;
}

/* Etichetta con contatore (Assistenza, Richieste, errori di Sistema). */
.zd-nav-label {
    display: flex;
    align-items: center;
    gap: var(--zd-space-2);
    min-width: 0;
}
.zd-nav-label__text {
    min-width: 0;
    overflow: hidden;
    text-overflow: ellipsis;
    white-space: nowrap;
}
.zd-nav-badge {
    flex: 0 0 auto;
    margin-left: auto;
    display: inline-flex;
    align-items: center;
    justify-content: center;
    min-width: 20px;
    height: 20px;
    padding: 0 7px;
    border-radius: var(--zd-radius-pill);
    background: var(--zd-danger);
    color: #FFFFFF;
    font-size: 0.7rem;
    font-weight: 700;
    line-height: 1;
    animation: zd-pop-in var(--zd-dur) var(--zd-ease) backwards;
}

/* Separatore tra sezioni (DividerBefore dei moduli). */
.zd-nav-sep {
    height: 1px;
    margin: var(--zd-space-3) var(--zd-space-5);
    background: var(--zd-sidebar-border);
}

/* Gruppo ad albero: intestazione cliccabile + corpo che si apre con un'animazione fluida
   (grid-template-rows 0fr → 1fr: altezza vera, senza misure scritte a mano). */
.zd-nav-group { margin: 2px 0; }
.zd-nav-group__head {
    all: unset;
    box-sizing: border-box;
    display: flex;
    align-items: center;
    gap: var(--zd-space-3);
    width: calc(100% - 2 * var(--zd-space-3));
    min-height: 40px;
    margin: 1px var(--zd-space-3);
    padding: 8px var(--zd-space-3);
    border-radius: var(--zd-radius-sm);
    color: var(--zd-sidebar-text);
    font-size: var(--zd-font-size);
    font-weight: 600;
    cursor: pointer;
    transition: background-color var(--zd-dur-fast) var(--zd-ease), color var(--zd-dur-fast) var(--zd-ease);
}
.zd-nav-group__head:hover { background: var(--zd-sidebar-bg-2); color: var(--zd-sidebar-text-strong); }
.zd-nav-group__head:focus-visible { outline: 2px solid rgba(139, 92, 246, 0.7); outline-offset: -2px; }
.zd-nav-group__icon { font-size: 1.2rem !important; color: inherit !important; opacity: 0.85; }
.zd-nav-group__title { flex: 1 1 auto; min-width: 0; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
.zd-nav-group__chevron {
    font-size: 1.15rem !important;
    color: var(--zd-sidebar-section) !important;
    transition: transform var(--zd-dur) var(--zd-ease);
}
.zd-nav-group__head .zd-nav-badge { margin-left: 0; }
.zd-nav-group.is-open > .zd-nav-group__head { color: var(--zd-sidebar-text-strong); }
.zd-nav-group.is-open .zd-nav-group__chevron { transform: rotate(180deg); }
/* Gruppo chiuso che contiene la pagina corrente: un punto d'accento accanto al titolo. */
.zd-nav-group.has-active:not(.is-open) .zd-nav-group__title::after {
    content: "";
    display: inline-block;
    width: 6px;
    height: 6px;
    margin-left: 8px;
    vertical-align: middle;
    border-radius: 50%;
    background: var(--zd-brand-gradient);
}

.zd-nav-group__body {
    display: grid;
    grid-template-rows: 0fr;
    transition: grid-template-rows var(--zd-dur-slow) var(--zd-ease);
}
.zd-nav-group.is-open > .zd-nav-group__body { grid-template-rows: 1fr; }
.zd-nav-group__inner {
    min-height: 0;
    overflow: hidden;
    position: relative;
}
/* Rami dell'albero: filo verticale sottile a sinistra delle voci figlie. */
.zd-nav-group__inner::before {
    content: "";
    position: absolute;
    left: calc(var(--zd-space-3) + 21px);
    top: 4px;
    bottom: 6px;
    width: 1px;
    background: var(--zd-sidebar-border);
}
.zd-nav-group__inner .mud-nav-link {
    margin-left: calc(var(--zd-space-3) + 30px);
    padding-left: var(--zd-space-3);
    min-height: 34px;
    font-size: var(--zd-font-size-sm);
}
.zd-nav-group__inner .mud-nav-link .mud-icon-root { font-size: 1.05rem; opacity: 0.7; }
/* Le voci entrano scivolando appena quando il gruppo si apre. */
.zd-nav-group.is-open .zd-nav-group__inner .mud-nav-link {
    animation: zd-fade-in var(--zd-dur-slow) var(--zd-ease) backwards;
}

/* Add-on attivi del tenant (AddonNavSection): stessa resa, separati da un filo. */
.zd-sidebar .mud-navmenu > .mud-divider,
.zd-sidebar .mud-divider {
    border-color: var(--zd-sidebar-border) !important;
    margin: var(--zd-space-3) var(--zd-space-5);
}
.zd-sidebar .mud-typography,
.zd-sidebar .mud-typography-overline { color: var(--zd-sidebar-section); }

/* Telefono/tablet: il menu è un pannello sopra il contenuto, con velo morbido. */
.mud-drawer-responsive.zd-sidebar,
.mud-drawer-temporary.zd-sidebar { transition: transform var(--zd-dur-slow) var(--zd-ease), width var(--zd-dur-slow) var(--zd-ease); }
.mud-overlay-drawer { background: rgba(11, 10, 32, 0.38) !important; }
@media (max-width: 59.99em) {
    .mud-drawer.zd-sidebar.mud-drawer--open { box-shadow: var(--zd-shadow-3); }
    /* Tap target ≥ 44px su touch. */
    .zd-sidebar .mud-nav-link,
    .zd-nav-group__head { min-height: 44px; }
    .zd-nav-group__inner .mud-nav-link { min-height: 42px; }
}

/* ===================== PAGE HEADER =====================
   Titolo direttamente sul canvas, senza card né aloni: icona in tessera
   tenue con l'accento, titolo scuro. */
.page-header {
    background: transparent !important;
    border: none !important;
    border-radius: 0 !important;
    box-shadow: none !important;
    position: relative;
    overflow: visible;
    padding: 0 0 var(--zd-space-4) !important;
}
.page-header .mud-icon-root { color: var(--accent) !important; }
.page-header .mud-typography-h4,
.page-header .mud-typography-h5 {
    color: var(--zd-text);
    font-size: var(--zd-h1);
    font-weight: 700;
    letter-spacing: -0.02em;
}

/* ===================== PULSANTI ===================== */
.mud-button-root {
    border-radius: var(--zd-radius-sm) !important;
    text-transform: none !important;
    font-weight: 600 !important;
    letter-spacing: 0 !important;
    transition: background-color var(--zd-dur-fast) var(--zd-ease), color var(--zd-dur-fast) var(--zd-ease),
                box-shadow var(--zd-dur-fast) var(--zd-ease), border-color var(--zd-dur-fast) var(--zd-ease);
}
.mud-button-filled { box-shadow: var(--zd-shadow-1) !important; }
.mud-button-filled:hover { box-shadow: var(--zd-shadow-2) !important; }
.mud-button-filled:active { box-shadow: none !important; }
/* Primario: colore pieno del tema (accento del verticale), niente gradienti né riflessi. */
.mud-button-filled.mud-button-filled-primary { color: var(--mud-palette-primary-text, #FFFFFF) !important; }

.mud-button-outlined.mud-button-outlined-default {
    border-color: var(--zd-border-strong) !important;
    color: var(--zd-text-2) !important;
}
.mud-button-outlined.mud-button-outlined-default:hover { background: var(--zd-surface-hover) !important; }

.mud-icon-button { transition: background-color var(--zd-dur-fast) var(--zd-ease), color var(--zd-dur-fast) var(--zd-ease); }

.mud-button-group-outlined .mud-button-root { border-color: var(--zd-border-strong) !important; }

/* ===================== CARD / PAPER ===================== */
.mud-paper {
    border-radius: var(--zd-radius) !important;
    border: 1px solid var(--zd-border);
    box-shadow: var(--zd-shadow-1) !important;
    background: var(--zd-surface) !important;
}
.mud-paper.mud-elevation-0 { box-shadow: none !important; }
.mud-paper.page-header {
    background: transparent !important;
    border: none !important;
    box-shadow: none !important;
}
/* Pannelli a comparsa: niente bordo/ombra della card (li gestiscono popover e menu). */
.mud-popover.mud-paper { border-radius: var(--zd-radius) !important; }
.mud-appbar.mud-paper, .mud-drawer.mud-paper { border-radius: 0 !important; }

.mud-card {
    border-radius: var(--zd-radius) !important;
    border: 1px solid var(--zd-border);
    box-shadow: var(--zd-shadow-1) !important;
    transition: box-shadow var(--zd-dur) var(--zd-ease), border-color var(--zd-dur) var(--zd-ease);
}
.mud-card:hover { box-shadow: var(--zd-shadow-2) !important; }
.mud-card-header {
    padding: var(--zd-space-4) var(--zd-space-5);
    border-bottom: 1px solid var(--zd-border);
}
.mud-card-header .mud-typography-h6 { font-size: 1rem; }
.mud-card-content { padding: var(--zd-space-5); }
.mud-card-actions { padding: var(--zd-space-3) var(--zd-space-4); gap: var(--zd-space-2); }

/* ===================== TABELLE ===================== */
.mud-data-grid,
.mud-table {
    border-radius: var(--zd-radius) !important;
    border: 1px solid var(--zd-border);
    box-shadow: var(--zd-shadow-1) !important;
    overflow: hidden;
    background: var(--zd-surface) !important;
}
.mud-data-grid .mud-table-head,
.mud-table .mud-table-head { background: var(--zd-surface-2) !important; }
.mud-data-grid .mud-table-head th,
.mud-data-grid .mud-table-head .mud-table-cell,
.mud-table .mud-table-head th {
    color: var(--zd-text-3) !important;
    font-weight: 600 !important;
    letter-spacing: 0.04em;
    text-transform: uppercase;
    font-size: 0.7rem;
    border-bottom: 1px solid var(--zd-border);
    padding-top: 12px;
    padding-bottom: 12px;
}
.mud-table-cell {
    border-bottom: 1px solid var(--zd-border);
    color: var(--zd-text);
    font-size: var(--zd-font-size);
}
.mud-table-row { transition: background-color var(--zd-dur-fast) var(--zd-ease); }
.mud-table-row:hover { background: var(--zd-surface-hover) !important; }
.mud-table-pagination,
.mud-table-toolbar {
    border-top: 1px solid var(--zd-border);
    background: var(--zd-surface);
    color: var(--zd-text-2);
}

/* ===================== DIALOG ===================== */
.mud-overlay-dialog { background: rgba(15, 23, 42, 0.36) !important; }
.mud-dialog {
    border-radius: var(--zd-radius-lg) !important;
    overflow: hidden;
    box-shadow: var(--zd-shadow-3) !important;
    border: 1px solid var(--zd-border);
    animation: zd-pop-in var(--zd-dur) var(--zd-ease) both;
}
.mud-dialog-title {
    background: var(--zd-surface) !important;
    color: var(--zd-text) !important;
    font-weight: 650 !important;
    font-size: 1.05rem;
    padding: 18px 24px !important;
    border-bottom: 1px solid var(--zd-border);
}
.mud-dialog-title .mud-icon-root { color: var(--accent) !important; }
.mud-dialog-content { padding: 24px !important; color: var(--zd-text); }
.mud-dialog-actions {
    background: var(--zd-surface-2) !important;
    padding: 14px 24px !important;
    gap: var(--zd-space-2);
    border-top: 1px solid var(--zd-border);
}
.mud-message-box .mud-dialog-content { padding: 24px !important; }

/* ===================== CHIP ===================== */
.mud-chip {
    border-radius: var(--zd-radius-pill) !important;
    font-weight: 600;
    font-size: 0.76rem;
}
.mud-chip.mud-chip-color-primary { background: var(--accent-tint-strong) !important; color: var(--accent-darker) !important; }
.mud-chip.mud-chip-color-secondary { background: var(--zd-surface-hover) !important; color: var(--zd-text-2) !important; }
.mud-chip.mud-chip-color-success { background: var(--zd-success-soft) !important; color: var(--zd-success-ink) !important; }
.mud-chip.mud-chip-color-error { background: var(--zd-danger-soft) !important; color: var(--zd-danger-ink) !important; }
.mud-chip.mud-chip-color-warning { background: var(--zd-warning-soft) !important; color: var(--zd-warning-ink) !important; }
.mud-chip.mud-chip-color-info { background: var(--zd-info-soft) !important; color: var(--zd-info-ink) !important; }
.mud-chip.mud-chip-color-default { background: var(--zd-surface-hover) !important; color: var(--zd-text-2) !important; }
.mud-chip.mud-clickable { transition: background-color var(--zd-dur-fast) var(--zd-ease), box-shadow var(--zd-dur-fast) var(--zd-ease); }
.mud-chip.mud-clickable:hover { box-shadow: var(--zd-shadow-1); }

/* ===================== AVVISI ===================== */
.mud-alert { border-radius: var(--zd-radius) !important; font-weight: 500; }
.mud-alert.mud-alert-text-info,
.mud-alert.mud-alert-standard-info { background: var(--zd-info-soft) !important; color: var(--zd-info-ink) !important; }
.mud-alert.mud-alert-text-success,
.mud-alert.mud-alert-standard-success { background: var(--zd-success-soft) !important; color: var(--zd-success-ink) !important; }
.mud-alert.mud-alert-text-warning,
.mud-alert.mud-alert-standard-warning { background: var(--zd-warning-soft) !important; color: var(--zd-warning-ink) !important; }
.mud-alert.mud-alert-text-error,
.mud-alert.mud-alert-standard-error { background: var(--zd-danger-soft) !important; color: var(--zd-danger-ink) !important; }
.mud-alert.mud-alert-filled-success { background: var(--zd-success) !important; }
.mud-alert.mud-alert-filled-error { background: var(--zd-danger) !important; }
.mud-alert.mud-alert-filled-warning { background: var(--zd-warning) !important; }
.mud-alert.mud-alert-filled-info { background: var(--zd-info) !important; }

/* ===================== LISTE ===================== */
.mud-list-item {
    border-radius: var(--zd-radius-sm);
    transition: background-color var(--zd-dur-fast) var(--zd-ease);
}
.mud-list-item:hover { background: var(--zd-surface-hover) !important; }
.mud-list .mud-divider { border-color: var(--zd-border); }

/* ===================== CAMPI / SELECT / PICKER ===================== */
.mud-input-outlined .mud-input-outlined-border {
    border-color: var(--zd-border-strong) !important;
    border-radius: var(--zd-radius-sm) !important;
    transition: border-color var(--zd-dur-fast) var(--zd-ease), box-shadow var(--zd-dur-fast) var(--zd-ease);
}
.mud-input-outlined:hover .mud-input-outlined-border { border-color: var(--zd-text-3) !important; }
.mud-input-outlined.mud-focused .mud-input-outlined-border {
    border-color: var(--accent) !important;
    border-width: 1px !important;
    box-shadow: 0 0 0 3px var(--accent-tint-strong);
}
.mud-input-label.mud-input-label-animated.mud-focused { color: var(--accent-dark) !important; }
.mud-input-error .mud-input-outlined-border { border-color: var(--zd-danger) !important; }
.mud-input-helper-text.mud-input-error { color: var(--zd-danger) !important; }
.mud-input-control input::placeholder { color: var(--zd-text-3); }

/* popover di select / datepicker / menu */
.mud-popover {
    border-radius: var(--zd-radius) !important;
    box-shadow: var(--zd-shadow-3) !important;
    border: 1px solid var(--zd-border);
}
.mud-popover.mud-popover-open { animation: zd-pop-in var(--zd-dur-fast) var(--zd-ease) both; }
.mud-list-item-clickable.mud-selected-item {
    background: var(--accent-tint-strong) !important;
    color: var(--accent-darker) !important;
}
.mud-picker-toolbar { background: var(--accent) !important; color: #FFFFFF !important; }
.mud-picker-toolbar .mud-typography { color: #FFFFFF !important; }
.mud-picker .mud-picker-calendar-day.mud-selected { background: var(--accent) !important; color: #fff !important; }
.mud-picker .mud-picker-calendar-day:hover { background: var(--accent-tint) !important; }

.mud-switch.mud-switch-checked .mud-switch-track { background: var(--accent) !important; opacity: 0.5; }
.mud-switch.mud-switch-checked .mud-switch-thumb { color: var(--accent) !important; }
.mud-checkbox .mud-checkbox-true,
.mud-checkbox .mud-checkbox-indeterminate { color: var(--accent) !important; }

/* ===================== TAB ===================== */
.mud-tab {
    text-transform: none !important;
    font-weight: 600 !important;
    color: var(--zd-text-2) !important;
    letter-spacing: 0 !important;
    transition: color var(--zd-dur-fast) var(--zd-ease), background-color var(--zd-dur-fast) var(--zd-ease);
}
.mud-tab:hover { background: var(--zd-surface-hover); color: var(--zd-text) !important; }
.mud-tab.mud-tab-active { color: var(--accent-dark) !important; }
.mud-tab-slider.mud-tab-slider-horizontal {
    background: var(--accent) !important;
    height: 2px;
    border-radius: 2px 2px 0 0;
}

/* ===================== AVATAR / BADGE / PROGRESS ===================== */
.mud-avatar.mud-avatar-color-primary { background: var(--accent) !important; color: #fff !important; }
.mud-avatar.mud-avatar-color-secondary { background: var(--sage) !important; color: #fff !important; }
.mud-badge .mud-badge-content { background: var(--accent) !important; color: #fff !important; }
.mud-badge.mud-badge-error, .mud-badge .mud-badge.mud-theme-error { background: var(--zd-danger) !important; }
.mud-progress-linear.mud-progress-linear-color-primary .mud-progress-linear-bar { background: var(--accent) !important; }
.mud-progress-linear { border-radius: 6px; background: var(--zd-surface-hover) !important; }
.mud-progress-circular.mud-progress-circular-color-primary .mud-progress-circular-circle { color: var(--accent) !important; }

/* ===================== DIVISORI / TOOLTIP ===================== */
.mud-divider { border-color: var(--zd-border) !important; }
.mud-tooltip {
    background: var(--zd-text) !important;
    color: #FFFFFF !important;
    border-radius: 6px !important;
    font-size: 0.75rem;
    font-weight: 500;
    padding: 6px 10px;
}

/* ===================== CALENDAR ===================== */
.calendar-grid {
    display: grid;
    grid-template-columns: 70px repeat(7, 1fr);
    gap: 1px;
    background: var(--border);
    border: 1px solid var(--border);
    border-radius: var(--r-md);
    overflow: hidden;
}

.calendar-slot {
    background: var(--surface);
    min-height: 54px;
    padding: 4px;
    cursor: pointer;
    transition: background-color var(--ease), box-shadow var(--ease);
    position: relative;
}

.calendar-slot.calendar-header {
    background: var(--surface-2);
    color: var(--text);
    text-align: center;
    padding: 10px 4px;
    cursor: default;
    border-bottom: 2px solid var(--accent);
}
.calendar-slot.calendar-header .mud-typography-overline { color: var(--accent-dark) !important; font-weight: 700; }
.calendar-slot.calendar-header .mud-typography-h6 { color: var(--text) !important; }

.calendar-slot.calendar-time {
    background: var(--surface-2);
    font-size: 11px;
    color: var(--text-muted);
    font-weight: 600;
    display: flex;
    align-items: center;
    justify-content: center;
    cursor: default;
}

.calendar-slot.calendar-cell:hover {
    background: var(--accent-tint);
    box-shadow: inset 0 0 0 2px var(--accent);
    z-index: 1;
}

/* La cella dispone le prenotazioni in colonna e le lascia crescere in altezza:
   un appuntamento riempie l'intero rettangolo dello slot (min 30 min = 1 cella). */
.calendar-slot.calendar-cell {
    display: flex;
    flex-direction: column;
    gap: 2px;
}

.appointment-chip {
    border-radius: 7px;
    padding: 4px 8px;
    font-size: 0.76rem;
    font-weight: 600;
    line-height: 1.25;
    cursor: pointer;
    width: 100%;
    /* riempie tutta l'altezza del rettangolo dello slot */
    flex: 1 1 auto;
    display: flex;
    flex-direction: column;
    justify-content: center;
    /* testo mandato a capo e sempre visibile: niente troncamento con ellissi */
    white-space: normal;
    overflow-wrap: anywhere;
    overflow: hidden;
    box-shadow: var(--shadow-xs);
    /* leggibilità garantita su qualsiasi colore di servizio */
    text-shadow: 0 1px 2px rgba(0, 0, 0, 0.30);
    transition: transform var(--ease), box-shadow var(--ease), filter var(--ease);
}
.appointment-chip:hover {
    transform: scale(1.03);
    filter: brightness(1.06);
    box-shadow: var(--shadow-sm);
    z-index: 2;
}

/* ===================== STAT CARD (dashboard / pagamenti) =====================
   Card bianca, bordo neutro, numero protagonista. Niente aloni né icone fluttuanti:
   l'unico movimento è l'ombra che si alza appena al passaggio. */
.stat-card,
.stat-card.mud-card-outlined {
    background: var(--zd-surface) !important;
    border: 1px solid var(--zd-border) !important;
    border-radius: var(--zd-radius) !important;
    box-shadow: var(--zd-shadow-1) !important;
    transition: box-shadow var(--zd-dur) var(--zd-ease), border-color var(--zd-dur) var(--zd-ease);
    position: relative;
    overflow: hidden;
}
.stat-card:hover,
.stat-card.mud-card-outlined:hover {
    border-color: var(--zd-border-strong) !important;
    box-shadow: var(--zd-shadow-2) !important;
}
.stat-card .mud-card-content { padding: 18px 20px; }
.stat-card .mud-typography-overline {
    color: var(--zd-text-3);
    letter-spacing: 0.06em;
}
.stat-card .mud-typography-h4 {
    font-size: 1.75rem;
    font-weight: 700;
    letter-spacing: -0.02em;
    margin-top: 2px;
    color: var(--zd-text);
}
/* icona (dove presente) in tessera tonda con l'accento tenue */
.stat-card .mud-icon-root {
    color: var(--accent) !important;
    background: var(--accent-tint);
    border-radius: 10px;
    padding: 8px;
    box-sizing: content-box;
}

/* ===================== PLAN CARDS (pricing — SuperAdmin / billing) =====================
   Schede piano moderne: niente bordo laterale, prezzo protagonista, glow accent in
   alto, hover lift e footer azioni separato. */
.plan-card {
    height: 100%;
    display: flex !important;
    flex-direction: column;
    border: 1px solid var(--border) !important;
    border-radius: var(--r-lg) !important;
    overflow: hidden;
    position: relative;
    background:
        var(--surface) !important;
    transition: transform var(--ease-slow), box-shadow var(--ease-slow), border-color var(--ease);
}
.plan-card:hover {
    transform: translateY(-2px);
    border-color: var(--accent-light) !important;
    box-shadow: var(--shadow-md) !important;
}

.plan-card-body { padding: 22px 22px 14px; flex: 1 1 auto; }

.plan-card-badges {
    display: flex;
    align-items: center;
    gap: 8px;
    flex-wrap: wrap;
    margin-bottom: 12px;
}

.plan-card-name { font-weight: 700 !important; letter-spacing: -0.01em; }

.plan-card-price {
    display: flex;
    align-items: baseline;
    gap: 6px;
    margin-top: 2px;
}
.plan-price-amount {
    font-size: 2.1rem;
    font-weight: 800;
    letter-spacing: -0.03em;
    color: var(--accent-dark);
    line-height: 1.15;
}
.plan-price-period { color: var(--text-muted); font-size: 0.85rem; font-weight: 500; }
.plan-price-yearly { color: var(--text-faint); font-size: 0.8rem; margin-top: 1px; }

.plan-card-desc { margin-top: 10px !important; min-height: 38px; }

.plan-card-meta {
    display: flex;
    gap: 8px;
    flex-wrap: wrap;
    margin-top: 14px;
}

.plan-card-actions {
    border-top: 1px solid var(--border);
    background: var(--surface-2) !important;
    padding: 8px 14px !important;
}

.plan-inactive { opacity: 0.62; }
.plan-inactive:hover { transform: none; }

/* ===================== PACKAGE CARDS (listino pacchetti) =====================
   Card di listino con numero sessioni protagonista, prezzo per sessione e
   footer azioni. Stesso linguaggio delle plan-card. */
.pkg-card {
    height: 100%;
    display: flex;
    flex-direction: column;
    background:
        var(--surface);
    border: 1px solid var(--border);
    border-radius: var(--r-lg);
    padding: 18px 18px 10px;
    position: relative;
    overflow: hidden;
    transition: transform var(--ease-slow), box-shadow var(--ease-slow), border-color var(--ease);
}
.pkg-card:hover {
    transform: translateY(-2px);
    border-color: var(--accent-light);
    box-shadow: var(--shadow-md), 0 8px 26px var(--accent-tint-strong);
}

.pkg-card-top {
    display: flex;
    align-items: flex-start;
    justify-content: space-between;
    margin-bottom: 6px;
}
.pkg-card-qty {
    font-size: 2rem;
    font-weight: 800;
    letter-spacing: -0.03em;
    color: var(--accent-dark);
    line-height: 1;
    display: flex;
    align-items: baseline;
    gap: 5px;
}
.pkg-card-qty span {
    font-size: 0.76rem;
    font-weight: 600;
    color: var(--text-faint);
    letter-spacing: 0.04em;
    text-transform: uppercase;
}
.pkg-card-name { font-weight: 700 !important; letter-spacing: -0.01em; }

.pkg-card-price {
    display: flex;
    align-items: baseline;
    gap: 10px;
    margin: 10px 0 4px;
}
.pkg-price-amount {
    font-size: 1.45rem;
    font-weight: 800;
    letter-spacing: -0.02em;
    color: var(--text);
}
.pkg-price-per { font-size: 0.78rem; color: var(--text-muted); font-weight: 500; }

.pkg-card-meta {
    display: flex;
    gap: 6px;
    flex-wrap: wrap;
    margin: 8px 0 12px;
}
.pkg-card-actions {
    display: flex;
    align-items: center;
    gap: 4px;
    margin-top: auto;
    padding-top: 8px;
    border-top: 1px solid var(--border);
}

/* ===================== PURCHASE CARDS (abbonamenti clienti) ===================== */
.purchase-card {
    height: 100%;
    display: flex;
    flex-direction: column;
    gap: 12px;
    background: var(--surface);
    border: 1px solid var(--border);
    border-radius: var(--r-lg);
    padding: 16px 18px 12px;
    transition: transform var(--ease-slow), box-shadow var(--ease-slow), border-color var(--ease);
}
.purchase-card:hover {
    transform: translateY(-2px);
    border-color: var(--accent-light);
    box-shadow: var(--shadow-md);
}
.purchase-card-closed { opacity: 0.72; }
.purchase-card-closed:hover { transform: none; }

.purchase-card-head {
    display: flex;
    align-items: center;
    gap: 12px;
}
.purchase-card-title { flex: 1 1 auto; min-width: 0; }
.purchase-card-title .mud-typography { overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }

.purchase-progress { display: flex; flex-direction: column; gap: 6px; }
.purchase-progress-label {
    display: flex;
    justify-content: space-between;
    font-size: 0.8rem;
    color: var(--text-muted);
}
.purchase-progress-label strong { color: var(--accent-dark); font-size: 0.95rem; }

.purchase-card-meta {
    display: flex;
    flex-wrap: wrap;
    gap: 6px 14px;
    font-size: 0.78rem;
    color: var(--text-muted);
}
.purchase-card-meta span { display: inline-flex; align-items: center; gap: 4px; }
.purchase-card-meta .mud-icon-root { font-size: 0.95rem; color: var(--text-faint); }
.purchase-expired { color: var(--error); font-weight: 600; }
.purchase-expired .mud-icon-root { color: var(--error); }

.purchase-card-actions {
    display: flex;
    align-items: center;
    margin-top: auto;
    padding-top: 10px;
    border-top: 1px solid var(--border);
}

/* ===================== LOGIN E PAGINE PRE-ACCESSO =====================
   Card bianca al centro con bordo sottile e ombra leggera, sul grigio dell'app.
   Un po' di personalità (2026-10-09, richiesta del titolare) senza tornare alle
   scene animate: sul grigio di fondo due ampie velature BIANCHE ferme e un filo
   d'indaco, una barretta nel gradiente del marchio in cima alla card, alone
   attorno al logo, il nome nel gradiente del marchio e il motto sotto la card.
   Niente sfere, griglie o righe; l'unico movimento è l'ingresso della card. */
.login-bg {
    min-height: 100vh;
    min-height: 100dvh;
    display: flex;
    flex-direction: column;
    align-items: center;
    justify-content: center;
    gap: var(--zd-space-4);
    padding: var(--zd-space-5) var(--zd-space-4);
    background:
        radial-gradient(70rem 42rem at 12% -12%, rgba(255, 255, 255, .95), transparent 62%),
        radial-gradient(56rem 40rem at 108% 112%, rgba(255, 255, 255, .85), transparent 60%),
        radial-gradient(44rem 30rem at 92% 4%, color-mix(in srgb, var(--zd-brand) 7%, transparent), transparent 70%),
        radial-gradient(36rem 26rem at 0% 100%, color-mix(in srgb, #22D3EE 6%, transparent), transparent 70%),
        var(--zd-canvas);
}

.login-card {
    position: relative;
    width: 100%;
    max-width: 420px;
    border-radius: var(--zd-radius-lg);
    border: 1px solid var(--zd-border);
    background: var(--zd-surface);
    box-shadow: var(--zd-shadow-2);
    overflow: hidden;
    animation: zd-pop-in var(--zd-dur-slow) var(--zd-ease) both;
}

/* Barretta nel gradiente del marchio (viola → azzurro, come l'icona dell'app). */
.login-card::before {
    content: "";
    position: absolute;
    inset: 0 0 auto;
    height: 4px;
    background: var(--zd-brand-gradient);
}
.login-card-body {
    background: var(--zd-surface);
    padding: 36px 36px 28px;
    text-align: center;
}
.login-card-body .login-form,
.login-card-body form { text-align: left; }

/* Marchio dell'app (Login) e icona di pagina (2FA, password, email). */
.login-logo {
    display: block;
    width: 60px;
    height: 60px;
    margin: 4px auto 18px;
    border-radius: 16px;
    /* alone: anello bianco e luce morbida nei colori del marchio */
    box-shadow:
        0 0 0 6px var(--zd-surface),
        0 0 0 7px color-mix(in srgb, var(--zd-brand) 14%, transparent),
        0 14px 32px -10px rgba(139, 92, 246, .55);
}
.login-brand-mark {
    width: 48px;
    height: 48px;
    margin: 0 auto 16px;
    border-radius: 12px;
    display: flex;
    align-items: center;
    justify-content: center;
    background: var(--zd-brand-soft);
}
.login-brand-mark .mud-icon-root {
    color: var(--zd-brand) !important;
    font-size: 1.6rem;
}

.login-form-title {
    font-size: 1.375rem;
    font-weight: 700;
    letter-spacing: -0.02em;
    color: var(--zd-text);
    margin-bottom: 4px;
}
.login-form-sub {
    font-size: var(--zd-font-size);
    color: var(--zd-text-2);
    margin-bottom: 24px;
}
.login-form { margin-bottom: 20px; }

.login-btn {
    height: 46px !important;
    font-size: 0.95rem !important;
    border-radius: var(--zd-radius-sm) !important;
}

.login-signup {
    text-align: center;
    font-size: var(--zd-font-size-sm);
    color: var(--zd-text-3);
    margin: 14px 0 8px;
}
.login-signup a { color: var(--zd-brand); font-weight: 600; text-decoration: none; }
.login-signup a:hover { color: var(--zd-brand-hover); text-decoration: underline; }

.login-policy-links {
    display: flex;
    align-items: center;
    justify-content: center;
    flex-wrap: wrap;
    gap: 8px;
    font-size: 0.78rem;
    color: var(--zd-text-3);
    margin: 18px 0 8px;
    padding-top: 16px;
    border-top: 1px solid var(--zd-border);
}
.login-policy-links a { color: var(--zd-text-2); text-decoration: none; transition: color var(--zd-dur-fast) var(--zd-ease); }
.login-policy-links a:hover { color: var(--zd-brand); text-decoration: underline; }
.login-policy-links span { color: var(--zd-border-strong); }

.login-copyright {
    text-align: center;
    font-size: 0.74rem;
    color: var(--zd-text-3);
}

/* Nome della piattaforma nel gradiente del marchio (solo nella pagina di accesso). */
.login-form-title--brand {
    font-size: 1.5rem;
    background: linear-gradient(135deg, #7C3AED 0%, var(--zd-brand) 45%, #0891B2 100%);
    -webkit-background-clip: text;
    background-clip: text;
    color: transparent;
}

/* Motto sotto la card. */
.login-motto {
    margin: 0;
    font-size: var(--zd-font-size-sm);
    font-weight: 500;
    letter-spacing: .01em;
    color: var(--zd-text-3);
    text-align: center;
}

/* Le pagine pre-accesso hanno l'accento della piattaforma (indaco) anche se il
   [data-vertical] arriva da un verticale per un redirect. */
.login-bg .mud-button-filled.mud-button-filled-primary { background: var(--zd-brand) !important; }
.login-bg .mud-button-filled.mud-button-filled-primary:hover { background: var(--zd-brand-hover) !important; }

@media (max-width: 37.49em) {
    .login-bg { justify-content: flex-start; padding: var(--zd-space-6) var(--zd-space-4); }
    .login-card { box-shadow: var(--zd-shadow-1); }
    .login-card-body { padding: 28px 22px 22px; }
}

/* ===================== REGISTRAZIONE / ONBOARDING / PRENOTAZIONE =====================
   Stessa regola: tinta unita e card bianca. */
.auth-hero {
    position: relative;
    /* 100dvh: con 100vh la barra degli indirizzi dei browser mobili accorcia il viewport
       reale e i pulsanti a fondo card finiscono sotto la barra. */
    min-height: 100vh;
    min-height: 100dvh;
    display: flex;
    align-items: center;
    justify-content: center;
    padding: var(--zd-space-5);
    background: var(--zd-canvas);
}

.auth-card {
    position: relative;
    background: var(--zd-surface) !important;
    border-radius: var(--zd-radius-lg) !important;
    box-shadow: var(--zd-shadow-2) !important;
    border: 1px solid var(--zd-border);
    overflow: hidden;
    max-width: 420px;
    width: 100%;
    animation: zd-pop-in var(--zd-dur-slow) var(--zd-ease) both;
}

/* Larghezze delle varianti (erano inline sulle MudPaper e vincevano sull'override mobile). */
.auth-card--medium { max-width: 560px; }
.auth-card--wide   { max-width: 640px; }

/* Padding della card (sostituisce pa-8 di MudBlazor, che non si riduceva su mobile). */
.auth-card-pad { padding: 32px !important; }

.auth-card .auth-logo {
    font-weight: 700;
    font-size: 1.5rem;
    color: var(--zd-text);
    text-align: center;
}
.auth-card .auth-logo .auth-icon { color: var(--accent); margin: 0 0.35rem; }
.auth-card .auth-subtitle {
    color: var(--zd-text-2);
    text-align: center;
}
.auth-card .auth-divider {
    height: 1px;
    width: 100%;
    margin: 1rem 0 1.25rem;
    background: var(--zd-border);
}

/* ===================== SELETTORE VERTICALE (registrazione) ===================== */
.vertical-picker {
    display: grid;
    grid-template-columns: repeat(auto-fill, minmax(94px, 1fr));
    gap: 8px;
}
.vertical-option {
    display: flex;
    flex-direction: column;
    align-items: center;
    gap: 6px;
    min-height: 44px;
    padding: 12px 8px;
    background: var(--zd-surface);
    border: 1px solid var(--zd-border-strong);
    border-radius: var(--zd-radius-sm);
    color: var(--zd-text-2);
    font: inherit;
    cursor: pointer;
    transition: border-color var(--zd-dur-fast) var(--zd-ease), background-color var(--zd-dur-fast) var(--zd-ease),
                color var(--zd-dur-fast) var(--zd-ease), box-shadow var(--zd-dur-fast) var(--zd-ease);
}
.vertical-option:hover {
    border-color: var(--accent-light);
    background: var(--accent-tint);
    color: var(--accent-darker);
}
.vertical-option .mud-icon-root { color: var(--accent); }
.vertical-option-selected,
.vertical-option-selected:hover {
    border-color: var(--accent);
    background: var(--accent-tint-strong);
    color: var(--accent-darker);
    box-shadow: inset 0 0 0 1px var(--accent);
}
.vertical-option-name {
    font-size: 0.78rem;
    font-weight: 600;
    text-align: center;
    line-height: 1.2;
}

/* ===================== BARRE DI SCORRIMENTO =====================
   Sottili e neutre nella pagina; il menu laterale non ne ha (vedi .zd-nav). */
::-webkit-scrollbar { width: 10px; height: 10px; }
::-webkit-scrollbar-track { background: transparent; }
::-webkit-scrollbar-thumb {
    background: var(--zd-border-strong);
    border-radius: 6px;
    border: 2px solid var(--zd-canvas);
}
::-webkit-scrollbar-thumb:hover { background: var(--zd-text-3); }
* { scrollbar-width: thin; scrollbar-color: var(--zd-border-strong) transparent; }

/* ===================== SNACKBAR ===================== */
.mud-snackbar { border-radius: var(--zd-radius) !important; box-shadow: var(--zd-shadow-3) !important; }
.mud-snackbar.mud-alert-filled-success { background: var(--success) !important; }
.mud-snackbar.mud-alert-filled-error { background: var(--error) !important; }
.mud-snackbar.mud-alert-filled-warning { background: var(--warning) !important; }
.mud-snackbar.mud-alert-filled-info { background: var(--zd-info) !important; }

/* ===========================================================
   RESPONSIVE
   =========================================================== */

/* Tab scrollabili ovunque: su schermi stretti non spezzano il layout */

/* --- Tablet (≤ 960px) --- */
@media (max-width: 960px) {
    .mud-main-content > .mud-container {
        padding-left: 20px !important;
        padding-right: 20px !important;
    }
    .mud-dialog-content { padding: 20px !important; }
    .mud-dialog-actions { padding: 14px 20px !important; }
    .mud-card-content { padding: 16px; }
    .calendar-slot { min-height: 48px; }
    .stat-card .mud-typography-h4 { font-size: 1.5rem; }
    /* toolbar di tabelle/griglie: i controlli vanno a capo invece di traboccare */
    .mud-table-toolbar { flex-wrap: wrap; gap: 8px; min-height: unset; padding: 10px 12px; }
}

/* --- Mobile (≤ 600px) --- */
@media (max-width: 600px) {
    html, body { font-size: 14px; }

    h4, .mud-typography-h4 { font-size: 1.45rem; }
    h5, .mud-typography-h5 { font-size: 1.2rem; }
    h6, .mud-typography-h6 { font-size: 1.02rem; }

    /* contenuto a tutta larghezza con margini ridotti */
    .mud-main-content > .mud-container {
        padding-left: 16px !important;
        padding-right: 16px !important;
    }

    /* gruppi di bottoni e stack orizzontali: a capo invece di traboccare */
    .mud-button-group-root { flex-wrap: wrap; }
    .mud-toolbar { flex-wrap: wrap; gap: 6px; }

    /* le stat card occupano tutta la riga */
    .stat-card { width: 100%; }

    /* tabelle larghe → scroll orizzontale invece di rompere il layout */
    .mud-data-grid, .mud-table { overflow-x: auto; -webkit-overflow-scrolling: touch; }
    .mud-table-container { overflow-x: auto; }

    /* dialog a tutta larghezza */
    .mud-dialog {
        margin: 12px !important;
        width: calc(100vw - 24px) !important;
        max-width: calc(100vw - 24px) !important;
        border-radius: var(--zd-radius) !important;
    }
    .mud-dialog-title { padding: 16px 18px !important; font-size: 1.02rem; }
    .mud-dialog-content { padding: 16px 18px !important; }
    .mud-dialog-actions { padding: 12px 18px !important; flex-wrap: wrap; }
    .mud-dialog-actions .mud-button-root { flex: 1 1 auto; }

    /* page header: contenuti che vanno a capo */
    .page-header .mud-stack-row { flex-wrap: wrap; gap: 8px; }

    /* calendario compatto */
    .calendar-grid { grid-template-columns: 52px repeat(7, minmax(96px, 1fr)); }
    .calendar-slot { min-height: 46px; padding: 3px; }
    .calendar-slot.calendar-header { padding: 8px 2px; }
    .appointment-chip { font-size: 0.7rem; padding: 3px 6px; }

    .stat-card .mud-typography-h4 { font-size: 1.4rem; }
    .mud-card-content { padding: 14px; }
    .mud-card-header { padding: 14px 16px; }

    /* login */
    .auth-hero { padding: 16px; }
    .auth-card,
    .auth-card--medium,
    .auth-card--wide { max-width: 100%; }
    /* 32px per lato su 360px lasciavano ~264px di contenuto: campi e label andavano stretti. */
    .auth-card-pad { padding: 24px !important; }
    .auth-card .auth-logo { font-size: 1.4rem; }

    /* page header senza card: su mobile più compatto */
    .page-header { padding: 2px 0 12px !important; }
}

/* --- Mobile piccolo (≤ 380px) --- */
@media (max-width: 380px) {
    .calendar-grid { grid-template-columns: 44px repeat(7, minmax(78px, 1fr)); }
    .stat-card .mud-typography-h4 { font-size: 1.3rem; }
    .auth-hero { padding: 12px; }
    .auth-card-pad { padding: 18px !important; }
}

/* --- Card Assistenza / Support: bordo un filo più visibile --- */
.support-card {
    border: 1px solid var(--zd-border-strong) !important;
}

/* --- Badge storico dell'Assistenza (ora .zd-nav-badge nel menu): resta per chi lo usa ancora,
       senza lampeggio — un contatore che pulsa all'infinito distrae e si impara a ignorarlo. --- */
.support-nav-label {
    display: inline-flex;
    align-items: center;
    gap: 8px;
}
.support-blink-badge {
    display: inline-flex;
    align-items: center;
    justify-content: center;
    min-width: 20px;
    height: 20px;
    padding: 0 6px;
    border-radius: var(--zd-radius-pill);
    background: var(--zd-danger);
    color: #fff;
    font-size: 0.72rem;
    font-weight: 700;
    line-height: 1;
}

/* ===================== FOOTER ===================== */
/* Chiaro e discreto, sul canvas: un filo sopra, testo secondario. */
.app-footer {
    background: transparent;
    border-top: 1px solid var(--zd-border);
    padding: 14px 24px;
    flex-shrink: 0;
}
.app-footer-inner {
    display: flex;
    align-items: center;
    justify-content: space-between;
    flex-wrap: wrap;
    gap: 6px 16px;
    max-width: 1800px;
    margin: 0 auto;
}
.app-footer-copy {
    font-size: 0.76rem;
    color: var(--zd-text-3);
}
.app-footer-tagline {
    flex: 1 1 auto;
    text-align: center;
    font-size: 0.78rem;
    color: var(--zd-text-3);
    white-space: nowrap;
}
.app-footer-links {
    display: flex;
    align-items: center;
    gap: 10px;
}
.app-footer-links a {
    font-size: 0.76rem;
    color: var(--zd-text-2);
    text-decoration: none;
    transition: color var(--zd-dur-fast) var(--zd-ease);
}
.app-footer-links a:hover { color: var(--zd-text); text-decoration: underline; }
.app-footer-sep { color: var(--zd-border-strong); font-size: 0.76rem; }

@media (max-width: 59.99em) {
    .app-footer-tagline { display: none; }
}
@media (max-width: 37.49em) {
    .app-footer { padding: 12px 16px; }
    .app-footer-inner { flex-direction: column; align-items: flex-start; gap: 3px; }
}

/* ===================== POLICY PAGES (privacy / cookie) ===================== */
.policy-section {
    margin-bottom: 2.2rem;
}
.policy-heading {
    color: var(--accent-dark) !important;
    font-size: 1rem !important;
    font-weight: 700 !important;
    margin-bottom: 0.75rem !important;
}
.policy-list .mud-list-item { padding-top: 4px !important; padding-bottom: 4px !important; }
.policy-list .mud-list-item .mud-icon-root {
    font-size: 0.55rem !important;
    color: var(--accent) !important;
    margin-top: 2px;
    align-self: flex-start;
}
.policy-table {
    border-radius: var(--r-md) !important;
    overflow: hidden;
    font-size: 0.84rem;
}
.policy-table thead th {
    background: var(--surface-2) !important;
    color: var(--text-muted) !important;
    font-weight: 700 !important;
    font-size: 0.76rem;
    text-transform: uppercase;
    letter-spacing: 0.05em;
    padding: 10px 14px !important;
}
.policy-table tbody td {
    padding: 9px 14px !important;
    color: var(--text);
    border-bottom: 1px solid var(--border);
    vertical-align: top;
}
.policy-table tbody tr:last-child td { border-bottom: none; }
.policy-table code {
    background: var(--surface-2);
    border: 1px solid var(--border);
    border-radius: 4px;
    padding: 1px 5px;
    font-size: 0.78rem;
    color: var(--accent-dark);
    font-family: 'Menlo', 'Consolas', monospace;
    white-space: nowrap;
}

/* ===========================================================
   UTILITY DI STATO (caricamento, vuoto)
   Il vecchio layer "Flow 2.0" (aurora nell'header, filo animato,
   riflessi sui pulsanti, icone fluttuanti, ingressi scaglionati,
   pulsazione dei badge) è stato eliminato il 2026-10-08: restano
   solo le utility che le pagine usano davvero.
   =========================================================== */
@keyframes skeletonWave {
    from { background-position: 200% 0; }
    to   { background-position: -200% 0; }
}
@keyframes dotBounce {
    0%, 80%, 100% { transform: scale(0.6); opacity: 0.4; }
    40%           { transform: scale(1);   opacity: 1; }
}

/* ---- SKELETON — shimmer di caricamento ----
   Uso: <div class="skeleton" style="height:20px;width:60%"></div> */
.skeleton {
    border-radius: var(--zd-radius-sm);
    background: linear-gradient(90deg, var(--zd-surface-2) 25%, var(--zd-surface-hover) 50%, var(--zd-surface-2) 75%);
    background-size: 200% 100%;
    animation: skeletonWave 1.4s linear infinite;
}
.mud-skeleton { border-radius: var(--zd-radius-sm) !important; }

/* ---- EMPTY STATE ----
   Uso: wrapper .empty-state con dentro MudIcon + testi */
.empty-state {
    display: flex;
    flex-direction: column;
    align-items: center;
    justify-content: center;
    gap: 10px;
    padding: 48px 24px;
    text-align: center;
    color: var(--zd-text-2);
}
.empty-state .mud-icon-root {
    font-size: 2.6rem;
    color: var(--zd-text-3);
}

/* ---- LOADING DOTS — indicatore a tre puntini ----
   Uso: <span class="loading-dots"><i></i><i></i><i></i></span> */
.loading-dots { display: inline-flex; gap: 5px; align-items: center; }
.loading-dots i {
    width: 7px; height: 7px;
    border-radius: 50%;
    background: var(--accent);
    animation: dotBounce 1.2s ease-in-out infinite;
}
.loading-dots i:nth-child(2) { animation-delay: 0.15s; }
.loading-dots i:nth-child(3) { animation-delay: 0.3s; }

/* ===================== ACCESSIBILITÀ — riduzione movimento =====================
   I token --zd-dur* valgono già 0ms (design-tokens.css); qui si spengono le
   animazioni che non passano dai token o che girano all'infinito. */
@media (prefers-reduced-motion: reduce) {
    .mud-main-content > .zd-content > *,
    .login-card, .auth-card, .mud-dialog, .mud-popover.mud-popover-open,
    .zd-nav-badge, .zd-nav-group .mud-nav-link,
    .skeleton, .loading-dots i { animation: none !important; }
    .zd-nav-group__body, .zd-nav-group__chevron { transition: none !important; }
    /* NOTA: occhi e micro-animazioni della mascotte Zed NON vengono spenti qui di
       proposito — richiesta esplicita del cliente (vedi mascot.css). */
}

/* ═══════════════════════════════════════════════════════════════════════════
   Calendario abbonamenti (SuperAdmin) — /superadmin/calendario
   Regola portante: la TINTA della chip identifica il verticale (var --cal-brand,
   iniettata inline dalla pagina), il BORDO identifica lo stato dell'evento. Con
   venti verticali, codificare entrambi col colore renderebbe un insoluto
   indistinguibile da un rinnovo regolare, anche per chi vede bene i colori.
   ═══════════════════════════════════════════════════════════════════════════ */

/* ── Striscia KPI ── */
.cal-kpis {
    display: grid;
    grid-template-columns: repeat(4, 1fr);
    gap: 12px;
}

.cal-kpi {
    background: var(--surface);
    border: 1px solid var(--border-strong);
    border-radius: var(--r-md);
    border-left: 4px solid var(--accent);
    padding: 12px 16px;
    display: flex;
    flex-direction: column;
    gap: 2px;
}

.cal-kpi--money  { border-left-color: var(--zd-success); }
.cal-kpi--trial  { border-left-color: var(--zd-warning); }
.cal-kpi--danger { border-left-color: var(--zd-danger); }

.cal-kpi__label {
    font-size: .7rem;
    font-weight: 700;
    letter-spacing: .05em;
    text-transform: uppercase;
    color: var(--mud-palette-text-secondary, var(--zd-text-3));
}

.cal-kpi__value { font-size: 1.55rem; font-weight: 700; line-height: 1.1; }

/* ── Chip evento (condivisa da mese e settimana) ── */
.cal-chip {
    --cal-brand: var(--zd-text-3);
    display: flex;
    align-items: center;
    gap: 6px;
    padding: 3px 7px;
    margin-top: 3px;
    border-radius: 7px;
    border-left: 3px solid var(--cal-brand);
    background: color-mix(in srgb, var(--cal-brand) 12%, transparent);
    font-size: .72rem;
    line-height: 1.25;
    cursor: pointer;
    transition: transform .12s ease, box-shadow .12s ease;
}

.cal-chip:hover {
    transform: translateY(-1px);
    box-shadow: 0 2px 8px rgba(15, 23, 42, .12);
}

.cal-chip__dot {
    width: 7px; height: 7px;
    border-radius: 50%;
    background: var(--cal-brand);
    flex: 0 0 auto;
}

.cal-chip__txt {
    overflow: hidden;
    text-overflow: ellipsis;
    white-space: nowrap;
    font-weight: 600;
}

.cal-chip__stack { display: flex; flex-direction: column; min-width: 0; }
.cal-chip__sub { font-size: .66rem; opacity: .75; white-space: nowrap; }

/* Stato: solo il bordo, mai la tinta di fondo (che appartiene al verticale). */
.cal-chip--trial     { border-left-style: dashed; }
.cal-chip--projected { border-left-style: dotted; opacity: .72; }
.cal-chip--pastdue   { border-left-color: var(--zd-danger); border-left-width: 4px; background: rgba(220, 38, 38, .10); }
.cal-chip--cancelled { text-decoration: line-through; opacity: .6; }
.cal-chip--activation{ border-left-color: var(--zd-success); }

/* ── Vista MESE ── */
.cal-month {
    display: grid;
    grid-template-columns: repeat(7, minmax(0, 1fr));
    gap: 1px;
    background: var(--border-strong);
    border: 1px solid var(--border-strong);
    border-radius: var(--r-md);
    overflow: hidden;
}

.cal-month__dow {
    background: var(--surface-2);
    padding: 9px 8px;
    text-align: center;
    font-size: .7rem;
    font-weight: 700;
    letter-spacing: .06em;
    text-transform: uppercase;
    color: var(--mud-palette-text-secondary, var(--zd-text-3));
    position: sticky;
    top: 0;
    z-index: 2;
}

.cal-month__cell {
    background: var(--surface);
    min-height: 118px;
    padding: 6px 7px 8px;
    display: flex;
    flex-direction: column;
}

.cal-month__cell--weekend { background: var(--surface-2); }
.cal-month__cell--out     { opacity: .45; }
.cal-month__cell--today   { background: color-mix(in srgb, var(--accent) 7%, var(--surface)); }

.cal-month__num {
    display: flex;
    align-items: center;
    justify-content: space-between;
    font-size: .8rem;
    font-weight: 600;
    margin-bottom: 2px;
}

/* Anello, non riempimento: il pieno ruberebbe attenzione agli insoluti. */
.cal-today {
    display: inline-flex;
    align-items: center;
    justify-content: center;
    min-width: 24px; height: 24px;
    border-radius: 50%;
    border: 2px solid var(--accent);
    color: var(--accent);
    font-weight: 700;
}

.cal-month__count {
    font-size: .62rem;
    font-weight: 700;
    padding: 1px 6px;
    border-radius: 9px;
    background: var(--surface-2);
    color: var(--mud-palette-text-secondary, var(--zd-text-3));
}

.cal-month__more {
    margin-top: 3px;
    font-size: .68rem;
    font-weight: 600;
    color: var(--accent);
    cursor: pointer;
}

.cal-month__more:hover { text-decoration: underline; }

/* ── Vista SETTIMANA ── */
.cal-week {
    display: grid;
    grid-template-columns: repeat(7, minmax(0, 1fr));
    gap: 1px;
    background: var(--border-strong);
    border: 1px solid var(--border-strong);
    border-radius: var(--r-md);
    overflow: hidden;
}

.cal-week__col {
    background: var(--surface);
    display: flex;
    flex-direction: column;
    min-height: 340px;
}

.cal-week__col--today { background: color-mix(in srgb, var(--accent) 7%, var(--surface)); }

.cal-week__head {
    padding: 9px 8px;
    text-align: center;
    background: var(--surface-2);
    display: flex;
    flex-direction: column;
    gap: 2px;
    position: sticky;
    top: 0;
    z-index: 2;
}

.cal-week__dow {
    font-size: .68rem;
    font-weight: 700;
    letter-spacing: .06em;
    text-transform: uppercase;
    color: var(--mud-palette-text-secondary, var(--zd-text-3));
}

.cal-week__num { font-size: 1.05rem; font-weight: 700; }
.cal-week__body { flex: 1; padding: 6px 7px; overflow-y: auto; }
.cal-week__empty { text-align: center; opacity: .3; padding-top: 14px; }

.cal-week__foot {
    padding: 7px 8px;
    text-align: right;
    font-size: .74rem;
    font-weight: 700;
    border-top: 1px solid var(--border);
    min-height: 30px;
}

.cal-week__foot--on { color: var(--zd-success); }

/* ── Legenda ── */
.cal-legend {
    display: inline-flex;
    align-items: center;
    gap: 6px;
    font-size: .74rem;
    color: var(--mud-palette-text-secondary, var(--zd-text-3));
}

.cal-legend__mark {
    width: 14px; height: 0;
    border-top: 3px solid var(--accent);
    border-radius: 2px;
}

.cal-legend__mark--projected { border-top-style: dotted; }
.cal-legend__mark--trial     { border-top-style: dashed; border-top-color: var(--zd-warning); }
.cal-legend__mark--pastdue   { border-top-color: var(--zd-danger); border-top-width: 4px; }

/* ── Responsive ── */
@media (max-width: 1100px) {
    .cal-kpis { grid-template-columns: repeat(2, 1fr); }
    .cal-month__cell { min-height: 96px; }
}

@media (max-width: 800px) {
    /* La settimana ha 7 colonne piene di orari: sotto questa soglia scorre in orizzontale. */
    .cal-week { display: block; overflow-x: auto; white-space: nowrap; }
    .cal-week > * {
        display: inline-block;
        vertical-align: top;
        white-space: normal;
        width: 140px;
    }
    .cal-week__col { min-height: 280px; }
}

/* ── Vista MESE su telefono ───────────────────────────────────────────────────
   Qui c'era la stessa regola della settimana, e sul mese non funzionava: con
   `display:block`, figli `inline-block` da 140px e `white-space:nowrap`, le sette
   intestazioni più i ~35 giorni finivano tutti su UNA riga larga quasi 6000px. Il
   risultato non era un calendario che scorre, era un nastro in cui non si capiva più
   quale giorno stesse sotto quale colonna: di fatto, su telefono il calendario non si
   vedeva. Un mese è una griglia 7×5: resta una griglia, solo compatta. Al posto dei
   nomi dei tenant — che in 50px non ci stanno comunque — resta il contatore, e il
   dettaglio del giorno si apre toccando la cella. */
@media (max-width: 800px) {
    .cal-month {
        display: grid;
        grid-template-columns: repeat(7, minmax(0, 1fr));
        white-space: normal;
        overflow: hidden;
    }
    .cal-month > * { display: block; width: auto; }
    .cal-month__dow { padding: 6px 2px; font-size: .58rem; letter-spacing: 0; }
    .cal-month__cell { min-height: 56px; padding: 4px 3px 5px; }
    .cal-month__num { font-size: .8rem; }

    /* I riquadri col nome del tenant e il "+N altri" spariscono: resta il numero del
       giorno col contatore, che è l'informazione che serve a colpo d'occhio. */
    .cal-month .cal-chip,
    .cal-month__more { display: none; }
    .cal-month__count { font-size: .58rem; padding: 1px 4px; }
}

/* Tutta la cella è un bersaglio: prima si poteva toccare solo un riquadro o "+N altri",
   che su telefono ora non ci sono più. */
.cal-month__cell { cursor: pointer; }

@media (max-width: 560px) {
    /* Un KPI per riga sono quattro schede impilate: ~340px solo per quattro numeri.
       Due per riga li fa stare in uno sguardo. */
    .cal-kpis { grid-template-columns: repeat(2, 1fr); gap: 8px; }
    .cal-kpi { padding: 8px 10px; }
    .cal-kpi__label { font-size: .62rem; line-height: 1.25; }
    .cal-kpi__value { font-size: 1.05rem; line-height: 1.2; }
}

/* ═══════════════════════════════════════════════════════════════════════════
   Popover con UNA sola barra di scorrimento.
   MudSelect limita in altezza sia il popover sia la MudList interna: quando le
   voci superano lo spazio disponibile compaiono due scrollbar annidate, e
   trascinare quella esterna non muove l'elenco. Qui lo scroll resta al popover
   e la lista interna scorre insieme al contenitore.
   Generalizza la stessa correzione già applicata a .vertical-multiselect-popover.
   ═══════════════════════════════════════════════════════════════════════════ */
/* Lo scroll vive SOLO sul contenitore del popover (div id="popovercontent-…").
   Le due forme del selettore coprono entrambi i casi: la classe applicata
   direttamente su quell'elemento oppure su un suo antenato. */
.zcd-single-scroll-popover,
.zcd-single-scroll-popover .mud-popover {
    max-height: 340px !important;
    overflow-y: auto !important;
    overflow-x: hidden !important;
}

/* MudBlazor limita anche la lista interna (MaxHeight di MudSelect diventa uno stile
   inline sull'elemento): serve !important, che da foglio di stile ha comunque la
   precedenza sull'inline, altrimenti la seconda barra resta. */
.zcd-single-scroll-popover .mud-list,
.zcd-single-scroll-popover .mud-list-padding,
.zcd-single-scroll-popover .mud-menu-list,
.zcd-single-scroll-popover .mud-select-menu {
    max-height: none !important;
    overflow: visible !important;
}

/* ── Console SQL del SuperAdmin ────────────────────────────────────────────────
   Colonne dell'albero dello schema: cliccabili per accodare il nome virgolettato
   alla query. Serve un segnale visivo che siano cliccabili, altrimenti sembrano
   una semplice etichetta e nessuno le prova. */
.sqlc__col {
    cursor: pointer;
    padding: 1px 4px;
    border-radius: 4px;
    line-height: 1.35;
}

.sqlc__col:hover {
    background: var(--mud-palette-action-default-hover);
}

/* ============================================================================
   Barra in alto su telefono: il pulsante "Esci" deve restare raggiungibile.
   Misurato su iPhone 12 (390px): la barra aveva scrollWidth 416px contro clientWidth 390,
   cioè sbordava di 26px, e l'elemento più a destra — il logout — era il primo a uscire dallo
   schermo. La larghezza se la prendeva l'indirizzo email dell'utente.
   ============================================================================ */
@media (max-width: 599.98px) {
    .mud-appbar .appbar-user { display: none; }
    /* Icone un filo più strette: quattro pulsanti più il menu devono stare in 390px. */
    .mud-appbar .mud-icon-button { padding: 8px; }
}

/* ============================================================================
   Barra di ritorno delle pagine legali (.policy-nav).
   Le informative si aprivano in una scheda nuova (target="_blank") e su telefono da lì
   non si tornava indietro: ora restano nell'app e portano con sé i propri comandi, in
   cima e in fondo, perché sono pagine lunghe.
   ============================================================================ */
.policy-nav {
    display: flex;
    align-items: center;
    gap: 8px;
    margin-bottom: 16px;
}
.policy-nav:last-child { margin: 16px 0 0; }
.policy-nav__spacer { flex: 1 1 auto; }
.policy-nav .mud-button-root { text-transform: none; font-weight: 600; }

@media (max-width: 599.98px) {
    /* Il contenitore delle informative ha pa-8 (32px): su telefono è troppo. */
    .policy-nav .mud-button-root { padding: 0 10px; min-width: 0; }
}

/* ============================================================================
   Calendario — barra dei comandi e dei livelli (.cal-toolbar).

   Su telefono questa barra occupava ~430px prima ancora di mostrare un giorno: il
   gruppo Prec./Oggi/Succ., il nome del mese con un min-width di 230px scritto inline,
   la scelta Mese/Settimana/Giorno, il filtro Verticale e quattro interruttori che
   andavano a capo su due righe. Sei fasce sovrapposte per quattro decisioni.

   Strategia: le misure fisse escono dall'inline e finiscono qui, dove possono cedere;
   sopra resta una riga sola con periodo e navigazione, sotto vista e verticale si
   dividono la riga, e i livelli diventano UNA striscia che scorre in orizzontale —
   lo stesso schema dei contatori-filtro dell'elenco tenant, così il gesto è già noto.
   ============================================================================ */
.cal-toolbar__label { font-weight: 600; min-width: 230px; }
.cal-toolbar__levels-label { font-weight: 700; letter-spacing: .04em; }

@media (max-width: 599.98px) {
    .cal-toolbar { padding: 10px !important; }

    /* Prima riga: frecce e nome del periodo accanto, non uno sopra l'altro. */
    .cal-toolbar__row { gap: 8px !important; }
    .cal-toolbar__nav { flex: 0 0 auto; }
    .cal-toolbar__nav .mud-button-root { padding: 0 8px; min-width: 0; font-size: .78rem; }
    .cal-toolbar__label {
        min-width: 0;
        flex: 1 1 auto;
        font-size: .95rem;
        text-align: right;
        text-transform: capitalize;
        white-space: nowrap;
        overflow: hidden;
        text-overflow: ellipsis;
    }

    /* Seconda riga: vista e verticale si dividono lo spazio invece di impilarsi. */
    .cal-toolbar__view { flex: 1 1 100%; }
    .cal-toolbar__view .mud-toggle-group { width: 100%; }
    .cal-toolbar__view .mud-toggle-item { flex: 1 1 0; font-size: .78rem; padding-inline: 4px; }
    .cal-toolbar__vertical { flex: 1 1 100%; min-width: 0; }
    .cal-toolbar__vertical .mud-select { width: 100%; }

    /* Livelli: una riga sola che scorre. flex-wrap:wrap arriva da MudStack e va vinto,
       altrimenti gli interruttori tornano a impilarsi invece di scorrere. */
    .cal-toolbar__levels {
        flex-wrap: nowrap !important;
        overflow-x: auto;
        gap: 12px !important;
        margin-top: 10px !important;
        padding-bottom: 2px;
        scrollbar-width: none;
        /* Sfumatura a destra: dice che la striscia continua oltre il bordo. */
        mask-image: linear-gradient(to right, #000 calc(100% - 20px), transparent 100%);
    }
    .cal-toolbar__levels::-webkit-scrollbar { display: none; }
    .cal-toolbar__levels > * { flex: 0 0 auto; }
    .cal-toolbar__levels .mud-switch { margin: 0; }
    .cal-toolbar__levels .mud-switch-label { font-size: .78rem; }
    .cal-toolbar__levels-label { font-size: .6rem; }
}

/* ── Schermata d'avvio (pagine senza prerender, vedi App.razor e js/boot.js) ──────────────────
   Sostituisce la pagina bianca dei primi istanti mentre parte il circuito: l'icona di Zed al
   centro sul fondo a tinta unita dell'app e una barretta sottile che scorre sotto. Sfuma via
   appena il layout è disegnato. Colori scritti per esteso: questo blocco deve funzionare anche
   se design-tokens.css non è ancora arrivato. */
#zcd-boot {
    position: fixed;
    inset: 0;
    z-index: 2000;
    display: flex;
    flex-direction: column;
    align-items: center;
    justify-content: center;
    gap: 22px;
    background: var(--zd-canvas);
    transition: opacity 240ms cubic-bezier(.2, .8, .2, 1);
}
#zcd-boot img {
    width: 64px;
    height: 64px;
    border-radius: 16px;
    box-shadow: 0 1px 2px rgba(15, 23, 42, .05), 0 6px 16px -6px rgba(15, 23, 42, .18);
    animation: zcd-boot-in 280ms cubic-bezier(.2, .8, .2, 1) both;
}
.zcd-boot__bar {
    position: relative;
    width: 96px;
    height: 3px;
    border-radius: 3px;
    overflow: hidden;
    background: var(--zd-border);
}
.zcd-boot__bar::after {
    content: "";
    position: absolute;
    inset: 0 auto 0 0;
    width: 40%;
    border-radius: 3px;
    background: var(--zd-brand);
    animation: zcd-boot-slide 1.1s cubic-bezier(.4, 0, .2, 1) infinite;
}
#zcd-boot.zcd-boot--out { opacity: 0; pointer-events: none; }
@keyframes zcd-boot-in {
    from { opacity: 0; transform: scale(.96); }
    to   { opacity: 1; transform: none; }
}
@keyframes zcd-boot-slide {
    from { transform: translateX(-100%); }
    to   { transform: translateX(250%); }
}
@media (prefers-reduced-motion: reduce) {
    #zcd-boot img, .zcd-boot__bar::after { animation: none; }
    #zcd-boot { transition: none; }
}

/* Pallino del colore scelto (servizi, categorie, sale, gruppi…): il colore resta inline,
   il contorno viene dai token e regge anche il tema scuro (2026-10-09; prima era #ccc/#fff inline). */
.zd-swatch {
    flex: 0 0 auto;
    width: 36px;
    height: 36px;
    border-radius: 50%;
    box-shadow: 0 0 0 2px var(--zd-surface), 0 0 0 3px var(--zd-border-strong);
}
.zd-swatch--sm { width: 24px; height: 24px; }
.zd-swatch--square { border-radius: var(--zd-radius-sm); }
.zd-swatch--sm.zd-swatch--square { border-radius: 4px; }

/* Barra di accettazione di Termini + Accordo art. 28 (LegalAcceptanceBanner, 2026-10-09):
   una riga sottile al posto dell'avviso alto tre righe. Su telefono il testo va a capo e il
   pulsante scende a tutta larghezza. */
.legal-bar {
    display: flex;
    align-items: center;
    gap: 10px;
    margin-bottom: 12px;
    padding: 8px 8px 8px 14px;
    border: 1px solid color-mix(in srgb, var(--zd-warning) 35%, transparent);
    border-radius: var(--zd-radius);
    background: var(--zd-warning-soft);
    color: var(--zd-text);
    font-size: var(--zd-font-size-sm);
    line-height: 1.4;
}
.legal-bar__icon { color: var(--zd-warning-ink); flex: 0 0 auto; }
.legal-bar__text { flex: 1 1 auto; min-width: 0; }
.legal-bar__text strong { color: var(--zd-warning-ink); }
.legal-bar__text a { color: var(--zd-text); font-weight: 600; text-decoration: underline; text-underline-offset: 2px; }
.legal-bar__sep { margin: 0 4px; color: var(--zd-text-3); }
.legal-bar__btn.mud-button-root { flex: 0 0 auto; white-space: nowrap; }
@media (max-width: 599.98px) {
    .legal-bar { flex-wrap: wrap; align-items: flex-start; padding: 10px 12px; }
    .legal-bar__text { flex-basis: calc(100% - 30px); }
    .legal-bar__btn.mud-button-root { flex-basis: 100%; }
}

/* Navigazione in basso su telefono (Shared/BottomNav, 2026-10-09). Sopra i 600px non esiste: lì
   il menu laterale resta lo strumento principale. Il contenuto si allunga di altrettanto, così
   l'ultima riga di una pagina non resta sotto la barra. */
.zd-bottom-nav { display: none; }
@media (max-width: 599.98px) {
    .zd-bottom-nav {
        position: fixed;
        inset: auto 0 0 0;
        z-index: 1250;
        display: grid;
        grid-auto-flow: column;
        grid-auto-columns: 1fr;
        padding: 6px 6px calc(6px + env(safe-area-inset-bottom, 0px));
        background: var(--zd-surface);
        border-top: 1px solid var(--zd-border);
        box-shadow: 0 -6px 18px -12px rgba(15, 23, 42, .25);
    }
    .zd-bottom-nav__item {
        display: flex;
        flex-direction: column;
        align-items: center;
        justify-content: center;
        gap: 2px;
        min-height: 52px;
        padding: 4px 2px;
        border: 0;
        border-radius: var(--zd-radius-sm);
        background: none;
        color: var(--zd-text-3);
        font: inherit;
        font-size: 0.68rem;
        font-weight: 600;
        text-decoration: none;
        cursor: pointer;
        -webkit-tap-highlight-color: transparent;
    }
    .zd-bottom-nav__item span { max-width: 100%; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
    .zd-bottom-nav__item--active { color: var(--mud-palette-primary, var(--zd-brand)); }
    .zd-bottom-nav__item--active .mud-icon-root {
        background: color-mix(in srgb, var(--mud-palette-primary, var(--zd-brand)) 14%, transparent);
        border-radius: var(--zd-radius-pill);
        padding: 2px 14px;
        box-sizing: content-box;
    }
    .mud-layout:has(.zd-bottom-nav) .mud-main-content { padding-bottom: calc(76px + env(safe-area-inset-bottom, 0px)) !important; }
    /* Il piè di pagina dell'app resta sopra la barra. */
}

/* ==== css/mascot.css ==== */
/* ===========================================================
   Mascotte "Zed" 2.0 — stili e animazioni
   -----------------------------------------------------------
   Componente: Shared/Mascot.razor. Tutto il colore arriva dalle
   variabili tema (--accent-*, --surface, --ink) definite in
   app.css per [data-vertical]: nessun colore di brand hardcoded.
   Gli occhi luminosi derivano dall'accent del tema e ciclano
   tinta tramite hue-rotate: restano coerenti col verticale.
   Namespace CSS: .zcd-mascot / .zm-* — nessuna collisione con
   le classi del design system Flow.
   =========================================================== */

/* Registrate come <color> per poterle animare in modo fluido (senza
   @property un'animazione su custom property "scatta" da un valore
   all'altro invece di sfumare). Usate dagli occhi/glow: qui gira
   davvero il ciclo giallo/arancione richiesto, non solo un hue-rotate
   (che partendo da un blu non arriva mai a un giallo/arancione vero). */
@property --zm-eye-core { syntax: '<color>'; inherits: true; initial-value: #DFF2FF; }
@property --zm-eye-edge { syntax: '<color>'; inherits: true; initial-value: #8FC6E8; }
@property --zm-glow     { syntax: '<color>'; inherits: true; initial-value: #8FC6E8; }

.zcd-mascot {
    --mascot-size: 120px;
    /* Valori di partenza (fallback se @property non supportato): tinta del
       verticale. L'animazione zcd-eye-color-cycle li porta poi su giallo/
       arancione e torna. */
    --zm-eye-core: color-mix(in srgb, var(--accent-light, #C99670) 32%, #FFFFFF);
    --zm-eye-edge: color-mix(in srgb, var(--accent-light, #C99670) 72%, #FFFFFF);
    --zm-glow: color-mix(in srgb, var(--accent-light, #C99670) 80%, #FFFFFF);
    animation: zcd-eye-color-cycle 9s ease-in-out infinite;
    display: inline-flex;
    align-items: flex-start;
    gap: 0.875rem;
    max-width: 100%;
}

.zcd-mascot__figure {
    width: var(--mascot-size);
    flex: none;
    filter: drop-shadow(0 6px 14px rgba(20, 16, 12, 0.12));
}

.zcd-mascot__figure svg {
    display: block;
    width: 100%;
    height: auto;
    overflow: visible;
}

/* Tutte le parti animate via transform usano il proprio bounding box */
.zm-float, .zm-head, .zm-eyes, .zm-eye, .zm-arm-r, .zm-shadow,
.zm-antenna, .zm-halo, .zm-chest, .zm-sheen {
    transform-box: fill-box;
    transform-origin: center;
}

/* ---------- Animazioni di base (idle) ---------- */

/* Fluttuazione: ampiezza 12px + micro-rollio, chiaramente percepibile */
.zm-float { animation: zcd-float 4.2s ease-in-out infinite; }

.zm-shadow { animation: zcd-shadow 4.2s ease-in-out infinite; }

/* Battito di ciglia: doppio blink ogni ~3.8s */
.zm-eye { animation: zcd-blink 3.8s ease-in-out infinite; }

/* Occhi: glow permanente + ciclo di tinta (hue-rotate) + drift dello sguardo.
   Il filter base garantisce il glow anche con reduced-motion. */
.zm-eyes {
    filter: drop-shadow(0 0 3px var(--zm-glow)) drop-shadow(0 0 9px var(--zm-glow));
    animation:
        zcd-look 8s ease-in-out infinite,
        zcd-eyeglow 6.5s ease-in-out infinite;
}

/* Led antenna, alone, nucleo petto, anelli pod: pulsano sfalsati */
.zm-antenna { animation: zcd-pulse 2.6s ease-in-out infinite; }
.zm-halo    { animation: zcd-halo 2.6s ease-in-out infinite; }
.zm-chest   { animation: zcd-core 2.2s ease-in-out infinite; }
.zm-ear     { animation: zcd-pulse 3.4s ease-in-out 0.8s infinite; }

/* Led di stato sul corpo: si accendono in sequenza */
.zm-led { opacity: 0.25; animation: zcd-led 1.8s ease-in-out infinite; }
.zm-led + .zm-led { animation-delay: 0.3s; }
.zm-led + .zm-led + .zm-led { animation-delay: 0.6s; }

/* Sheen diagonale che attraversa il visore ogni ~7s */
.zm-sheen { animation: zcd-sheen 7s ease-in-out infinite; }

/* La testa reagisce con una transizione morbida (hover, mood) */
.zm-head {
    transform-origin: 50% 90%;
    transition: transform 0.32s cubic-bezier(0.22, 1, 0.36, 1);
}

/* ---------- Reazione al passaggio del mouse ---------- */

.zcd-mascot:hover .zm-head { transform: rotate(-6deg) translateY(-2px); }

.zcd-mascot:hover .zm-arm-r {
    transform-origin: 50% 10%;
    animation: zcd-wave 1s ease-in-out;
}

.zcd-mascot:hover .zm-antenna { animation: zcd-pulse 0.7s ease-in-out infinite; }
.zcd-mascot:hover .zm-halo    { animation: zcd-halo 0.7s ease-in-out infinite; }

/* Gli occhi si illuminano di più quando ricevono attenzione */
.zcd-mascot:hover .zm-eyes {
    animation:
        zcd-look 8s ease-in-out infinite,
        zcd-eyeglow 2.5s ease-in-out infinite;
}

/* ---------- Mood ---------- */

/* Elementi condizionali: nascosti di default */
.zm-mouth-happy, .zm-cheek, .zm-think, .zm-question { opacity: 0; visibility: hidden; }

/* happy: sorriso e guance, niente grille */
.zcd-mascot--happy .zm-mouth-neutral { opacity: 0; visibility: hidden; }
.zcd-mascot--happy .zm-mouth-happy   { opacity: 1; visibility: visible; }
.zcd-mascot--happy .zm-cheek         { opacity: 0.55; visibility: visible; }

/* thinking: sguardo in alto fisso + puntini che si accendono in sequenza */
.zcd-mascot--thinking .zm-eyes {
    animation: zcd-eyeglow 6.5s ease-in-out infinite;
    transform: translate(3px, -4px);
}
.zcd-mascot--thinking .zm-think { opacity: 1; visibility: visible; }
.zcd-mascot--thinking .zm-think-dot { animation: zcd-think 1.8s ease-in-out infinite; }
.zcd-mascot--thinking .zm-think-dot:nth-child(2) { animation-delay: 0.3s; }
.zcd-mascot--thinking .zm-think-dot:nth-child(3) { animation-delay: 0.6s; }

/* confused: testa inclinata e punto interrogativo */
.zcd-mascot--confused .zm-head { transform: rotate(6deg); }
.zcd-mascot--confused:hover .zm-head { transform: rotate(-6deg) translateY(-2px); }
.zcd-mascot--confused .zm-question {
    opacity: 1;
    visibility: visible;
    animation: zcd-question 2.4s ease-in-out infinite;
    transform-box: fill-box;
    transform-origin: center;
}

/* ---------- Fumetto ---------- */

.zcd-mascot__bubble {
    position: relative;
    align-self: center;
    background: var(--surface, #FFFFFF);
    border: 1px solid var(--border, #E3DFD8);
    border-radius: var(--r-md, 14px);
    padding: 0.625rem 0.875rem;
    font-size: 0.9rem;
    line-height: 1.45;
    color: var(--text, #2C2521);
    box-shadow: var(--shadow-sm, 0 2px 6px rgba(20, 16, 12, 0.06));
    max-width: 34ch;
    animation: zcd-bubble-in 0.45s cubic-bezier(0.22, 1, 0.36, 1) 0.15s both;
}

/* Coda del fumetto: punta verso la figura (a sinistra nel layout in riga) */
.zcd-mascot__bubble::before {
    content: '';
    position: absolute;
    left: -5px;
    top: 50%;
    width: 10px;
    height: 10px;
    background: inherit;
    border-left: 1px solid var(--border, #E3DFD8);
    border-bottom: 1px solid var(--border, #E3DFD8);
    transform: translateY(-50%) rotate(45deg);
}

/* ---------- Variante impilata (empty state, 404) ---------- */

.zcd-mascot--stack {
    flex-direction: column;
    align-items: center;
    text-align: center;
}

.zcd-mascot--stack .zcd-mascot__bubble { align-self: center; }

.zcd-mascot--stack .zcd-mascot__bubble::before {
    left: 50%;
    top: -5px;
    border: none;
    border-left: 1px solid var(--border, #E3DFD8);
    border-top: 1px solid var(--border, #E3DFD8);
    transform: translateX(-50%) rotate(45deg);
}

/* Mascotte "di sezione" (accanto ai titoli pagina/verticale): oscilla dolcemente
   e si illumina, come il nome "Zed" nell'assistente compatto. Il float agisce su un
   gruppo INTERNO all'SVG (.zm-float) e il bagliore è un filter sul wrap: nessuno dei
   due tocca il transform:scale che mascot-follow.js applica per posizionarla, quindi
   il movimento non interferisce con l'aggancio sopra l'icona del titolo. */
.zcd-mascot-anchor .zm-float {
    animation: zcd-float 4.2s ease-in-out infinite;
}

/* L'ombra di terra resta ferma: non ha senso pulsare sopra un'icona di titolo. */
.zcd-mascot-anchor .zm-shadow {
    animation: none;
}

.zcd-mascot-anchor .zcd-mascot-figure-wrap {
    animation: zcd-section-glow 2.6s ease-in-out infinite;
}

@keyframes zcd-section-glow {
    0%, 100% { filter: drop-shadow(0 0 0 transparent); }
    50%      { filter: drop-shadow(0 0 6px color-mix(in srgb, var(--accent, #A87545) 70%, transparent)); }
}

@media (prefers-reduced-motion: reduce) {
    .zcd-mascot-anchor .zm-float,
    .zcd-mascot-anchor .zcd-mascot-figure-wrap {
        animation: none;
    }
}

/* ---------- Contesti d'uso ---------- */

/* Login: mascotte di benvenuto — accanto alla card su desktop, impilata sopra su mobile/tablet */
.mascot-login {
    position: relative;
    z-index: 1;
    margin-inline-end: 2.5rem;
    align-self: center;
}

@media (max-width: 59.99em) {
    .mascot-login {
        margin-inline-end: 0;
        margin-block-end: 0.5rem;
        transform: scale(0.8);
    }
}

@media (max-width: 380px) {
    .mascot-login { transform: scale(0.68); }
}

/* Mascotte "di sezione": prende il POSTO dell'icona del titolo di ogni
   pagina (.page-header .mud-icon-root.mud-svg-icon), che viene nascosta via
   JS — non più "a fianco" del titolo, ma esattamente al suo posto, stessa
   dimensione. z-index alto: deve stare sopra le card come lo sfondo
   fluttuante. */
.zcd-mascot-anchor {
    position: fixed;
    z-index: 35;
    cursor: pointer;
    /* niente transition su top/left/opacity: l'ancora deve scattare ESATTAMENTE
       sopra l'icona reale ad ogni cambio pagina, uno spostamento animato
       farebbe vedere la mascotte "viaggiare" da un punto vecchio. Nascosta
       di default: mascot-follow.js la rende visibile SOLO dopo aver calcolato
       la posizione corretta sulla pagina corrente, così non si vede mai né
       nel punto della pagina precedente né "saltare" in quello nuovo. */
    opacity: 0;
}

/* Il wrap riceve lo scale calcolato via JS in base alla dimensione
   dell'icona sostituita: SEPARATO dall'anchor apposta, altrimenti anche il
   pannello/menu (fratello, sotto) si rimpicciolirebbe insieme alla figura. */
.zcd-mascot-figure-wrap {
    display: block;
    transform-origin: top left;
    transition: transform 0.15s ease-out;
}

.zcd-mascot-anchor .zcd-mascot__bubble,
.zcd-mascot-anchor .zcd-mascot-toast {
    position: absolute;
    top: calc(100% + 10px);
    /* Ancorato al bordo SINISTRO della mascotte: ora sta al posto
       dell'icona del titolo, quindi vicino al bordo SINISTRO dell'area di
       contenuto (accanto alla sidebar) — aprire verso destra (non più verso
       sinistra) evita che il pannello finisca nascosto dietro la sidebar. */
    left: 0;
    right: auto;
    white-space: normal;
    width: max-content;
    max-width: min(30ch, calc(100vw - 2.5rem));
}

.zcd-mascot-anchor .zcd-mascot__bubble::before {
    left: 14px;
    right: auto;
    top: -5px;
    border: none;
    border-left: 1px solid var(--border, #E3DFD8);
    border-top: 1px solid var(--border, #E3DFD8);
    transform: rotate(45deg);
}

/* Messaggio transitorio ("come se parlasse"): stessa forma del fumetto ma
   sparisce da sola dopo pochi secondi (gestito da MainLayout via MascotSignal),
   la mascotte resta al suo posto. */
.zcd-mascot-toast {
    background: var(--surface, #FFFFFF);
    border: 1px solid var(--accent-light, #C99670);
    border-radius: var(--r-md, 14px);
    padding: 0.55rem 0.8rem;
    font-size: 0.86rem;
    font-weight: 600;
    color: var(--accent-dark, #8B5D38);
    box-shadow: var(--shadow-md, 0 8px 24px rgba(20, 16, 12, 0.12));
    animation: zcd-bubble-in 0.35s cubic-bezier(0.22, 1, 0.36, 1) both;
    pointer-events: none;
}

/* Pagina 404 */
.zcd-notfound {
    min-height: 60vh;
    display: flex;
    flex-direction: column;
    align-items: center;
    justify-content: center;
    gap: 1.25rem;
    padding: 2rem 1rem;
    text-align: center;
}

.zcd-notfound__home {
    display: inline-flex;
    align-items: center;
    min-height: 44px;
    padding: 0.625rem 1.25rem;
    border-radius: var(--r-sm, 10px);
    background: var(--accent, #A87545);
    color: var(--text-on-accent, #FFFFFF);
    font-weight: 600;
    font-size: 0.95rem;
    text-decoration: none;
    box-shadow: var(--shadow-sm, 0 2px 6px rgba(20, 16, 12, 0.06));
    transition: background 0.18s cubic-bezier(0.4, 0, 0.2, 1), transform 0.18s cubic-bezier(0.4, 0, 0.2, 1);
}

.zcd-notfound__home:hover {
    background: var(--accent-dark, #8B5D38);
    transform: translateY(-1px);
}

.zcd-notfound__home:focus-visible {
    outline: 2px solid var(--accent-dark, #8B5D38);
    outline-offset: 2px;
}

/* Empty state generico con mascotte (Addons, ...) */
.zcd-empty-mascot {
    display: flex;
    justify-content: center;
    padding: 2rem 1rem;
}

/* ---------- Keyframes ---------- */

@keyframes zcd-float {
    0%, 100% { transform: translateY(0) rotate(0deg); }
    50%      { transform: translateY(-12px) rotate(1.4deg); }
}

@keyframes zcd-shadow {
    0%, 100% { transform: scaleX(1);    opacity: 0.12; }
    50%      { transform: scaleX(0.78); opacity: 0.06; }
}

/* Doppio battito di ciglia, rapido e vivace */
@keyframes zcd-blink {
    0%, 86%, 100% { transform: scaleY(1); }
    88%, 90%      { transform: scaleY(0.06); }
    92%           { transform: scaleY(1); }
    94%, 96%      { transform: scaleY(0.06); }
    98%           { transform: scaleY(1); }
}

@keyframes zcd-look {
    0%, 30%, 100% { transform: translateX(0); }
    38%, 52%      { transform: translateX(5px); }
    60%, 88%      { transform: translateX(-5px); }
}

/* Glow degli occhi: intensità che respira (il COLORE non è più qui — vedi
   zcd-eye-color-cycle sotto, che cambia davvero --zm-glow/--zm-eye-*). */
@keyframes zcd-eyeglow {
    0%, 100% { filter: drop-shadow(0 0 3px var(--zm-glow)) drop-shadow(0 0 9px var(--zm-glow)) brightness(1); }
    35%      { filter: drop-shadow(0 0 5px var(--zm-glow)) drop-shadow(0 0 14px var(--zm-glow)) brightness(1.18); }
    70%      { filter: drop-shadow(0 0 4px var(--zm-glow)) drop-shadow(0 0 11px var(--zm-glow)) brightness(1.08); }
}

/* Ciclo di colore reale degli occhi: tinta del verticale -> giallo -> arancione
   -> tinta del verticale. Richiede @property qui sopra per interpolare invece
   di scattare da un colore all'altro. */
@keyframes zcd-eye-color-cycle {
    0%, 100% {
        --zm-eye-core: color-mix(in srgb, var(--accent-light, #C99670) 32%, #FFFFFF);
        --zm-eye-edge: color-mix(in srgb, var(--accent-light, #C99670) 72%, #FFFFFF);
        --zm-glow: color-mix(in srgb, var(--accent-light, #C99670) 80%, #FFFFFF);
    }
    30% { --zm-eye-core: #FFF3B0; --zm-eye-edge: #FFC53D; --zm-glow: #FFB300; }
    65% { --zm-eye-core: #FFDCB0; --zm-eye-edge: #FF9F45; --zm-glow: #FF7A1A; }
}

@keyframes zcd-pulse {
    0%, 100% { opacity: 1; }
    50%      { opacity: 0.35; }
}

@keyframes zcd-halo {
    0%, 100% { opacity: 0.10; transform: scale(1); }
    50%      { opacity: 0.40; transform: scale(1.35); }
}

@keyframes zcd-core {
    0%, 100% { opacity: 1;    transform: scale(1); }
    50%      { opacity: 0.65; transform: scale(1.18); }
}

@keyframes zcd-led {
    0%, 100% { opacity: 0.25; }
    30%, 50% { opacity: 1; }
}

@keyframes zcd-sheen {
    0%, 55%   { transform: translateX(-46px); }
    85%, 100% { transform: translateX(120px); }
}

@keyframes zcd-wave {
    0%, 100% { transform: rotate(0); }
    25%      { transform: rotate(-44deg); }
    50%      { transform: rotate(-14deg); }
    75%      { transform: rotate(-36deg); }
}

@keyframes zcd-think {
    0%, 100% { opacity: 0.25; }
    50%      { opacity: 1; }
}

@keyframes zcd-question {
    0%, 100% { transform: translateY(0) rotate(0); }
    50%      { transform: translateY(-4px) rotate(8deg); }
}

@keyframes zcd-bubble-in {
    from { opacity: 0; transform: translateY(6px) scale(0.96); }
    to   { opacity: 1; transform: translateY(0) scale(1); }
}

/* NOTA: nessuna regola prefers-reduced-motion qui (rimossa): richiesta
   esplicita del cliente, le animazioni (mascotte inclusa) restano sempre
   attive a prescindere dalle impostazioni di sistema. */

/* ==== css/docs-assistant.css ==== */
/* ============================================================
   Assistente della documentazione ("Chiedi a Zed").
   Usato da Verticals\Barbiere\Barbiere.Web\Components\DocsAssistant.razor.
   Namespace classi: .zed-assist / .zed-turn / .zed-typing
   Riusa le variabili di tema (--accent, --surface, --ink) come mascot.css.
   ============================================================ */

.zed-assist {
    position: relative;
    overflow: hidden;
    margin-bottom: 1.5rem;
    padding: 1.5rem 1.75rem;
    /* Con la riga unica non c'è più nulla sotto la barra di ricerca: il fondo
       si stringe al minimo, il respiro lo dà già il margine esterno. */
    padding-bottom: 3px;
    border-radius: 18px;
    border: 1px solid color-mix(in srgb, var(--accent) 22%, transparent);
    background:
        radial-gradient(120% 140% at 0% 0%, color-mix(in srgb, var(--accent) 12%, transparent) 0%, transparent 60%),
        linear-gradient(180deg, var(--zd-surface) 0%, var(--zd-surface-2) 100%);
}

/* --- Hero: mascotte + intro + barra di ricerca --- */
.zed-assist__hero {
    display: flex;
    align-items: center;
    gap: 1.75rem;
}

/* --- Variante compatta: recupera altezza (nome sopra la mascotte, niente riga titolo) --- */
.zed-assist--compact {
    padding: 1rem 1.25rem;
    padding-bottom: 3px;
    margin-bottom: 1rem;
}

.zed-assist--compact .zed-assist__hero {
    gap: 1.25rem;
}

/* Mascotte più piccola con il nome impilato sopra la testa. */
.zed-assist--compact .zed-assist__mascot {
    display: flex;
    flex-direction: column;
    align-items: center;
    gap: 0.1rem;
}

.zed-assist__name {
    font-weight: 700;
    font-size: 1.05rem;
    letter-spacing: 0.03em;
    line-height: 1;
    color: color-mix(in srgb, var(--accent) 72%, var(--zd-ink-mix));
    /* Poco più in alto, staccato dalla testa della mascotte. */
    margin-top: -0.35rem;
    margin-bottom: 0.15rem;
    /* Si muove e si illumina. */
    animation: zed-name-glow 2.4s ease-in-out infinite;
    will-change: transform;
}

@keyframes zed-name-glow {
    0%, 100% {
        transform: translateY(0);
        text-shadow: 0 0 0 transparent;
    }
    50% {
        transform: translateY(-3px);
        text-shadow: 0 0 12px color-mix(in srgb, var(--accent) 75%, transparent);
    }
}

/* Distacca la barra input/Invia dai chip sottostanti (altrimenti risultano "attaccati"). */
.zed-assist--compact .zed-assist__ask {
    margin-bottom: 0.75rem;
}

/* ...ma quando sotto non c'è nulla (caso normale: l'invito è ora nella riga stessa)
   quel margine sommato al padding del riquadro tornerebbe a sprecare altezza. */
.zed-assist__ask:last-child {
    margin-bottom: 0;
}

/* Domande frequenti in griglia ordinata: 4 colonne dove c'è spazio, poi 3 / 2 / 1. */
.zed-assist--compact .zed-assist__chips {
    display: grid;
    grid-template-columns: repeat(4, minmax(0, 1fr));
    gap: 0.4rem;
    align-items: stretch;
    margin-top: 0.6rem;
}

.zed-assist--compact .zed-assist__chips-label {
    grid-column: 1 / -1;
    margin: 0;
}

.zed-assist--compact .zed-assist__chips .mud-chip {
    width: 100%;
    margin: 0;
    justify-content: flex-start;
}

@media (max-width: 75em) {
    .zed-assist--compact .zed-assist__chips {
        grid-template-columns: repeat(3, minmax(0, 1fr));
    }
}

@media (max-width: 60em) {
    .zed-assist--compact .zed-assist__chips {
        grid-template-columns: repeat(2, minmax(0, 1fr));
    }
}

@media (max-width: 40em) {
    .zed-assist--compact .zed-assist__chips {
        grid-template-columns: 1fr;
    }
}

/* Assistente subito dopo il titolo (solo area SuperAdmin): la .page-header della pagina e
   ZedHero sono figli diretti della stessa MudContainer (Blazor rende @Body inline). Con un
   flex-column e order forziamo Titolo → ZedHero → resto, senza toccare le singole pagine. */
.zed-after-title {
    display: flex;
    flex-direction: column;
}
/* I banner di LAYOUT (conferma email, annunci, anteprima Owner) restano in cima, sopra il
   titolo: sono avvisi che riguardano l'intera sessione, non la pagina che si sta guardando.

   Il selettore era `.zed-after-title > .mud-alert`, e il commento diceva che le alert dentro
   le pagine non venivano toccate. Non era vero: Blazor rende @Body in linea, quindi anche gli
   avvisi scritti DENTRO una pagina sono figli diretti di questo contenitore e prendevano lo
   stesso order:-3, scavalcando titolo e assistente. Su "WhatsApp dedicato" le istruzioni
   operative finivano così sopra al titolo della pagina. Ora la regola vale solo per i banner
   che il layout marca a mano, e gli avvisi di pagina restano dove l'autore li ha scritti. */
.zed-after-title > .layout-banner { order: -3; }
.zed-after-title > .page-header { order: -2; }
.zed-after-title > .zed-assist,
.zed-after-title > .zed-hero-bar,
.zed-after-title > .zed-inline-bar { order: -1; }
/* Barra compatta nei verticali (2026-10-09): su una riga sua sotto il titolo, a tutta larghezza. */
.zed-after-title:not(.zed-title-row) > .zed-inline-bar { margin-bottom: 16px; }

@media (prefers-reduced-motion: reduce) {
    .zed-assist__name { animation: none; }
}

/* Comprimi/espandi in compatta: pulsante in alto a destra, senza rubare una riga. */
.zed-hero__collapse--floating {
    position: absolute;
    top: 0.5rem;
    right: 0.5rem;
    z-index: 2;
    opacity: 0.6;
}
.zed-hero__collapse--floating:hover { opacity: 1; }

/* In compatta il pulsante "Invia" arriverebbe a sfiorare l'icona comprimi/espandi
   (che galleggia nell'angolo): riserviamo la corsia a destra della riga di ricerca. */
.zed-assist--compact .zed-assist__ask {
    padding-right: 2.6rem;
}

/* ---- Riga unica: ricerca + Invia + invito alla palette --------------------
   Dove c'è larghezza (desktop e tablet) i tre elementi stanno affiancati e
   alti uguali: l'assistente occupa una fascia sola invece di due, che sui
   portatili è la differenza fra vedere o non vedere la tabella sotto.
   Vale per entrambe le varianti (shell SuperAdmin e verticali). */
.zed-assist__ask {
    align-items: center;
    flex-wrap: nowrap;
    --zed-row-h: 2.5rem;
}

/* min-width:0 è obbligatorio: senza, la larghezza minima del campo impedisce
   alla riga di stringersi e i tre elementi sbordano invece di adattarsi. */
.zed-assist__input {
    min-width: 0;
}

.zed-assist__input,
.zed-assist__input .mud-input-control,
.zed-assist__input .mud-input {
    min-height: var(--zed-row-h);
}

.zed-assist__send {
    height: var(--zed-row-h);
    padding-inline: 1.1rem;
}

/* L'invito diventa un elemento della riga: niente stacco verticale, niente a capo. */
.zed-assist__hint {
    flex: 0 1 auto;
    min-width: 0;
    height: var(--zed-row-h);
    margin-top: 0;
    white-space: nowrap;
}

.zed-assist__hint > span:not(.zed-assist__hint-kbd) {
    overflow: hidden;
    text-overflow: ellipsis;
}

/* Tablet stretto: si sacrifica per primo il suggerimento sul come aprirla,
   che è ridondante (la mascotte è lì accanto). */
@media (max-width: 62em) {
    .zed-assist__hint-kbd { display: none; }
}

@media (max-width: 40em) {
    /* In colonna il pulsante è a tutta larghezza: basta un filo di respiro. */
    .zed-assist--compact .zed-assist__ask {
        padding-right: 2.2rem;
    }

    .zed-assist__ask {
        flex-wrap: wrap;
        align-items: stretch;
    }

    /* Sotto, la riga unica non ci sta: l'invito torna a tutta larghezza. */
    .zed-assist__hint {
        width: 100%;
        height: auto;
        padding-block: 0.45rem;
        justify-content: center;
    }

    /* Su schermo stretto i controlli sono impilati: si torna alle altezze tocco-friendly. */
    .zed-assist__send {
        height: 2.9rem;
    }
}

/* Barra ridotta migliorata: filo d'accento a sinistra, più compatta. */
.zed-hero-bar--compact {
    padding: 7px 14px;
    border-left: 3px solid var(--accent);
}

.zed-assist__mascot {
    flex: 0 0 auto;
}

.zed-assist__intro {
    flex: 1 1 auto;
    min-width: 0;
}

.zed-assist__title {
    font-weight: 700;
    letter-spacing: -0.01em;
}

.zed-assist__subtitle {
    margin-bottom: 0.9rem;
    max-width: 62ch;
    opacity: 0.78;
}

.zed-assist__ask {
    display: flex;
    align-items: flex-start;
    gap: 0.6rem;
}

.zed-assist__input {
    flex: 1 1 auto;
    margin: 0;
}

.zed-assist__send {
    flex: 0 0 auto;
    height: 3.4rem;
    border-radius: 12px;
    padding-inline: 1.4rem;
}

.zed-assist__chips {
    display: flex;
    flex-wrap: wrap;
    align-items: center;
    gap: 0.35rem;
    margin-top: 0.85rem;
}

.zed-assist__chips-label {
    margin-right: 0.25rem;
    opacity: 0.65;
}

/* --- Thread domanda/risposta --- */
.zed-assist__thread {
    margin-top: 1.5rem;
    padding-top: 1.25rem;
    border-top: 1px dashed color-mix(in srgb, var(--accent) 28%, transparent);
}

.zed-turn + .zed-turn {
    margin-top: 1.25rem;
}

.zed-turn__you {
    display: inline-flex;
    align-items: center;
    gap: 0.4rem;
    max-width: 100%;
    margin-bottom: 0.6rem;
    padding: 0.5rem 0.9rem;
    border-radius: 14px 14px 14px 4px;
    font-weight: 600;
    color: var(--zd-text);
    background: color-mix(in srgb, var(--accent) 14%, transparent);
}

.zed-turn__zed {
    padding: 1rem 1.15rem;
    border-radius: 4px 14px 14px 14px;
    border: 1px solid color-mix(in srgb, var(--accent) 18%, transparent);
    background: var(--zd-surface);
    animation: zed-answer-in 0.35s ease-out both;
}

.zed-turn__zed--miss {
    border-style: dashed;
    background: transparent;
}

@keyframes zed-answer-in {
    from { opacity: 0; transform: translateY(6px); }
    to   { opacity: 1; transform: none; }
}

.zed-turn__badge {
    display: inline-flex;
    align-items: center;
    gap: 0.35rem;
    margin-bottom: 0.6rem;
    padding: 0.15rem 0.6rem;
    border-radius: 999px;
    font-size: 0.72rem;
    font-weight: 600;
    text-transform: uppercase;
    letter-spacing: 0.03em;
    color: color-mix(in srgb, var(--accent) 72%, var(--zd-ink-mix));
    background: color-mix(in srgb, var(--accent) 16%, transparent);
}

.zed-turn__body {
    line-height: 1.6;
}

.zed-turn__body p { margin: 0 0 0.6rem; }
.zed-turn__body p:last-child { margin-bottom: 0; }
.zed-turn__body ul,
.zed-turn__body ol { margin: 0 0 0.6rem; padding-left: 1.3rem; }
.zed-turn__body li { margin-bottom: 0.3rem; }

.zed-turn__body code {
    padding: 0.1rem 0.35rem;
    border-radius: 5px;
    font-size: 0.88em;
    background: color-mix(in srgb, var(--zd-text) 8%, transparent);
}

.zed-turn__related {
    display: flex;
    flex-wrap: wrap;
    align-items: center;
    gap: 0.3rem;
    margin-top: 0.75rem;
    padding-top: 0.6rem;
    border-top: 1px solid color-mix(in srgb, var(--zd-text) 8%, transparent);
}

.zed-assist__reset {
    margin-top: 1rem;
}

/* --- Indicatore "sta scrivendo" --- */
.zed-typing {
    display: inline-flex;
    align-items: center;
    gap: 0.35rem;
}

.zed-typing__dot {
    width: 7px;
    height: 7px;
    border-radius: 50%;
    background: var(--accent);
    animation: zed-blink 1.2s infinite ease-in-out;
}

.zed-typing__dot:nth-child(2) { animation-delay: 0.18s; }
.zed-typing__dot:nth-child(3) { animation-delay: 0.36s; }

.zed-typing__label {
    margin-left: 0.5rem;
    font-size: 0.85rem;
    opacity: 0.7;
}

@keyframes zed-blink {
    0%, 60%, 100% { opacity: 0.25; transform: translateY(0); }
    30%           { opacity: 1;    transform: translateY(-3px); }
}

/* --- Responsive: sotto i 60em la mascotte va sopra, centrata --- */
@media (max-width: 60em) {
    .zed-assist {
        padding: 1.25rem;
    }

    .zed-assist__hero {
        flex-direction: column;
        align-items: center;
        gap: 1rem;
        text-align: center;
    }

    .zed-assist__mascot {
        transform: scale(0.8);
        transform-origin: center;
    }

    .zed-assist__subtitle {
        margin-inline: auto;
    }

    .zed-assist__ask {
        flex-direction: column;
        text-align: left;
    }

    .zed-assist__send {
        width: 100%;
        height: 2.9rem;
    }

    .zed-assist__chips {
        justify-content: center;
    }
}

@media (prefers-reduced-motion: reduce) {
    .zed-turn__zed { animation: none; }
    .zed-typing__dot { animation-duration: 3s; }
}

/* ===================== ZED HERO (globale, sopra il contenuto) ===================== */
/* Riga del titolo con il pulsante per ridurre l'hero a barra. */
.zed-hero__titlerow {
    display: flex;
    align-items: center;
    justify-content: space-between;
    gap: 8px;
}
.zed-hero__collapse {
    flex-shrink: 0;
    opacity: 0.7;
}
.zed-hero__collapse:hover { opacity: 1; }

/* Barra compatta: stato "ridotto" ricordato per utente. Un click la riapre. */
.zed-hero-bar {
    display: flex;
    align-items: center;
    gap: 10px;
    padding: 9px 16px;
    margin-bottom: 1rem;
    border: 1px solid var(--zd-border);
    border-radius: 12px;
    background: var(--zd-surface);
    color: var(--zd-text-2);
    cursor: pointer;
    transition: border-color var(--ease, .2s ease), box-shadow var(--ease, .2s ease), background var(--ease, .2s ease);
}
.zed-hero-bar:hover {
    border-color: var(--accent);
    box-shadow: 0 2px 10px rgba(0, 0, 0, 0.06);
}
.zed-hero-bar__icon {
    display: inline-flex;
    color: var(--accent);
}
.zed-hero-bar__text {
    flex: 1 1 auto;
    font-size: 0.9rem;
    font-weight: 500;
}

/* Tabelle e schede chiave-valore nelle risposte di Zed (consultazioni "Zed sa").
   Scorrono orizzontalmente su schermi stretti senza rompere il layout della chat. */
.zed-turn__body table {
    width: 100%;
    border-collapse: collapse;
    margin: 0.35rem 0;
    font-size: 0.85rem;
    display: block;
    overflow-x: auto;
}
.zed-turn__body th,
.zed-turn__body td {
    text-align: left;
    padding: 4px 8px;
    border-bottom: 1px solid var(--zd-border);
    vertical-align: top;
    white-space: nowrap;
}
.zed-turn__body th {
    font-weight: 600;
    color: var(--zd-text-3);
}
.zed-turn__body table.zed-kv td:first-child {
    white-space: nowrap;
    color: var(--zd-text-3);
}
.zed-turn__body table.zed-kv td:last-child {
    white-space: normal;
}

/* ===================== MASCOTTE-TRIGGER + PALETTE DELLE SCORCIATOIE =====================
   I suggerimenti ("Prova con:") non stanno piu' nell'hero: rubavano mezza schermata.
   Ora la mascotte e' un pulsante che apre .zed-palette, una modale fixed con le azioni,
   le consultazioni e le domande frequenti, filtrabili. Su mobile diventa un bottom-sheet.
   ====================================================================================== */

.zed-mascot-trigger {
    position: relative;
    display: block;
    padding: 0;
    border: 0;
    background: none;
    cursor: pointer;
    line-height: 0;
    border-radius: 50%;
    transition: transform 0.25s cubic-bezier(0.34, 1.56, 0.64, 1);
}

.zed-mascot-trigger:hover { transform: translateY(-3px) scale(1.04); }
.zed-mascot-trigger:active { transform: translateY(-1px) scale(0.99); }

.zed-mascot-trigger:focus-visible {
    outline: 2px solid var(--accent);
    outline-offset: 6px;
}

/* Alone pulsante: dice "sono cliccabile" senza aggiungere testo alla pagina. */
.zed-mascot-trigger__ring {
    position: absolute;
    inset: 8% 4%;
    border-radius: 50%;
    border: 2px solid color-mix(in srgb, var(--accent) 55%, transparent);
    opacity: 0;
    pointer-events: none;
    animation: zed-trigger-ping 3.2s ease-out infinite;
}

@keyframes zed-trigger-ping {
    0%   { transform: scale(0.72); opacity: 0; }
    35%  { opacity: 0.55; }
    100% { transform: scale(1.12); opacity: 0; }
}

.zed-mascot-trigger:hover .zed-mascot-trigger__ring {
    opacity: 0.65;
    animation-duration: 1.6s;
}

/* Pastiglia con il numero di scorciatoie disponibili. */
.zed-mascot-trigger__badge {
    position: absolute;
    top: 2px;
    right: -2px;
    min-width: 22px;
    height: 22px;
    padding: 0 6px;
    display: inline-flex;
    align-items: center;
    justify-content: center;
    border-radius: 999px;
    font-size: 0.72rem;
    font-weight: 700;
    line-height: 1;
    color: #fff;
    background: linear-gradient(140deg, var(--accent), var(--accent-dark));
    box-shadow: 0 2px 8px color-mix(in srgb, var(--accent-dark) 45%, transparent);
    pointer-events: none;
}

/* Invito testuale al posto della griglia di chip: una riga, non venti. */
.zed-assist__hint {
    display: inline-flex;
    align-items: center;
    gap: 0.45rem;
    margin-top: 0.75rem;
    padding: 0.4rem 0.85rem;
    border-radius: 999px;
    cursor: pointer;
    font: inherit;
    font-size: 0.85rem;
    color: color-mix(in srgb, var(--accent) 72%, var(--zd-ink-mix));
    border: 1px solid color-mix(in srgb, var(--accent) 32%, transparent);
    background: color-mix(in srgb, var(--accent) 9%, transparent);
    transition: background 0.2s ease, border-color 0.2s ease, transform 0.2s ease;
}

.zed-assist__hint:hover {
    transform: translateY(-1px);
    background: color-mix(in srgb, var(--accent) 16%, transparent);
    border-color: color-mix(in srgb, var(--accent) 55%, transparent);
}

.zed-assist__hint-kbd {
    padding: 0.1rem 0.45rem;
    border-radius: 999px;
    font-size: 0.72rem;
    opacity: 0.75;
    background: color-mix(in srgb, var(--accent) 18%, transparent);
}

/* --- Modale --- */
.zed-palette {
    position: fixed;
    inset: 0;
    z-index: 1400;
    display: flex;
    align-items: center;
    justify-content: center;
    padding: 5vh 1rem;
}

.zed-palette__scrim {
    position: absolute;
    inset: 0;
    background: rgba(15, 23, 42, .55);
    backdrop-filter: blur(6px);
    -webkit-backdrop-filter: blur(6px);
    animation: zed-pal-fade 0.22s ease-out;
}

.zed-palette__panel {
    position: relative;
    display: flex;
    flex-direction: column;
    width: min(760px, 100%);
    max-height: 90vh;
    overflow: hidden;
    border-radius: 22px;
    outline: none;
    border: 1px solid color-mix(in srgb, var(--accent) 30%, transparent);
    background: linear-gradient(180deg, var(--zd-surface) 0%, var(--zd-surface-2) 100%);
    box-shadow: var(--zd-shadow-3);
    animation: zed-pal-in 0.32s cubic-bezier(0.22, 1, 0.36, 1);
}

/* Aura d'accento in alto: da' profondita' senza immagini. */
.zed-palette__glow {
    position: absolute;
    top: -45%;
    left: -10%;
    width: 70%;
    height: 90%;
    pointer-events: none;
    background: radial-gradient(closest-side,
        color-mix(in srgb, var(--accent) 30%, transparent), transparent 70%);
}

@keyframes zed-pal-fade { from { opacity: 0; } to { opacity: 1; } }

@keyframes zed-pal-in {
    from { opacity: 0; transform: translateY(18px) scale(0.96); }
    to   { opacity: 1; transform: none; }
}

.zed-palette__head {
    position: relative;
    display: flex;
    align-items: center;
    gap: 0.9rem;
    padding: 1.15rem 1.3rem 0.6rem;
}

.zed-palette__avatar { flex: 0 0 auto; line-height: 0; }
.zed-palette__headtext { flex: 1 1 auto; min-width: 0; }

.zed-palette__title {
    font-size: 1.15rem;
    font-weight: 700;
    letter-spacing: -0.01em;
    color: color-mix(in srgb, var(--accent) 72%, var(--zd-ink-mix));
}

.zed-palette__sub {
    font-size: 0.85rem;
    opacity: 0.72;
    margin-top: 0.1rem;
}

.zed-palette__close { flex: 0 0 auto; align-self: flex-start; }

.zed-palette__search {
    position: relative;
    display: flex;
    align-items: center;
    gap: 0.5rem;
    margin: 0.35rem 1.3rem 0.9rem;
    padding: 0.55rem 0.85rem;
    border-radius: 14px;
    border: 1px solid color-mix(in srgb, var(--accent) 26%, transparent);
    background: var(--zd-surface);
    transition: border-color 0.2s ease, box-shadow 0.2s ease;
}

.zed-palette__search:focus-within {
    border-color: var(--accent);
    box-shadow: 0 0 0 3px color-mix(in srgb, var(--accent) 18%, transparent);
}

.zed-palette__input {
    flex: 1 1 auto;
    min-width: 0;
    border: 0;
    outline: none;
    background: none;
    font: inherit;
    font-size: 0.95rem;
    color: inherit;
}

.zed-palette__clear {
    border: 0;
    background: none;
    cursor: pointer;
    padding: 0;
    line-height: 0;
    opacity: 0.55;
}
.zed-palette__clear:hover { opacity: 1; }

.zed-palette__body {
    position: relative;
    flex: 1 1 auto;
    overflow-y: auto;
    padding: 0 1.3rem 1rem;
    overscroll-behavior: contain;
}

.zed-palette__group + .zed-palette__group { margin-top: 1.1rem; }

.zed-palette__grouplabel {
    display: flex;
    align-items: center;
    gap: 0.6rem;
    margin-bottom: 0.5rem;
    font-size: 0.7rem;
    font-weight: 700;
    text-transform: uppercase;
    letter-spacing: 0.08em;
    opacity: 0.6;
}

.zed-palette__grouplabel::after {
    content: "";
    flex: 1 1 auto;
    height: 1px;
    background: color-mix(in srgb, var(--accent) 22%, transparent);
}

.zed-palette__grid {
    display: grid;
    grid-template-columns: repeat(auto-fill, minmax(230px, 1fr));
    gap: 0.5rem;
}

.zed-palette__item {
    display: flex;
    align-items: center;
    gap: 0.7rem;
    width: 100%;
    padding: 0.65rem 0.7rem;
    border-radius: 14px;
    cursor: pointer;
    text-align: left;
    font: inherit;
    color: inherit;
    border: 1px solid color-mix(in srgb, var(--accent) 18%, transparent);
    background: var(--zd-surface);
    transition: transform 0.18s ease, border-color 0.18s ease, box-shadow 0.18s ease;
}

.zed-palette__item:hover {
    transform: translateY(-2px);
    border-color: color-mix(in srgb, var(--accent) 55%, transparent);
    box-shadow: 0 8px 20px color-mix(in srgb, var(--accent-dark) 18%, transparent);
}

.zed-palette__item:focus-visible {
    outline: 2px solid var(--accent);
    outline-offset: 2px;
}

.zed-palette__icon {
    flex: 0 0 auto;
    width: 34px;
    height: 34px;
    display: inline-flex;
    align-items: center;
    justify-content: center;
    border-radius: 11px;
    color: #fff;
    background: linear-gradient(140deg, var(--accent), var(--accent-dark));
}

/* Consultazioni e domande restano riconoscibili a colpo d'occhio. */
.zed-palette__item--query .zed-palette__icon {
    background: linear-gradient(140deg,
        color-mix(in srgb, var(--accent) 30%, #4C8DA6), #2F6B84);
}

.zed-palette__item--doc .zed-palette__icon {
    color: color-mix(in srgb, var(--accent) 72%, var(--zd-ink-mix));
    background: color-mix(in srgb, var(--accent) 16%, transparent);
}

.zed-palette__text {
    flex: 1 1 auto;
    min-width: 0;
    display: flex;
    flex-direction: column;
}

.zed-palette__label {
    font-size: 0.9rem;
    font-weight: 600;
    line-height: 1.25;
}

.zed-palette__hint {
    font-size: 0.76rem;
    opacity: 0.65;
    line-height: 1.3;
    display: -webkit-box;
    -webkit-line-clamp: 2;
    -webkit-box-orient: vertical;
    overflow: hidden;
}

.zed-palette__go {
    flex: 0 0 auto;
    opacity: 0;
    transform: translateX(-4px);
    transition: opacity 0.18s ease, transform 0.18s ease;
}

.zed-palette__item:hover .zed-palette__go,
.zed-palette__item:focus-visible .zed-palette__go {
    opacity: 0.7;
    transform: none;
}

.zed-palette__empty {
    display: flex;
    flex-direction: column;
    align-items: center;
    gap: 0.6rem;
    padding: 2rem 1rem;
    text-align: center;
    opacity: 0.85;
}

.zed-palette__foot {
    display: flex;
    align-items: center;
    justify-content: center;
    gap: 0.5rem;
    padding: 0.6rem 1rem;
    font-size: 0.76rem;
    opacity: 0.62;
    border-top: 1px solid color-mix(in srgb, var(--accent) 16%, transparent);
    background: color-mix(in srgb, var(--accent) 5%, transparent);
}

.zed-palette__foot kbd {
    padding: 0.05rem 0.35rem;
    border-radius: 5px;
    font-family: inherit;
    font-size: 0.72rem;
    border: 1px solid color-mix(in srgb, var(--zd-text) 22%, transparent);
    background: var(--zd-surface);
}

.zed-palette__footdot { opacity: 0.5; }

/* Mobile: bottom-sheet a tutta larghezza, piu' comodo del pop-up centrato. */
@media (max-width: 40em) {
    .zed-palette {
        align-items: flex-end;
        padding: 0;
    }

    .zed-palette__panel {
        width: 100%;
        max-height: 88vh;
        border-radius: 22px 22px 0 0;
        animation-name: zed-pal-sheet;
    }

    .zed-palette__grid { grid-template-columns: 1fr; }
    .zed-palette__head { padding-top: 1rem; }
}

@keyframes zed-pal-sheet {
    from { opacity: 0; transform: translateY(100%); }
    to   { opacity: 1; transform: none; }
}

@media (prefers-reduced-motion: reduce) {
    .zed-mascot-trigger,
    .zed-mascot-trigger__ring,
    .zed-palette__panel,
    .zed-palette__scrim,
    .zed-palette__item,
    .zed-palette__go {
        animation: none;
        transition: none;
    }
    .zed-mascot-trigger:hover { transform: none; }
    .zed-palette__go { opacity: 0.6; transform: none; }
}

/* ============================================================================
   Zed in riga col titolo (area SuperAdmin, ZedHero Compact).
   Il contenitore passa da flex a grid: il titolo della pagina nella prima colonna,
   la barra di Zed nella seconda, sulla stessa riga; tutto il resto a piena larghezza.
   L'ordine (banner → titolo → Zed → pagina) resta quello di .zed-after-title: gli
   `order` valgono anche per la grid, e il posizionamento automatico mette la barra
   accanto al titolo perché la colonna 2 di quella riga è libera.
   La barra NON entra nel riquadro del titolo: diverse pagine SuperAdmin hanno pulsanti
   a destra nel proprio titolo, e ci finirebbe sopra.
   ============================================================================ */
.zed-title-row {
    display: grid;
    grid-template-columns: minmax(0, 1fr) auto;
    column-gap: 16px;
    align-items: start;
    /* align-content: start è OBBLIGATORIO, non una rifinitura.
       Questo contenitore è figlio di .mud-main-content, che è display:flex: viene quindi
       stirato a tutta l'altezza della finestra anche quando la pagina è corta. Il valore
       iniziale align-content:normal per una grid si comporta come `stretch`, e le righe a
       dimensione automatica si spartiscono TUTTO lo spazio avanzato: su /superadmin/richieste
       le righe misuravano 254px e 521px per 461px di contenuto, su /superadmin/whatsapp-dedicato
       308+217+249px per 289px. Da qui i vuoti enormi fra titolo, barra di Zed e contenuto, e il
       fatto che cambiassero da pagina a pagina (dipendono da quanto contenuto c'è).
       Conseguenza secondaria, meno ovvia: la barra di Zed ha align-self:center e finiva
       centrata in una riga alta 254px, cioè MOLTO sotto il titolo invece che accanto. */
    align-content: start;
}
/* min-width:0: senza, una tabella larga allargherebbe la colonna e la pagina. */
.zed-title-row > * { grid-column: 1 / -1; min-width: 0; }
.zed-title-row > .page-header { grid-column: 1; }
.zed-title-row > .zed-inline-bar {
    grid-column: 2;
    order: -1;
    align-self: center;
    width: clamp(300px, 30vw, 440px);
    /* Il titolo ha mb-4 (16px): lo stesso margine qui centra la barra sul riquadro, non sulla riga. */
    margin-bottom: 16px;
}
/* Pagina senza titolo standard: la barra prende l'intera riga. */
.zed-title-row:not(:has(> .page-header)) > .zed-inline-bar {
    grid-column: 1 / -1;
    width: auto;
}

.zed-inline-bar {
    display: flex;
    align-items: center;
    gap: 8px;
}
.zed-inline-bar__input { flex: 1 1 auto; min-width: 0; }
.zed-inline-bar .mud-input-control { margin: 0 !important; }
.zed-inline-bar__send.mud-button-root {
    flex: 0 0 auto;
    height: 40px;          /* = altezza del campo con Margin.Dense */
    min-width: 0;
    padding: 0 14px;
    border-radius: 8px;
    text-transform: none;
    font-weight: 600;
}
.zed-inline-bar__send .mud-button-label { gap: 6px; }

/* Pannello delle risposte sotto il titolo: compare solo quando c'è una risposta. */
.zed-assist--inline {
    order: -1;
    padding: 1rem 1.25rem;
    margin-bottom: 1rem;
}
.zed-assist--inline .zed-assist__thread:first-child {
    margin-top: 0;
    padding-top: 0;
    border-top: 0;
}

/* Tablet e telefono: la barra scende sotto il titolo, a tutta larghezza. */
@media (max-width: 959.98px) {
    .zed-title-row > .page-header,
    .zed-title-row > .zed-inline-bar {
        grid-column: 1 / -1;
    }
    .zed-title-row > .zed-inline-bar {
        width: auto;
        margin-top: -4px;
    }
}

/* Telefono: "Invia" diventa un pulsante quadrato con la sola icona. */
@media (max-width: 599.98px) {
    .zed-inline-bar__send.mud-button-root { width: 40px; padding: 0; }
    .zed-inline-bar__send-label { display: none; }
}

/* Pulsante delle scorciatoie nella barra in riga: fulmine + numero, alto come il campo.
   Sostituisce il badge che nella variante estesa sta sulla mascotte. */
.zed-inline-bar__shortcuts {
    flex: 0 0 auto;
    display: inline-flex;
    align-items: center;
    gap: 4px;
    height: 40px;
    padding: 0 10px;
    border: 1px solid var(--zd-border-strong);
    border-radius: 8px;
    background: var(--zd-surface);
    color: var(--mud-palette-primary);
    font: inherit;
    cursor: pointer;
    transition: background-color .15s ease, border-color .15s ease;
}
.zed-inline-bar__shortcuts:hover {
    border-color: var(--mud-palette-primary);
    background: var(--zd-surface-hover);
}
.zed-inline-bar__shortcuts:focus-visible { outline: 2px solid var(--mud-palette-primary); outline-offset: 1px; }
.zed-inline-bar__count {
    min-width: 20px;
    height: 20px;
    padding: 0 6px;
    display: inline-flex;
    align-items: center;
    justify-content: center;
    border-radius: 999px;
    font-size: 0.72rem;
    font-weight: 700;
    line-height: 1;
    color: var(--mud-palette-primary-text, #fff);
    background: var(--mud-palette-primary);
}

/* ============================================================================
   Chiusura della risposta di Zed.
   Il pannello si apriva e non si chiudeva più: l'unico modo era cambiare pagina, e su un
   telefono la risposta copre tutto lo schermo sopra il contenuto della pagina. Il contenitore
   ha già position:relative, quindi la X si àncora al suo angolo senza toccare il resto.
   ============================================================================ */
.zed-assist__close.mud-icon-button {
    position: absolute;
    top: 6px;
    right: 6px;
    z-index: 2;
    color: var(--mud-palette-text-secondary);
}
.zed-assist__close.mud-icon-button:hover {
    color: var(--mud-palette-text-primary);
    background: var(--mud-palette-action-default-hover);
}
/* Il testo del pannello non deve finire sotto la X. */
.zed-assist--inline { padding-right: 44px; }

@media (max-width: 599.98px) {
    /* Area di tocco piena sul telefono, dove si sbaglia mira. */
    .zed-assist__close.mud-icon-button { top: 2px; right: 2px; padding: 8px; }
}

/* ============================================================================
   Pagina Documentazione su telefono: l'assistente non deve mangiarsi lo schermo.

   Qui l'assistente è la variante grande (DocsAssistant Compact="true"): mascotte da 96px,
   nome sopra la testa, campo e suggerimento sotto. Su un telefono da 390px quel blocco
   occupa quasi metà della prima schermata, mentre su tutte le ALTRE pagine SuperAdmin
   l'assistente è la barra sottile accanto al titolo. Qui lo si riporta alle stesse
   proporzioni: mascotte piccola a sinistra, campo accanto, una fascia sola.

   La mascotte deriva ogni misura da --mascot-size, quindi basta cambiare quella: scalarla
   con transform avrebbe lasciato lo spazio originale occupato.
   ============================================================================ */
@media (max-width: 599.98px) {
    .zed-assist--compact {
        padding: 10px 12px;
        padding-bottom: 3px;
        margin-bottom: 12px;
    }
    /* Sotto i 60em una regola precedente mette l'eroe IN COLONNA e centra la mascotte:
       è ciò che fa diventare il blocco una torre da 280px. Qui torna una riga. */
    .zed-assist--compact .zed-assist__hero {
        flex-direction: row;
        align-items: center;
        text-align: left;
        gap: 10px;
    }
    /* La stessa regola rimpicciolisce la mascotte con transform: scale(.8), che cambia
       l'aspetto ma NON lo spazio occupato — restava ingombrante come a 96px. Si annulla
       e si agisce sulla misura vera. --mascot-size è impostata inline dal componente,
       quindi serve !important per scavalcarla. */
    .zed-assist--compact .zed-assist__mascot { transform: none; }
    .zed-assist--compact .zcd-mascot { --mascot-size: 52px !important; }
    .zed-assist--compact .zed-assist__name { font-size: .78rem; margin-top: 0; margin-bottom: 2px; }

    /* L'anello attorno alla mascotte e il contatore erano tarati sui 96px. */
    .zed-assist--compact .zed-mascot-trigger__badge { font-size: .58rem; padding: 0 4px; min-width: 16px; }

    /* Il campo e "Chiedi" su UNA riga, il pulsante accanto alla barra di scrittura.
       Qui serve flex-direction:row esplicito: la media query a 60em qui sopra mette
       .zed-assist__ask in COLONNA, ed è per questo che "Chiedi" finiva sotto il campo —
       il flex-wrap:nowrap che c'era prima non poteva farci nulla, perché in colonna gli
       elementi si incolonnano comunque. */
    .zed-assist--compact .zed-assist__ask {
        flex-direction: row;
        flex-wrap: nowrap;
        align-items: center;
        padding-right: 0;
        gap: 8px;
    }
    /* Il pulsante tiene la sua etichetta: "Chiedi" dice cosa succede, un'icona sola no.
       width:auto annulla il width:100% della regola a 60em. */
    .zed-assist--compact .zed-assist__send {
        flex: 0 0 auto;
        width: auto;
        min-width: 0;
        height: 2.5rem;
        padding-inline: 12px;
        font-size: .82rem;
    }
    .zed-assist--compact .zed-assist__input { flex: 1 1 auto; min-width: 0; }

    /* L'invito alle scorciatoie va sotto, piccolo: è un suggerimento, non un comando. */
    .zed-assist--compact .zed-assist__hint { font-size: .72rem; padding-block: .3rem; }
}

/* ==== css/superadmin-lists.css ==== */
/* ============================================================================
   Liste del SuperAdmin: barra comandi + contatori-filtro (.tt).
   Condivisa da Tenant (/superadmin) e Assistenza (/superadmin/assistenza), che
   devono restare identiche nell'aspetto: prima questi stili vivevano nel <style>
   di una pagina sola.
   Tutti i controlli della barra sono alti 40px (campi con Margin.Dense).
   ============================================================================ */
/* ── Barra tenant ───────────────────────────────────────────────────────────
   Una scheda sola: comandi sopra, contatori-filtro sotto, separati da una linea.
   Tutti i campi alti uguali (40px, margine Dense) così la riga è davvero una riga. */
.tt {
    border: 1px solid var(--zd-border);
    border-radius: var(--zd-radius);
    background: var(--zd-surface);
}
.tt__bar {
    display: flex;
    flex-wrap: wrap;
    align-items: center;
    gap: 10px;
    padding: 12px 14px;
}
.tt__bar .mud-input-control { margin-top: 0 !important; margin-bottom: 0 !important; }
.tt__search { flex: 1 1 280px; min-width: 0; }
.tt__vertical { flex: 0 1 230px; min-width: 0; }
.tt__vertical .mud-select { width: 100%; }
.tt__sort { flex: 0 1 190px; min-width: 0; }
.tt__new.mud-button-root {
    flex: 0 0 auto;
    height: 40px;
    padding: 0 16px;
    border-radius: var(--zd-radius-sm);
    white-space: nowrap;
    text-transform: none;
    font-weight: 600;
}
.tt__new .mud-button-label { gap: 6px; }

.tt__meta {
    display: flex;
    align-items: center;
    gap: 8px;
    padding: 8px 14px;
    border-top: 1px solid var(--zd-border);
    background: var(--zd-surface-2);
    border-radius: 0 0 var(--zd-radius) var(--zd-radius);
}
.tt__stats {
    display: flex;
    gap: 6px;
    flex: 1 1 auto;
    min-width: 0;
    overflow-x: auto;
    scrollbar-width: none;
}
.tt__stats::-webkit-scrollbar { display: none; }
.tt__clear { flex: 0 0 auto; text-transform: none !important; }

.tt__stat {
    flex: 0 0 auto;
    display: inline-flex;
    align-items: center;
    gap: 6px;
    height: 30px;
    padding: 0 10px;
    border: 1px solid var(--zd-border);
    border-radius: var(--zd-radius-pill);
    background: var(--zd-surface);
    color: var(--zd-text-2);
    font: inherit;
    font-size: 0.8rem;
    cursor: pointer;
    transition: background-color var(--zd-dur-fast) var(--zd-ease), border-color var(--zd-dur-fast) var(--zd-ease), color var(--zd-dur-fast) var(--zd-ease);
}
.tt__stat:hover { background: var(--zd-surface-hover); color: var(--zd-text); }
.tt__stat:focus-visible { outline: 2px solid var(--zd-brand); outline-offset: 1px; }
/* Contatore attivo: fondo tenue del marchio (non pieno), come i filtri dei gestionali. */
.tt__stat.is-active {
    border-color: var(--zd-brand);
    background: var(--zd-brand-soft);
    color: var(--zd-brand);
    font-weight: 600;
}
.tt__dot { width: 8px; height: 8px; border-radius: 50%; background: var(--tt-dot); }
.tt__stat-count {
    min-width: 20px;
    padding: 0 6px;
    border-radius: var(--zd-radius-pill);
    font-weight: 700;
    font-size: 0.74rem;
    text-align: center;
    background: var(--zd-surface-2);
    color: var(--zd-text-2);
    font-variant-numeric: tabular-nums;
}
.tt__stat.is-active .tt__stat-count { background: var(--zd-brand); color: var(--zd-text-inverse); }

/* Pulsante icona della barra (es. Aggiorna): quadrato, alto come i campi. */
.tt__icon.mud-button-root,
.tt__icon.mud-icon-button {
    flex: 0 0 auto;
    width: 40px;
    height: 40px;
    min-width: 40px;
    padding: 0;
    border-radius: var(--zd-radius-sm);
    border: 1px solid var(--zd-border-strong);
    background: var(--zd-surface);
}

/* Separatore fra gruppi di contatori (es. stati | da leggere, urgenti). */
.tt__sep {
    flex: 0 0 auto;
    width: 1px;
    align-self: stretch;
    margin: 4px 4px;
    background: var(--zd-border);
}
/* Barra su tablet: la ricerca prende la prima riga, il resto la seconda. */
@media (max-width: 959.98px) {
    .tt__search { flex-basis: 100%; }
    /* "Ordina per" non esiste piu in questa barra: i verticali prendono la riga da soli. */
    .tt__vertical { flex: 1 1 100%; }
}

/* Barra su telefono: ricerca + pulsante "+" sopra, verticali sotto. */
@media (max-width: 599.98px) {
    .tt__bar { padding: 10px; gap: 8px; }
    .tt__search { flex: 1 1 calc(100% - 48px); } /* 48 = pulsante "+" (40) + spazio (8) */
    .tt__new.mud-button-root { width: 40px; min-width: 40px; padding: 0; }
    .tt__new-label { display: none; }
    .tt__vertical { order: 2; flex: 1 1 100%; }
    .tt__meta { padding: 8px 10px; }
}


/* ============================================================================
   Fascia azioni delle pagine SuperAdmin (.sa-actions).
   Il riquadro del titolo contiene solo icona, titolo e sottotitolo (sulla sua riga
   c'è la barra di Zed); i pulsanti della pagina stanno qui, subito sotto, allineati
   a destra come la barra di Zed sopra. Tutti alti 40px, stessi angoli, niente
   maiuscolo: la stessa fascia su ogni pagina.
   ============================================================================ */
.sa-actions {
    display: flex;
    flex-wrap: wrap;
    justify-content: flex-end;
    align-items: center;
    gap: 8px;
    margin: -4px 0 16px;
}
.sa-actions .mud-button-root:not(.mud-icon-button) {
    height: 40px;
    padding: 0 16px;
    border-radius: var(--zd-radius-sm);
    text-transform: none;
    font-weight: 600;
    box-shadow: none;
    white-space: nowrap;
}
.sa-actions .mud-icon-button {
    width: 40px;
    height: 40px;
    padding: 0;
    border-radius: var(--zd-radius-sm);
    border: 1px solid var(--zd-border-strong);
    background: var(--zd-surface);
    color: var(--zd-text-2);
}
.sa-actions .mud-icon-button:hover { background: var(--zd-surface-hover); color: var(--zd-text); }
.sa-actions .mud-chip { margin: 0; height: 32px; }

/* Telefono: i pulsanti con testo si dividono la riga; le icone restano quadrate. */
@media (max-width: 599.98px) {
    .sa-actions { justify-content: stretch; }
    .sa-actions .mud-button-root:not(.mud-icon-button) { flex: 1 1 calc(50% - 4px); padding: 0 10px; }
}

/* Barra con la sola ricerca + un pulsante icona: il pulsante resta accanto alla ricerca a ogni
   larghezza (la regola tablet generica manderebbe la ricerca a tutta riga e il pulsante sotto). */
@media (max-width: 959.98px) {
    .tt__bar--search-only .tt__search { flex: 1 1 0; }
}

/* ============================================================================
   Backup — riquadri di stato (ultimo backup, database scoperti, spazio, pianificazione).
   Le larghezze minime stavano in Style inline sui MudPaper: 210/190/190/260px, che su un
   telefono da 390px diventano quattro blocchi a tutta larghezza uno sotto l'altro, alti
   ~90px ciascuno. Per leggere "Spazio archivio" bisognava scorrere. In CSS si possono
   invece stringere a due colonne, che è il punto di avere queste misure qui.
   ============================================================================ */
.backup-stat { min-width: 190px; flex: 1 1 190px; }
.backup-stat--wide { min-width: 210px; flex: 1 1 240px; }
/* Stessa resa delle KPI card (.sa-kpi): etichetta in tono di frase, valore grande. */
.backup-stats .mud-typography-overline {
    display: block;
    font-size: var(--zd-font-size-sm);
    font-weight: 500;
    text-transform: none;
    letter-spacing: 0;
    line-height: 1.3;
    color: var(--zd-text-2);
}
.backup-stats .mud-typography-h6 { font-size: 1.35rem; font-weight: 700; letter-spacing: -.01em; font-variant-numeric: tabular-nums; }
.backup-stats .mud-typography-caption { color: var(--zd-text-3); }

@media (max-width: 599.98px) {
    /* Da flex-wrap a griglia a due colonne: i quattro riquadri stanno in due righe. */
    .backup-stats { display: grid !important; grid-template-columns: 1fr 1fr; gap: 8px; }
    .backup-stat, .backup-stat--wide { min-width: 0; flex: none; padding: 10px !important; }

    /* "Pianificazione" porta anche il percorso dell'archivio: da sola su tutta la riga. */
    .backup-stat--wide:last-child { grid-column: 1 / -1; }

    /* L'etichetta in maiuscoletto va a capo due volte in una colonna stretta. */
    .backup-stats .mud-typography-overline { font-size: .62rem; line-height: 1.3; letter-spacing: .06em; }
    /* Il valore resta l'elemento dominante, ma h6 a 1.25rem manda a capo una data con l'ora. */
    .backup-stats .mud-typography-h6 { font-size: 1rem; line-height: 1.3; }
    .backup-stats .mud-typography-caption { font-size: .68rem; overflow-wrap: anywhere; }
}

/* ============================================================================
   Budget (Entrate/Uscite) e dialoghi delle categorie su telefono.

   I dialoghi avevano larghezze minime scritte inline — 520px il gestore categorie, 420px i
   moduli movimento/ricorrenza — dentro un dialogo che su un telefono da 390px è largo 366.
   Tutto ciò che eccedeva usciva dallo schermo: misurato, il cestino di ogni categoria stava
   a x=511, cioè invisibile e non premibile. Inline non si poteva correggere da CSS: le misure
   ora stanno qui, dove una media query può annullarle.
   ============================================================================ */
.cat-manager { min-width: 520px; }
.cat-form { min-width: 360px; }
.cat-form--wide { min-width: 420px; }

@media (max-width: 599.98px) {
    .cat-manager, .cat-form, .cat-form--wide { min-width: 0; width: 100%; }

    /* I due pulsanti "Nuova entrata/uscita" non stanno affiancati in 366px. */
    .cat-manager > .mud-stack-row { flex-wrap: wrap; }
    .cat-manager > .mud-stack-row > .mud-button-root { flex: 1 1 auto; }

    /* MudTable in modalità impilata: le azioni vanno allineate a destra della propria riga
       e i bersagli portati a 40px, perché 24px è sotto la soglia utilizzabile col pollice. */
    .cat-manager__actions { text-align: right; }
    .cat-manager__actions .mud-icon-button { padding: 8px; }
    .cat-manager__table .mud-table-cell { padding-left: 12px; padding-right: 12px; }

    /* KPI: due per riga (xs=6 nel markup) e più bassi, così i quattro numeri stanno
       in uno schermo invece che in 450px di scorrimento. */
    .kpi-card { padding: 12px !important; }
    .kpi-card .mud-typography-h5 { font-size: 1.05rem; line-height: 1.25; }
    .kpi-card .mud-typography-caption { font-size: .66rem; line-height: 1.25; }

    /* Le due righe di pulsanti sopra i filtri: etichette intere senza sbordare. */
    .eu-filters .mud-input-control { min-width: 0; }
}

/* ============================================================================
   Budget — barra dei filtri.
   Due fasce con un ruolo ciascuna: sopra QUALE periodo si guarda, sotto COSA se ne mostra.
   Prima era una riga sola di sei controlli separati da un MudSpacer: andava a capo dove
   capitava e sotto i 900px diventava una colonna di campi tutti uguali, senza più un ordine
   leggibile. Le misure (min-width dell'etichetta del periodo, max-width dei select) stavano
   inline: qui possono adattarsi allo schermo.
   ============================================================================ */
.eu-filters__row {
    display: flex;
    align-items: center;
    flex-wrap: wrap;
    gap: 8px;
}
/* Separatore leggero fra periodo e filtri: si capisce che sono due cose diverse. */
.eu-filters__row--selects {
    margin-top: 10px;
    padding-top: 10px;
    border-top: 1px solid var(--border-strong, rgba(0,0,0,.08));
}

/* Frecce e nome del periodo restano un blocco unico, mai spezzato a capo. */
.eu-filters__nav { display: flex; align-items: center; flex: 0 0 auto; }
.eu-filters__label {
    font-weight: 600;
    min-width: 170px;
    text-align: center;
    text-transform: capitalize;
    white-space: nowrap;
}

/* MudSelect si avvolge in un <div class="mud-select">: l'elemento flex è QUELLO, non il
   .mud-input-control su cui finisce la classe passata con Class="". Mettendo le misure sulla
   classe i due select restavano larghi tutta la riga e si impilavano. */
.eu-filters__row--selects > .mud-select { flex: 0 1 150px; min-width: 0; }
.eu-filters__row--selects > .mud-select:has(.eu-filters__select--wide) { flex: 0 1 240px; }
.eu-filters__select { width: 100%; min-width: 0; }
.eu-filters__today { flex: 0 0 auto; }
.eu-filters__reset { flex: 0 0 auto; margin-left: auto; }

@media (max-width: 599.98px) {
    /* Periodo: la scala a tutta larghezza, poi frecce e "Oggi" sulla riga sotto, dove le
       frecce si allargano a riempire lo spazio: bersagli grandi per il pollice. */
    .eu-filters__row > .mud-toggle-group { width: 100%; }
    .eu-filters__nav { flex: 1 1 auto; justify-content: space-between; }
    .eu-filters__label { min-width: 0; flex: 1 1 auto; font-size: .95rem; }

    /* I due select si dividono la riga invece di impilarsi (di nuovo sul wrapper .mud-select). */
    .eu-filters__row--selects > .mud-select,
    .eu-filters__row--selects > .mud-select:has(.eu-filters__select--wide) { flex: 1 1 0; }
    .eu-filters__reset { flex: 1 1 100%; margin-left: 0; }
}

/* ============================================================================
   Comunicazioni (/superadmin/comunicazioni)

   Ogni tab canale è UNA card, impostata come un client email: in cima la riga "A:" con
   i filtri a pillola (CommRecipientFilters.razor) e il pulsante Anteprima, subito sotto
   il messaggio, in fondo prova e invio. Le scelte dei filtri si aprono in un pannello
   dentro la card, mai in un popover sopra la pagina.

   Il colore del canale arriva da data-ch sul contenitore (--comm-ch): i quattro tab
   condividono le stesse regole e cambia solo l'accento. Superfici e testi usano le
   variabili del tema MudBlazor, quindi la pagina segue da sola il tema chiaro e scuro.
   ============================================================================ */
[data-ch="email"] { --comm-ch: #4f6bed; }
[data-ch="sms"]   { --comm-ch: #0ea5e9; }
[data-ch="wa"]    { --comm-ch: #16a34a; }
[data-ch="tg"]    { --comm-ch: #229ed9; }

/* ── intestazione ─────────────────────────────────────────────────────────── */
.comm-head {
    display: flex; flex-wrap: wrap; align-items: center; justify-content: space-between;
    gap: 12px; margin-bottom: 14px;
}
.comm-head__title { display: flex; align-items: center; gap: 12px; min-width: 0; }
.comm-head__icon {
    display: grid; place-items: center; width: 38px; height: 38px; flex: none;
    border-radius: 10px; color: var(--zd-brand);
    background: color-mix(in srgb, var(--zd-brand) 12%, transparent);
}
.comm-head__h { line-height: 1.2 !important; font-weight: 600 !important; }
.comm-head__status { display: flex; flex-wrap: wrap; gap: 6px; }

.comm-pill {
    display: inline-flex; align-items: center; gap: 6px;
    padding: 3px 10px; border-radius: 999px; font-size: .75rem; font-weight: 500;
    color: var(--zd-text-3);
    border: 1px solid var(--zd-border);
    background: var(--zd-surface);
}
.comm-pill i { width: 7px; height: 7px; border-radius: 50%; background: var(--zd-border-strong); }
.comm-pill.is-on { color: var(--zd-text); }
.comm-pill.is-on i {
    background: var(--zd-success);
    box-shadow: 0 0 0 3px color-mix(in srgb, var(--zd-success) 20%, transparent);
}

/* ── tab ──────────────────────────────────────────────────────────────────── */
.comm-tabs { border: 1px solid var(--zd-border); border-radius: 12px; overflow: hidden; }
.comm-tabs .mud-tabs-tabbar { border-bottom: 1px solid var(--zd-border); }
.comm-tabs .mud-tab { text-transform: none; font-weight: 500; letter-spacing: 0; min-height: 44px; }
.comm-tabs .mud-tabs-panels { background: var(--zd-surface-2); }

/* ── card di composizione ─────────────────────────────────────────────────── */
.comm-compose { padding: 14px; }
.comm-card {
    display: flex; flex-direction: column; gap: 10px; min-width: 0;
    max-width: 980px; margin-inline: auto;
    padding: 14px; border-radius: 10px;
    background: var(--zd-surface);
    border: 1px solid var(--zd-border);
}
.comm-sep { height: 1px; margin: 2px -14px; background: var(--zd-border); }
.comm-card__foot {
    display: flex; flex-wrap: wrap; align-items: center; justify-content: space-between; gap: 10px;
    margin-top: 2px; padding-top: 12px; border-top: 1px solid var(--zd-border);
}
.comm-result { display: flex; flex-wrap: wrap; gap: 6px; min-height: 1px; }

/* ── filtri destinatari (CommRecipientFilters.razor) ───────────────────────
   Una riga di pillole: "Verticali · Tutti", "Stato · Tutti", "Tenant · Tutti".
   Una pillola con una scelta attiva prende il colore del canale. */
.cf { display: flex; flex-direction: column; gap: 8px; }
.cf-bar { display: flex; flex-wrap: wrap; align-items: center; gap: 6px; }
.cf-to { font-size: .8rem; font-weight: 600; color: var(--zd-text-3); margin-right: 2px; }

.cf-pill {
    position: relative; display: inline-flex; align-items: center; gap: 6px;
    height: 30px; padding: 0 10px; max-width: 230px; border-radius: 999px; cursor: pointer;
    font: inherit; font-size: .78rem; color: var(--zd-text);
    background: var(--zd-surface-2);
    border: 1px solid var(--zd-border-strong);
    transition: background-color .12s, border-color .12s;
}
.cf-pill:hover { border-color: var(--zd-text-3); }
.cf-pill__k { color: var(--zd-text-3); flex: none; }
.cf-pill__v { font-weight: 600; min-width: 0; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
/* freccina: in giù chiusa, in su quando il pannello è aperto */
.cf-pill::after {
    content: ""; flex: none; width: 5px; height: 5px; margin-left: 2px;
    border-right: 1.5px solid currentColor; border-bottom: 1.5px solid currentColor;
    transform: rotate(45deg) translateY(-2px); opacity: .6;
}
.cf-pill.is-open::after { transform: rotate(225deg) translate(-1px, -1px); }
.cf-pill.is-set, .cf-pill.is-open {
    border-color: var(--comm-ch, var(--zd-brand));
    background: color-mix(in srgb, var(--comm-ch, var(--zd-brand)) 9%, var(--zd-surface));
}
.cf-pill.is-set .cf-pill__v { color: var(--comm-ch, var(--zd-brand)); }
.cf-pill:focus-visible {
    outline: 2px solid var(--comm-ch, var(--zd-brand)); outline-offset: 1px;
}


.cf-actions { margin-left: auto; display: inline-flex; align-items: center; }
.comm-preview-btn.mud-button-root { text-transform: none; font-weight: 600; color: var(--comm-ch, var(--zd-brand)); }

/* Pannello delle opzioni, sotto la riga. */
.cf-panel {
    display: flex; flex-direction: column; gap: 8px; padding: 10px;
    border-radius: 8px; border: 1px solid var(--zd-border);
    background: var(--zd-surface-2);
}
.cf-panel__foot { display: flex; justify-content: flex-end; gap: 14px; }

.cf-chips { display: flex; flex-wrap: wrap; gap: 5px; max-height: 150px; overflow-y: auto; }
.cf-chip {
    display: inline-flex; align-items: center; gap: 5px;
    padding: 3px 9px; border-radius: 999px; cursor: pointer;
    font: inherit; font-size: .74rem; line-height: 1.2;
    color: var(--zd-text); background: var(--zd-surface);
    border: 1px solid var(--zd-border);
}
.cf-chip i { width: 7px; height: 7px; border-radius: 50%; background: var(--cf-dot, #9e9e9e); }
.cf-chip:hover { border-color: var(--zd-text-3); }
.cf-chip.is-on {
    color: var(--comm-ch, var(--zd-brand)); border-color: var(--comm-ch, var(--zd-brand));
    background: color-mix(in srgb, var(--comm-ch, var(--zd-brand)) 12%, var(--zd-surface)); font-weight: 600;
}
.cf-chip:focus-visible, .cf-link:focus-visible {
    outline: 2px solid var(--comm-ch, var(--zd-brand)); outline-offset: 1px;
}

.cf-search {
    width: 100%; height: 32px; padding: 0 10px; border-radius: 6px; font: inherit; font-size: .8rem;
    color: var(--zd-text); background: var(--zd-surface);
    border: 1px solid var(--zd-border-strong); outline: none;
}
.cf-search:focus { border-color: var(--comm-ch, var(--zd-brand)); }

.cf-checks {
    max-height: 180px; overflow-y: auto;
    display: grid; grid-template-columns: repeat(auto-fill, minmax(190px, 1fr)); gap: 0 8px;
}
.cf-check {
    display: flex; align-items: center; gap: 8px; min-width: 0; padding: 4px 6px; border-radius: 6px;
    font-size: .78rem; cursor: pointer;
}
.cf-check:hover { background: var(--zd-surface-hover); }
.cf-check input { accent-color: var(--comm-ch, var(--zd-brand)); width: 14px; height: 14px; margin: 0; flex: none; }
.cf-check span { min-width: 0; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
.cf-check.is-on span { font-weight: 600; }
.cf-empty { padding: 4px; font-size: .78rem; color: var(--zd-text-3); }

.cf-link {
    padding: 0; border: 0; background: none; cursor: pointer;
    font: inherit; font-size: .76rem; color: var(--zd-text-3);
}
.cf-link:hover { text-decoration: underline; }
.cf-link--done { color: var(--comm-ch, var(--zd-brand)); font-weight: 600; }

/* ── variabili e contatore ────────────────────────────────────────────────── */
.comm-vars {
    display: flex; flex-wrap: wrap; align-items: center; gap: 4px;
    margin-top: -4px; font-size: .72rem; color: var(--zd-text-3);
}
.comm-vars code {
    padding: 1px 6px; border-radius: 5px; font-size: .7rem;
    background: var(--zd-surface-2); color: var(--zd-text);
}
.comm-vars__sep { margin-left: 8px; }
.comm-counter { margin-left: auto; font-variant-numeric: tabular-nums; font-weight: 600; }
.comm-counter.is-near { color: var(--zd-warning); }

/* ── avvisi ───────────────────────────────────────────────────────────────── */
.comm-note {
    padding: 8px 10px; border-radius: 8px; font-size: .78rem; line-height: 1.45;
    border-left: 3px solid var(--zd-info);
    background: color-mix(in srgb, var(--zd-info) 8%, transparent);
}
.comm-note--warn {
    border-left-color: var(--zd-warning);
    background: color-mix(in srgb, var(--zd-warning) 10%, transparent);
}
.comm-note code { font-size: .72rem; }
.comm-hint { font-size: .72rem; color: var(--zd-text-3); margin-top: 6px; }

/* ── sezioni richiudibili: elenco destinatari e invio di prova ─────────────
   <details> nativo: nessuno stato da tenere nel componente, e Blazor non gestisce
   l'attributo "open", quindi un nuovo render non la richiude sotto le dita. */
.comm-disclosure {
    border: 1px solid var(--zd-border); border-radius: 8px;
    background: var(--zd-surface-2);
}
.comm-disclosure > summary {
    display: flex; align-items: center; gap: 6px; cursor: pointer; list-style: none;
    padding: 6px 10px; font-size: .8rem; color: var(--zd-text-3); user-select: none;
}
.comm-disclosure > summary::-webkit-details-marker { display: none; }
.comm-disclosure > summary::after {
    content: ""; margin-left: auto; width: 6px; height: 6px; flex: none;
    border-right: 1.5px solid currentColor; border-bottom: 1.5px solid currentColor;
    transform: rotate(45deg) translateY(-2px); transition: transform .15s;
}
.comm-disclosure[open] > summary::after { transform: rotate(225deg) translateY(-2px); }
.comm-disclosure > summary:hover { color: var(--zd-text); }
.comm-disclosure > summary b { color: var(--comm-ch); }
.comm-disclosure[open] > summary { border-bottom: 1px solid var(--zd-border); }
.comm-disclosure--test[open] { padding-bottom: 10px; }
.comm-disclosure--test > .comm-test,
.comm-disclosure--test > .comm-hint { margin-inline: 10px; }

.comm-test { display: flex; flex-wrap: wrap; align-items: center; gap: 8px; margin-top: 10px; }
.comm-test > .mud-input-control { flex: 1 1 220px; max-width: 320px; margin-top: 0; }

.comm-list { max-height: 240px; overflow-y: auto; }
.comm-list__row {
    display: flex; justify-content: space-between; gap: 10px;
    padding: 6px 10px; font-size: .78rem;
    border-bottom: 1px solid var(--zd-border);
}
.comm-list__row:last-child { border-bottom: 0; }
.comm-list__main, .comm-list__side { display: flex; flex-direction: column; min-width: 0; }
.comm-list__main b { font-weight: 600; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
.comm-list__main span, .comm-list__side span { color: var(--zd-text-3); font-size: .72rem; }
.comm-list__side { text-align: right; flex: none; max-width: 55%; overflow-wrap: anywhere; }
.comm-list__side.is-missing { color: var(--zd-warning); font-style: italic; }

/* ── etichette di esito ───────────────────────────────────────────────────── */
.comm-flag {
    display: inline-flex; align-items: center; padding: 2px 9px; border-radius: 999px;
    font-size: .74rem; font-weight: 600;
}
.comm-flag.is-ok   { color: var(--zd-success); background: color-mix(in srgb, var(--zd-success) 12%, transparent); }
.comm-flag.is-ko   { color: var(--zd-danger);   background: color-mix(in srgb, var(--zd-danger) 12%, transparent); }
.comm-flag.is-skip { color: var(--zd-warning); background: color-mix(in srgb, var(--zd-warning) 14%, transparent); }

/* ── storico ──────────────────────────────────────────────────────────────── */
.comm-history { padding: 10px 14px 4px; }
.comm-history__bar { display: flex; flex-wrap: wrap; align-items: center; gap: 8px; min-height: 36px; font-size: .8rem; }
.comm-history__search { flex: 0 1 300px; width: auto; min-width: 0; }
.comm-history__hint { font-size: .72rem; color: var(--zd-text-3); }
.comm-history__table { background: transparent !important; }
.comm-history__table .mud-table-head .mud-table-cell {
    font-size: .7rem; font-weight: 600; text-transform: uppercase; letter-spacing: .04em;
    color: var(--zd-text-3);
}
.comm-history__table .mud-table-cell { padding-top: 6px !important; padding-bottom: 6px !important; }

.comm-date { display: flex; flex-direction: column; font-size: .78rem; font-variant-numeric: tabular-nums; line-height: 1.25; }
.comm-date small { color: var(--zd-text-3); font-size: .7rem; }

.comm-channel {
    display: inline-flex; align-items: center; gap: 6px; font-size: .75rem; font-weight: 600;
    padding: 2px 9px 2px 7px; border-radius: 999px;
    color: var(--comm-ch); background: color-mix(in srgb, var(--comm-ch) 11%, transparent);
}
.comm-channel i { width: 6px; height: 6px; border-radius: 50%; background: currentColor; }

.comm-msg { display: flex; flex-direction: column; min-width: 0; max-width: 520px; }
.comm-msg__text { font-size: .82rem; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
.comm-msg__filter {
    display: block; font-size: .72rem; color: var(--zd-text-3);
    overflow: hidden; text-overflow: ellipsis; white-space: nowrap;
}

.comm-outcome { display: inline-flex; align-items: baseline; gap: 6px; font-variant-numeric: tabular-nums; font-size: .8rem; }
.comm-outcome b.is-ok { color: var(--zd-success); font-size: .9rem; }
.comm-outcome > span { color: var(--zd-text-3); margin-left: -5px; }
.comm-outcome em { font-style: normal; font-size: .7rem; font-weight: 600; padding: 0 6px; border-radius: 999px; }
.comm-outcome em.is-ko   { color: var(--zd-danger);   background: color-mix(in srgb, var(--zd-danger) 12%, transparent); }
.comm-outcome em.is-skip { color: var(--zd-warning); background: color-mix(in srgb, var(--zd-warning) 14%, transparent); }

.comm-empty {
    display: flex; flex-direction: column; align-items: center; gap: 6px;
    padding: 36px 12px; color: var(--zd-text-3); font-size: .85rem;
}

/* ── telefono ─────────────────────────────────────────────────────────────── */
@media (max-width: 599.98px) {
    .comm-head { margin-bottom: 10px; }
    .comm-head__status { width: 100%; }
    .comm-pill { font-size: .7rem; padding: 2px 8px; }

    /* Cinque tab con icona+testo non stanno in 360-390px: solo testo, più stretto. */
    .comm-tabs .mud-tab { min-width: 0; min-height: 40px; padding: 4px 8px; font-size: .8rem; }
    .comm-tabs .mud-tab-icon-text { display: none; }

    .comm-compose { padding: 8px; }
    .comm-card { padding: 12px; }
    .comm-sep { margin-inline: -12px; }
    .comm-card__foot > .mud-button-root { width: 100%; }
    .comm-test > .mud-input-control { max-width: none; flex-basis: 100%; }
    .comm-test > .mud-button-root { flex: 1 1 auto; }
    .comm-list { max-height: 200px; }

    /* Filtri: le tre pillole si dividono la riga in parti uguali (etichetta sopra, valore
       sotto, così "Verticali" e "Tutti" stanno anche in un terzo di schermo); "A:" sparisce
       e Anteprima va sulla riga intera sotto. */
    .cf-bar { display: grid; grid-template-columns: repeat(3, minmax(0, 1fr)); gap: 6px; }
    .cf-to { display: none; }
    .cf-pill {
        max-width: none; height: auto; min-height: 40px; padding: 4px 18px 4px 10px; border-radius: 10px;
        flex-direction: column; align-items: flex-start; justify-content: center; gap: 0;
    }
    .cf-pill__k { font-size: .66rem; text-transform: uppercase; letter-spacing: .03em; }
    .cf-pill__v { max-width: 100%; font-size: .78rem; }
    .cf-pill::after { position: absolute; right: 9px; top: 50%; margin: -4px 0 0; }
    .cf-pill.is-open::after { margin-top: -1px; }
    .cf-actions { grid-column: 1 / -1; margin-left: 0; }
    .cf-actions .mud-button-root { width: 100%; }
    .cf-checks { grid-template-columns: minmax(0, 1fr); }
    .cf-chips { max-height: 140px; }

    /* Storico: sotto i 600px MudTable diventa una scheda per riga (etichetta a sinistra,
       valore a destra, celle in flex). Il testo del messaggio deve potersi stringere e
       troncare invece di spingere fuori lo schermo: min-width:0 + allineamento a destra. */
    .comm-history { padding: 8px 10px 4px; }
    .comm-history__search { flex: 1 1 100%; }
    .comm-history__table.mud-xs-table .mud-table-cell { gap: 12px; padding: 5px 4px !important; }
    .comm-history__table.mud-xs-table .mud-table-cell::before {
        flex: none; font-size: .7rem; text-transform: uppercase; letter-spacing: .04em;
        color: var(--zd-text-3);
    }
    .comm-date { flex-direction: row; gap: 6px; }
    .comm-msg { max-width: none; flex: 1 1 auto; align-items: flex-end; text-align: right; }
    .comm-msg__text, .comm-msg__filter { max-width: 100%; }
}

/* ==== css/vertical-showcase.css ==== */
/* ============================================================
   Vetrina dei verticali (pannello SuperAdmin).
     .vs*   griglia delle schede (prima tab)
     .vsd*  scheda completa di un verticale (/superadmin/vetrina/{slug})
   Ogni scheda riceve i colori del proprio verticale via --vs-accent /
   --vs-accent-dark impostate inline: una sola regola serve tutte le identità.
   ============================================================ */

/* ---------- Griglia ---------- */
.vs {
    padding: 1.25rem 1rem 2rem;
}

.vs__bar {
    display: flex;
    flex-wrap: wrap;
    align-items: flex-end;
    justify-content: space-between;
    gap: 1rem;
    margin-bottom: 1.25rem;
}

.vs__bar-text { min-width: 0; }

.vs__heading {
    margin: 0;
    font-size: 1.35rem;
    font-weight: 700;
    letter-spacing: -0.015em;
}

.vs__sub {
    margin: 0.35rem 0 0;
    max-width: 68ch;
    font-size: 0.9rem;
    line-height: 1.5;
    opacity: 0.72;
}

.vs__search {
    flex: 0 1 22rem;
    min-width: 14rem;
}

/* auto-fill + minmax: le colonne si adattano da sole alla larghezza disponibile,
   senza media query e senza numeri di colonne cablati per ogni breakpoint. */
.vs__grid {
    display: grid;
    grid-template-columns: repeat(auto-fill, minmax(16.5rem, 1fr));
    gap: 1.1rem;
}

.vs-card {
    display: flex;
    flex-direction: column;
    overflow: hidden;
    border-radius: var(--zd-radius, 12px);
    cursor: pointer;
    background: var(--zd-surface);
    border: 1px solid var(--zd-border);
    box-shadow: var(--zd-shadow-1);
    transition: transform var(--zd-dur, .2s) var(--zd-ease, ease), box-shadow var(--zd-dur, .2s) var(--zd-ease, ease), border-color var(--zd-dur, .2s) ease;
}

/* Bordo neutro anche in hover (niente bordi colorati, richiesta del titolare): solleva e basta. */
.vs-card:hover,
.vs-card:focus-visible {
    transform: translateY(-2px);
    border-color: var(--zd-border-strong);
    box-shadow: var(--zd-shadow-2);
    outline: none;
}

.vs-card:focus-visible { outline: 2px solid var(--vs-accent); outline-offset: 2px; }

/* Anteprima: rapporto fisso così la griglia resta allineata anche se un SVG
   ha proporzioni diverse. */
.vs-card__shot {
    position: relative;
    aspect-ratio: 16 / 9;
    overflow: hidden;
    background: linear-gradient(135deg,
        color-mix(in srgb, var(--vs-accent) 16%, transparent),
        color-mix(in srgb, var(--vs-accent-dark) 26%, transparent));
}

.vs-card__shot img {
    width: 100%;
    height: 100%;
    object-fit: cover;
    object-position: top center;
    display: block;
}

.vs-card__placeholder {
    display: flex;
    align-items: center;
    justify-content: center;
    height: 100%;
    font-size: 2.6rem;
    font-weight: 800;
    letter-spacing: 0.05em;
    color: #fff;
    opacity: 0.9;
}

.vs-card__num {
    position: absolute;
    top: 0.6rem;
    left: 0.6rem;
    padding: 0.15rem 0.55rem;
    border-radius: 999px;
    font-size: 0.78rem;
    font-weight: 800;
    font-variant-numeric: tabular-nums;
    color: #fff;
    background: var(--vs-accent-dark);
    box-shadow: 0 2px 6px rgb(0 0 0 / 30%);
}

.vs-card__wip {
    position: absolute;
    top: 0.6rem;
    right: 0.6rem;
    padding: 0.12rem 0.5rem;
    border-radius: 999px;
    font-size: 0.68rem;
    color: #fff;
    background: rgb(0 0 0 / 45%);
}

.vs-card__body {
    flex: 1 1 auto;
    padding: 0.85rem 0.95rem 0.6rem;
}

.vs-card__kicker {
    font-size: 0.66rem;
    font-weight: 700;
    letter-spacing: 0.09em;
    color: color-mix(in srgb, var(--vs-accent-dark) 80%, var(--zd-ink-mix));
    margin-bottom: 0.2rem;
}

.vs-card__name {
    margin: 0;
    font-size: 1.08rem;
    font-weight: 700;
    line-height: 1.2;
}

.vs-card__tagline {
    margin: 0.25rem 0 0;
    font-size: 0.85rem;
    line-height: 1.4;
    opacity: 0.72;
}

.vs-card__foot {
    display: flex;
    align-items: center;
    justify-content: space-between;
    gap: 0.5rem;
    padding: 0.55rem 0.95rem 0.85rem;
    font-size: 0.78rem;
}

.vs-card__screens {
    display: inline-flex;
    align-items: center;
    gap: 0.3rem;
    opacity: 0.65;
}

.vs-card__go {
    display: inline-flex;
    align-items: center;
    gap: 0.2rem;
    font-weight: 700;
    color: color-mix(in srgb, var(--vs-accent-dark) 80%, var(--zd-ink-mix));
}

.vs-card:hover .vs-card__go { gap: 0.4rem; }

/* ---------- "Vetrina" dentro la Documentazione del singolo verticale ----------
   Qui la scheda è una sola: non serve la griglia, ma una larghezza massima che
   eviti una card sproporzionata sui monitor larghi. */
.vsp__intro {
    margin: 0 0 0.9rem;
    max-width: 70ch;
    font-size: 0.9rem;
    line-height: 1.6;
    opacity: 0.78;
}

.vsp__card {
    max-width: 22rem;
    margin-bottom: 1.25rem;
}

/* La scheda espansa non ha l'intestazione grande (ShowHero=false): il primo blocco
   arriverebbe attaccato alla card. */
.vsp .vsd__cards { margin-top: 0; }

/* ---------- Scheda completa ---------- */
.vsd {
    padding-bottom: 3rem;
}

.vsd__back {
    display: inline-flex;
    align-items: center;
    gap: 0.35rem;
    margin-bottom: 0.9rem;
    font-size: 0.88rem;
    font-weight: 600;
    text-decoration: none;
    color: color-mix(in srgb, var(--vs-accent-dark) 80%, var(--zd-ink-mix));
}

.vsd__back:hover { text-decoration: underline; }

.vsd__hero {
    display: grid;
    grid-template-columns: minmax(0, 1fr) minmax(0, 0.9fr);
    gap: 1.5rem;
    align-items: center;
    padding: 1.6rem;
    border-radius: var(--zd-radius-lg, 16px);
    color: #fff;
    background: linear-gradient(135deg, var(--vs-accent), var(--vs-accent-dark));
}

/* Testi della testata colorata SEMPRE bianchi: la regola globale dei titoli (h1..h6 nel colore
   del testo) vinceva sul colore ereditato e il nome finiva scuro su fondo scuro. */
.vsd .vsd__hero :is(.vsd__title, .vsd__tagline, .vsd__summary, .vsd__meta, .vsd__kicker, .vsd__num) {
    color: #fff;
}

.vsd__badges {
    display: flex;
    align-items: center;
    gap: 0.5rem;
    margin-bottom: 0.5rem;
}

.vsd__num {
    padding: 0.15rem 0.6rem;
    border-radius: 999px;
    font-size: 0.82rem;
    font-weight: 800;
    font-variant-numeric: tabular-nums;
    background: rgb(255 255 255 / 22%);
}

.vsd__kicker {
    font-size: 0.7rem;
    font-weight: 700;
    letter-spacing: 0.1em;
    opacity: 0.85;
}

.vsd__title {
    margin: 0;
    font-size: 2rem;
    font-weight: 800;
    letter-spacing: -0.02em;
    line-height: 1.1;
}

.vsd__tagline {
    margin: 0.35rem 0 0;
    font-size: 1.05rem;
    opacity: 0.92;
}

.vsd__summary {
    margin: 0.8rem 0 0;
    max-width: 62ch;
    font-size: 0.92rem;
    line-height: 1.6;
    opacity: 0.88;
}

.vsd__meta {
    display: flex;
    flex-wrap: wrap;
    gap: 0.4rem 1rem;
    margin-top: 0.9rem;
    font-size: 0.8rem;
    opacity: 0.85;
}

.vsd__hero-shot img {
    width: 100%;
    height: auto;
    display: block;
    border-radius: 12px;
    box-shadow: 0 12px 30px rgb(0 0 0 / 28%);
}

.vsd__cards {
    display: grid;
    grid-template-columns: repeat(auto-fit, minmax(20rem, 1fr));
    gap: 1rem;
    margin-top: 1.25rem;
}

.vsd__card {
    padding: 1.1rem 1.2rem;
    border-radius: var(--zd-radius, 12px);
    background: var(--zd-surface);
    border: 1px solid var(--zd-border);
    box-shadow: var(--zd-shadow-1);
}

.vsd__card h2 {
    display: flex;
    align-items: center;
    gap: 0.4rem;
    margin: 0 0 0.45rem;
    font-size: 0.95rem;
    font-weight: 700;
    color: color-mix(in srgb, var(--vs-accent-dark) 80%, var(--zd-ink-mix));
}

.vsd__card p {
    margin: 0;
    font-size: 0.9rem;
    line-height: 1.6;
    opacity: 0.82;
}

/* --- Zed --- */
.vsd__zed {
    margin-top: 1.25rem;
    padding: 1.2rem;
    border-radius: var(--zd-radius, 12px);
    border: 1px solid var(--zd-border);
    background: var(--zd-surface-2);
}

.vsd__zed-title {
    display: flex;
    align-items: center;
    gap: 0.4rem;
    margin: 0 0 0.5rem;
    font-size: 1rem;
    font-weight: 700;
    color: color-mix(in srgb, var(--vs-accent-dark) 80%, var(--zd-ink-mix));
}

.vsd__zed-intro {
    margin: 0 0 1rem;
    max-width: 76ch;
    font-size: 0.9rem;
    line-height: 1.6;
    opacity: 0.82;
}

.vsd__zed-cols {
    display: grid;
    grid-template-columns: repeat(auto-fit, minmax(15rem, 1fr));
    gap: 0.9rem;
}

.vsd__zed-col h3 {
    display: flex;
    align-items: center;
    gap: 0.35rem;
    margin: 0 0 0.4rem;
    font-size: 0.82rem;
    font-weight: 700;
    text-transform: uppercase;
    letter-spacing: 0.05em;
    opacity: 0.7;
}

.vsd__zed-col ul {
    margin: 0;
    padding-left: 1.05rem;
    font-size: 0.87rem;
    line-height: 1.65;
}

.vsd__zed-col li { margin-bottom: 0.2rem; }

.vsd__zed-empty { margin: 0; font-size: 0.85rem; opacity: 0.55; }

/* --- Tour delle schermate --- */
.vsd__tour { margin-top: 2rem; }

.vsd__tour-title {
    margin: 0 0 0.75rem;
    font-size: 1.2rem;
    font-weight: 700;
}

.vsd__toc {
    display: flex;
    flex-wrap: wrap;
    gap: 0.35rem;
    margin-bottom: 1.5rem;
}

.vsd__toc a {
    padding: 0.22rem 0.6rem;
    border-radius: 999px;
    font-size: 0.78rem;
    text-decoration: none;
    color: color-mix(in srgb, var(--vs-accent-dark) 80%, var(--zd-ink-mix));
    border: 1px solid var(--zd-border);
    background: var(--zd-surface);
    transition: background-color var(--zd-dur-fast, .12s) ease, border-color var(--zd-dur-fast, .12s) ease;
}

.vsd__toc a:hover {
    background: color-mix(in srgb, var(--vs-accent) 8%, var(--zd-surface));
    border-color: var(--zd-border-strong);
}

.vsd__step {
    display: grid;
    grid-template-columns: minmax(0, 1.15fr) minmax(0, 1fr);
    gap: 1.5rem;
    align-items: center;
    /* scroll-margin: cliccando una voce dell'indice il titolo non finisce sotto l'app bar. */
    scroll-margin-top: 5rem;
    padding: 1.25rem 0;
    border-top: 1px solid var(--zd-border);
}

.vsd__step:first-of-type { border-top: none; }

/* Le schermate si alternano: immagine a destra nelle pari, per non produrre
   una colonna monotona lungo una pagina di 25 sezioni. */
.vsd__step:nth-child(even) .vsd__step-shot { order: 2; }

.vsd__step-shot img {
    width: 100%;
    height: auto;
    display: block;
    border-radius: var(--zd-radius, 12px);
    border: 1px solid var(--zd-border);
    box-shadow: var(--zd-shadow-2);
}

.vsd__step-n {
    font-size: 0.78rem;
    font-weight: 800;
    font-variant-numeric: tabular-nums;
    letter-spacing: 0.08em;
    color: var(--vs-accent);
}

.vsd__step-text h3 {
    margin: 0.15rem 0 0.3rem;
    font-size: 1.15rem;
    font-weight: 700;
}

.vsd__step-desc {
    margin: 0 0 0.6rem;
    font-size: 0.82rem;
    font-weight: 600;
    opacity: 0.6;
}

.vsd__step-text p {
    margin: 0 0 0.6rem;
    font-size: 0.92rem;
    line-height: 1.65;
    opacity: 0.85;
}

.vsd__step-ex {
    padding: 0.6rem 0.8rem;
    border-radius: 10px;
    border-left: 3px solid var(--vs-accent);
    background: color-mix(in srgb, var(--vs-accent) 8%, transparent);
    opacity: 1;
}

/* ---------- Adattamento ai dispositivi ---------- */
@media (max-width: 60em) {
    .vsd__hero {
        grid-template-columns: 1fr;
        text-align: left;
    }

    .vsd__title { font-size: 1.6rem; }

    /* In colonna l'alternanza non ha senso: l'immagine sta sempre sopra il testo. */
    .vsd__step {
        grid-template-columns: 1fr;
        gap: 0.9rem;
    }

    .vsd__step:nth-child(even) .vsd__step-shot { order: 0; }
}

@media (max-width: 40em) {
    .vs { padding: 1rem 0.75rem 1.5rem; }

    .vs__grid {
        grid-template-columns: 1fr;
        gap: 0.9rem;
    }

    .vs__search { flex: 1 1 100%; }

    .vsd__hero { padding: 1.2rem; border-radius: 16px; }

    /* Indice lungo su telefono: scorre in orizzontale invece di occupare mezzo schermo. */
    .vsd__toc {
        flex-wrap: nowrap;
        overflow-x: auto;
        padding-bottom: 0.35rem;
        scrollbar-width: thin;
    }

    .vsd__toc a { white-space: nowrap; }
}

@media (prefers-reduced-motion: reduce) {
    .vs-card { transition: none; }
    .vs-card:hover, .vs-card:focus-visible { transform: none; }
}

/* ==== css/tenant.css ==== */
/* ============================================================================
   Aree dei CLIENTI — tutti i 24 verticali (2026-10-08)

   Contenuti delle pagine nello stile del design system (design-tokens.css):
   sfondo a tinta unita --zd-canvas, contenuti su card bianche con bordo sottile
   e ombra leggera, testi slate, animazioni brevi spente con prefers-reduced-motion.

   Il colore del settore resta SOLO ACCENTO: lo dà il tema MudBlazor del verticale
   (--mud-palette-primary) e qui si usa per icone di sezione, selezioni, chip,
   barre attive. Mai come sfondo di pagina o di card. Bordi delle card neutri
   anche in hover (richiesta del titolare: niente bordi colorati).

   Ambito: tutto sotto html:not([data-vertical="superadmin"]):not([data-vertical="platform"]).
   Restano fuori il pannello admin (superadmin*.css) e le pagine di accesso
   (platform, shell). Il Budget (.fzb) ha un design system proprio, allineato
   ai token in budget.css: qui è escluso con :not(.fzb *).

   Carica dopo app.css (vedi App.razor): diverse regole di app.css hanno
   !important, per questo alcune qui lo ripetono con specificità maggiore.

   Indice
     1. Token locali e palette MudBlazor allineata ai token
     2. Intestazione di pagina (.page-header)
     3. Card, paper, statistiche
     4. Tabelle (MudTable, MudDataGrid, MudSimpleTable)
     5. Chip di stato, avvisi, liste, tab, pannelli
     6. Campi e filtri
     7. Finestre (MudDialog)
     8. Calendari e agende
     9. Stati vuoti, caricamento
    10. Pagine pubbliche di prenotazione (/{verticale}/p/{slug})
    11. Movimento
    12. Telefono e touch
   ============================================================================ */

html:not([data-vertical="superadmin"]):not([data-vertical="platform"]) {
    /* ═════════════ 1. TOKEN LOCALI ═════════════ */
    --tn-accent: var(--mud-palette-primary, var(--zd-brand));
    --tn-accent-soft: color-mix(in srgb, var(--tn-accent) 9%, var(--zd-surface));
    --tn-accent-soft-2: color-mix(in srgb, var(--tn-accent) 15%, var(--zd-surface));
    /* accento usato come TESTO: scurito verso lo slate (schiarito nel tema scuro), regge 4.5:1 */
    --tn-accent-ink: color-mix(in srgb, var(--tn-accent) 72%, var(--zd-ink-mix));
    --tn-accent-ring: color-mix(in srgb, var(--tn-accent) 26%, transparent);
    --tn-row-hover: color-mix(in srgb, var(--tn-accent) 4%, var(--zd-surface));

    /* Palette MudBlazor ricondotta ai token: superfici bianche, linee e testi slate,
       uguali in ogni verticale. Il colore primario del verticale NON si tocca.
       (:root del MudThemeProvider ha specificità 0,1,0: qui 0,3,1.) */
    --mud-palette-background: var(--zd-canvas);
    --mud-palette-background-grey: var(--zd-surface-2);
    --mud-palette-surface: var(--zd-surface);
    --mud-palette-lines-default: var(--zd-border);
    --mud-palette-lines-inputs: var(--zd-border-strong);
    --mud-palette-table-lines: var(--zd-border);
    --mud-palette-table-striped: var(--zd-surface-2);
    --mud-palette-table-hover: var(--tn-row-hover);
    --mud-palette-divider: var(--zd-border);
    --mud-palette-divider-light: var(--zd-border);
    --mud-palette-text-primary: var(--zd-text);
    --mud-palette-text-secondary: var(--zd-text-3);
    --mud-default-borderradius: var(--zd-radius-sm);

    /* Titoli messi a fuoco da FocusOnNavigate (tabindex=-1): non sono comandi,
       l'anello di focus attorno al titolo sembrava un errore grafico. */
    & :is(h1, h2, h3, h4, h5, h6, .mud-typography)[tabindex="-1"]:focus {
        outline: none !important;
        box-shadow: none !important;
    }

    /* ═════════════ 2. INTESTAZIONE DI PAGINA ═════════════
       MudPaper.page-header > div.d-flex.flex-row (MudStack Row) > [MudIcon] [div testi]
       [MudSpacer] [ricerca/filtri] [pulsanti]. Vive sul canvas, senza card né aloni. */
    & .mud-main-content .page-header {
        background: transparent !important;
        border: 0 !important;
        box-shadow: none !important;
        padding: var(--zd-space-1) 0 var(--zd-space-5) !important;
        margin-bottom: 0 !important;
    }
    & .mud-main-content .page-header::before { display: none !important; }
    & .mud-main-content .page-header > .d-flex.flex-row {
        flex-wrap: wrap;
        row-gap: var(--zd-space-3);
        column-gap: var(--zd-space-3);
    }
    /* Icona di sezione: accento del verticale, niente ombra colorata. */
    & .mud-main-content .page-header > .d-flex > .mud-icon-root:first-child,
    & .mud-main-content .page-header .mud-icon-root.mud-icon-size-large {
        color: var(--tn-accent) !important;
        filter: none !important;
        flex: none;
    }
    & .mud-main-content .page-header > .d-flex > .mud-icon-root:first-child { margin-right: 0 !important; }
    & .mud-main-content .page-header :is(.mud-typography-h4, .mud-typography-h5) {
        color: var(--zd-text) !important;
        font-size: clamp(1.25rem, 1.1rem + .6vw, 1.5rem) !important;
        font-weight: 700 !important;
        letter-spacing: -0.02em;
        line-height: 1.25;
        background: none !important;
        -webkit-text-fill-color: currentColor;
    }
    & .mud-main-content .page-header .mud-typography-body2 {
        color: var(--zd-text-3) !important;
        font-size: var(--zd-font-size-sm);
        margin-top: 2px;
        max-width: 72ch;
    }
    /* Il blocco dei testi prende lo spazio libero e va a capo prima di comprimersi. */
    & .mud-main-content .page-header > .d-flex.flex-row > div:not([class]) {
        flex: 1 1 14rem;
        min-width: 0;
    }

    /* ═════════════ 3. CARD, PAPER, STATISTICHE ═════════════ */
    & .mud-main-content :is(.mud-paper, .mud-card):not(.page-header):not(.fzb *):not(.zed-assist):not(.zed-hero-bar) {
        background: var(--zd-surface) !important;
        border: 1px solid var(--zd-border);
        border-radius: var(--zd-radius) !important;
        box-shadow: var(--zd-shadow-1) !important;
        transition: box-shadow var(--zd-dur) var(--zd-ease), border-color var(--zd-dur) var(--zd-ease), transform var(--zd-dur) var(--zd-ease);
    }
    /* Riquadri dentro una card: raggio più piccolo, fondo appena grigio, niente ombra. */
    & .mud-main-content :is(.mud-paper, .mud-card) :is(.mud-paper, .mud-card):not(.fzb *):not(.mud-table):not(.mud-data-grid) {
        border-radius: var(--zd-radius-sm) !important;
        box-shadow: none !important;
    }
    & .mud-main-content .mud-card:hover:not(.fzb *) {
        border-color: var(--zd-border-strong);
        box-shadow: var(--zd-shadow-2) !important;
        transform: none;
    }
    & .mud-main-content .mud-card-header:not(.fzb *) {
        padding: var(--zd-space-4) var(--zd-space-5);
        border-bottom: 1px solid var(--zd-border);
    }
    & .mud-main-content .mud-card-header .mud-typography-h6 {
        font-size: 1rem;
        font-weight: 600;
        color: var(--zd-text);
        letter-spacing: -0.01em;
    }
    & .mud-main-content .mud-card-content:not(.fzb *) { padding: var(--zd-space-5); }
    & .mud-main-content .mud-card-actions:not(.fzb *) {
        padding: var(--zd-space-3) var(--zd-space-5);
        border-top: 1px solid var(--zd-border);
        gap: var(--zd-space-2);
    }
    /* Titoli h6 delle card "paper + titolo" (molto usati nelle impostazioni). */
    & .mud-main-content .mud-paper > .mud-typography-h6:first-child {
        font-size: 1rem;
        font-weight: 600;
        letter-spacing: -0.01em;
    }

    /* Statistiche delle dashboard: etichetta piccola, numero protagonista.
       Niente aloni né icone che fluttuano: un solo sollevamento leggero in hover. */
    & .mud-main-content .stat-card {
        background: var(--zd-surface) !important;
        border: 1px solid var(--zd-border) !important;
        border-radius: var(--zd-radius) !important;
        box-shadow: var(--zd-shadow-1) !important;
        overflow: hidden;
        height: 100%;
    }
    & .mud-main-content .stat-card::after { display: none !important; }
    & .mud-main-content .stat-card:hover {
        transform: translateY(-2px);
        border-color: var(--zd-border-strong) !important;
        box-shadow: var(--zd-shadow-2) !important;
    }
    & .mud-main-content .stat-card :is(.mud-card-content, .mud-paper-content) { padding: var(--zd-space-4) var(--zd-space-5); }
    & .mud-main-content .stat-card .mud-typography-overline {
        display: block;
        color: var(--zd-text-3) !important;
        font-size: .72rem;
        font-weight: 600;
        letter-spacing: .06em;
        line-height: 1.4;
        text-transform: uppercase;
    }
    & .mud-main-content .stat-card :is(.mud-typography-h4, .mud-typography-h5) {
        font-size: clamp(1.4rem, 1.2rem + .8vw, 1.75rem) !important;
        font-weight: 700 !important;
        letter-spacing: -0.02em;
        line-height: 1.2;
        margin-top: var(--zd-space-1);
        font-variant-numeric: tabular-nums;
    }
    & .mud-main-content .stat-card :is(.mud-typography-h4, .mud-typography-h5):not(.mud-error-text):not(.mud-success-text):not(.mud-warning-text):not(.mud-info-text):not([style*="color"]) {
        color: var(--zd-text) !important;
    }
    & .mud-main-content .stat-card .mud-icon-root {
        color: var(--tn-accent) !important;
        background: var(--tn-accent-soft) !important;
        border-radius: var(--zd-radius-sm) !important;
        padding: 8px;
        box-sizing: content-box;
        animation: none !important;
        transition: none;
    }
    & .mud-main-content .stat-card:hover .mud-icon-root { transform: none; }

    /* Barre di avanzamento: traccia grigia, riempimento nell'accento. */
    & .mud-main-content .mud-progress-linear:not(.fzb *) {
        background: var(--zd-surface-hover) !important;
        border-radius: var(--zd-radius-pill);
    }

    /* ═════════════ 4. TABELLE ═════════════
       Tabella = card; intestazione grigio chiaro in maiuscoletto; righe senza zebra,
       hover appena accennato; scroll orizzontale dentro la tabella, mai sulla pagina. */
    & .mud-main-content :is(.mud-table, .mud-data-grid):not(.fzb *) {
        background: var(--zd-surface) !important;
        border: 1px solid var(--zd-border);
        border-radius: var(--zd-radius) !important;
        box-shadow: var(--zd-shadow-1) !important;
        overflow: hidden;
    }
    & .mud-main-content :is(.mud-paper, .mud-card, .mud-tabs-panels) :is(.mud-table, .mud-data-grid):not(.fzb *) {
        box-shadow: none !important;
        border-radius: var(--zd-radius-sm) !important;
    }
    & .mud-main-content :is(.mud-table, .mud-data-grid, .mud-simple-table):not(.fzb *) .mud-table-container {
        overflow-x: auto;
        -webkit-overflow-scrolling: touch;
    }
    & .mud-main-content :is(.mud-table, .mud-data-grid, .mud-simple-table):not(.fzb *) :is(.mud-table-head, thead) :is(th, .mud-table-cell) {
        background: var(--zd-surface-2) !important;
        color: var(--zd-text-3) !important;
        font-size: .72rem !important;
        font-weight: 600 !important;
        letter-spacing: .05em;
        text-transform: uppercase;
        border-bottom: 1px solid var(--zd-border) !important;
        padding-top: var(--zd-space-3);
        padding-bottom: var(--zd-space-3);
        white-space: nowrap;
    }
    & .mud-main-content :is(.mud-table, .mud-data-grid):not(.fzb *) .mud-table-head {
        background: var(--zd-surface-2) !important;
    }
    & .mud-main-content :is(.mud-table, .mud-data-grid, .mud-simple-table):not(.fzb *) :is(.mud-table-body, tbody) :is(td, .mud-table-cell) {
        border-bottom: 1px solid var(--zd-border);
        color: var(--zd-text);
        font-size: var(--zd-font-size);
    }
    & .mud-main-content :is(.mud-table, .mud-data-grid, .mud-simple-table):not(.fzb *) :is(.mud-table-body, tbody) tr:last-child > :is(td, .mud-table-cell) {
        border-bottom: 0;
    }
    & .mud-main-content :is(.mud-table, .mud-data-grid):not(.fzb *) .mud-table-row:nth-child(even) { background: transparent; }
    & .mud-main-content :is(.mud-table, .mud-data-grid, .mud-simple-table):not(.fzb *) :is(.mud-table-body, tbody) tr {
        transition: background-color var(--zd-dur-fast) ease;
    }
    & .mud-main-content :is(.mud-table, .mud-data-grid, .mud-simple-table):not(.fzb *) :is(.mud-table-body, tbody) tr:hover {
        background: var(--tn-row-hover) !important;
    }
    & .mud-main-content .mud-table-row:hover .mud-table-cell:first-child { box-shadow: inset 2px 0 0 var(--tn-accent); }
    & .mud-main-content :is(.mud-table, .mud-data-grid):not(.fzb *) :is(.mud-table-pagination, .mud-table-toolbar) {
        background: var(--zd-surface) !important;
        color: var(--zd-text-2);
    }
    & .mud-main-content :is(.mud-table, .mud-data-grid):not(.fzb *) .mud-table-pagination {
        border-top: 1px solid var(--zd-border);
    }
    & .mud-main-content :is(.mud-table, .mud-data-grid):not(.fzb *) .mud-table-toolbar {
        border-top: 0;
        border-bottom: 1px solid var(--zd-border);
    }
    /* Tabelle semplici dentro le card: stesso maiuscoletto, niente bordo doppio. */
    & .mud-main-content .mud-simple-table:not(.fzb *) {
        background: transparent;
        box-shadow: none !important;
    }

    /* ═════════════ 5. CHIP, AVVISI, LISTE, TAB, PANNELLI ═════════════ */
    /* Chip di stato: tinta tenue + testo scuro dello stesso colore (leggibili, non urlati). */
    & .mud-chip:not(.fzb *) {
        border-radius: var(--zd-radius-pill) !important;
        font-weight: 600;
        letter-spacing: .01em;
        transition: background-color var(--zd-dur-fast) ease, box-shadow var(--zd-dur-fast) ease, transform var(--zd-dur-fast) ease;
    }
    & .mud-chip.mud-chip-size-small:not(.fzb *) { height: 24px; font-size: .75rem; padding: 0 10px; }
    & .mud-chip.mud-chip-filled.mud-chip-color-primary:not(.fzb *) { background: var(--tn-accent-soft-2) !important; color: var(--tn-accent-ink) !important; }
    & .mud-chip.mud-chip-filled.mud-chip-color-secondary:not(.fzb *),
    & .mud-chip.mud-chip-filled.mud-chip-color-tertiary:not(.fzb *),
    & .mud-chip.mud-chip-filled.mud-chip-color-default:not(.fzb *),
    & .mud-chip.mud-chip-filled.mud-chip-color-dark:not(.fzb *) { background: var(--zd-surface-hover) !important; color: var(--zd-text-2) !important; }
    & .mud-chip.mud-chip-filled.mud-chip-color-success:not(.fzb *) { background: var(--zd-success-soft) !important; color: var(--zd-success-ink) !important; box-shadow: inset 0 0 0 1px color-mix(in srgb, var(--zd-success) 22%, transparent); }
    & .mud-chip.mud-chip-filled.mud-chip-color-error:not(.fzb *) { background: var(--zd-danger-soft) !important; color: var(--zd-danger-ink) !important; box-shadow: inset 0 0 0 1px color-mix(in srgb, var(--zd-danger) 22%, transparent); }
    & .mud-chip.mud-chip-filled.mud-chip-color-warning:not(.fzb *) { background: var(--zd-warning-soft) !important; color: var(--zd-warning-ink) !important; box-shadow: inset 0 0 0 1px color-mix(in srgb, var(--zd-warning) 26%, transparent); }
    & .mud-chip.mud-chip-filled.mud-chip-color-info:not(.fzb *) { background: var(--zd-info-soft) !important; color: var(--zd-info-ink) !important; box-shadow: inset 0 0 0 1px color-mix(in srgb, var(--zd-info) 22%, transparent); }
    & .mud-chip.mud-chip-filled :is(.mud-chip-icon, .mud-icon-root) { color: inherit !important; }
    /* Chip selezionabili (filtri, MudChipSet): la scelta attiva è piena nell'accento. */
    & .mud-chip.mud-chip-selected:not(.fzb *) {
        background: var(--tn-accent) !important;
        color: #FFFFFF !important;
        box-shadow: none;
    }
    & .mud-chip.mud-chip-outlined:not(.fzb *) { border-color: var(--zd-border-strong) !important; background: var(--zd-surface) !important; }
    & .mud-chip.mud-chip-outlined.mud-chip-color-primary:not(.fzb *) { border-color: var(--tn-accent-ring) !important; color: var(--tn-accent-ink) !important; }

    /* Avvisi (MudAlert standard/testo): fondo tenue dello stato, bordo sottile, testo scuro.
       Le "info" erano tinte nel colore del verticale e in Ristorante sembravano errori. */
    & .mud-main-content .mud-alert:not(.fzb *):not(.layout-banner) {
        border-radius: var(--zd-radius-sm) !important;
        font-weight: 500;
        box-shadow: none !important;
    }
    & .mud-main-content :is(.mud-alert-text-info, .mud-alert-standard-info):not(.fzb *) { background: var(--zd-info-soft) !important; color: var(--zd-info-ink) !important; border: 1px solid color-mix(in srgb, var(--zd-info) 22%, transparent); }
    & .mud-main-content :is(.mud-alert-text-success, .mud-alert-standard-success):not(.fzb *) { background: var(--zd-success-soft) !important; color: var(--zd-success-ink) !important; border: 1px solid color-mix(in srgb, var(--zd-success) 22%, transparent); }
    & .mud-main-content :is(.mud-alert-text-warning, .mud-alert-standard-warning):not(.fzb *) { background: var(--zd-warning-soft) !important; color: var(--zd-warning-ink) !important; border: 1px solid color-mix(in srgb, var(--zd-warning) 26%, transparent); }
    & .mud-main-content :is(.mud-alert-text-error, .mud-alert-standard-error):not(.fzb *) { background: var(--zd-danger-soft) !important; color: var(--zd-danger-ink) !important; border: 1px solid color-mix(in srgb, var(--zd-danger) 22%, transparent); }
    & .mud-main-content :is(.mud-alert-text-info, .mud-alert-standard-info, .mud-alert-outlined-info):not(.layout-banner) .mud-alert-icon .mud-icon-root { color: var(--zd-info) !important; }
    & .mud-main-content :is(.mud-alert-text-success, .mud-alert-standard-success, .mud-alert-outlined-success):not(.layout-banner) .mud-alert-icon .mud-icon-root { color: var(--zd-success) !important; }
    & .mud-main-content :is(.mud-alert-text-warning, .mud-alert-standard-warning, .mud-alert-outlined-warning):not(.layout-banner) .mud-alert-icon .mud-icon-root { color: var(--zd-warning) !important; }
    & .mud-main-content :is(.mud-alert-text-error, .mud-alert-standard-error, .mud-alert-outlined-error):not(.layout-banner) .mud-alert-icon .mud-icon-root { color: var(--zd-danger) !important; }
    /* Avvisi delineati: fondo bianco, bordo tenue dello stato. */
    & .mud-main-content .mud-alert[class*="mud-alert-outlined-"]:not(.layout-banner):not(.fzb *) { background: var(--zd-surface) !important; }
    & .mud-main-content .mud-alert-outlined-info:not(.layout-banner) { border-color: color-mix(in srgb, var(--zd-info) 40%, transparent) !important; color: var(--zd-info-ink) !important; }
    & .mud-main-content .mud-alert-outlined-success:not(.layout-banner) { border-color: color-mix(in srgb, var(--zd-success) 40%, transparent) !important; color: var(--zd-success-ink) !important; }
    & .mud-main-content .mud-alert-outlined-warning:not(.layout-banner) { border-color: color-mix(in srgb, var(--zd-warning) 45%, transparent) !important; color: var(--zd-warning-ink) !important; }
    & .mud-main-content .mud-alert-outlined-error:not(.layout-banner) { border-color: color-mix(in srgb, var(--zd-danger) 40%, transparent) !important; color: var(--zd-danger-ink) !important; }

    /* Liste */
    & .mud-main-content .mud-list-item:not(.fzb *) {
        border-radius: var(--zd-radius-sm);
        transition: background-color var(--zd-dur-fast) ease;
    }
    & .mud-main-content .mud-list-item:not(.fzb *):hover { background: var(--zd-surface-hover) !important; }
    & .mud-main-content .mud-list-item.mud-selected-item:not(.fzb *) { background: var(--tn-accent-soft) !important; color: var(--tn-accent-ink); }

    /* Tab: barra bianca con linea sotto, scheda attiva nell'accento con barretta. */
    & .mud-main-content .mud-tabs:not(.fzb *) .mud-tabs-tabbar {
        background: var(--zd-surface) !important;
        border-bottom: 1px solid var(--zd-border);
    }
    & .mud-main-content > .mud-container .mud-tabs:not(.mud-paper *):not(.fzb *) {
        background: var(--zd-surface);
        border: 1px solid var(--zd-border);
        border-radius: var(--zd-radius);
        box-shadow: var(--zd-shadow-1);
        overflow: hidden;
    }
    & .mud-main-content .mud-tabs:not(.fzb *) .mud-tab {
        color: var(--zd-text-2);
        font-weight: 600;
        text-transform: none;
        letter-spacing: 0;
        min-height: 48px;
        transition: color var(--zd-dur) ease, background-color var(--zd-dur) ease;
    }
    & .mud-main-content .mud-tabs:not(.fzb *) .mud-tab::after { display: none; }
    & .mud-main-content .mud-tabs:not(.fzb *) .mud-tab:hover { background: var(--zd-surface-hover); color: var(--zd-text); }
    & .mud-main-content .mud-tabs:not(.fzb *) .mud-tab.mud-tab-active { color: var(--tn-accent-ink) !important; }
    & .mud-main-content .mud-tabs:not(.fzb *) .mud-tab-slider {
        background: var(--tn-accent) !important;
        height: 2px !important;
        border-radius: 2px 2px 0 0;
        transition: left var(--zd-dur-slow) var(--zd-ease), width var(--zd-dur-slow) var(--zd-ease);
    }
    & .mud-main-content .mud-tabs:not(.fzb *) .mud-tabs-panels { background: transparent; }

    /* Pannelli espandibili (documentazione, impostazioni): una card unica a righe. */
    & .mud-main-content .mud-expansion-panels:not(.fzb *) {
        background: var(--zd-surface);
        border: 1px solid var(--zd-border);
        border-radius: var(--zd-radius);
        box-shadow: var(--zd-shadow-1) !important;
        overflow: hidden;
    }
    & .mud-main-content .mud-expansion-panels:not(.fzb *) > .mud-expand-panel {
        background: var(--zd-surface) !important;
        border: 0 !important;
        border-bottom: 1px solid var(--zd-border) !important;
        border-radius: 0 !important;
        box-shadow: none !important;
        margin: 0 !important;
    }
    & .mud-main-content .mud-expansion-panels:not(.fzb *) > .mud-expand-panel:last-child { border-bottom: 0 !important; }
    & .mud-main-content .mud-expand-panel:not(.fzb *) .mud-expand-panel-header {
        transition: background-color var(--zd-dur-fast) ease;
    }
    & .mud-main-content .mud-expand-panel:not(.fzb *) .mud-expand-panel-header:hover { background: var(--zd-surface-hover); }
    & .mud-main-content .mud-expand-panel.mud-panel-expanded:not(.fzb *) > .mud-expand-panel-header {
        color: var(--tn-accent-ink);
        font-weight: 600;
    }
    & .mud-main-content .mud-expand-panel.mud-panel-expanded:not(.fzb *) > .mud-expand-panel-header .mud-icon-root { color: var(--tn-accent); }

    /* Occhielli (overline) dei contenuti: grigi come le etichette, non nel colore del settore. */
    & .mud-main-content .mud-typography-overline:not([class*="-text"]):not(.fzb *) { color: var(--zd-text-3); }

    /* Testi 'secondari' (MudText Color.Secondary): nei template sono testo attenuato, ma il colore
       secondario dei verticali è verde, rosso, arancio... Qui diventano grigio slate ovunque. */
    & :is(.mud-main-content, .mud-dialog) .mud-typography.mud-secondary-text:not(.fzb *) { color: var(--zd-text-3) !important; }

    /* Divisori */
    & .mud-main-content .mud-divider:not(.fzb *) { border-color: var(--zd-border) !important; }

    /* ═════════════ 6. CAMPI E FILTRI ═════════════ */
    & :is(.mud-main-content, .mud-dialog) .mud-input.mud-input-outlined:not(.fzb *) {
        background: var(--zd-surface);
        border-radius: var(--zd-radius-sm);
    }
    & :is(.mud-main-content, .mud-dialog) .mud-input-outlined-border:not(.fzb *) {
        border-color: var(--zd-border-strong) !important;
        border-radius: var(--zd-radius-sm) !important;
        transition: border-color var(--zd-dur-fast) ease, box-shadow var(--zd-dur-fast) ease;
    }
    & :is(.mud-main-content, .mud-dialog) .mud-input.mud-input-outlined:not(.fzb *):hover .mud-input-outlined-border { border-color: var(--zd-text-3) !important; }
    & :is(.mud-main-content, .mud-dialog) .mud-input.mud-input-outlined.mud-focused:not(.fzb *) .mud-input-outlined-border {
        border-color: var(--tn-accent) !important;
        border-width: 1px !important;
        box-shadow: 0 0 0 3px var(--tn-accent-ring);
    }
    & :is(.mud-main-content, .mud-dialog) .mud-input-error .mud-input-outlined-border { border-color: var(--zd-danger) !important; }
    /* Etichetta del campo delineato: stesso fondo del campo, niente riquadretto colorato attorno. */
    & :is(.mud-main-content, .mud-dialog) .mud-input-label-outlined:not(.fzb *) { background-color: var(--zd-surface); }
    & :is(.mud-main-content, .mud-dialog) .mud-input-label.mud-focused:not(.fzb *) { color: var(--tn-accent-ink) !important; }
    & :is(.mud-main-content, .mud-dialog) .mud-input-underline:not(.fzb *)::before { border-bottom-color: var(--zd-border-strong); }
    & :is(.mud-main-content, .mud-dialog) .mud-input-underline:not(.fzb *)::after { border-bottom-color: var(--tn-accent); }
    & :is(.mud-main-content, .mud-dialog) .mud-input-helper-text:not(.mud-input-error) { color: var(--zd-text-3); }

    /* ═════════════ 7. FINESTRE (MudDialog) ═════════════
       Card bianca con angoli ampi, testata con l'icona nell'accento, piede grigio chiaro.
       MudBlazor ancora la X di chiusura alla testata, ma la testata non è "position: relative":
       la X finiva nell'angolo dello SCHERMO, fuori dalla finestra (desktop e telefono). */
    & .mud-overlay-dialog { backdrop-filter: none !important; }
    & .mud-overlay-dialog .mud-overlay-scrim { background-color: rgba(15, 23, 42, .45) !important; }
    & .mud-dialog:not(.fzb *) {
        background: var(--zd-surface) !important;
        border: 1px solid var(--zd-border);
        border-radius: var(--zd-radius-lg) !important;
        box-shadow: var(--zd-shadow-3) !important;
        overflow: hidden;
    }
    & .mud-dialog .mud-dialog-title {
        position: relative;
        display: flex;
        align-items: center;
        gap: var(--zd-space-3);
        min-height: 60px;
        padding: var(--zd-space-4) 56px var(--zd-space-4) var(--zd-space-5) !important;
        background: var(--zd-surface) !important;
        color: var(--zd-text) !important;
        border-bottom: 1px solid var(--zd-border);
        font-size: 1.05rem;
        font-weight: 600 !important;
    }
    & .mud-dialog .mud-dialog-title > .mud-typography {
        display: flex;
        align-items: center;
        gap: var(--zd-space-2);
        min-width: 0;
        font-weight: 600;
    }
    & .mud-dialog .mud-dialog-title .mud-icon-root { color: var(--tn-accent) !important; }
    & .mud-dialog .mud-dialog-title .mud-button-close {
        position: absolute;
        top: 50%;
        right: var(--zd-space-3);
        transform: translateY(-50%);
        color: var(--zd-text-3) !important;
    }
    & .mud-dialog .mud-dialog-title .mud-button-close .mud-icon-root { color: inherit !important; }
    & .mud-dialog .mud-dialog-content {
        padding: var(--zd-space-5) !important;
        background: var(--zd-surface) !important;
        color: var(--zd-text);
        overflow-x: hidden;
    }
    & .mud-dialog .mud-dialog-actions {
        background: var(--zd-surface-2) !important;
        border-top: 1px solid var(--zd-border);
        padding: var(--zd-space-3) var(--zd-space-5) !important;
        gap: var(--zd-space-2);
    }
    & .mud-dialog .mud-alert { border-radius: var(--zd-radius-sm) !important; }
    /* Sentinelle invisibili del focus-trap di MudDialog: con il focus disegnavano un
       quadratino colorato nell'angolo dello schermo (anello di focus globale). */
    & .mud-dialog-container .mud-focus-trap > .fixed.pointer-events-none:focus {
        outline: none !important;
        box-shadow: none !important;
    }
    /* Corpo dei dialog con larghezza minima (classe da usare nelle finestre nuove):
       comoda su desktop, mai oltre lo schermo su telefono. */
    & .tn-dialog-body { min-width: min(460px, calc(100vw - 88px)); max-width: 100%; }

    /* ═════════════ 8. CALENDARI E AGENDE ═════════════
       Griglia settimanale (.calendar-grid, Barbiere e cloni) e mese/settimana (.cal-*):
       righe sottili grigie, intestazioni chiare, oggi in evidenza con l'accento. */
    & .mud-main-content .calendar-grid {
        background: var(--zd-border);
        border: 1px solid var(--zd-border);
        border-radius: var(--zd-radius);
        box-shadow: var(--zd-shadow-1);
    }
    & .mud-main-content .calendar-slot { background: var(--zd-surface); }
    & .mud-main-content .calendar-slot.calendar-header {
        background: var(--zd-surface) !important;
        border-bottom: 1px solid var(--zd-border) !important;
        padding: var(--zd-space-3) var(--zd-space-1);
    }
    & .mud-main-content .calendar-slot.calendar-header .mud-typography-overline {
        color: var(--zd-text-3) !important;
        font-weight: 600;
        letter-spacing: .06em;
    }
    & .mud-main-content .calendar-slot.calendar-header .mud-typography-h6 { color: var(--zd-text) !important; font-weight: 700; }
    & .mud-main-content .calendar-slot.calendar-time {
        background: var(--zd-surface-2) !important;
        color: var(--zd-text-3);
        font-weight: 500;
        font-variant-numeric: tabular-nums;
    }
    & .mud-main-content .calendar-slot.calendar-cell:hover {
        background: var(--tn-row-hover) !important;
        box-shadow: inset 0 0 0 1px var(--tn-accent-ring) !important;
    }
    & .mud-main-content .appointment-chip {
        border-radius: 6px;
        box-shadow: 0 1px 2px rgba(15, 23, 42, .12);
        text-shadow: 0 1px 1px rgba(0, 0, 0, .25);
    }
    & .mud-main-content .appointment-chip:hover { transform: translateY(-1px); filter: brightness(1.05); box-shadow: var(--zd-shadow-2); }
    & .mud-main-content :is(.cal-month, .cal-week) {
        border-color: var(--zd-border) !important;
        border-radius: var(--zd-radius) !important;
        box-shadow: var(--zd-shadow-1);
        background: var(--zd-border);
    }
    & .mud-main-content :is(.cal-month__cell, .cal-week__col) { background: var(--zd-surface); }
    & .mud-main-content .cal-month__cell--weekend { background: var(--zd-surface-2); }
    & .mud-main-content :is(.cal-month__cell--today, .cal-week__col--today) { background: var(--tn-accent-soft) !important; }
    & .mud-main-content .cal-today { background: var(--tn-accent) !important; color: #FFFFFF !important; }
    & .mud-main-content :is(.cal-month__dow, .cal-week__head) { background: var(--zd-surface-2); color: var(--zd-text-3); }
    & .mud-main-content .cal-kpi {
        background: var(--zd-surface);
        border: 1px solid var(--zd-border);
        border-radius: var(--zd-radius);
        box-shadow: var(--zd-shadow-1);
    }

    /* ═════════════ 9. STATI VUOTI, CARICAMENTO ═════════════ */
    & .mud-main-content .empty-state {
        background: var(--zd-surface);
        border: 1px dashed var(--zd-border-strong);
        border-radius: var(--zd-radius);
        color: var(--zd-text-3);
        padding: var(--zd-space-6) var(--zd-space-5);
        text-align: center;
    }
    & .mud-main-content .empty-state .mud-icon-root {
        color: var(--tn-accent) !important;
        background: var(--tn-accent-soft);
        border-radius: var(--zd-radius-pill);
        padding: 12px;
        box-sizing: content-box;
        animation: none !important;
    }
    & .mud-main-content .mud-progress-linear.mud-progress-indeterminate:not(.fzb *) { height: 3px; }
    & .mud-main-content .mud-skeleton { background-color: var(--zd-surface-hover); border-radius: var(--zd-radius-sm) !important; }

    /* Animazioni continue nei contenuti (badge che pulsano, icone che fluttuano, aloni che
       respirano): distraggono e consumano. Restano solo transizioni brevi su interazione. */
    & .mud-main-content :is(.mud-badge-content, .stat-card .mud-icon-root, .page-header .mud-icon-root) { animation: none !important; }
    & .mud-main-content .mud-button-filled.mud-button-filled-primary::after { display: none !important; }
}

/* Titoli dei contenuti nel testo slate del design system (app.css li tinge col colore del
   settore). Specificità minima (:where): qualsiasi regola più precisa, come i testi bianchi
   delle testate colorate, continua a vincere. */
:where(html:not([data-vertical="superadmin"]):not([data-vertical="platform"]) :is(.mud-main-content, .mud-dialog)) :is(h1, h2, h3, h4, h5, h6, .mud-typography-h1, .mud-typography-h2, .mud-typography-h3, .mud-typography-h4, .mud-typography-h5, .mud-typography-h6) {
    color: var(--zd-text);
}

/* ═════════════ 10. PAGINE PUBBLICHE DI PRENOTAZIONE ═════════════
   /{verticale}/p/{slug}: PublicLayout del verticale (niente menu, niente barra in alto).
   Stesso linguaggio dell'area di lavoro: canvas a tinta unita, testata BIANCA (prima un
   blocco scuro sfumato nel colore del settore), card bianche, accento solo nei dettagli.
   Le regole di forma restano nei <style> delle pagine (logica e markup invariati): qui
   solo i colori, con specificità maggiore di .public-booking-shell .pb-*. */
html:not([data-vertical="superadmin"]):not([data-vertical="platform"]) {
    & .mud-layout:has(> .pb-layout-main),
    & .pb-layout-main,
    & .public-booking-shell {
        background: var(--zd-canvas) !important;
    }
    & .public-booking-shell .pb-hero {
        color: var(--zd-text);
        background: var(--zd-surface);
        border-bottom: 1px solid var(--zd-border);
    }
    & .public-booking-shell .pb-hero--compact {
        border: 1px solid var(--zd-border);
        box-shadow: var(--zd-shadow-1);
    }
    & .public-booking-shell .pb-hero__eyebrow { color: var(--tn-accent-ink); }
    & .public-booking-shell .pb-hero__name { color: var(--zd-text) !important; }
    & .public-booking-shell .pb-hero__address { color: var(--zd-text-2); }
    & .public-booking-shell .pb-hero__address .mud-icon-root { color: var(--tn-accent); }
    & .public-booking-shell .pb-chip {
        background: var(--zd-surface-2);
        border: 1px solid var(--zd-border);
        color: var(--zd-text-2);
        backdrop-filter: none;
        -webkit-backdrop-filter: none;
    }
    & .public-booking-shell .pb-hero__mascot .zcd-mascot__bubble {
        border-color: var(--zd-border);
        box-shadow: var(--zd-shadow-2);
    }
    & .public-booking-shell .pb-tabs .mud-tabs-tabbar {
        background: var(--zd-surface) !important;
        backdrop-filter: none;
        -webkit-backdrop-filter: none;
        border-bottom: 1px solid var(--zd-border);
        box-shadow: var(--zd-shadow-1);
    }
    & .public-booking-shell .pb-tabs .mud-tab { color: var(--zd-text-2); }
    & .public-booking-shell .pb-tabs .mud-tab:hover { color: var(--zd-text); background: var(--zd-surface-hover); }
    & .public-booking-shell .pb-tabs .mud-tab.mud-tab-active { color: var(--tn-accent-ink); }
    & .public-booking-shell .pb-tabs .mud-tab-slider { background: var(--tn-accent); }
    & .public-booking-shell :is(.mud-paper, .mud-card):not(.mud-paper *):not(.mud-tabs-tabbar) {
        background: var(--zd-surface) !important;
        border: 1px solid var(--zd-border);
        border-radius: var(--zd-radius-lg) !important;
        box-shadow: var(--zd-shadow-1) !important;
    }
    /* Servizi come schede selezionabili (2026-10-09). La classe pb-service-item sta sul
       contenitore .mud-input-control del MudCheckBox, non sul label .mud-checkbox: le regole
       precedenti puntavano a .pb-service-item.mud-checkbox e non si applicavano mai. */
    & .public-booking-shell .pb-service-item {
        margin: 0;
        border: 1px solid var(--zd-border);
        border-radius: var(--zd-radius);
        background: var(--zd-surface);
        transition: border-color var(--zd-dur-fast) var(--zd-ease), background-color var(--zd-dur-fast) var(--zd-ease), box-shadow var(--zd-dur-fast) var(--zd-ease);
    }
    & .public-booking-shell .pb-service-item .mud-input-control-input-container,
    & .public-booking-shell .pb-service-item label.mud-checkbox {
        width: 100%;
    }
    & .public-booking-shell .pb-service-item label.mud-checkbox {
        min-height: 52px;
        padding: 4px 14px 4px 4px;
        margin: 0;
        cursor: pointer;
    }
    & .public-booking-shell .pb-service-item label.mud-checkbox > .mud-typography {
        font-size: var(--zd-font-size);
        font-weight: 500;
        color: var(--zd-text);
        line-height: 1.35;
    }
    & .public-booking-shell .pb-service-item:hover {
        border-color: var(--zd-border-strong);
        box-shadow: var(--zd-shadow-1);
    }
    & .public-booking-shell .pb-service-item:has(input:checked) {
        border-color: var(--tn-accent);
        background: var(--tn-accent-soft);
        box-shadow: inset 0 0 0 1px var(--tn-accent);
    }
    & .public-booking-shell .pb-service-item:has(input:checked) label.mud-checkbox > .mud-typography {
        color: var(--tn-accent-ink);
        font-weight: 600;
    }
    /* Contenuto della scheda: nome in evidenza, durata e prezzo come etichette. */
    & .public-booking-shell .pb-service {
        display: flex;
        flex: 1 1 auto;
        align-items: center;
        justify-content: space-between;
        gap: 8px 12px;
        flex-wrap: wrap;
        min-width: 0;
        padding: 6px 0;
    }
    & .public-booking-shell .pb-service__name {
        font-size: var(--zd-font-size);
        font-weight: 600;
        color: var(--zd-text);
        line-height: 1.3;
    }
    & .public-booking-shell .pb-service__meta { display: inline-flex; gap: 6px; flex: 0 0 auto; }
    & .public-booking-shell .pb-tag {
        display: inline-flex;
        align-items: center;
        padding: 2px 8px;
        border-radius: var(--zd-radius-pill);
        background: var(--zd-surface-2);
        border: 1px solid var(--zd-border);
        color: var(--zd-text-2);
        font-size: 0.75rem;
        font-weight: 500;
        white-space: nowrap;
    }
    & .public-booking-shell .pb-tag--price { color: var(--zd-text); font-weight: 700; font-variant-numeric: tabular-nums; }
    & .public-booking-shell .pb-service-item:has(input:checked) .pb-service__name { color: var(--tn-accent-ink); }
    & .public-booking-shell .pb-service-item:has(input:checked) .pb-tag--price {
        background: var(--tn-accent);
        border-color: var(--tn-accent);
        color: #FFFFFF;
    }
    & .public-booking-shell .pb-service-item:has(:focus-visible) {
        box-shadow: 0 0 0 3px var(--tn-accent-ring);
    }
    & .public-booking-shell .mud-input.mud-input-outlined { background: var(--zd-surface); }
    & .public-booking-shell .mud-input-outlined-border { border-color: var(--zd-border-strong) !important; border-radius: var(--zd-radius-sm) !important; }
    & .public-booking-shell .mud-input.mud-input-outlined.mud-focused .mud-input-outlined-border {
        border-color: var(--tn-accent) !important;
        box-shadow: 0 0 0 3px var(--tn-accent-ring);
    }
    & .public-booking-shell .mud-input-label-outlined { background-color: var(--zd-surface); }
}

/* ═════════════ 11. MOVIMENTO ═════════════
   Ingresso della pagina: i blocchi principali salgono di pochi pixel e appaiono,
   a scaglioni di 40ms. Le finestre si aprono con una scala leggera. Tutto spento
   con prefers-reduced-motion (anche le durate dei token vanno a 0). */
@keyframes tn-rise {
    from { opacity: 0; transform: translateY(6px); }
    to   { opacity: 1; transform: none; }
}
@keyframes tn-pop {
    from { opacity: 0; transform: translateY(8px) scale(.98); }
    to   { opacity: 1; transform: none; }
}
@media (prefers-reduced-motion: no-preference) {
    html:not([data-vertical="superadmin"]):not([data-vertical="platform"]) {
        & .mud-main-content :is(.mud-paper, .mud-card, .mud-table, .mud-data-grid, .page-header):not(.fzb *) {
            animation: none;
        }
        & .mud-main-content .zed-after-title > :not(.layout-banner):not(.fzb) {
            animation: tn-rise var(--zd-dur-slow) var(--zd-ease) both;
        }
        & .mud-main-content .zed-after-title > :nth-child(2) { animation-delay: 30ms; }
        & .mud-main-content .zed-after-title > :nth-child(3) { animation-delay: 60ms; }
        & .mud-main-content .zed-after-title > :nth-child(4) { animation-delay: 90ms; }
        & .mud-main-content .zed-after-title > :nth-child(n+5) { animation-delay: 120ms; }
        /* Griglie di statistiche e card: scaglioni brevi da sinistra a destra. */
        & .mud-main-content .mud-grid > .mud-grid-item:not(.fzb *) {
            animation: tn-rise var(--zd-dur-slow) var(--zd-ease) both;
        }
        & .mud-main-content .mud-grid > .mud-grid-item:nth-child(2) { animation-delay: 40ms; }
        & .mud-main-content .mud-grid > .mud-grid-item:nth-child(3) { animation-delay: 80ms; }
        & .mud-main-content .mud-grid > .mud-grid-item:nth-child(4) { animation-delay: 120ms; }
        & .mud-main-content .mud-grid > .mud-grid-item:nth-child(n+5) { animation-delay: 160ms; }
        & .mud-dialog:not(.fzb *) { animation: tn-pop var(--zd-dur-slow) var(--zd-ease) both !important; }
        & .public-booking-shell .pb-tabs .mud-tabs-panels > * { animation: tn-rise var(--zd-dur-slow) var(--zd-ease) both; }
    }
}
@media (prefers-reduced-motion: reduce) {
    html:not([data-vertical="superadmin"]):not([data-vertical="platform"]) {
        & .mud-main-content *, & .mud-dialog, & .public-booking-shell * {
            animation: none !important;
            transition: none !important;
        }
    }
}

/* ═════════════ 12. TELEFONO E TOUCH ═════════════ */
@media (max-width: 37.5em) {
    html:not([data-vertical="superadmin"]):not([data-vertical="platform"]) {
        /* Intestazione: titolo su tutta la riga, poi ricerca e pulsanti che vanno a capo. */
        & .mud-main-content .page-header { padding-bottom: var(--zd-space-4) !important; }
        & .mud-main-content .page-header > .d-flex.flex-row > div.flex-grow-1:not(:has(*)) { display: none; }
        & .mud-main-content .page-header .mud-input-control :is(.mud-input, [style*="width"]) { max-width: 100% !important; }
        & .mud-main-content .page-header > .d-flex.flex-row > div:not([class]) { flex: 1 1 calc(100% - 56px); }
        & .mud-main-content .page-header > .d-flex.flex-row > :is(.mud-input-control, .mud-select, .mud-autocomplete, .mud-picker) {
            flex: 1 1 100%;
            max-width: 100% !important;
            min-width: 0 !important;
        }
        & .mud-main-content .page-header > .d-flex.flex-row > .mud-button-root:not(.mud-icon-button) { flex: 1 1 auto; }
        & .mud-main-content .page-header .mud-button-root:not(.mud-icon-button) .mud-button-label { white-space: nowrap; }

        /* Niente larghezze minime fisse nei campi: su 360px facevano scorrere la pagina. */
        & .mud-main-content .mud-input-control:not(.fzb *) { min-width: 0 !important; max-width: 100% !important; }
        & .mud-main-content .mud-card-content:not(.fzb *),
        & .mud-main-content .mud-card-header:not(.fzb *) { padding: var(--zd-space-4); }

        /* Dialog: testata più bassa, campi affiancati che vanno a capo, pulsanti alti 44px. */
        & .mud-dialog .mud-dialog-title { min-height: 54px; padding: var(--zd-space-3) 52px var(--zd-space-3) var(--zd-space-4) !important; }
        & .mud-dialog .mud-dialog-content { padding: var(--zd-space-4) !important; }
        & .mud-dialog .mud-dialog-actions { padding: var(--zd-space-3) var(--zd-space-4) !important; flex-wrap: wrap; }
        & .mud-dialog .mud-dialog-content .d-flex.flex-row:not(.mud-input-control *) { flex-wrap: wrap; }
        & .mud-dialog .mud-dialog-content .d-flex.flex-row > .mud-input-control { flex: 1 1 100%; }
        & .mud-dialog .mud-dialog-content :is(.mud-input-control, .mud-stack, .d-flex) { min-width: 0 !important; }
        /* Larghezze fisse scritte inline nei dialog dei verticali (min-width:420px e simili):
           su telefono tagliavano campi e pulsanti a destra. */
        & .mud-dialog .mud-dialog-content [style*="width"] { min-width: 0 !important; max-width: 100% !important; }
        & .mud-dialog .mud-dialog-actions .mud-button-root { min-height: 44px; }

        /* Tabelle impilate di MudTable (righe come schede): ogni riga è una card. */
        & .mud-main-content .mud-xs-table :is(.mud-table-body, tbody) > .mud-table-row {
            display: block;
            margin: var(--zd-space-2);
            border: 1px solid var(--zd-border);
            border-radius: var(--zd-radius-sm);
            background: var(--zd-surface);
            box-shadow: none;
        }
        & .mud-main-content .mud-xs-table :is(.mud-table-body, tbody) > .mud-table-row > .mud-table-cell {
            border-bottom: 1px solid var(--zd-border);
        }
        & .mud-main-content .mud-xs-table :is(.mud-table-body, tbody) > .mud-table-row > .mud-table-cell:last-child { border-bottom: 0; }
        & .mud-main-content .mud-xs-table :is(.mud-table-body, tbody) > .mud-table-row > .mud-table-cell::before {
            color: var(--zd-text-3);
            font-size: .72rem;
            font-weight: 600;
            text-transform: uppercase;
            letter-spacing: .04em;
        }
        & .mud-main-content .mud-xs-table .mud-table-row:hover .mud-table-cell:first-child { box-shadow: none; }

        /* Pagine pubbliche: Giorno/Orario e Nome/Cognome in colonna. La regola nella pagina
           perdeva contro .flex-row di MudBlazor (flex-direction: row !important). */
        & .public-booking-shell :is(.pb-when-row, .pb-name-row) { flex-direction: column !important; align-items: stretch !important; }
        & .public-booking-shell :is(.pb-when-row, .pb-name-row) > * { width: 100%; }
        /* Pagine pubbliche: card a filo con meno margine. */
        & .public-booking-shell :is(.mud-paper, .mud-card):not(.mud-paper *):not(.mud-tabs-tabbar) { border-radius: var(--zd-radius) !important; }
    }
}
@media (pointer: coarse) {
    html:not([data-vertical="superadmin"]):not([data-vertical="platform"]) {
        /* Bersagli di tocco ≥ 44px. Interruttori, spunte e scelte usano internamente
           .mud-icon-button: ingrandirli staccava il pallino dello switch dalla barra. */
        & .mud-main-content .mud-button-root:not(.mud-icon-button):not(.fzb *):not(:is(.mud-switch, .mud-checkbox, .mud-radio, .mud-input-adornment, .mud-table-pagination) *) { min-height: 44px; }
        & .mud-main-content .mud-icon-button:not(.fzb *):not(:is(.mud-switch, .mud-checkbox, .mud-radio, .mud-input-adornment, .mud-chip, .mud-table-pagination) *) { min-width: 44px; min-height: 44px; }
    }
}

/* ═════════════ Andamento incassi (RevenueTrend, dashboard dei verticali, 2026-10-09) ═════════════
   Barre in CSS: accento del verticale per oggi, una sua tinta tenue per gli altri giorni. */
.revenue-trend .mud-card-content { padding: 18px 20px 14px; }
.revenue-trend__head {
    display: flex;
    align-items: flex-start;
    justify-content: space-between;
    gap: 12px;
    flex-wrap: wrap;
}
.revenue-trend__label {
    margin: 0;
    font-size: 0.72rem;
    font-weight: 600;
    letter-spacing: .06em;
    text-transform: uppercase;
    color: var(--zd-text-3);
}
.revenue-trend__total {
    margin: 2px 0 0;
    font-size: 1.6rem;
    font-weight: 700;
    letter-spacing: -0.02em;
    color: var(--zd-text);
    font-variant-numeric: tabular-nums;
}
.revenue-trend__delta {
    display: inline-flex;
    align-items: center;
    gap: 4px;
    padding: 4px 10px;
    border-radius: var(--zd-radius-pill);
    font-size: var(--zd-font-size-sm);
    font-weight: 600;
    white-space: nowrap;
}
.revenue-trend__delta--up { background: var(--zd-success-soft); color: var(--zd-success-ink); }
.revenue-trend__delta--down { background: var(--zd-danger-soft); color: var(--zd-danger-ink); }
.revenue-trend__delta--flat { background: var(--zd-surface-hover); color: var(--zd-text-2); }
.revenue-trend__bars {
    display: grid;
    grid-template-columns: repeat(7, minmax(0, 1fr));
    gap: clamp(6px, 1.5vw, 14px);
    margin-top: 16px;
    height: 132px;
}
.revenue-trend__col { display: flex; flex-direction: column; align-items: stretch; gap: 6px; min-width: 0; }
.revenue-trend__track {
    flex: 1 1 auto;
    display: flex;
    align-items: flex-end;
    border-radius: var(--zd-radius-sm);
    background: var(--zd-surface-2);
}
.revenue-trend__bar {
    width: 100%;
    border-radius: var(--zd-radius-sm);
    background: color-mix(in srgb, var(--mud-palette-primary, var(--zd-brand)) 35%, var(--zd-surface));
    transition: height var(--zd-dur-slow) var(--zd-ease);
}
.revenue-trend__col--today .revenue-trend__bar { background: var(--mud-palette-primary, var(--zd-brand)); }
.revenue-trend__day {
    text-align: center;
    font-size: 0.72rem;
    color: var(--zd-text-3);
    text-transform: capitalize;
}
.revenue-trend__col--today .revenue-trend__day { color: var(--zd-text); font-weight: 600; text-transform: none; }

/* Schede statistiche due per riga su telefono (2026-10-09): valore e margini più compatti,
   così anche un importo come "€12.345,00" sta nella mezza larghezza. */
@media (max-width: 599.98px) {
    html:not([data-vertical="superadmin"]):not([data-vertical="platform"]) .mud-main-content .stat-card :is(.mud-card-content, .mud-paper-content) {
        padding: var(--zd-space-3) var(--zd-space-4);
    }
    html:not([data-vertical="superadmin"]):not([data-vertical="platform"]) .mud-main-content .stat-card :is(.mud-typography-h4, .mud-typography-h5) {
        font-size: 1.35rem !important;
        white-space: nowrap;
        overflow: hidden;
        text-overflow: ellipsis;
    }
    html:not([data-vertical="superadmin"]):not([data-vertical="platform"]) .mud-main-content .stat-card .mud-typography-overline {
        font-size: 0.62rem;
        line-height: 1.3;
    }
}

/* ==== css/public-booking.css ==== */
/* ============================================================================
   Pagine pubbliche di prenotazione (/{verticale}/p/{slug}) — struttura comune
   (2026-10-09). Prima questo blocco era copiato in un <style> dentro la pagina di
   ognuno dei 15 verticali, con piccole differenze accumulate nel tempo (in 4 mancava
   la regola per desktop, e la mascotte finiva sotto il titolo). Ora sta in un solo
   posto. Colori e finiture del design system: tenant.css, sezione 10.
   ============================================================================ */
.public-booking-shell {
    min-height: 100dvh;
    background: var(--canvas, #F6F4F1);
    overflow-x: clip; /* nessuno scroll orizzontale di pagina, mai */
}

/* Stati di caricamento / errore centrati e leggibili */
.public-booking-shell .pb-status {
    max-width: 40rem;
    margin-inline: auto;
    padding: 1rem;
}

/* ---------------- Hero a piena larghezza ---------------- */

.public-booking-shell .pb-hero {
    position: relative;
    color: var(--text-on-ink, #F2EAE0);
    background:
        radial-gradient(56rem 26rem at 88% -30%, var(--accent-tint-strong, rgba(168,117,69,.18)) 0%, transparent 62%),
        linear-gradient(150deg, var(--ink, #2C2521) 0%, color-mix(in srgb, var(--ink, #2C2521) 76%, var(--accent, #A87545)) 100%);
    padding: clamp(1.75rem, 5vw, 3.25rem) clamp(1rem, 4vw, 2rem) clamp(2rem, 5vw, 3.5rem);
}

.public-booking-shell .pb-hero__inner {
    max-width: 64rem;
    margin-inline: auto;
    display: flex;
    flex-direction: column;   /* mobile: brand sopra, mascotte sotto */
    align-items: flex-start;
    gap: 1.5rem;
}

.public-booking-shell .pb-hero__eyebrow {
    margin: 0 0 0.375rem;
    font-size: 0.75rem;
    font-weight: 700;
    letter-spacing: 0.14em;
    text-transform: uppercase;
    color: var(--accent-light, #C99670);
}

.public-booking-shell .pb-hero__name {
    margin: 0;
    font-size: clamp(1.75rem, 1.1rem + 3.2vw, 2.75rem);
    font-weight: 800;
    line-height: 1.12;
    letter-spacing: -0.015em;
}

.public-booking-shell .pb-hero__address {
    display: flex;
    align-items: center;
    gap: 0.375rem;
    margin: 0.625rem 0 0;
    font-size: 0.95rem;
    color: color-mix(in srgb, var(--text-on-ink, #F2EAE0) 78%, transparent);
}

.public-booking-shell .pb-hero__address .mud-icon-root {
    flex: none;
    color: var(--accent-light, #C99670);
}

.public-booking-shell .pb-hero__chips {
    display: flex;
    flex-wrap: wrap;
    gap: 0.5rem;
    margin-top: 1rem;
}

.public-booking-shell .pb-chip {
    display: inline-flex;
    align-items: center;
    padding: 0.3rem 0.8rem;
    border-radius: 999px;
    font-size: 0.8rem;
    font-weight: 600;
    background: rgba(255, 255, 255, 0.10);
    border: 1px solid color-mix(in srgb, var(--text-on-ink, #F2EAE0) 26%, transparent);
    color: var(--text-on-ink, #F2EAE0);
    backdrop-filter: blur(4px);
    -webkit-backdrop-filter: blur(4px);
}

/* Mascotte: figura ridotta fluidamente sotto tablet, fumetto leggibile sul fondo scuro */
.public-booking-shell .pb-hero__mascot { align-self: center; }

.public-booking-shell .pb-hero__mascot .zcd-mascot__figure {
    width: clamp(88px, 20vw, 128px);
}

.public-booking-shell .pb-hero__mascot .zcd-mascot__bubble {
    border-color: color-mix(in srgb, var(--accent-light, #C99670) 55%, transparent);
}

/* ---------------- Tab bar sticky a piena larghezza ---------------- */

.public-booking-shell .pb-tabs .mud-tabs-tabbar {
    position: sticky;
    top: 0;
    z-index: 20;
    background: color-mix(in srgb, var(--canvas, #F6F4F1) 86%, transparent);
    backdrop-filter: blur(10px);
    -webkit-backdrop-filter: blur(10px);
    border-bottom: 1px solid var(--border, #E3DFD8);
    box-shadow: var(--shadow-xs, 0 1px 2px rgba(20, 16, 12, 0.05));
}

/* Riga tab centrata sulla stessa gabbia del contenuto */
.public-booking-shell .pb-tabs .mud-tabs-tabbar-content {
    max-width: 64rem;
    margin-inline: auto;
}

.public-booking-shell .pb-tabs .mud-tab {
    text-transform: none;
    font-weight: 600;
    font-size: 0.92rem;
    min-height: 48px;           /* tap target >= 44px */
    min-width: auto;
    padding: 0.7rem 1rem;
    color: var(--text-muted, #6B5F50);
    transition: color var(--ease, 0.18s cubic-bezier(0.4, 0, 0.2, 1)),
                background-color var(--ease, 0.18s cubic-bezier(0.4, 0, 0.2, 1));
}

.public-booking-shell .pb-tabs .mud-tab:hover {
    color: var(--text, #2C2521);
    background: var(--accent-tint, rgba(168, 117, 69, 0.09));
}

.public-booking-shell .pb-tabs .mud-tab.mud-tab-active {
    color: var(--accent-dark, #8B5D38);
}

.public-booking-shell .pb-tabs .mud-tab:focus-visible {
    outline: 2px solid var(--accent-dark, #8B5D38);
    outline-offset: -2px;
}

.public-booking-shell .pb-tabs .mud-tab-slider {
    height: 3px;
    border-radius: 3px 3px 0 0;
    background: var(--accent, #A87545);
}

/* Frecce di scroll delle tab (MudBlazor le mostra quando le 8 tab non entrano) */
.public-booking-shell .pb-tabs .mud-tabs-scroll-button .mud-icon-button {
    color: var(--text-muted, #6B5F50);
}

/* ---------------- Area contenuto dei pannelli ---------------- */

.public-booking-shell .pb-tabs .mud-tabs-panels {
    max-width: 64rem;
    margin-inline: auto;
    width: 100%;
    padding: clamp(0.75rem, 2.5vw, 1.75rem) clamp(0.75rem, 3vw, 1.5rem) 3.5rem;
    background: transparent;
}

/* Colonna del form di prenotazione: più ampia e ariosa che negli altri tab,
   resta comunque leggibile (non full-bleed) su schermi molto larghi. */
.public-booking-shell .pb-narrow {
    max-width: 60rem;
    margin-inline: auto;
}

.public-booking-shell .pb-form-card {
    border-radius: var(--r-lg, 18px);
    padding: clamp(1.25rem, 3vw, 2rem) !important;
}

/* Servizi come griglia di "card" selezionabili invece di una lista lineare:
   usa meglio la larghezza extra e resta a colonna singola su mobile. */
.public-booking-shell .pb-services-grid {
    display: grid;
    grid-template-columns: 1fr;
    gap: 0.6rem;
}

@media (min-width: 40em) {
    .public-booking-shell .pb-services-grid {
        grid-template-columns: 1fr 1fr;
    }
}



/* Giorno/Orario e Nome/Cognome: in colonna sugli schermi stretti
   (MudStack Row li forza affiancati e sotto i 400px vanno in overflow) */
@media (max-width: 30em) {
    .public-booking-shell .pb-when-row,
    .public-booking-shell .pb-name-row {
        flex-direction: column;
    }
}

/* ---------------- Tablet e desktop (mobile-first: min-width) ---------------- */

@media (min-width: 48em) {
    .public-booking-shell .pb-hero__inner {
        flex-direction: row;
        align-items: center;
        justify-content: space-between;
        gap: 2.5rem;
    }

    .public-booking-shell .pb-hero__mascot { align-self: auto; }
}

/* Variante compatta (Ristorante, Palestra, Campi sportivi): la testata sta nella colonna
   stretta della pagina invece che a piena larghezza, quindi è una card. */
.public-booking-shell .pb-hero--compact {
    margin: 1rem 0 1rem;
    padding: 1.25rem 1.25rem 1.4rem;
    border-radius: var(--zd-radius-lg, 16px);
}

/* ==== css/budget/budget.css ==== */
/* ============================================================================
   Budget — stile del modulo, chiuso sotto .fzb (riscritto il 2026-10-09)

   Un solo strato sui token del design system (design-tokens.css, --zd-*): vale così
   com'è sia nel tema chiaro sia in quello scuro, nelle aree dei clienti (/budget) e
   nel pannello (/superadmin/budget). Prima c'erano tre strati sovrapposti (tema scuro
   "spatial OS" importato, poi un tema chiaro, poi gli adattamenti ai token) che si
   annullavano a vicenda regola per regola.

   - Superfici, testi, bordi, ombre e raggi: dai token, nessun valore scritto a mano.
   - Pulsanti principali e selezioni: colore primario della pagina (--mud-palette-primary:
     il settore nei verticali, l'indaco nel pannello).
   - --accent / --accent-2 (inline su FinanceShell e ModuleShell) restano solo per
     grafici, anelli e barre di avanzamento.
   - Entrate/uscite: --income / --expense sui toni "ink" degli stati (4.5:1 su card).
   ============================================================================ */

.fzb {
    /* Colore primario della pagina e sue derivate */
    --fzb-primary: var(--mud-palette-primary, var(--zd-brand));
    --fzb-primary-ink: color-mix(in srgb, var(--fzb-primary) 72%, var(--zd-ink-mix));
    --fzb-primary-soft: color-mix(in srgb, var(--fzb-primary) 10%, var(--zd-surface));

    /* Nomi storici del modulo, ricondotti ai token */
    --bg-0: var(--zd-canvas);
    --surface: var(--zd-surface);
    --surface-1: var(--zd-surface-2);
    --surface-2: var(--zd-surface-2);
    --surface-3: var(--zd-surface-hover);
    --surface-solid: var(--zd-surface);
    --border: var(--zd-border);
    --border-strong: var(--zd-border-strong);
    --text: var(--zd-text);
    --text-2: var(--zd-text-2);
    --text-3: var(--zd-text-3);
    --accent: var(--zd-brand);
    --accent-2: var(--zd-info);
    --accent-soft: color-mix(in srgb, var(--accent) 16%, transparent);
    --accent-ink: var(--fzb-primary-ink);
    --accent-2-ink: var(--fzb-primary-ink);
    --success: var(--zd-success-ink);
    --danger: var(--zd-danger-ink);
    --warning: var(--zd-warning-ink);
    --info: var(--zd-info-ink);
    --income: var(--zd-success-ink);
    --expense: var(--zd-danger-ink);
    --radius-s: var(--zd-radius-sm);
    --radius: var(--zd-radius);
    --radius-l: var(--zd-radius-lg);
    --radius-xl: var(--zd-radius-lg);
    --shadow-1: var(--zd-shadow-1);
    --shadow-2: var(--zd-shadow-2);
    --shadow-glow: var(--zd-shadow-2);
    --ease-spring: cubic-bezier(.34, 1.56, .64, 1);
    --ease-out: var(--zd-ease);
    /* "Twemoji Country Flags" copre solo i caratteri delle bandiere (unicode-range): Windows non ha le emoji delle bandiere. */
    --font: "Twemoji Country Flags", var(--zd-font);
    --font-display: "Twemoji Country Flags", var(--zd-font);
    --safe-top: env(safe-area-inset-top, 0px);
    --safe-bottom: env(safe-area-inset-bottom, 0px);
    /* barra delle sezioni sticky sotto l'AppBar; le intestazioni dei giorni scorrono sotto di lei */
    --fzb-sticky-top: calc(var(--zcd-appbar-h, 64px) + 62px);

    /* Il modulo non disegna un pannello proprio: prende lo sfondo del layout e i suoi margini. */
    position: relative;
    color: var(--text);
    font-family: var(--font);
    font-size: var(--zd-font-size);
    line-height: 1.5;
    -webkit-font-smoothing: antialiased;
    background: transparent;
}
.fzb *, .fzb *::before, .fzb *::after { box-sizing: border-box; }
.fzb h1, .fzb h2, .fzb h3, .fzb h4 { font-family: var(--font-display); letter-spacing: -0.02em; line-height: 1.15; margin: 0; color: inherit; }
.fzb a { color: inherit; text-decoration: none; }
.fzb button { font: inherit; color: inherit; }
.fzb img { max-width: 100%; display: block; }
.fzb ::selection { background: color-mix(in srgb, var(--fzb-primary) 30%, transparent); }

/* ---------- Superfici ---------- */
.fzb .glass,
.fzb .card {
    background: var(--zd-surface);
    border: 1px solid var(--zd-border);
    border-radius: var(--zd-radius);
    box-shadow: var(--zd-shadow-1);
}
.fzb .card {
    position: relative;
    padding: 20px;
    transition: box-shadow var(--zd-dur) var(--zd-ease), border-color var(--zd-dur) ease;
}
.fzb .card.accent { background: var(--zd-surface); }
.fzb a.card:hover, .fzb .card.clickable:hover, .fzb button.card:hover { border-color: var(--zd-border-strong); box-shadow: var(--zd-shadow-2); }
.fzb .card-title { font-family: var(--font-display); font-size: 1.05rem; font-weight: 600; margin: 0 0 12px; display: flex; align-items: center; gap: 8px; }
.fzb .card-sub { color: var(--text-3); font-size: .82rem; }

/* Effetti un tempo dinamici (tilt, comparsa allo scroll, parallasse): gli attributi restano nel markup ma non fanno nulla. */
.fzb [data-tilt]::after { display: none; }
.fzb [data-reveal] { opacity: 1; }
.fzb .depth-1, .fzb .depth-2, .fzb .depth-3 { transform: none; }

/* ---------- Tipografia & utility ---------- */
.fzb .muted { color: var(--text-2); }
.fzb .dim { color: var(--text-3); }
.fzb .small { font-size: .82rem; }
.fzb .tiny { font-size: .72rem; }
.fzb .mono { font-variant-numeric: tabular-nums; }
.fzb .num { font-family: var(--font-display); font-variant-numeric: tabular-nums; letter-spacing: -0.02em; }
.fzb .pos { color: var(--income); }
.fzb .neg { color: var(--expense); }
.fzb .grad-text { color: var(--zd-text); }
.fzb .row { display: flex; align-items: center; gap: 12px; }
.fzb .row.wrap { flex-wrap: wrap; }
.fzb .row.between { justify-content: space-between; }
.fzb .stack { display: flex; flex-direction: column; gap: 12px; }
.fzb .stack.lg { gap: 20px; }
.fzb .grow { flex: 1 1 auto; min-width: 0; }
.fzb .grid { display: grid; gap: 16px; }
.fzb .grid.cols-2 { grid-template-columns: repeat(2, minmax(0, 1fr)); }
.fzb .grid.cols-3 { grid-template-columns: repeat(3, minmax(0, 1fr)); }
.fzb .grid.cols-4 { grid-template-columns: repeat(4, minmax(0, 1fr)); }
.fzb .grid.auto { grid-template-columns: repeat(auto-fill, minmax(240px, 1fr)); }
@media (max-width: 900px) { .fzb .grid.cols-3, .fzb .grid.cols-4 { grid-template-columns: repeat(2, minmax(0, 1fr)); } }
@media (max-width: 560px) { .fzb .grid.cols-2, .fzb .grid.cols-3 { grid-template-columns: minmax(0, 1fr); } .fzb .grid.cols-4 { grid-template-columns: repeat(2, minmax(0, 1fr)); } }
.fzb .truncate { overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
@media (max-width: 700px) { .fzb .hide-mobile { display: none !important; } }
.fzb .only-mobile { display: none !important; }
@media (max-width: 700px) { .fzb .only-mobile { display: initial !important; } }
.fzb .scroll-x { display: flex; gap: 10px; overflow-x: auto; scrollbar-width: none; padding-bottom: 4px; scroll-snap-type: x mandatory; }
.fzb .scroll-x > * { scroll-snap-align: start; flex: 0 0 auto; }
.fzb .scroll-x::-webkit-scrollbar { display: none; }
.fzb .divider { height: 1px; background: var(--border); margin: 12px 0; border: 0; }
.fzb .sr-only { position: absolute; width: 1px; height: 1px; overflow: hidden; clip: rect(0 0 0 0); white-space: nowrap; }

/* ---------- Pulsanti ---------- */
.fzb .btn {
    position: relative; overflow: hidden; isolation: isolate;
    display: inline-flex; align-items: center; justify-content: center; gap: 8px;
    height: 42px; padding: 0 18px; border-radius: var(--zd-radius-sm); border: 1px solid var(--border);
    background: var(--surface-2); color: var(--text); font-weight: 600; font-size: .92rem; cursor: pointer;
    transition: transform .1s ease-out, background-color var(--zd-dur-fast), border-color var(--zd-dur-fast);
    user-select: none; white-space: nowrap;
}
.fzb .btn:hover { background: var(--surface-3); border-color: var(--border-strong); }
.fzb .btn:active { transform: scale(.96); }
.fzb .btn:focus-visible, .fzb .input:focus-visible, .fzb .chip:focus-visible { outline: 2px solid var(--fzb-primary); outline-offset: 2px; }
.fzb .btn[disabled] { opacity: .45; pointer-events: none; }
.fzb .btn-ghost { background: transparent; border-color: transparent; }
.fzb .btn-ghost:hover { background: var(--surface-2); }
.fzb .btn-danger { color: var(--zd-danger-ink); background: var(--zd-danger-soft); border-color: color-mix(in srgb, var(--zd-danger) 35%, transparent); }
.fzb .btn-success { color: var(--zd-success-ink); background: var(--zd-success-soft); border-color: color-mix(in srgb, var(--zd-success) 35%, transparent); }
.fzb .btn-sm { height: 34px; padding: 0 12px; font-size: .84rem; }
.fzb .btn-lg { height: 52px; padding: 0 24px; font-size: 1rem; }
.fzb .btn-icon { width: 42px; padding: 0; }
.fzb .btn-icon.btn-sm { width: 34px; }
.fzb .btn-block { width: 100%; }

/* Pulsanti principali, "aggiungi" e pulsante flottante: pieni nel colore primario. */
.fzb .btn-primary,
.fzb .fab,
.fzb .module-top .btn.btn-icon.btn-add:not(.home-btn),
.fzb .btn.btn-add {
    color: #FFFFFF;
    background: var(--fzb-primary);
    border-color: transparent;
    box-shadow: var(--zd-shadow-1);
}
.fzb .btn-primary:hover,
.fzb .fab:hover,
.fzb .module-top .btn.btn-icon.btn-add:not(.home-btn):hover,
.fzb .btn.btn-add:hover {
    background: color-mix(in srgb, var(--fzb-primary) 88%, #000000);
    box-shadow: var(--zd-shadow-2);
}
.fzb .module-top .btn.btn-icon.btn-add:not(.home-btn),
.fzb .btn.btn-add { width: 44px; height: 44px; padding: 0; border: 0; }
.fzb .btn.btn-add:active { transform: scale(.92); }
.fzb .btn.btn-add svg { width: 22px; height: 22px; }

.fzb .fab {
    position: fixed; right: max(20px, env(safe-area-inset-right)); bottom: calc(24px + var(--safe-bottom)); z-index: 40;
    width: 56px; height: 56px; border-radius: var(--zd-radius-lg); border: 0; cursor: pointer; font-size: 26px;
    display: grid; place-items: center; transition: transform .12s ease-out;
}
.fzb .fab:active { transform: scale(.94); }

/* ---------- Campi ---------- */
.fzb .field { display: flex; flex-direction: column; gap: 6px; min-width: 0; }
.fzb .field > label, .fzb .label { font-size: .75rem; font-weight: 600; color: var(--text-2); text-transform: uppercase; letter-spacing: .06em; }
.fzb .input, .fzb .select, .fzb .textarea {
    width: 100%; height: 46px; padding: 0 14px; border-radius: var(--zd-radius-sm);
    background-color: var(--zd-surface); border: 1px solid var(--zd-border-strong); color: var(--text); font: inherit; font-size: 16px;
    transition: border-color .2s, box-shadow .2s; appearance: none; -webkit-appearance: none;
}
.fzb .textarea { height: auto; min-height: 90px; padding: 12px 14px; resize: vertical; }
.fzb .select { background-image: linear-gradient(45deg, transparent 50%, var(--text-2) 50%), linear-gradient(135deg, var(--text-2) 50%, transparent 50%); background-position: calc(100% - 20px) 50%, calc(100% - 15px) 50%; background-size: 5px 5px; background-repeat: no-repeat; padding-right: 36px; }
.fzb .select option { background: var(--surface-solid); color: var(--text); }
.fzb .input:focus, .fzb .select:focus, .fzb .textarea:focus {
    outline: none;
    border-color: var(--fzb-primary);
    box-shadow: 0 0 0 3px color-mix(in srgb, var(--fzb-primary) 22%, transparent);
}
.fzb .input::placeholder, .fzb .textarea::placeholder { color: var(--text-3); }
.fzb .input-lg { height: 58px; font-size: 1.1rem; }
.fzb .check { display: inline-flex; align-items: center; gap: 10px; cursor: pointer; user-select: none; }
.fzb .check input { width: 22px; height: 22px; accent-color: var(--fzb-primary); }

/* Interruttore */
.fzb .switch { position: relative; width: 48px; height: 28px; flex: none; }
.fzb .switch input { opacity: 0; width: 0; height: 0; position: absolute; }
.fzb .switch span { position: absolute; inset: 0; border-radius: 99px; background: var(--zd-border-strong); transition: .3s; cursor: pointer; }
.fzb .switch span::before { content: ""; position: absolute; width: 22px; height: 22px; left: 3px; top: 3px; border-radius: 50%; background: #FFFFFF; transition: .35s var(--ease-spring); box-shadow: var(--zd-shadow-1); }
.fzb .switch input:checked + span { background: var(--fzb-primary); }
.fzb .switch input:checked + span::before { transform: translateX(20px); }

/* Controllo segmentato */
.fzb .seg { display: inline-flex; padding: 4px; gap: 2px; border-radius: var(--zd-radius-sm); background: var(--zd-surface-2); border: 1px solid var(--zd-border); position: relative; }
.fzb .seg button, .fzb .seg a { border: 0; background: transparent; padding: 7px 14px; border-radius: 6px; font-weight: 600; font-size: .86rem; color: var(--text-2); cursor: pointer; transition: color .2s, background-color .2s; white-space: nowrap; }
.fzb .seg button:hover, .fzb .seg a:hover { color: var(--text); }
.fzb .seg .active { background: var(--zd-surface); color: var(--text); box-shadow: var(--zd-shadow-1), inset 0 0 0 1px var(--zd-border-strong); }
.fzb .seg.full { display: flex; }
.fzb .seg.full > * { flex: 1; text-align: center; }

/* ---------- Chip e badge ---------- */
.fzb .chip { display: inline-flex; align-items: center; gap: 6px; height: 34px; padding: 0 14px; border-radius: 99px; border: 1px solid var(--zd-border-strong); background: var(--zd-surface); color: var(--text-2); font-size: .85rem; font-weight: 500; cursor: pointer; transition: color .2s, border-color .2s, background-color .2s; white-space: nowrap; }
.fzb .chip:hover { color: var(--text); border-color: var(--text-3); }
.fzb .chip.active { color: var(--fzb-primary-ink); background: var(--fzb-primary-soft); border-color: color-mix(in srgb, var(--fzb-primary) 45%, transparent); }
.fzb .badge { display: inline-flex; align-items: center; gap: 4px; padding: 2px 9px; border-radius: 99px; font-size: .72rem; font-weight: 700; background: var(--surface-3); color: var(--text-2); letter-spacing: .02em; }
.fzb .badge.success { background: var(--zd-success-soft); color: var(--zd-success-ink); }
.fzb .badge.danger { background: var(--zd-danger-soft); color: var(--zd-danger-ink); }
.fzb .badge.warning { background: var(--zd-warning-soft); color: var(--zd-warning-ink); }
.fzb .badge.info { background: var(--zd-info-soft); color: var(--zd-info-ink); }
.fzb .badge.accent { background: var(--fzb-primary-soft); color: var(--fzb-primary-ink); }

/* ---------- Barre di avanzamento ---------- */
.fzb .progress { height: 10px; border-radius: 99px; background: var(--zd-surface-hover); overflow: hidden; position: relative; }
.fzb .progress > span { display: block; height: 100%; border-radius: inherit; width: var(--v, 0%); background: linear-gradient(90deg, var(--accent), var(--accent-2)); transition: width .25s ease-out; position: relative; }
.fzb .progress.danger > span { background: var(--zd-danger); }
.fzb .progress.warning > span { background: var(--zd-warning); }
.fzb .progress.success > span { background: var(--zd-success); }

/* ---------- Liste ---------- */
.fzb .list { display: flex; flex-direction: column; gap: 8px; }
.fzb .list-item { display: flex; align-items: center; gap: 14px; padding: 12px 14px; border-radius: var(--zd-radius-sm); background: var(--zd-surface); border: 1px solid var(--zd-border); transition: background-color .12s, border-color .12s; cursor: pointer; }
.fzb .list-item:hover { background: var(--zd-surface-hover); border-color: var(--zd-border-strong); }
.fzb .avatar { width: 44px; height: 44px; border-radius: var(--zd-radius); display: grid; place-items: center; font-size: 22px; flex: none; background: var(--surface-2); box-shadow: inset 0 0 0 1px var(--border); }
.fzb .avatar.sm { width: 34px; height: 34px; border-radius: var(--zd-radius-sm); font-size: 17px; }
.fzb .avatar.lg { width: 58px; height: 58px; border-radius: var(--zd-radius-lg); font-size: 30px; }

.fzb .kpi { display: flex; flex-direction: column; gap: 4px; }
.fzb .kpi .kpi-label { font-size: .75rem; color: var(--text-2); text-transform: uppercase; letter-spacing: .08em; font-weight: 600; }
.fzb .kpi .kpi-value { font-family: var(--font-display); font-size: 1.9rem; font-weight: 700; letter-spacing: -0.03em; font-variant-numeric: tabular-nums; }
.fzb .kpi .kpi-delta { font-size: .8rem; font-weight: 600; }

.fzb .empty { text-align: center; padding: 48px 20px; color: var(--text-2); }
.fzb .empty .empty-icon { font-size: 56px; display: inline-block; }

.fzb .skeleton { background: linear-gradient(90deg, var(--surface-2) 25%, var(--surface-3) 50%, var(--surface-2) 75%); background-size: 200% 100%; animation: sk 1.4s infinite; border-radius: var(--zd-radius-sm); }
@keyframes sk { from { background-position: 200% 0; } to { background-position: -200% 0; } }

/* ---------- Struttura del modulo ---------- */
/* Intestazione come quella delle altre pagine: il pulsante "+" sta sulla riga del titolo. */
.fzb .module {
    position: relative;
    max-width: 1280px;
    margin: 0 auto;
    padding: 0 0 24px;
    display: grid;
    grid-template-columns: minmax(0, 1fr) auto;
    align-items: center;
    column-gap: var(--zd-space-3);
}
.fzb .module > * { grid-column: 1 / -1; min-width: 0; }
.fzb .module > .module-top { grid-column: 2; grid-row: 1; position: relative; z-index: 2; display: flex; align-items: center; gap: 12px; padding: 0; }
.fzb .module > .module-hero { grid-column: 1; grid-row: 1; padding: var(--zd-space-1) 0 var(--zd-space-5); }
.fzb .home-btn { width: 44px; height: 44px; border-radius: var(--zd-radius); display: grid; place-items: center; font-size: 20px; }

/* Azioni nella barra del modulo: solo l'icona, senza riquadro (il pulsante Home resta com'è). */
.fzb .module-top .btn.glass:not(.home-btn), .fzb .module-top .btn.btn-icon:not(.home-btn) { background: none; border-color: transparent; box-shadow: none; }
.fzb .module-top .btn.btn-icon:not(.home-btn) { font-size: 1.6rem; width: 46px; height: 46px; }
.fzb .module-top .btn.glass:not(.home-btn):hover, .fzb .module-top .btn.btn-icon:not(.home-btn):hover { background: var(--surface-3); }

.fzb .module-hero { position: relative; }
.fzb .module-hero h1 {
    font-family: var(--zd-font);
    font-size: clamp(1.25rem, 1.1rem + .6vw, 1.5rem);
    font-weight: 700;
    letter-spacing: -0.02em;
    color: var(--zd-text);
}
.fzb .module-hero h1:focus { outline: none; }
.fzb .module-hero .hero-sub { color: var(--zd-text-3); font-size: var(--zd-font-size-sm); margin-top: 2px; }
.fzb .module-hero .hero-icon { width: 76px; height: 76px; border-radius: var(--zd-radius-lg); display: grid; place-items: center; font-size: 40px; background: var(--fzb-primary-soft); }
.fzb .hero-stat .hs-label { color: var(--zd-text-3); font-weight: 600; letter-spacing: .06em; }
.fzb .hero-stat .hs-value { font-family: var(--zd-font); }

/* Barra delle sezioni: resta visibile sotto l'AppBar e segna la sezione corrente (NavLink). */
.fzb .module-tabs {
    position: sticky;
    top: var(--zcd-appbar-h, 64px);
    z-index: 20;
    display: flex;
    gap: 2px;
    overflow-x: auto;
    scrollbar-width: none;
    scroll-padding-inline: 24px;
    padding: 4px;
    margin-bottom: var(--zd-space-5);
    width: fit-content;
    max-width: 100%;
    border-radius: var(--zd-radius);
    background: var(--zd-surface);
    border: 1px solid var(--zd-border);
    box-shadow: var(--zd-shadow-1);
}
.fzb .module-tabs::-webkit-scrollbar { display: none; }
.fzb .module-tabs a {
    display: inline-flex; align-items: center; gap: 6px;
    min-height: 40px;
    padding: 9px 16px;
    border-radius: var(--zd-radius-sm);
    color: var(--zd-text-2);
    font-weight: 600;
    font-size: .88rem;
    white-space: nowrap;
    transition: background-color var(--zd-dur-fast) ease, color var(--zd-dur-fast) ease;
}
.fzb .module-tabs a:hover { color: var(--zd-text); background: var(--zd-surface-hover); }
.fzb .module-tabs a.active {
    color: var(--fzb-primary-ink);
    background: var(--fzb-primary-soft);
    box-shadow: inset 0 0 0 1px color-mix(in srgb, var(--fzb-primary) 30%, transparent);
    font-weight: 700;
}
.fzb .module-tabs a:focus-visible { outline: 2px solid var(--fzb-primary); outline-offset: -2px; }

/* ---------- Finestre (sheet) ---------- */
/* Restano sopra all'AppBar e ai drawer di MudBlazor. */
.fzb .sheet-backdrop { position: fixed; inset: 0; z-index: 1500; background: rgba(15, 23, 42, .45); display: flex; align-items: center; justify-content: center; padding: 20px; }
.fzb .sheet { width: min(560px, 100%); max-height: min(88vh, 900px); display: flex; flex-direction: column; border-radius: var(--zd-radius-lg); background: var(--zd-surface); border: 1px solid var(--zd-border); box-shadow: var(--zd-shadow-3); overflow: hidden; }
.fzb .sheet.wide { width: min(820px, 100%); }
.fzb .sheet-head { display: flex; align-items: center; gap: 12px; padding: 20px 22px 12px; }
.fzb .sheet-head h2 { font-size: 1.3rem; flex: 1; }
.fzb .sheet-body { padding: 8px 22px 20px; overflow-y: auto; overscroll-behavior: contain; }
.fzb .sheet-foot { display: flex; gap: 10px; justify-content: flex-end; padding: 14px 22px calc(18px + var(--safe-bottom)); border-top: 1px solid var(--zd-border); background: var(--zd-surface-2); }
.fzb .sheet-grip { display: none; }
@keyframes fade-in { from { opacity: 0; } to { opacity: 1; } }
@media (max-width: 640px) {
    .fzb .sheet-backdrop { align-items: flex-end; padding: 0; }
    .fzb .sheet, .fzb .sheet.wide { width: 100%; max-height: 92vh; border-radius: var(--zd-radius-lg) var(--zd-radius-lg) 0 0; }
    .fzb .sheet-grip { display: block; width: 42px; height: 5px; border-radius: 9px; background: var(--border-strong); margin: 10px auto 0; }
    .fzb .sheet-foot > .btn { flex: 1; }
}

/* ---------- Notifiche (toast) ---------- */
.fzb .toast-host { position: fixed; z-index: 200; left: 50%; bottom: calc(24px + var(--safe-bottom)); transform: translateX(-50%); display: flex; flex-direction: column-reverse; gap: 10px; width: min(440px, calc(100vw - 32px)); pointer-events: none; }
.fzb .toast { pointer-events: auto; display: flex; align-items: center; gap: 12px; padding: 12px 14px; border-radius: var(--zd-radius); background: var(--zd-surface); border: 1px solid var(--zd-border); box-shadow: var(--zd-shadow-3); }
.fzb .toast .t-ico { width: 30px; height: 30px; border-radius: var(--zd-radius-sm); display: grid; place-items: center; font-weight: 800; background: var(--surface-3); flex: none; }
.fzb .toast.success .t-ico { background: var(--zd-success); color: #FFFFFF; }
.fzb .toast.error .t-ico { background: var(--zd-danger); color: #FFFFFF; }
.fzb .toast.warning .t-ico { background: var(--zd-warning); color: #FFFFFF; }

/* ---------- Errori Blazor e validazione ---------- */
.fzb #blazor-error-ui { display: none; position: fixed; bottom: 16px; left: 50%; transform: translateX(-50%); z-index: 1000; padding: 12px 18px; border-radius: var(--zd-radius); background: var(--zd-danger-soft); border: 1px solid var(--zd-danger); color: var(--zd-danger-ink); box-shadow: var(--zd-shadow-2); }
.fzb #blazor-error-ui .reload { color: var(--zd-danger-ink); font-weight: 700; margin-left: 10px; text-decoration: underline; }
.fzb #blazor-error-ui .dismiss { cursor: pointer; margin-left: 10px; }
.fzb .blazor-error-boundary { padding: 1rem 1.2rem; border-radius: var(--zd-radius); background: var(--zd-danger-soft); color: var(--zd-danger-ink); }
.fzb .blazor-error-boundary::after { content: "Si è verificato un errore."; }
.fzb .validation-message { color: var(--danger); font-size: .8rem; }
.fzb .invalid { border-color: var(--danger) !important; }

/* ---------- Pagine legali (privacy, cookie) ---------- */
.fzb .legal { max-width: 760px; margin: 0 auto; padding: calc(24px + var(--safe-top)) 20px 40px; line-height: 1.65; color: var(--text-2); }
.fzb .legal h1 { font-family: var(--font-display); color: var(--text); font-size: clamp(1.6rem, 5vw, 2.2rem); margin: 18px 0 4px; }
.fzb .legal h2 { color: var(--text); font-size: 1.05rem; margin: 26px 0 6px; }
.fzb .legal a { color: var(--accent-2-ink); }
.fzb .legal ul { padding-left: 20px; }
.fzb .legal-back { display: inline-block; font-weight: 700; text-decoration: none; color: var(--text) !important; }
.fzb .legal-table { width: 100%; border-collapse: collapse; font-size: .88rem; margin-top: 8px; }
.fzb .legal-table th, .fzb .legal-table td { text-align: left; padding: 8px 10px; border-bottom: 1px solid var(--border); vertical-align: top; }
.fzb .legal-table th { color: var(--text); }

/* ---------- Barre di scorrimento ---------- */
.fzb ::-webkit-scrollbar { width: 10px; height: 10px; }
.fzb ::-webkit-scrollbar-thumb { background: var(--zd-border-strong); border-radius: 10px; border: 2px solid transparent; background-clip: padding-box; }
.fzb ::-webkit-scrollbar-thumb:hover { background: var(--zd-text-3); background-clip: padding-box; }

/* ---------- Telefono e touch ---------- */
@media (max-width: 600px) {
    .fzb .module > .module-hero { padding-bottom: var(--zd-space-4); }
}
@media (hover: none) {
    .fzb .btn:active, .fzb .chip:active, .fzb .fab:active, .fzb .list-item:active { transform: scale(.96); transition-duration: .08s; }
}
@media (prefers-reduced-motion: reduce) {
    .fzb .skeleton { animation: none; }
}

