/* v2 */
:root {
    --c-primary: #2f7d4f;
    --c-primary-dark: #266842;
    --c-primary-darker: #1b3b2c;
    --c-primary-gradient: linear-gradient(135deg, #246340 0%, #1b3b2c 100%);
    /* Le sfumature del verde, dal bosco al prato: sono queste e basta.
       Prima meta' dei riquadri sfumava dal blu al verde, e sulla stessa
       pagina i due colori facevano a pugni. */
    --g-verde: linear-gradient(160deg, var(--c-primary), var(--c-primary-deep));
    --g-verde-chiaro: linear-gradient(160deg, var(--c-primary-soft), var(--c-primary));
    --c-success: #10b981;
    --c-success-dark: #059669;
    --c-success-darker: #065f46;
    --c-success-bg: #d1fae5;
    --c-danger: #ef4444;
    --c-danger-dark: #dc2626;
    --c-danger-darker: #991b1b;
    --c-danger-bg: #fee2e2;
    --c-danger-bg-light: #fef2f2;
    --c-warning: #f59e0b;
    --c-warning-dark: #d97706;
    --c-warning-darker: #92400e;
    --c-warning-bg: #fef3c7;
    --c-info: #3b82f6;
    --c-info-dark: #2563eb;
    --c-info-bright: #6366f1;
    --c-info-bg: #eef2ff;
    --c-text: #333;
    --c-text-dark: #1f2937;
    --c-text-darkest: #111827;
    --c-text-mid: #666;
    --c-text-secondary: #4b5563;
    --c-text-darkish: #374151;
    --c-text-muted: #6b7280;
    --c-text-lighter: #9ca3af;
    --c-text-faint: #888;
    --c-border: #dde4ea;
    --c-border-light: #f3f4f6;
    --c-border-mid: #c3ced8;
    --c-border-faint: #eee;
    --c-border-light2: #e2e8f0;
    --c-border-cool: #cbd5e1;
    --c-bg: #f4f6f8;
    --c-bg-card: white;
    --c-bg-light: #f7f9fa;
    --c-bg-lighter: #f1f5f9;
    --c-white: #fff;
    --c-primary-deep: #1e5c39;
    --c-primary-soft: #6ba883;
    --c-primary-bg-soft: #e6f1ea;
    --c-primary-bg: #cbe3d5;           /* verde tenue, piu' saturo di primary-bg-soft */
    --c-primary-deeper: #15402a;       /* piu' scuro di primary-deep */
    --c-info-bg-pale: #dbeafe;
    --c-info-bg-soft: #c7d7fa;         /* blu-indigo tra info-bg e info-bg-pale */
    --c-info-darker: #1d4ed8;          /* più scuro di info-dark */
    --c-success-bright: #22c55e;
    --c-success-deep: #16a34a;
    --c-success-darkest: #166534;
    --c-success-bg-mint: #ecfdf5;
    --c-danger-bg-mid: #fca5a5;
    --c-danger-bg-pale: #fecaca;
    --c-warning-mid: #b45309;
    --c-pink-dark: #9d174d;
    --c-focus-ring: rgba(47, 125, 79, 0.18);

    /* CARATTERI — nessun webfont: si usa quello del sistema. */
    --font-ui: system-ui, 'Segoe UI', Roboto, -apple-system, 'Helvetica Neue',
               Arial, sans-serif;
    --font-mono: ui-monospace, Consolas, 'SF Mono', 'Cascadia Mono', monospace;

    /* MODULE PALETTE — Colori condivisi tra moduli (>=2 file).
       Aggiungere qui invece di hex literali per coerenza visuale. */
    --c-amber-bg-soft: #fefce8;
    --c-amber-bg-mid: #fde68a;
    --c-amber-text-deep: #854d0e;
    --c-orange-bg: #ffedd5;
    --c-purple-deep: #764ba2;
    --c-violet: #8b5cf6;
    --c-violet-bg: #ede9fe;
    --c-violet-bg-pale: #f5f3ff;
    --c-violet-darker: #5b21b6;
    --c-indigo-medium: #5a6fd6;
    --c-pink-bg: #fce7f3;
    --c-pink-bg-pale: #fdf2f8;
    --c-green-bg-mint: #bbf7d0;
    --c-cyan-bg: #cffafe;
    --c-warm-bg: #fff7ed;
    /* Palette extra per moduli/runtime (anti-drift) */
    --c-blue-light: #93c5fd;
    --c-cyan-bg-pale: #e0f2fe;
    --c-cyan-text-deep: #0369a1;
    --c-blue-soft: #bfdbfe;
    --c-amber-bright: #fbbf24;
    --c-red-700: #b91c1c;
    --c-amber-300: #fcd34d;
    --c-green-500: #4caf50;
    --c-black: #000000;
    --c-border-grey: #dee2e6;
    /* Colori aggiuntivi da audit moduli — mai usare hex letterali nei moduli */
    --c-amber-focus: #b88d00;       /* focus ring campi obbligatori ambra */
    --c-green-darkest: #365314;     /* testo su badge verde scuro */
    --c-emerald-300: #6ee7b7;       /* bordo emerald chiaro */
    --c-lime-300: #bef264;          /* bordo lime */
    --c-cyan-500: #06b6d4;          /* chip calendario cyan */
    /* Phase 5 — unificazione palette (hex letterali eliminati dai moduli) */
    --c-success-bg-pale: #f0fdf4;       /* alert-success, card-success-light */
    --c-success-bg-soft: #dcfce7;       /* quick-half--active, turno-intero */
    --c-success-border-light: #86efac;  /* alert-success, card-success-light */
    --c-warning-bg-pale: #fef9c3;       /* turno-solo_pomeriggio, state-box */
    --c-warning-bg-bright: #fffbeb;     /* alert-warning */
    --c-warning-bg-strong: #fff3cd;     /* duplicate-warning */
    --c-warning-border: #facc15;        /* state-box-warning */
    --c-warning-border-strong: #ffc107; /* duplicate-warning */
    --c-warning-text-deep: #856404;     /* duplicate-warning text */
    --c-info-bg-bright: #eff6ff;        /* alert-info */
    --c-info-bg-pale-cyan: #f0f9ff;     /* info-block-cyan */
    --c-primary-bg-pale: #f2f8f4;       /* card-primary-pale, hover-bg-blue-pale-row */
    --c-violet-bg-pale: #f0f2ff;        /* card-violet-pale */
    --c-violet-text-deep: #7c3aed;      /* order-badge Avvisato */
    --c-cyan-text-mid: #0891b2;         /* order-badge Ricevuto Parz. */
    --c-orange-vibrant: #f97316;        /* text-orange, order-badge Chiamato */
    --c-slate-text: #5a6f86;            /* text-slate */
    --c-amber-text: #f39c12;            /* u-text-amber */
    --c-brown-text-deep: #78350f;       /* tag-legna */
    --c-yellow-highlight: #fef08a;      /* cal-day today hover */
    --c-bg-grey-light: #f9f9f9;         /* cal-we weekend */
    --c-bg-grey-pale: #f0f0f0;          /* hover-bg-gray-pale */
    --c-bg-grey-very-light: #edf0f3;    /* cal-bar-empty */
    --c-bg-cyan-bright: #e8f4fd;        /* hover-bg-blue-pale */
    --c-warm-bg: #fff8e5;               /* bg-warn-pale */
    --c-warm-bg-soft: #fff5e6;          /* bg-warm-pale */
    --c-yellow-bolla-aperta: #fff7c2;   /* pesa: riga bolla aperta */
    --c-green-bolla-chiusa: #d2f0c8;    /* pesa: riga bolla chiusa */
    /* Glow semi-trasparenti — box-shadow e gradient con canale alpha */
    --c-primary-glow: rgba(102, 126, 234, 0.08);
    --c-purple-glow: rgba(118, 75, 162, 0.08);
    --c-success-glow: rgba(34, 197, 94, 0.53);
    --c-warning-glow: rgba(234, 179, 8, 0.53);
    --c-danger-glow: rgba(239, 68, 68, 0.53);

    --shadow-sm: 0 1px 3px rgba(0,0,0,0.06);
    --shadow-card: 0 1px 3px rgba(0,0,0,0.06), 0 1px 2px rgba(0,0,0,0.04);
    --radius-sm: 8px;
    --radius-md: 12px;
    --radius-lg: 16px;
    --radius-pill: 20px;

    /* Primitive componenti: un solo contratto per layout e stati condivisi. */
    --ui-transition-fast: 0.2s ease;
    --btn-padding-block: 0.6rem;
    --btn-padding-inline: 1.25rem;
    --btn-shadow-hover: 0 4px 12px rgba(15, 23, 42, 0.14);
    /* DENSITA' — la sceglie chi lavora, in Utilita', e resta salvata.
       Le righe si stringono togliendo spazio, mai rimpicciolendo il testo:
       ridurre il carattere per farne stare di piu' e' il modo sicuro di
       rendere illeggibile una tabella che serve a leggere. */
    --table-cell-padding-block: 0.55rem;
    --table-cell-padding-inline: 0.9rem;
    --table-riga-min: 40px;
    /* e le righe degli elenchi che non sono tabelle (ordini, lavori) */
    --riga-y: 0.55rem;
    --riga-x: 0.9rem;
    --riga-gap: 0.2rem;
    --modal-width: 94%;
    --modal-max-width: 700px;
    --modal-max-height: 96vh;
    --modal-shadow: 0 24px 64px rgba(0,0,0,0.18), 0 0 0 1px rgba(0,0,0,0.04);
    --loading-size: 18px;
    --loading-border-width: 2px;

    /* Z-INDEX LADDER — Scala centralizzata per evitare conflitti di stacking.
       Usare SEMPRE queste variabili, mai numeri ad-hoc. */
    --z-base: 1;           /* Elementi normali in flusso */
    --z-sticky: 100;       /* Header/tabelle sticky */
    --z-navbar: 900;       /* Navbar top */
    --z-modal-backdrop: 1000;
    --z-modal: 1010;       /* Contenuto modal sopra backdrop */
    --z-dropdown: 1050;    /* Dropdown/combobox sopra modali */
    --z-toast: 2000;       /* Notifiche toast */
    --z-alert: 10000;      /* Overlay critici (riavvio server, errori fatali) */
}

/* Compatta: per chi ci sta tutto il giorno. */
:root[data-densita="compatta"] {
    --table-cell-padding-block: 0.3rem;
    --table-cell-padding-inline: 0.7rem;
    --table-riga-min: 32px;
    --riga-y: 0.3rem;
    --riga-x: 0.75rem;
    --riga-gap: 0.1rem;
}

/* Comoda: per chi apre il Portale due volte a settimana, e per i tablet. */
:root[data-densita="comoda"] {
    --table-cell-padding-block: 0.8rem;
    --table-cell-padding-inline: 1rem;
    --table-riga-min: 48px;
    --riga-y: 0.85rem;
    --riga-x: 1.1rem;
    --riga-gap: 0.4rem;
}

* {
    margin: 0;
    padding: 0;
    box-sizing: border-box;
}

html, body {
    overflow-x: hidden;
    width: 100%;
}

/* Il carattere e' quello del sistema, e non si scarica niente.

   Il motivo per cui tutti i gestionali usano lo stesso carattere e' che
   quel carattere e' fatto per gli schermi, si legge piccolo e ha le cifre
   della stessa larghezza. Quel carattere pero' ce l'abbiamo gia': su
   Windows e' Segoe UI, e le macchine dell'ufficio sono tutte Windows.
   `system-ui` davanti serve ai tablet Android e agli iPhone, che cosi'
   prendono il proprio - su ciascuno e' quello che si legge meglio.

   Zero richieste in piu', zero attesa, e funziona anche quando la rete fa
   i capricci. */
body {
    font-family: var(--font-ui);
    background-color: var(--c-bg);
    color: var(--c-text);
    line-height: 1.6;
    /* I numeri della stessa larghezza ovunque: in colonna le migliaia
       stanno sopra le migliaia, e una cifra che cambia non fa ballare la
       riga. E' la singola regola che fa sembrare una tabella curata. */
    font-variant-numeric: tabular-nums;
}

/* ACCESSIBILITY — Focus ring coerente (keyboard navigation) */
:focus { outline: none; }

button:focus-visible,
a:focus-visible,
input:focus-visible,
select:focus-visible,
textarea:focus-visible,
[tabindex]:focus-visible,
[role="button"]:focus-visible {
    outline: 2px solid var(--c-primary);
    outline-offset: 2px;
    box-shadow: 0 0 0 4px var(--c-focus-ring);
    border-radius: var(--radius-sm);
}

/* Sr-only (screen reader) helper */
.sr-only {
    position: absolute !important;
    width: 1px; height: 1px;
    padding: 0; margin: -1px;
    overflow: hidden;
    clip: rect(0,0,0,0);
    white-space: nowrap;
    border: 0;
}

/* NAVBAR */
.navbar {
    background: var(--c-primary-gradient);
    padding: 0.75rem 2rem;
    box-shadow: 0 2px 15px rgba(0,0,0,0.15);
    position: sticky;
    top: 0;
    z-index: var(--z-navbar);
}

.navbar-container {
    max-width: 1600px;
    margin: 0 auto;
    display: flex;
    justify-content: space-between;
    align-items: center;
    flex-wrap: wrap;
}

.navbar-brand {
    color: white;
    font-size: 1.5rem;
    font-weight: bold;
    text-decoration: none;
}

.navbar-toggle {
    display: none;
    background: none;
    border: 2px solid rgba(255,255,255,0.5);
    border-radius: 6px;
    color: white;
    font-size: 1.5rem;
    padding: 0.3rem 0.7rem;
    cursor: pointer;
    transition: background 0.3s;
}

.navbar-toggle:hover {
    background: rgba(255,255,255,0.15);
}

.navbar-menu {
    display: flex;
    gap: 1.5rem;
    list-style: none;
    align-items: center;
}

.navbar-menu a {
    color: white;
    text-decoration: none;
    font-weight: 500;
    display: inline-flex;
    align-items: center;
    justify-content: center;
    gap: 0.35rem;
    border-radius: var(--radius-sm);
    padding: 0.35rem 0.65rem;
    line-height: 1.15;
    white-space: nowrap;
    transition: background 0.2s ease, opacity 0.2s ease, transform 0.2s ease, box-shadow 0.2s ease;
}

.navbar-menu a:hover {
    opacity: 0.8;
    background: rgba(255,255,255,0.1);
    transform: translateY(-1px);
}

.navbar-menu a.active {
    background: rgba(255,255,255,0.15);
    border-radius: 6px;
    padding: 0.35rem 0.65rem;
    opacity: 1;
}

.navbar-menu a.navbar-tile {
    min-width: 72px;
    min-height: 56px;
    flex-direction: column;
    gap: 0.28rem;
    padding: 0.42rem 0.65rem;
    text-align: center;
}

.navbar-tile-icon {
    display: block;
    font-size: 1.05rem;
    line-height: 1;
}

.navbar-tile-label {
    display: block;
    font-size: 0.9rem;
    line-height: 1.1;
}

.navbar-menu a.navbar-tile.active {
    padding: 0.42rem 0.65rem;
    box-shadow: inset 0 0 0 1px rgba(255,255,255,0.08);
}

/* Dropdown navbar (Configurazione ▾, ecc.) */
.navbar-dropdown { position: relative; }
.navbar-dropdown > a { cursor: pointer; user-select: none; }
.navbar-submenu {
    position: absolute;
    top: calc(100% + 0.5rem);
    right: 0;
    min-width: 12rem;
    background: var(--c-white, #fff);
    border-radius: 8px;
    box-shadow: 0 6px 18px rgba(0,0,0,0.15);
    list-style: none;
    margin: 0;
    padding: 0.35rem 0;
    z-index: var(--z-dropdown);
    display: none;
}
.navbar-submenu.open { display: block; }
.navbar-submenu li { display: block; }
.navbar-submenu a {
    display: block;
    padding: 0.5rem 1rem;
    color: var(--c-text, #333) !important;
    text-decoration: none;
    font-weight: 500;
    white-space: nowrap;
}
.navbar-submenu a:hover { background: var(--c-bg-light, #f4f6fb); opacity: 1; }

/* Tab navigazione Magazzino */
.magazzino-tabs {
    display: flex;
    gap: 0;
    margin-bottom: 0;
    border-bottom: 2px solid var(--c-border);
    background: var(--c-white);
    border-radius: 10px 10px 0 0;
    padding: 0 0.5rem;
}

.magazzino-tab {
    padding: 0.75rem 1.5rem;
    text-decoration: none;
    font-weight: 600;
    font-size: 0.95rem;
    color: var(--c-text-muted);
    border-bottom: 3px solid transparent;
    transition: all 0.2s;
    margin-bottom: -2px;
}

.magazzino-tab:hover {
    color: var(--c-primary-dark);
    background: var(--c-info-bg);
}

.magazzino-tab.active {
    color: var(--c-primary-dark);
    border-bottom-color: var(--c-primary-dark);
    background: transparent;
}

.magazzino-tabs + .card {
    border-radius: 0 0 12px 12px;
    border-top: none;
}

/* CONTAINER */
.container {
    max-width: 1600px;
    margin: 1.5rem auto;
    padding: 0 2rem;
    overflow-x: hidden;
    animation: pageFadeIn 0.3s ease;
}

/* CARD */
.card {
    background: var(--c-bg-card);
    border-radius: var(--radius-md);
    padding: 1.5rem 2rem;
    box-shadow: var(--shadow-card);
    margin-bottom: 1.5rem;
    border: 1px solid var(--c-border);
    animation: cardFadeIn 0.4s ease backwards;
    transition: border-color 0.2s ease, box-shadow 0.2s ease, transform 0.2s ease;
}

.card-title {
    font-size: 1.5rem;
    color: var(--c-primary-dark);
    margin-bottom: 1rem;
    font-weight: 700;
}

/* ==================== LE ICONE ====================
   Un pacchetto solo: le Fluent Emoji di Microsoft (licenza MIT), variante
   piatta e colorata, scaricate in static/images/icone/ — tutte, cosi' per un
   modulo nuovo il disegno c'e' gia'. Prima erano le emoji del sistema
   operativo: ognuno le disegnava a modo suo, e in fila non sembravano dello
   stesso programma.

   Si usano come immagini, col nome del disegno:

       <img class="ico" src="{{ asset_url('images/icone/robot.svg') }}" alt="">

   Sono decorative: l'`alt` resta vuoto perche' accanto c'e' sempre la parola
   che dicono, e uno screen reader che le legge direbbe due volte la stessa
   cosa. */
.ico {
    width: 1.3em;
    height: 1.3em;
    flex: 0 0 auto;
    vertical-align: -0.28em;
    object-fit: contain;
}

/* Sulle schede della home l'icona e' il segno che si cerca da lontano. */
.ico-grande {
    width: 2.6rem;
    height: 2.6rem;
    vertical-align: middle;
}
/* BUTTONS */
.btn {
    padding: var(--btn-padding-block) var(--btn-padding-inline);
    border: 1px solid transparent;
    border-radius: var(--radius-sm);
    background: var(--c-bg-light);
    color: var(--c-text-dark);
    cursor: pointer;
    font-size: 0.95rem;
    font-weight: 600;
    transition: background-color var(--ui-transition-fast), border-color var(--ui-transition-fast), box-shadow var(--ui-transition-fast), color var(--ui-transition-fast), transform var(--ui-transition-fast);
    text-decoration: none;
    display: inline-flex;
    align-items: center;
    justify-content: center;
    gap: 0.4rem;
    line-height: 1.4;
    white-space: nowrap;
}

.btn:hover:not(:disabled) {
    background: var(--c-border-light);
    transform: translateY(-2px);
    box-shadow: var(--btn-shadow-hover);
}

.btn:focus-visible {
    outline: none;
    box-shadow: 0 0 0 3px var(--c-focus-ring), var(--btn-shadow-hover);
}

.btn:disabled {
    cursor: not-allowed;
    opacity: 0.58;
}

.btn-primary {
    background: var(--c-primary-gradient);
    color: var(--c-white);
}
.btn-primary:hover:not(:disabled) {
    background: var(--c-primary-gradient);
    color: var(--c-white);
    box-shadow: 0 4px 12px rgba(102, 126, 234, 0.4);
}
.btn-success {
    background: var(--c-success);
    color: var(--c-white);
}
.btn-success:hover:not(:disabled) {
    background: var(--c-success-dark);
    color: var(--c-white);
}
.btn-danger {
    background: var(--c-danger);
    color: var(--c-white);
}
.btn-danger:hover:not(:disabled) {
    background: var(--c-danger-dark);
    color: var(--c-white);
}
.btn-warning {
    background: var(--c-warning);
    color: var(--c-white);
}
.btn-warning:hover:not(:disabled) {
    background: var(--c-warning-dark);
    color: var(--c-white);
}
.btn-secondary {
    background: var(--c-text-muted);
    color: var(--c-white);
}
.btn-secondary:hover:not(:disabled) {
    background: var(--c-text-secondary);
    color: var(--c-white);
}
.btn-info {
    background: var(--c-info);
    color: var(--c-white);
}
.btn-info:hover:not(:disabled) {
    background: var(--c-info-dark);
    color: var(--c-white);
}
.btn-light {
    background: var(--c-white);
    border-color: var(--c-border-mid);
    color: var(--c-text-dark);
}
.btn-light:hover:not(:disabled) {
    background: var(--c-bg-light);
    border-color: var(--c-border);
}
.btn-outline,
.btn-outline-light,
.btn-outline-primary {
    background: transparent;
    border-color: var(--c-border-mid);
    color: var(--c-text-dark);
}
.btn-outline:hover:not(:disabled),
.btn-outline-primary:hover:not(:disabled) {
    background: var(--c-bg-light);
    border-color: var(--c-border);
}
.btn-outline-primary,
.btn-outline.btn-primary,
.btn-primary.btn-outline {
    border-color: var(--c-primary);
    color: var(--c-primary);
}
.btn-outline-primary:hover:not(:disabled),
.btn-outline.btn-primary:hover:not(:disabled),
.btn-primary.btn-outline:hover:not(:disabled) {
    background: var(--c-primary-bg-soft);
    border-color: var(--c-primary);
    color: var(--c-primary-dark);
}
.btn-outline.btn-danger,
.btn-danger.btn-outline {
    background: transparent;
    border-color: var(--c-danger-bg-pale);
    color: var(--c-danger-dark);
}
.btn-outline.btn-danger:hover:not(:disabled),
.btn-danger.btn-outline:hover:not(:disabled) {
    background: var(--c-danger-bg);
    border-color: var(--c-danger-bg-pale);
    color: var(--c-danger-dark);
}
.btn-outline-light {
    border-color: rgba(255, 255, 255, 0.65);
    color: var(--c-white);
}
.btn-outline-light:hover:not(:disabled) {
    background: rgba(255, 255, 255, 0.14);
    border-color: var(--c-white);
    color: var(--c-white);
}

.btn:active:not(:disabled) {
    transform: scale(0.96);
}

/* IL PULSANTE CHE NON SEMBRA UN PULSANTE — dentro una tabella fitta un
   valore su cui si puo' cliccare non puo' portarsi dietro la cornice del
   browser: quaranta righe di scatolette grigie. Qui e' testo, col
   sottolineato tratteggiato che dice che c'e' altro sotto.
   (Era usato senza essere definito: la classe non esisteva in nessun
   foglio, e il browser ci metteva del suo — bordo, fondo grigio, font di
   sistema.) */
.btn-link {
    display: inline;
    padding: 0;
    margin: 0;
    background: none;
    border: 0;
    border-radius: 0;
    font: inherit;
    color: inherit;
    text-align: inherit;
    cursor: pointer;
    text-decoration: none;
}

.btn-link:hover,
.btn-link:focus-visible {
    color: var(--c-primary-dark);
}

.btn-sm {
    padding: 0.4rem 0.8rem;
    font-size: 0.9rem;
}

.btn-xs {
    padding: 0.15rem 0.5rem;
    font-size: 0.75rem;
}

.btn-square {
    width: 34px;
    height: 34px;
    min-width: 34px;
    padding: 0;
}

.btn-square.btn-xs {
    width: 30px;
    height: 30px;
    min-width: 30px;
}

/* FORM */

.form-label {
    display: block;
    margin-bottom: 0.5rem;
    font-weight: 500;
    color: var(--c-text-secondary);
}

.form-control,
.input-base,
.form-select {
    width: 100%;
    padding: 0.6rem 0.75rem;
    border: 1px solid var(--c-border-mid);
    border-radius: var(--radius-sm);
    font-size: 0.95rem;
    font-family: inherit;
    color: var(--c-text-dark);
    transition: border-color 0.2s, box-shadow 0.2s;
    background: var(--c-bg-light);
}

.form-control:focus,
.input-base:focus,
.form-select:focus,
.search-input:focus,
.search-input-sm:focus {
    outline: none;
    border-color: var(--c-primary);
    box-shadow: 0 0 0 3px var(--c-focus-ring);
    background: var(--c-white);
    animation: focusRing 0.2s ease;
}

.form-row {
    display: flex;
    gap: 0.75rem;
    flex-wrap: wrap;
}

fieldset {
    border: 1px solid transparent;
    padding: 0;
    margin: 0;
    min-inline-size: 0;
    transition: border-color 0.2s;
}

fieldset:focus-within {
    border-color: var(--c-primary);
    border-radius: var(--radius-sm);
}
/* TABLE */
.table-container,
.table-responsive {
    overflow-x: auto;
    margin-top: 1rem;
    max-width: 100%;
    -webkit-overflow-scrolling: touch;
}

/* Quando la tabella e' piu' alta di una schermata, l'intestazione resta
   attaccata in cima: senza, a meta' elenco non si sa piu' quale colonna si
   sta guardando e si torna su a controllare. Serve un'altezza massima sul
   contenitore perche' lo sticky abbia un riferimento. */
.table-container.tabella-alta,
.table-responsive.tabella-alta {
    max-height: calc(100vh - 260px);
    overflow-y: auto;
}

.table {
    width: 100%;
    border-collapse: collapse;
    background: var(--c-white);
}

.table th {
    position: sticky;
    top: 0;
    z-index: 2;
    background: var(--c-bg-light);
    padding: var(--table-cell-padding-block) var(--table-cell-padding-inline);
    text-align: left;
    font-weight: 600;
    color: var(--c-text-muted);
    /* Una riga sola, netta. Il reticolo di linee di prima litigava con i
       dati per l'attenzione: la struttura la portano lo spazio e un solo
       separatore. */
    border-bottom: 1px solid var(--c-border-mid);
    font-size: 0.72rem;
    text-transform: uppercase;
    letter-spacing: 0.05em;
    white-space: nowrap;
}

.table th.sortable {
    cursor: pointer;
    user-select: none;
}
.table th.sortable:hover {
    background: var(--c-bg-lighter);
    color: var(--c-primary-dark);
}
.table th.sortable .sort-arrow {
    font-size: 0.7rem;
    color: var(--c-primary);
}

.table td {
    padding: var(--table-cell-padding-block) var(--table-cell-padding-inline);
    border-bottom: 1px solid var(--c-border-light);
    word-break: break-word;
    overflow-wrap: break-word;
    vertical-align: middle;
}

.table tbody tr { min-height: var(--table-riga-min); }

/* ══════════════════════════════════════════════════════════════════
   LA TABELLA DA BANCO — .table-banco

   E' la tabella della home della pesa promossa a stile condiviso: la
   usano le pagine dove il lavoro e' tenere sotto gli occhi un documento
   intero (una bolla, un registro, un confronto di prezzi), non scorrere
   dieci schede. Quindici colonne per quaranta righe, e devono starci.

   Cosa cambia rispetto alla tabella normale:

   - **una riga e' una riga.** `word-break: break-word` sulla tabella
     normale, dentro una colonna stretta, spezza "CRANCY CAT MEATYMIX"
     in una parola per riga: la riga diventa alta 280px e a schermo ne
     stanno due. Qui il testo non va a capo, e quello che non ci sta
     finisce nei puntini, col testo intero nel `title`.
   - **le colonne non si stringono per far stare la tabella nella
     pagina.** Con `width: 100%` e diciassette colonne il browser
     comprime le ultime a due pixel: l'ultima colonna non spariva dietro
     un bordo, era larga niente. Qui la tabella si prende la larghezza
     che le serve e il contenitore scorre di lato.
   - i numeri a destra e a larghezza fissa, che in colonna si
     confrontano a occhio;
   - i righelli verticali restano, tenui: con quindici colonne aiutano a
     non perdere la riga, marcati litigherebbero coi dati.
   ══════════════════════════════════════════════════════════════════ */
.table-banco {
    width: auto;
    min-width: 100%;
    font-size: var(--banco-corpo, 0.78rem);
    font-variant-numeric: tabular-nums;
}
.table-banco th {
    padding: 4px 6px;
    border-right: 1px solid var(--c-border-light);
    font-size: 0.68rem;
    vertical-align: bottom;
    /* L'intestazione va a capo dentro la sua colonna: "MARGINE PRECEDENTE"
       su una riga sola e' centotrenta pixel per una colonna da
       novantadue, e quei trentotto pixel di troppo facevano comparire la
       barra orizzontale su tutta la tabella. Due righe di intestazione si
       leggono; una colonna spinta fuori dallo schermo no. */
    white-space: normal;
    overflow: hidden;
    line-height: 1.15;
}
.table-banco td {
    padding: var(--banco-riga-y, 3px) 6px;
    border-right: 1px solid var(--c-border-light);
    white-space: nowrap;
    overflow: hidden;
    text-overflow: ellipsis;
    word-break: normal;
    overflow-wrap: normal;
    max-width: var(--banco-cella-max, 260px);
    line-height: 1.25;
}
.table-banco tbody tr { min-height: 0; }
.table-banco tbody tr:hover td { background: var(--c-cyan-bg-pale); }

/* COLONNE DECISE — quando le colonne che contano devono stare a schermo,
   la larghezza non la sceglie il contenuto: la si decide, con un
   <colgroup>, e la colonna piu' larga (la descrizione) si prende quello
   che avanza. Senza questo la colonna dello stato, che e' l'unica con
   del testo libero, si allargava fino a spingere il nuovo prezzo fuori
   dallo schermo — e il nuovo prezzo e' il motivo per cui si e' aperta la
   pagina. Il min-width tiene la tabella leggibile sui portatili: sotto
   quella misura scorre, sopra ci sta tutta. */
.table-banco--colonne {
    table-layout: fixed;
    width: 100%;
    min-width: var(--banco-min, 1300px);
}

/* Una cella che puo' andare a capo invece di allargare la colonna: il
   testo libero (uno stato composto, una lista di sconti) sta su due
   righe e la tabella resta larga quanto lo schermo. */
.table-banco .cella-capo {
    white-space: normal;
    overflow-wrap: anywhere;
}

/* LA NUVOLETTA — quello che si vuole sapere passando sopra una cella,
   senza aprire niente e senza perdere il posto: si scopre col mouse e
   sparisce da sola quando ci si sposta. Un modal per leggere cinque
   date e' un modal da chiudere. */
.nuvoletta {
    position: fixed;
    z-index: var(--z-dropdown, 1050);
    max-width: 30rem;
    max-height: 60vh;
    overflow: auto;
    padding: 0.5rem 0.7rem;
    background: var(--c-white);
    border: 1px solid var(--c-border-mid);
    border-radius: var(--radius-sm);
    box-shadow: 0 10px 30px rgba(0, 0, 0, 0.16);
    font-size: 0.78rem;
    pointer-events: none;
}

.nuvoletta[hidden] { display: none; }

.nuvoletta table { border-collapse: collapse; width: 100%; }

.nuvoletta th,
.nuvoletta td {
    padding: 2px 6px;
    white-space: nowrap;
    text-align: left;
}

.nuvoletta th {
    font-size: 0.68rem;
    text-transform: uppercase;
    letter-spacing: 0.04em;
    color: var(--c-text-muted);
    border-bottom: 1px solid var(--c-border);
}

.nuvoletta td.num { text-align: right; font-variant-numeric: tabular-nums; }

.nuvoletta-titolo {
    font-weight: 700;
    margin-bottom: 0.25rem;
}

/* La cella da cui si scopre qualcosa: si vede che c'e' altro sotto. */
.table-banco .listino-storico,
.table-banco .cella-scopri {
    border-bottom: 1px dotted var(--c-border-mid);
    cursor: help;
}

/* Il secondo dato della cella — la percentuale accanto agli euro, il
   valore che l'articolo ha oggi in anagrafica — sta sulla stessa riga,
   piu' piccolo e spento: e' un riferimento, non un dato da leggere per
   primo. Andare a capo raddoppiava l'altezza di ogni riga. */
.table-banco .cella-2 {
    font-size: 0.9em;
    color: var(--c-text-muted);
    margin-left: 0.3em;
}
.table-banco .cella-2-danger { color: var(--c-danger-dark); }

/* I CAMPI DENTRO LA TABELLA — si compilano, ma non sono un modulo: una
   colonna di scatolette grigie col bordo (e quaranta righe di scatolette)
   e' l'aspetto di un gestionale di trent'anni fa, e ruba anche lo spazio
   che serve alle cifre. Qui il campo e' il numero: fondo trasparente e un
   tratteggio sotto che dice "questo si scrive". Diventa un campo per
   davvero quando lo si tocca, ed e' l'unico momento in cui serve.
   Niente altezza fissa: un input da 38px deciderebbe l'altezza di tutte
   le righe. */
.table-banco .form-control {
    width: 100%;
    padding: 1px 2px;
    font: inherit;
    color: inherit;
    height: auto;
    min-height: 0;
    background: transparent;
    border: 0;
    border-bottom: 1px dashed var(--c-border-mid);
    border-radius: 0;
    box-shadow: none;
    text-align: right;
}

.table-banco .form-control:hover {
    background: var(--c-bg-lighter);
    border-bottom-color: var(--c-text-lighter);
}

.table-banco .form-control:focus,
.table-banco .form-control:focus-visible {
    background: var(--c-white);
    border-bottom: 1px solid var(--c-primary);
    box-shadow: 0 0 0 2px var(--c-focus-ring);
    outline: none;
}
.table-banco input[type="checkbox"] { margin: 0; }

/* Lo stato della riga: una parola, non una pastiglia. Quattro pastiglie
   in colonna facevano da sole l'altezza della riga; il colore basta a
   dire di che si tratta, e il dettaglio sta nel title. */
.table-banco .segno {
    font-weight: 600;
    white-space: nowrap;
}
.table-banco .segno-nuovo   { color: var(--c-warning-mid); }
.table-banco .segno-agg     { color: var(--c-info-darker); }
.table-banco .segno-uguale  { color: var(--c-text-lighter); font-weight: 400; }
.table-banco .segno-errore  { color: var(--c-danger-dark); }
.table-banco .segno-avviso {
    color: var(--c-warning-mid);
    cursor: help;
    margin-left: 0.25em;
}

/* Il contenitore che tiene la tabella alta quanto lo schermo che resta:
   la pagina non scorre, scorre la tabella. Chi lo usa deve dargli
   un'altezza (o stare in un flex con min-height: 0), altrimenti
   l'intestazione appiccicata non ha un riferimento. */
.banco-tabella {
    flex: 1 1 auto;
    min-height: 220px;
    /* La barra verticale c'e' sempre, anche quando non serve: cosi' la
       larghezza dentro cui la tabella misura il suo "cento per cento" e'
       sempre la stessa. Con la barra che appare e sparisce, la tabella
       misurava dodici pixel piu' del posto disponibile e compariva una
       barra orizzontale per niente - e quei dodici pixel se li prendeva
       l'ultima colonna, che e' il nuovo margine. */
    overflow-x: auto;
    overflow-y: scroll;
    border: 1px solid var(--c-border);
    border-radius: var(--radius-sm);
    margin-top: 0;
}

/* La riga scelta si vede anche quando il puntatore e' altrove. */
.table tbody tr.selezionata td { background: var(--c-primary-bg-pale); }

.table tbody tr.selezionata td:first-child {
    box-shadow: inset 3px 0 0 var(--c-primary);
}

/* I numeri a destra, il testo a sinistra. E' la regola che risolve piu'
   lamentele di "tabella disordinata" di qualunque restyling: le cifre si
   allineano per posizione, e la colonna si legge dall'alto in basso invece
   che parola per parola.

   Vale per chi la chiede - `.text-right`, `data-num`, `.num` - cosi' si
   applica dove il contenuto e' davvero un numero e non dove capita. */
.table td.text-right,
.table td[data-num],
.table td.num,
.table th.text-right,
.table th[data-num],
.table th.num {
    text-align: right;
    font-variant-numeric: tabular-nums;
}

/* I codici in monospazio: li' distinguere lo zero dalla O conta, ed e'
   l'unico posto dove serve un carattere diverso. */
.table td code,
.table td .cod,
.codice {
    font-family: var(--font-mono);
    font-size: 0.94em;
    letter-spacing: -0.01em;
}

.table tbody tr {
    transition: background 0.15s;
    animation: rowSlideIn 0.3s ease backwards;
}

.table tbody tr:hover {
    background: var(--c-bg-lighter);
}

/* ── I filtri attivi si devono vedere ──────────────────────────────────
   Una tabella filtrata identica a una non filtrata e' il modo in cui si
   leggono male i dati e si prendono decisioni sbagliate. Le pastiglie
   dicono cosa e' acceso, si tolgono toccandole, e accanto c'e' il conto di
   quante righe sono rimaste su quante. */
.filtri-attivi {
    display: flex;
    align-items: center;
    flex-wrap: wrap;
    gap: 0.4rem;
    margin: 0.75rem 0 0;
}

.filtri-attivi:empty { display: none; }

.filtro-pastiglia {
    display: inline-flex;
    align-items: center;
    gap: 0.4rem;
    padding: 0.15rem 0.5rem 0.15rem 0.6rem;
    border: 1px solid var(--c-primary);
    border-radius: 999px;
    background: var(--c-primary-bg-soft);
    color: var(--c-primary-deep);
    font-size: 0.78rem;
    font-weight: 600;
    line-height: 1.7;
    cursor: pointer;
}

/* IL TASTO-FILTRO — «Tutti / Scaduti / I miei», il nome di una persona da
   accendere, un reparto da scegliere. E' un interruttore, e si vede se e'
   acceso: spento e' neutro, acceso e' pieno di accento. Ogni modulo aveva
   la sua versione (.lav-filtro-btn, .lav-tag-chip, .turni-toggle button),
   con tre gialli diversi per la stessa cosa. */
.filtro-tasto {
    display: inline-flex;
    align-items: center;
    gap: 0.3rem;
    min-height: 32px;
    padding: 0.2rem 0.7rem;
    border: 1px solid var(--c-border-mid);
    border-radius: 999px;
    background: var(--c-white);
    color: var(--c-text-dark);
    font-size: 0.82rem;
    font-weight: 600;
    line-height: 1.4;
    cursor: pointer;
    white-space: nowrap;
}

.filtro-tasto:hover { background: var(--c-bg-lighter); }

.filtro-tasto.attiva {
    background: var(--c-primary);
    border-color: var(--c-primary);
    color: var(--c-white);
}

/* Lo stesso oggetto, ma che non si tocca: e' un'etichetta, non un
   interruttore (i responsabili di un lavoro, visti da chi legge). */
.filtro-tasto.ferma {
    cursor: default;
    background: var(--c-bg-light);
    font-weight: 500;
}

.filtro-pastiglia .via {
    font-weight: 400;
    opacity: 0.6;
    font-size: 0.9em;
}

.filtro-pastiglia:hover { background: var(--c-primary-bg); }

.filtri-conto {
    margin-left: auto;
    font-size: 0.8rem;
    color: var(--c-text-muted);
    font-variant-numeric: tabular-nums;
}

.filtri-azzera {
    border: 0;
    background: none;
    color: var(--c-text-muted);
    font: inherit;
    font-size: 0.78rem;
    text-decoration: underline;
    text-underline-offset: 2px;
    cursor: pointer;
    padding: 0.15rem 0.2rem;
}

/* SEARCH BAR */

.search-input {
    width: 100%;
    max-width: 400px;
    padding: 0.7rem 1rem;
    border: 1px solid var(--c-border-mid);
    border-radius: var(--radius-sm);
    font-size: 0.95rem;
    background: var(--c-bg-light);
    transition: border-color 0.2s, box-shadow 0.2s;
}


/* ── Le viste di un modulo ─────────────────────────────────────────────
   Sono lo stesso dato con un altro filtro - Attivi, Storico, Archivio -
   quindi stanno accanto ai dati, non nella barra in alto insieme ai
   moduli. Sottolineate, non a pastiglie: le pastiglie qui vicino sono i
   filtri, e due cose che si toccano allo stesso modo devono fare la stessa
   cosa. */
.viste-modulo {
    display: flex;
    align-items: stretch;
    gap: 0.5rem;
    margin: 0 0 1rem;
    border-bottom: 1px solid var(--c-border);
}

.viste-linguette {
    display: flex;
    gap: 0.15rem;
    overflow-x: auto;
    scrollbar-width: none;
}

.viste-linguette::-webkit-scrollbar { display: none; }

.viste-modulo .vista {
    display: inline-flex;
    align-items: center;
    min-height: 40px;
    padding: 0 0.85rem;
    border-bottom: 2px solid transparent;
    color: var(--c-text-muted);
    font-size: 0.92rem;
    font-weight: 500;
    text-decoration: none;
    white-space: nowrap;
}

/* La linguetta puo' essere un collegamento (una vista che e' una pagina)
   o un pulsante (una vista che e' un pannello della stessa pagina): il
   pulsante porta con se' la cornice del browser, e va toglierla, altrimenti
   le due file di linguette non si somigliano. */
.viste-modulo button.vista {
    background: none;
    border: 0;
    border-bottom: 2px solid transparent;
    font: inherit;
    font-weight: 500;
    cursor: pointer;
}

.viste-modulo .vista:hover { color: var(--c-text-dark); }

.viste-modulo .vista.attiva {
    color: var(--c-primary-deep);
    border-bottom-color: var(--c-primary);
    font-weight: 600;
}

/* Quando le viste non sono pagine ma pannelli della stessa pagina (li
   scambia il JS senza ricaricare), le linguette sono le stesse: chi
   guarda non deve sapere se dietro c'e' un indirizzo nuovo. Il pannello
   acceso e' quello con .attiva, come la linguetta. */
.pannello-vista { display: none; }
.pannello-vista.attiva { display: block; }

/* L'ingranaggio: fuori dalla fila, a destra, discreto. */
.viste-modulo .vista-config {
    margin-left: auto;
    display: inline-flex;
    align-items: center;
    justify-content: center;
    min-width: 40px;
    min-height: 40px;
    /* L'ingranaggio e' l'emoji, lo stesso del Portale in alto a destra: i
       suoi colori sono suoi e `color` non lo tocca. A riposo sta a colori
       pieni come li' — smorzarlo lo faceva sembrare spento — e sotto il
       dito cresce di un niente. */
    font-size: 1.25rem;
    line-height: 1;
    text-decoration: none;
    border-bottom: 2px solid transparent;
    transition: transform .12s ease;
}

.viste-modulo .vista-config:hover { transform: scale(1.12); }

.viste-modulo .vista-config.attiva {
    border-bottom-color: var(--c-primary);
}


/* Quando le voci del modulo sono diventate linguette, la barra in alto
   resta con la sola scritta del modulo: il tasto del menu non deve aprire
   un cassetto vuoto. */
.navbar-container:has(.navbar-menu:empty) .navbar-toggle { display: none; }
/* MODAL */
.modal {
    display: none;
    position: fixed;
    z-index: var(--z-modal-backdrop, 1000);
    left: 0;
    top: 0;
    width: 100%;
    height: 100%;
    background-color: rgba(0,0,0,0.45);
    overflow: auto;
    /* Il velo non passa la spinta alla pagina sotto: arrivato in fondo,
       il dito non trascina piu' il listone dietro al foglio. */
    overscroll-behavior: contain;
    backdrop-filter: blur(2px);
}

.modal.active {
    display: flex;
    align-items: center;
    justify-content: center;
    padding: 1rem 0;
    animation: pageFadeIn 0.25s ease;
}

/* ══════════════════════════════════════════════════════════════════════
   LA PAGINA DIETRO STA FERMA.

   `apriModal()` mette `overflow: hidden` sul <body>, e finora non e'
   servito a niente: piu' su c'e' `html, body { overflow-x: hidden }`, e
   quando l'<html> non e' piu' `visible` e' lui a comandare lo scorrimento
   della finestra — quello del <body> smette di contare. Il velo si
   apriva e la pagina sotto continuava a scorrere come prima.

   Il blocco va messo sull'<html>. E va messo in CSS, non in JS: mezzo
   portale apre i modal con `classList.add('active')` senza passare da
   `apriModal()`, e quelli non avrebbero mai chiamato il blocco. Con
   `:has()` il blocco segue il modal, chiunque lo apra e comunque lo
   chiuda. */
html:has(.modal.active),
body:has(.modal.active) {
    overflow: hidden;
    overscroll-behavior: none;
}

/* Portale modal: root che si trova alla fine del <body>. I modal
   al suo interno sono isolati dagli stacking contexts delle pagine. */
#modal-root {
    position: relative;
    z-index: var(--z-modal-backdrop, 1000);
}
#modal-root .modal.active {
    z-index: var(--z-modal, 1010);
}

.modal-content {
    background-color: var(--c-white);
    padding: 0;
    border-radius: var(--radius-lg);
    width: var(--modal-width);
    max-width: var(--modal-max-width, 700px);
    max-height: var(--modal-max-height, 92vh);
    /* margin:auto invece del solo align-items: centrato in un contenitore
       che scorre, il bordo alto finisce fuori schermo e non si raggiunge. */
    margin: auto;
    overflow-y: auto;
    overflow-x: hidden;
    box-shadow: var(--modal-shadow);
    animation: modalSlideUp 0.3s cubic-bezier(0.34, 1.56, 0.64, 1);
}

/* Scrollbar sottile nel modal */
.modal-content::-webkit-scrollbar {
    width: 5px;
}
.modal-content::-webkit-scrollbar-track {
    background: transparent;
}
.modal-content::-webkit-scrollbar-thumb {
    background: var(--c-border-mid);
    border-radius: 10px;
}
.modal-content::-webkit-scrollbar-thumb:hover {
    background: var(--c-text-lighter);
}

@keyframes modalSlideUp {
    from { opacity: 0; transform: translateY(24px) scale(0.97); }
    to { opacity: 1; transform: translateY(0) scale(1); }
}

/* Modal sizing variants */
.modal-content.modal-sm {
    max-width: 460px;
}
.modal-content.modal-md {
    max-width: 600px;
}
.modal-content.modal-lg {
    max-width: 900px;
}
.modal-content.modal-xl {
    max-width: 1100px;
}

.modal-header {
    display: flex;
    justify-content: space-between;
    align-items: center;
    padding: 1rem 2rem;
    border-bottom: 1px solid var(--c-border);
    background: var(--c-bg-light);
    border-radius: var(--radius-lg) var(--radius-lg) 0 0;
    position: sticky;
    top: 0;
    z-index: 10;
}

.modal-title {
    font-size: 1.15rem;
    color: var(--c-primary-dark);
    font-weight: 700;
    margin: 0;
    line-height: 1.3;
}

.modal-body {
    padding: 1.25rem 2rem;
    overflow-x: auto;
    -webkit-overflow-scrolling: touch;
}

/* Compact form inside modals */
.modal .form-label {
    margin-bottom: 0.2rem;
    font-size: 0.88rem;
}

.modal .form-control {
    padding: 0.45rem 0.65rem;
    font-size: 0.92rem;
}

.modal textarea.form-control {
    resize: vertical;
    min-height: 2.2rem;
}

.modal-footer {
    display: flex;
    justify-content: flex-end;
    gap: 0.6rem;
    padding: 0.85rem 2rem;
    border-top: 1px solid var(--c-border);
    background: var(--c-bg-light);
    border-radius: 0 0 var(--radius-lg) var(--radius-lg);
    position: sticky;
    bottom: 0;
    z-index: 10;
    flex-wrap: wrap;
}


.modal-close {
    font-size: 1.35rem;
    font-weight: 800;
    color: var(--c-danger-dark);
    cursor: pointer;
    line-height: 1;
    width: 34px;
    height: 34px;
    min-width: 34px;
    display: flex;
    align-items: center;
    justify-content: center;
    border-radius: var(--radius-sm);
    transition: background 0.18s, border-color 0.18s, color 0.18s, transform 0.18s, box-shadow 0.18s;
    background: var(--c-danger-bg-light);
    border: 1px solid var(--c-danger-bg);
    padding: 0;
}

.modal-close:hover {
    color: var(--c-white);
    background: var(--c-danger);
    border-color: var(--c-danger);
    transform: translateY(-1px);
    box-shadow: 0 4px 12px rgba(239, 68, 68, 0.22);
}

.modal-close:active {
    transform: scale(0.96);
}
/* BADGES & ALERTS — shared color system */
.badge {
    display: inline-flex;
    align-items: center;
    gap: 0.25rem;
    padding: 0.25rem 0.75rem;
    border-radius: var(--radius-pill);
    font-size: 0.82rem;
    font-weight: 600;
    white-space: nowrap;
    letter-spacing: 0.01em;
}

.badge-success {
    background: var(--c-success-bg);
    color: var(--c-success-darker);
}
.badge-danger,
.alert-danger {
    background: var(--c-danger-bg);
    color: var(--c-danger-darker);
}
.badge-warning,
.alert-warning {
    background: var(--c-warning-bg);
    color: var(--c-warning-darker);
}
.badge-info,
.alert-info {
    background: var(--c-info-bg);
    color: var(--c-info-darker);
}
.badge-info {
    border: 1px solid var(--c-info-bg-soft);
}
/* Verde tenue: la pastiglia che dice "di che cosa si tratta" quando la
   cosa e' del Portale e non un esito (il reparto di un lavoro, il tipo di
   una riga). Non e' ne' un allarme ne' un successo. */
.badge-primary {
    background: var(--c-primary-bg-soft);
    color: var(--c-primary-darker);
}

.badge-muted {
    background: var(--c-bg-light);
    color: var(--c-text-muted);
    border: 1px solid var(--c-border-light);
}
.badge-neutral {
    background: var(--c-bg-lighter);
    color: var(--c-text-darkish);
    border: 1px solid var(--c-border-mid);
    font-family: 'Consolas', monospace;
    font-size: 0.72rem;
}
/* Il battito era su tutte le pastiglie gialle: in una lista di venti
   lavori con la priorita' media, venti pastiglie che pulsano sono un
   albero di Natale, e quando pulsa tutto non pulsa niente. Ora e' una
   scelta, per l'unica pastiglia che deve farsi notare. */
.badge-pulsa {
    animation: badgePulse 2s ease-in-out infinite;
}
.badge--xs { font-size: 0.7rem; margin-left: 4px; }
.link-clean { color: inherit; text-decoration: none; }

/* Turni grid (modulo Ore + Turni) — celle giorno compatte */
.turni-day-label {
    font-size: 0.72rem;
    font-weight: 600;
    margin-bottom: 2px;
}
.turni-day-select {
    width: 56px;
    font-size: 0.7rem;
    padding: 1px 2px;
    border-radius: 3px;
    border: 1px solid var(--c-border-mid);
}

.alert {
    padding: 1rem 1.5rem;
    border-radius: 6px;
    margin-bottom: 1rem;
}
.alert-danger {
    border-left: 4px solid var(--c-danger);
}
.alert-warning {
    border-left: 4px solid var(--c-warning);
}
.alert-info {
    border-left: 4px solid var(--c-info);
}
/* Variant compatta per liste avvisi inline */
.alert-compact {
    padding: 0.4rem 0.6rem;
    margin-bottom: 0.35rem;
    font-size: 0.85rem;
    border-radius: 5px;
}

/* TEXT UTILITIES */
.text-success {
    color: var(--c-success);
}
.text-warning {
    color: var(--c-warning);
}
.text-danger {
    color: var(--c-danger);
    font-weight: bold;
}

/* DATE INDICATORS */
.date-ok {
    color: var(--c-success-dark);
    font-weight: bold;
}
.date-overdue {
    color: var(--c-danger-dark);
    font-weight: bold;
}
.date-na {
    color: var(--c-text-muted);
}

/* EMPTY STATES */
.error-state {
    text-align: center;
    padding: 1rem 0;
    color: var(--c-danger);
}
.empty-state--success {
    text-align: center;
    color: var(--c-success);
}

/* CARD HEADER WITH ACTIONS */
.card-header-actions {
    display: flex;
    justify-content: space-between;
    align-items: center;
    margin-bottom: 1.5rem;
}
.card-header-actions .card-title {
    margin: 0;
}

/* SEARCH DROPDOWN */
.search-dropdown-wrap {
    position: relative;
}
.search-dropdown {
    display: block;
    position: absolute;
    z-index: var(--z-modal-backdrop);
    background: white;
    border: 1px solid var(--c-border-mid);
    border-radius: 8px;
    box-shadow: 0 4px 12px rgba(0,0,0,0.15);
    max-height: 300px;
    overflow-y: auto;
    overflow-x: hidden;
    margin-top: 4px;
    width: 100%;
}
.search-dropdown-item {
    padding: 0.75rem 1rem;
    cursor: pointer;
    border-bottom: 1px solid var(--c-border);
    transition: background 0.2s;
    word-wrap: break-word;
    overflow-wrap: break-word;
}
.search-dropdown-item:hover {
    background: var(--c-border-light);
}
.search-dropdown-item:last-child {
    border-bottom: none;
}
.search-dropdown-empty {
    padding: 1rem;
    color: var(--c-text-muted);
    text-align: center;
}

/* FORM HINTS */
.form-hint {
    font-size: 0.85rem;
    color: var(--c-text-muted);
    display: block;
    margin-top: 0.25rem;
}

/* TIMELINE */
.timeline-entry {
    position: relative;
    padding-bottom: 2rem;
    animation: timelineSlideIn 0.4s ease backwards;
}
.timeline-entry--connected {
    border-left: 3px solid var(--c-text-muted);
}
.timeline-dot {
    position: absolute;
    left: -8px;
    width: 14px;
    height: 14px;
    border-radius: 50%;
    border: 3px solid white;
    background: var(--c-text-muted);
}
.timeline-card {
    margin-left: 1.5rem;
    background: white;
    padding: 1rem;
    border-radius: var(--radius-sm);
    box-shadow: var(--shadow-sm);
}
.timeline-header {
    display: flex;
    justify-content: space-between;
    align-items: center;
    margin-bottom: 0.5rem;
}
.timeline-title {
    font-weight: bold;
    color: var(--c-text-muted);
}
.timeline-date {
    color: var(--c-text-muted);
    font-size: 0.875rem;
}
.timeline-body {
    margin: 0.5rem 0;
    color: var(--c-text-secondary);
}
.timeline-meta {
    display: flex;
    gap: 1rem;
    font-size: 0.875rem;
    color: var(--c-text-muted);
    margin-top: 0.5rem;
    flex-wrap: wrap;
    align-items: center;
}
.timeline-notes {
    margin-top: 0.75rem;
    padding-top: 0.75rem;
    border-top: 1px solid var(--c-border);
}
.timeline-notes-label {
    font-size: 0.85rem;
    font-weight: 600;
    color: var(--c-text-muted);
    margin-bottom: 0.5rem;
}
.timeline-notes-text {
    padding-left: 0.75rem;
    border-left: 2px solid var(--c-border-mid);
    font-size: 0.875rem;
    color: var(--c-text-secondary);
    white-space: pre-wrap;
}

/* BUTTON ICON */
.btn-icon {
    padding: 0.25rem 0.5rem;
    font-size: 1.1rem;
    border: none;
    background: transparent;
    cursor: pointer;
    transition: transform 0.2s;
}
.btn.btn-icon:hover:not(:disabled),
.btn-icon:hover {
    transform: scale(1.2);
    box-shadow: none;
}
.btn-icon.btn-danger:hover {
    color: var(--c-danger);
}

/* STATS CARDS */
.stats-grid {
    display: flex;
    flex-wrap: wrap;
    gap: 1rem;
    margin-bottom: 2.5rem;
}
.stat-card {
    background: white;
    padding: 1.25rem 1.5rem;
    border-radius: var(--radius-md);
    box-shadow: var(--shadow-sm);
    border: 1px solid var(--c-border);
    border-left: 4px solid var(--c-primary);
    flex: 1 1 150px;
    min-width: 0;
    transition: transform 0.2s, box-shadow 0.2s;
}
.stat-card:hover {
    transform: translateY(-1px);
    box-shadow: 0 4px 12px rgba(0,0,0,0.08);
}
.stat-label {
    color: var(--c-text-muted);
    font-size: 0.9rem;
    margin-bottom: 0.5rem;
}
.stat-value {
    font-size: 2rem;
    font-weight: bold;
    color: var(--c-text-darkest);
    transition: transform 0.3s;
}
.stat-card:hover .stat-value {
    transform: scale(1.05);
}
/* LOADING */
.loading,
.loading-state {
    text-align: center;
    padding: 2rem;
    color: var(--c-text-muted);
}
.loading::after,
.loading-state::after {
    content: '';
    display: inline-block;
    width: var(--loading-size);
    height: var(--loading-size);
    border: var(--loading-border-width) solid var(--c-border-mid);
    border-top-color: var(--c-primary);
    border-radius: 50%;
    animation: spin 0.6s linear infinite;
    margin-left: 0.5rem;
    vertical-align: middle;
}

.spinner,
.spinner-sm {
    display: inline-block;
    width: var(--loading-size);
    height: var(--loading-size);
    border: var(--loading-border-width) solid var(--c-border-mid);
    border-top-color: var(--c-primary);
    border-radius: 50%;
    animation: spin 0.6s linear infinite;
    vertical-align: middle;
}

.spinner-sm {
    width: 16px;
    height: 16px;
}

.is-loading,
[aria-busy="true"] {
    cursor: wait;
}

.btn.is-loading,
.btn[aria-busy="true"] {
    pointer-events: none;
    opacity: 0.72;
}

.btn.is-loading::before,
.btn[aria-busy="true"]::before {
    content: '';
    width: 1em;
    height: 1em;
    border: var(--loading-border-width) solid currentColor;
    border-right-color: transparent;
    border-radius: 50%;
    animation: spin 0.6s linear infinite;
}

/* RICAMBI ROW (manutenzione) */
.ricambio-row {
    display: grid;
    grid-template-columns: 2fr 1fr 1fr auto;
    gap: 0.5rem;
    margin-bottom: 0.5rem;
    padding: 0.5rem;
    background-color: white;
    border: 1px solid var(--c-border-grey);
    border-radius: 4px;
    align-items: start;
}

/* MANUTENZIONE BUTTONS */
.manutenzione-buttons {
    display: grid;
    grid-template-columns: 1fr 1fr;
    gap: 1rem;
    margin-top: 1.5rem;
}
.manutenzione-buttons .btn {
    width: 100%;
}

/* HOMEPAGE CARDS */
/* I numeri di riepilogo: una striscia, non dieci manifesti.
   Erano dieci riquadri da centosessanta pixel l'uno: 590 px di schermo per
   dieci numeri, e il primo ordine compariva sotto la piega. Sono numeri che
   si guardano di sfuggita e si toccano per filtrare - quindi stanno in
   fila, piccoli, e la lista comincia subito sotto.
   Sotto i 760px diventa una striscia che scorre di lato: la regola sta in
   60-responsive, non in compatto.css, perche' questa striscia la vedono
   tutti i moduli e non solo quelli che caricano il foglio del telefono. */
.home-grid,
.stats-grid {
    display: grid;
    grid-template-columns: repeat(auto-fit, minmax(132px, 1fr));
    gap: 1px;
    background: var(--c-border);
    border: 1px solid var(--c-border);
    border-radius: var(--radius-sm);
    overflow: hidden;
    margin: 0 0 1rem;
}
.home-card {
    background: var(--c-white);
    padding: 0.5rem 0.75rem 0.6rem;
    border: 0;
    border-radius: 0;
    box-shadow: none;
    display: flex;
    flex-direction: column;
    align-items: flex-start;
    justify-content: center;
    gap: 0.1rem;
    cursor: pointer;
    text-decoration: none;
    color: inherit;
    position: relative;
    min-height: 58px;
}

.home-card:hover { background: var(--c-bg-lighter); }

/* Il riquadro acceso e' quello su cui si sta filtrando: si vede da una
   riga sotto, non da un'ombra. */
.home-card.stat-card-active {
    background: var(--c-primary-bg-pale);
    box-shadow: inset 0 -3px 0 var(--c-primary);
}

/* L'icona non serve a distinguere un numero da un altro: lo fa la parola.
   Dieci emoji in fila erano un albero di Natale. */
.home-card-icon { display: none; }
.home-card-info {
    min-width: 0;
}
/* Nella striscia il nome sta sopra, piccolo, e la cifra sotto, grande:
   in colonna fra un riquadro e l'altro i numeri si confrontano a occhio. */
.home-card-title {
    order: 1;
    font-size: 0.72rem;
    font-weight: 600;
    text-transform: uppercase;
    letter-spacing: 0.04em;
    color: var(--c-text-muted);
    margin: 0;
    line-height: 1.25;
    /* Due righe al massimo, poi taglia: "Ordini Attivi" ridotto a "O..."
       non e' un'etichetta, e in 132px ci sta per intero. */
    display: -webkit-box;
    -webkit-line-clamp: 2;
    -webkit-box-orient: vertical;
    overflow: hidden;
    max-width: 100%;
}

/* La riga di spiegazione sotto il nome non serve nella striscia: il nome
   e' gia' la spiegazione, e ripeterla raddoppiava l'altezza. */
.home-card-desc { display: none; }

.home-card-count {
    order: 2;
    font-size: 1.5rem;
    font-weight: 700;
    color: var(--c-text-darkest);
    line-height: 1.05;
    font-variant-numeric: tabular-nums;
    letter-spacing: -0.02em;
}
/* I moduli che scrivono la riga di numeri con .stat-card (venti pagine)
   entrano nella stessa striscia: il riquadro bianco con l'ombra e il bordo
   colorato, dentro una griglia da un pixel di stacco, diventava un
   francobollo per numero. La cornice la fa la striscia; il riquadro no. */
.stats-grid > .stat-card {
    background: var(--c-white);
    padding: 0.5rem 0.75rem 0.6rem;
    border: 0;
    border-left: 0;
    border-radius: 0;
    box-shadow: none;
    min-width: 0;
    max-width: none;
    min-height: 58px;
    display: flex;
    flex-direction: column;
    justify-content: center;
    gap: 0.1rem;
    transition: background 0.15s;
}
.stats-grid > .stat-card:hover {
    transform: none;
    box-shadow: none;
    background: var(--c-bg-lighter);
}
.stats-grid > .stat-card[data-action],
.stats-grid > .stat-card[data-navigate],
.stats-grid > .stat-card[onclick] {
    cursor: pointer;
}
.stats-grid > .stat-card.stat-card-active {
    background: var(--c-primary-bg-pale);
    box-shadow: inset 0 -3px 0 var(--c-primary);
    transform: none;
}
.stats-grid > .stat-card > .stat-label {
    font-size: 0.72rem;
    font-weight: 600;
    text-transform: uppercase;
    letter-spacing: 0.04em;
    color: var(--c-text-muted);
    margin: 0;
    line-height: 1.25;
    display: -webkit-box;
    -webkit-line-clamp: 2;
    -webkit-box-orient: vertical;
    overflow: hidden;
}
.stats-grid > .stat-card > .stat-value {
    font-size: 1.5rem;
    font-weight: 700;
    color: var(--c-text-darkest);
    line-height: 1.05;
    font-variant-numeric: tabular-nums;
    letter-spacing: -0.02em;
    transition: none;
}
.stats-grid > .stat-card:hover > .stat-value {
    transform: none;
}

/* La terza riga di un riquadro della striscia: da dove viene il numero.
   Serve dove il numero e' un totale che si scompone ("articoli 1.203 +
   spedizioni 84"), e in quel caso e' un dato, non una decorazione. */
.stats-grid > .stat-card > .stat-sub {
    font-size: 0.68rem;
    color: var(--c-text-lighter);
    line-height: 1.2;
    display: -webkit-box;
    -webkit-line-clamp: 2;
    -webkit-box-orient: vertical;
    overflow: hidden;
}

/* Riquadri col segno: entra, esce, e il totale che conta. Il colore non
   dice il valore (quello lo dice la cifra) ma di che natura e' la voce,
   ed e' l'unico modo per leggere una fila di dieci numeri contabili
   senza rileggere ogni etichetta. */
.stats-grid > .stat-card.stat-pos { background: var(--c-success-bg-mint); }
.stats-grid > .stat-card.stat-neg { background: var(--c-danger-bg-light); }
.stats-grid > .stat-card.stat-forte {
    background: var(--c-info-bg);
    box-shadow: inset 0 -3px 0 var(--c-info);
}

.home-card-count--arrow {
    color: var(--c-border-mid);
    font-size: 1.8rem;
    font-weight: 300;
}
.home-card-sub {
    font-size: 0.72rem;
    color: var(--c-text-muted);
    margin-top: 0.15rem;
}

/* ==================== I MODULI, DA UN MODULO ALL'ALTRO ====================
   Il markup e' uno (templates/_barra_moduli.html) e ha sempre i nomi scritti.
   Dove finisce lo decide `data-barra` sull'elemento radice, che scrive
   js/barra.js su scelta fatta in Utilita':

   - `alto` (predefinito): dentro il pannello del pulsante «Moduli», a
     griglia. Una fila di sole icone nella banda e' stata provata e buttata:
     venticinque disegnini senza nome non li legge nessuno;
   - `lato`: la colonna a sinistra, una voce per riga, col pulsante che
     sparisce perche' l'elenco e' gia' li'. */
.barra-moduli {
    display: flex;
    flex-direction: column;
    gap: 0.05rem;
}

.barra-modulo {
    display: flex;
    align-items: center;
    gap: 0.45rem;
    padding: 0.35rem 0.6rem;
    border-radius: var(--radius-sm);
    color: var(--c-text);
    font-size: 0.86rem;
    line-height: 1.2;
    text-decoration: none;
    white-space: nowrap;
    transition: background 0.15s ease, color 0.15s ease;
}

.barra-modulo:hover { background: var(--c-bg-lighter); }

.barra-modulo.attivo {
    background: var(--c-primary-bg-soft);
    color: var(--c-primary-dark);
    font-weight: 600;
}

.barra-modulo-icona {
    width: 1.4rem;
    font-size: 1.05rem;
    text-align: center;
}

/* Il nome e' la parte che si legge: se il posto non basta si accorcia lui,
   invece di allargare la colonna o mandare a capo. */
.barra-modulo-nome {
    flex: 1;
    min-width: 0;
    overflow: hidden;
    text-overflow: ellipsis;
}

/* L'INGRANAGGIO DELLA CONFIGURAZIONE — icona sola, ultima voce.
   La parola "Configurazione" si prendeva lo spazio delle pagine che si
   aprono ogni giorno, per una che si apre due volte l'anno. Resta l'icona,
   con un bersaglio quadrato perche' da sola sarebbe larga sedici pixel. */
.navbar-voce-ingranaggio > a {
    display: inline-flex;
    align-items: center;
    justify-content: center;
    min-width: 2.4rem;
}

/* Il ritorno al Portale sta con gli altri ma non e' un modulo: si stacca. */
.barra-modulo-casa {
    font-weight: 600;
    border-bottom: 1px solid var(--c-border-light);
    border-radius: var(--radius-sm) var(--radius-sm) 0 0;
    margin-bottom: 0.15rem;
    padding-bottom: 0.4rem;
}

/* Il pulsante «Moduli» sta accanto al ritorno al Portale, e le voci del
   modulo vanno a destra: sono due navigazioni diverse e si vede. */
.navbar-lanciatore {
    position: relative;
    margin-left: 1.6rem;
    margin-right: auto;
}

.navbar-lanciatore > a {
    display: inline-flex;
    align-items: center;
    gap: 0.4rem;
    padding: 0.35rem 0.6rem;
    border-radius: var(--radius-sm);
    color: var(--c-white);
    font-weight: 500;
    line-height: 1.15;
    text-decoration: none;
    white-space: nowrap;
    transition: background 0.2s ease;
}

.navbar-lanciatore > a:hover { background: rgba(255, 255, 255, 0.15); }

/* --- in alto: il pannello del pulsante «Moduli» --- */
.navbar-submenu-griglia {
    right: auto;
    left: 0;
    min-width: 34rem;
    max-width: min(52rem, calc(100vw - 2rem));
    max-height: 70vh;
    overflow-y: auto;
    padding: 0.5rem;
}

.navbar-submenu-griglia .barra-moduli {
    display: grid;
    grid-template-columns: repeat(3, minmax(9.5rem, 1fr));
    gap: 0.1rem 0.35rem;
}

.navbar-submenu-griglia .barra-modulo-casa { grid-column: 1 / -1; }

@media (max-width: 700px) {
    .navbar-submenu-griglia { min-width: 0; }
    .navbar-submenu-griglia .barra-moduli { grid-template-columns: 1fr 1fr; }
}

/* --- di lato: la colonna a sinistra --- */
:root[data-barra="lato"] .navbar {
    position: fixed;
    top: 0;
    left: 0;
    bottom: 0;
    width: 12.5rem;
    padding: 0.8rem 0.5rem;
    overflow-y: auto;
    overscroll-behavior: contain;
}

:root[data-barra="lato"] .navbar-container {
    flex-direction: column;
    align-items: stretch;
    gap: 0.45rem;
    max-width: none;
    flex-wrap: nowrap;
}

:root[data-barra="lato"] .navbar-brand {
    font-size: 1.15rem;
    padding: 0 0.35rem 0.3rem;
    border-bottom: 1px solid rgba(255, 255, 255, 0.18);
}

:root[data-barra="lato"] .navbar-menu {
    flex-direction: column;
    align-items: stretch;
    gap: 0.15rem;
}

:root[data-barra="lato"] .navbar-menu a { justify-content: flex-start; }

/* L'elenco dei moduli viene prima delle voci del modulo, e non e' piu' un
   pannello a tendina: e' la colonna. */
:root[data-barra="lato"] .navbar-lanciatore {
    margin-right: 0;
    padding-bottom: 0.35rem;
    border-bottom: 1px solid rgba(255, 255, 255, 0.18);
}

:root[data-barra="lato"] .navbar-lanciatore > a { display: none; }

:root[data-barra="lato"] .navbar-submenu-griglia,
:root[data-barra="lato"] .navbar-submenu-griglia.open {
    display: block;
    position: static;
    min-width: 0;
    max-height: none;
    padding: 0;
    background: transparent;
    box-shadow: none;
    overflow: visible;
}

:root[data-barra="lato"] .navbar-submenu-griglia .barra-modulo {
    color: rgba(255, 255, 255, 0.85);
}

:root[data-barra="lato"] .navbar-submenu-griglia .barra-modulo:hover {
    background: rgba(255, 255, 255, 0.14);
    color: var(--c-white);
}

:root[data-barra="lato"] .navbar-submenu-griglia .barra-modulo.attivo {
    background: rgba(255, 255, 255, 0.2);
    color: var(--c-white);
}

:root[data-barra="lato"] .barra-modulo-casa {
    border-bottom-color: rgba(255, 255, 255, 0.18);
}

/* Il contenuto si sposta di quanto e' larga la colonna: sul body, cosi'
   seguono anche le linguette, il banner del cluster e tutto il resto. */
:root[data-barra="lato"] body { padding-left: 12.5rem; }

/* Su schermo stretto la colonna non ci sta: si torna in alto da soli,
   qualunque sia la scelta. */
@media (max-width: 900px) {
    :root[data-barra="lato"] .navbar {
        position: sticky;
        top: 0;
        left: auto;
        bottom: auto;
        width: auto;
        padding: 0.75rem 1rem;
        overflow: visible;
    }

    :root[data-barra="lato"] .navbar-container {
        flex-direction: row;
        align-items: center;
        flex-wrap: wrap;
    }

    :root[data-barra="lato"] .navbar-brand {
        border-bottom: 0;
        padding: 0;
    }

    :root[data-barra="lato"] .navbar-menu {
        flex-direction: row;
        align-items: center;
    }

    :root[data-barra="lato"] .navbar-lanciatore {
        margin-right: auto;
        border-bottom: 0;
        padding-bottom: 0;
    }

    :root[data-barra="lato"] .navbar-lanciatore > a { display: inline-flex; }

    :root[data-barra="lato"] .navbar-submenu-griglia {
        position: absolute;
        display: none;
        min-width: 0;
        padding: 0.5rem;
        background: var(--c-white);
        box-shadow: 0 6px 18px rgba(0, 0, 0, 0.15);
        max-height: 70vh;
        overflow-y: auto;
    }

    :root[data-barra="lato"] .navbar-submenu-griglia.open { display: block; }

    :root[data-barra="lato"] .navbar-submenu-griglia .barra-modulo {
        color: var(--c-text);
    }

    :root[data-barra="lato"] body { padding-left: 0; }
}

/* In stampa la navigazione non c'entra niente. */
@media print {
    .navbar-lanciatore { display: none; }
    :root[data-barra="lato"] body { padding-left: 0; }
}
/* RESPONSIVE - TABLET */
@media (max-width: 1024px) {
    .container {
        padding: 0 1rem;
        margin: 1rem auto;
    }

    /* La striscia dei numeri si sistema da sola con auto-fit: qui non
       serve ne' imporre due colonne ne' rimettere lo stacco fra i
       riquadri, che nella striscia e' il separatore da un pixel. */

    .table th, .table td {
        padding: 0.6rem 0.5rem;
        font-size: 0.85rem;
    }

    .modal-content {
        width: 90%;
        max-width: 600px;
        margin: 1.5rem auto;
    }

    .card {
        padding: 1rem;
    }

    .card-title {
        font-size: 1.15rem;
    }

    .ricambio-row {
        grid-template-columns: 2fr 1fr 1fr auto;
        gap: 0.4rem;
    }

    .manutenzione-buttons {
        gap: 0.75rem;
    }
}

/* RESPONSIVE - MOBILE (smartphone moderni: 360-430px CSS width) */
@media (max-width: 768px) {
    .navbar {
        padding: 0.6rem 0.75rem;
    }

    .navbar-toggle {
        display: block;
    }

    .navbar-brand {
        font-size: 1.1rem;
    }

    .navbar-menu {
        display: none;
        flex-direction: column;
        width: 100%;
        gap: 0;
        margin-top: 0.75rem;
        padding-top: 0.75rem;
        border-top: 1px solid rgba(255,255,255,0.2);
    }

    .navbar-container.menu-open .navbar-menu {
        display: flex;
    }

    .navbar-menu li {
        padding: 0.3rem 0;
    }

    .navbar-menu a {
        display: flex;
        align-items: center;
        padding: 0.5rem 0;
        font-size: 0.95rem;
        min-height: 44px;
    }

    .navbar-menu a.active {
        padding: 0.5rem 0.5rem;
    }

    .navbar-menu a.navbar-tile,
    .navbar-menu a.navbar-tile.active {
        width: 100%;
        min-width: 0;
        min-height: 44px;
        flex-direction: row;
        justify-content: flex-start;
        gap: 0.55rem;
        padding: 0.5rem 0.65rem;
        text-align: left;
    }

    .magazzino-tabs {
        flex-wrap: wrap;
        padding: 0 0.25rem;
    }

    .magazzino-tab {
        padding: 0.55rem 0.85rem;
        font-size: 0.85rem;
    }

    .container {
        padding: 0 0.5rem;
        margin: 0.75rem auto;
    }

    .card {
        padding: 0.75rem;
        margin-bottom: 0.75rem;
        border-radius: 10px;
    }

    /* ══════════════════════════════════════════════════════════════════
       IL CONTORNO SI STRINGE — sul telefono lo schermo e' del contenuto.

       Misurato su un telefono da 390x844: in Lavori il primo lavoro
       cominciava a 525px, in Consegne Legna il primo ordine a 469px. Piu'
       di meta' schermo era contorno: il titolo della pagina col suo
       sottotitolo, la striscia dei numeri, e soprattutto la fila dei
       filtri che andando a capo diventava tre righe dentro una card con
       la sua cornice.

       Il titolo si stringe, i filtri e i tasti stanno in una riga sola
       che scorre di lato (come la striscia dei numeri: si scorrono col
       pollice e restano tutti raggiungibili), e la card che contiene solo
       i filtri non aggiunge la propria cornice. */
    .card-gradient {
        padding: 0.15rem 0 0.45rem;
        margin-bottom: 0.5rem;
    }

    .card-gradient .card-title,
    .card-gradient .card-title-white {
        font-size: 1.1rem;
        margin-bottom: 0.1rem;
    }

    .card-gradient .card-subtitle,
    .card-gradient .card-subtitle-white {
        font-size: 0.76rem;
        margin: 0;
        /* La spiegazione serve a chi arriva la prima volta: due righe al
           massimo, poi si taglia. */
        display: -webkit-box;
        -webkit-line-clamp: 2;
        -webkit-box-orient: vertical;
        overflow: hidden;
    }

    /* Una riga sola che scorre, invece di tre righe che vanno a capo. */
    .filtri-bar,
    .card-header-actions .u-flex,
    .card-header-actions .d-flex {
        flex-wrap: nowrap;
        overflow-x: auto;
        overflow-y: hidden;
        -webkit-overflow-scrolling: touch;
        scrollbar-width: none;
        padding-bottom: 0.15rem;
    }

    .filtri-bar::-webkit-scrollbar,
    .card-header-actions .u-flex::-webkit-scrollbar,
    .card-header-actions .d-flex::-webkit-scrollbar { display: none; }

    .filtri-bar > *,
    .card-header-actions .u-flex > *,
    .card-header-actions .d-flex > * { flex: 0 0 auto; }

    /* Il campo di ricerca e' l'unico che vale la sua riga: e' quello che
       si usa piu' di tutti, e mezzo campo non si scrive. */
    .filtri-bar input[type="search"],
    .filtri-bar input[type="text"],
    .card-header-actions .u-flex > input[type="search"],
    .card-header-actions .u-flex > input[type="text"] {
        flex: 1 0 12rem;
        min-width: 12rem;
    }

    /* La card che contiene soltanto la fila dei filtri non e' una card:
       e' una barra. Senza la sua cornice si guadagnano trenta pixel. */
    .card:has(> .card-header-actions):not(:has(table)):not(:has(.stats-grid)) {
        padding: 0.5rem;
        margin-bottom: 0.5rem;
    }

    /* LA BARRA DELLE AZIONI di una lista — ricerca, filtri e il tasto che
       apre la cosa nuova. E' scritta come `.card > .page-header-flex`, e
       sul telefono diventava tre righe dentro una card con la sua cornice:
       194px in Lavori, 298px in Magazzino, prima di vedere il primo dato.
       Qui e' una riga sola che scorre di lato, e la card intorno smette di
       fare la card: e' una barra. */
    .card > .page-header-flex,
    .card > .card-header-actions {
        flex-direction: row;
        align-items: center;
        flex-wrap: nowrap;
        overflow-x: auto;
        overflow-y: hidden;
        -webkit-overflow-scrolling: touch;
        scrollbar-width: none;
        gap: 0.4rem;
        margin-bottom: 0;
    }

    .card > .page-header-flex::-webkit-scrollbar,
    .card > .card-header-actions::-webkit-scrollbar { display: none; }

    .card > .page-header-flex > *,
    .card > .card-header-actions > * { flex: 0 0 auto; }

    .card > .page-header-flex .d-flex,
    .card > .page-header-flex .u-flex,
    .card > .card-header-actions .d-flex,
    .card > .card-header-actions .u-flex {
        flex-wrap: nowrap;
        gap: 0.4rem;
    }

    /* La ricerca resta larga da scriverci dentro - undici rem sono
       "Cerca articolo..." per intero - e il resto scorre. Prima ogni campo
       si prendeva una riga tutta sua (`flex: 1 1 100%`): con due ricerche,
       una tendina e quattro pastiglie facevano duecento pixel. */
    .card > .page-header-flex input[type="text"],
    .card > .page-header-flex input[type="search"],
    .card > .page-header-flex select,
    .card > .card-header-actions input[type="text"],
    .card > .card-header-actions input[type="search"],
    .card > .card-header-actions select {
        flex: 0 1 11rem;
        width: auto;
        min-width: 9rem;
        max-width: none;
    }

    /* I gruppi dentro la barra restano in fila anche loro: il campo col suo
       tasto, la tendina che suggerisce, le pastiglie dei filtri. */
    .card > .page-header-flex .cp-campo-azione,
    .card > .page-header-flex .ac-wrap,
    .card > .page-header-flex .cp-filtri,
    .card > .card-header-actions .cp-campo-azione,
    .card > .card-header-actions .ac-wrap,
    .card > .card-header-actions .cp-filtri {
        flex: 0 0 auto;
        flex-wrap: nowrap;
        min-width: 0;
    }

    .card > .page-header-flex .cp-campo-azione > input,
    .card > .card-header-actions .cp-campo-azione > input {
        flex: 0 1 11rem;
        min-width: 9rem;
    }

    /* IL TASTO CHE APRE LA COSA NUOVA NON SCORRE VIA. La barra scorre di
       lato, ma "+ Nuovo ordine" e' il motivo per cui si apre quella
       pagina: appiccicato al bordo destro resta sempre sotto il pollice.
       Senza questo, dopo aver stretto la barra in una riga sola, il tasto
       finiva oltre il bordo e non lo si trovava piu'. */
    .card > .page-header-flex > .btn-primary,
    .card > .page-header-flex > .btn-success,
    .card > .card-header-actions > .btn-primary,
    .card > .card-header-actions > .btn-success {
        position: sticky;
        right: 0;
        z-index: 1;
        box-shadow: -10px 0 10px -6px rgba(0, 0, 0, 0.18);
    }

    /* MA NON DEVE COPRIRE IL RESTO. Appiccicato sopra una barra che scorre,
       il tasto si mangiava quello che gli passava sotto: in Fitofarmaci la
       ricerca sembrava tagliata a metà e i due tasti «Esporta Metodo» e
       «Stato Metodo» erano invisibili, senza niente che dicesse che c'erano.
       Quando i filtri stanno in un gruppo loro **e' quel gruppo a scorrere**,
       e il tasto sta fuori, alla sua destra: si vede tutta la ricerca, i
       tasti nascosti si scoprono scorrendo la striscia, e nulla finisce
       sotto il verde. La barra resta pronta a scorrere lei per i casi
       stretti (in ordini, dove accanto al tasto ce n'e' un secondo), ma il
       tasto non e' piu' appiccicato: meglio scorrere fino a trovarlo che
       vederselo sopra le altre cose. Dove i filtri sono figli diretti della
       barra, senza un gruppo, non cambia niente. */
    .card > .page-header-flex:has(> .d-flex, > .u-flex) > .btn-primary,
    .card > .page-header-flex:has(> .d-flex, > .u-flex) > .btn-success,
    .card > .card-header-actions:has(> .d-flex, > .u-flex) > .btn-primary,
    .card > .card-header-actions:has(> .d-flex, > .u-flex) > .btn-success {
        position: static;
        box-shadow: none;
    }

    .card > .page-header-flex > .d-flex,
    .card > .page-header-flex > .u-flex,
    .card > .card-header-actions > .d-flex,
    .card > .card-header-actions > .u-flex {
        flex: 1 1 auto;
        /* Sotto le otto rem la ricerca non e' piu' una ricerca: si vedono tre
           lettere. Se il resto non ci sta e' la barra a scorrere, non il
           campo a sparire. */
        min-width: 8rem;
        overflow-x: auto;
        overflow-y: hidden;
        -webkit-overflow-scrolling: touch;
        scrollbar-width: none;
    }

    .card > .page-header-flex > .d-flex::-webkit-scrollbar,
    .card > .page-header-flex > .u-flex::-webkit-scrollbar,
    .card > .card-header-actions > .d-flex::-webkit-scrollbar,
    .card > .card-header-actions > .u-flex::-webkit-scrollbar { display: none; }

    /* Una card che contiene solo la barra non aggiunge la sua cornice. */
    .card:has(> .page-header-flex):not(:has(table)):not(:has(.stats-grid)):not(:has(.cp-lista)) {
        padding: 0.4rem 0.5rem;
        margin-bottom: 0.5rem;
        border-radius: 8px;
    }

    /* Le linguette e la striscia dei numeri: un filo piu' basse. */
    .viste-modulo { margin-bottom: 0.5rem; }
    .viste-modulo .vista { min-height: 36px; }
    .stats-grid > *,
    .home-grid > * { min-height: 46px; }

    .card-title {
        font-size: 1.05rem;
        margin-bottom: 0.5rem;
    }

    .form-row {
        flex-direction: column;
    }


    /* 16px previene zoom automatico iOS su focus input */
    .form-control {
        font-size: 16px;
        padding: 0.45rem 0.6rem;
    }

    .table-container,
    .table-responsive {
        font-size: 0.82rem;
        margin-top: 0.5rem;
    }

    .table th, .table td {
        padding: 0.4rem 0.3rem;
        font-size: 0.82rem;
    }

    /* Variante opt-in: ogni td espone data-label e diventa una riga-card. */
    .table-responsive--cards {
        overflow: visible;
    }

    .table-responsive--cards .table thead {
        display: none;
    }

    .table-responsive--cards .table,
    .table-responsive--cards .table tbody,
    .table-responsive--cards .table tr,
    .table-responsive--cards .table td {
        display: block;
        width: 100%;
    }

    .table-responsive--cards .table tr {
        margin-bottom: 0.75rem;
        border: 1px solid var(--c-border);
        border-radius: var(--radius-sm);
        background: var(--c-white);
        box-shadow: var(--shadow-sm);
        overflow: hidden;
    }

    .table-responsive--cards .table td {
        display: grid;
        grid-template-columns: minmax(7rem, 38%) 1fr;
        gap: 0.75rem;
        text-align: right;
    }

    .table-responsive--cards .table td::before {
        content: attr(data-label);
        color: var(--c-text-muted);
        font-weight: 600;
        text-align: left;
    }

    /* Nasconde colonne non essenziali su mobile */
    .hide-mobile {
        display: none !important;
    }

    /* Card header actions - stack vertically */
    .card-header-actions {
        flex-direction: column;
        gap: 0.4rem;
        align-items: stretch;
    }

    /* Le file di filtri e di pulsanti vanno a capo invece di uscire dallo
       schermo: su un telefono sei controlli con la loro misura minima
       fanno seicento pixel, e l'ultimo finiva oltre il bordo destro
       insieme a "Nuovo ordine". */
    .card-header-actions .u-flex,
    .card-header-actions .d-flex,
    .filtri-bar {
        flex-wrap: wrap;
        gap: 0.4rem;
    }
    .card-header-actions .u-flex > .form-control,
    .card-header-actions .u-flex > label {
        flex: 1 1 auto;
    }

    /* Page header flex (title + button) → stack */
    .page-header-flex {
        flex-direction: column;
        gap: 0.4rem;
        align-items: stretch;
    }

    /* LA RIGA DEI NUMERI SUL TELEFONO — una striscia che scorre di lato.
       Andando a capo, dieci numeri diventavano quattro righe: mezzo
       schermo speso prima di vedere il primo ordine. In fila si scorrono
       col pollice, e la lista comincia subito sotto. Sta qui e non in
       compatto.css perche' la riga di numeri ce l'hanno tutti i moduli,
       anche quelli che non caricano il foglio del telefono. */
    .home-grid,
    .stats-grid {
        display: flex;
        grid-template-columns: none;
        flex-wrap: nowrap;
        overflow-x: auto;
        overflow-y: hidden;
        -webkit-overflow-scrolling: touch;
        scroll-snap-type: x proximity;
        scrollbar-width: none;
    }
    .home-grid::-webkit-scrollbar,
    .stats-grid::-webkit-scrollbar { display: none; }

    .home-grid > *,
    .stats-grid > * {
        flex: 0 0 auto;
        width: 116px;
        max-width: none;
        scroll-snap-align: start;
    }


    .home-card-icon {
        font-size: 1.3rem;
    }

    .home-card-info {
        min-width: 0;
        overflow: hidden;
    }

    .home-card-title {
        font-size: 0.88rem;
        white-space: nowrap;
        overflow: hidden;
        text-overflow: ellipsis;
    }

    .home-card-desc {
        font-size: 0.68rem;
        white-space: nowrap;
        overflow: hidden;
        text-overflow: ellipsis;
    }

    .home-card-count {
        font-size: 1.2rem;
        min-width: 28px;
        text-align: right;
    }

    .home-card-count--arrow {
        font-size: 1.1rem;
    }

    /* ══════════════════════════════════════════════════════════════════
       IL MODAL SUL TELEFONO — un foglio che sale dal basso.

       Vale per **tutti** i modal, non solo per le pagine che caricano il
       foglio del telefono: se sono tutti figli dello stesso modal, sul
       telefono si devono comportare tutti allo stesso modo. Prima non era
       cosi': dieci template dichiaravano `.compatto` e i loro modal
       diventavano un foglio dal basso con la maniglia, il piede
       appiccicato e una colonna sola; tutti gli altri restavano un
       riquadro da scrivania rimpicciolito al 98% della larghezza, con i
       campi affiancati a centosettanta pixel l'uno.
       ══════════════════════════════════════════════════════════════════ */
    .modal.active,
    .modal:not(.hidden) {
        align-items: flex-end;
        padding: 0;
    }

    .modal-content,
    .modal-content.modal-sm,
    .modal-content.modal-md,
    .modal-content.modal-lg,
    .modal-content.modal-xl {
        display: flex;
        flex-direction: column;
        width: 100%;
        max-width: none;
        /* Non 100vh: sopra resta una striscia di velo, che dice che sotto
           c'e' ancora la pagina e si puo' tornare indietro. */
        max-height: 92vh;
        margin: 0;
        border-radius: 16px 16px 0 0;
        overflow: hidden;
    }

    /* ══════════════════════════════════════════════════════════════════
       IL FORM IN MEZZO — perche' i modal non scorrevano.

       Meta' dei modal del portale (sopralluoghi, robot, clienti, ricambi,
       utenti...) infilano un <form> fra il riquadro e il corpo:

           .modal-content > form > .modal-body + .modal-footer

       Il riquadro qui sopra e' una colonna flex con `overflow: hidden`, e
       il corpo chiede `flex: 1 1 auto; min-height: 0; overflow-y: auto`.
       Ma il corpo non e' figlio del riquadro: e' figlio del form, che e'
       un blocco normale. Quelle tre righe non valgono niente, il form
       cresce quanto il suo contenuto, il riquadro lo taglia a 92vh e
       quello che resta sotto non si raggiunge piu': il dito che prova a
       scorrere non trova niente da scorrere e trascina la pagina dietro.

       Il form (o qualunque altro involucro) deve essere una colonna flex
       anche lui, e deve potersi accorciare: `min-height: 0` e' la meta'
       che di solito si dimentica, senza quella un elemento flex non
       scende mai sotto l'altezza del proprio contenuto. */
    .modal-content > form,
    .modal-content > .modal-inner {
        display: flex;
        flex-direction: column;
        flex: 1 1 auto;
        min-height: 0;
    }

    .modal-header {
        position: sticky;
        top: 0;
        z-index: 2;
        flex: 0 0 auto;
        padding: var(--cp-pad-y, 0.7rem) var(--cp-pad-x, 0.85rem);
        background: var(--c-white);
        border-bottom: 1px solid var(--c-border);
        border-radius: 16px 16px 0 0;
    }

    .modal-title { font-size: 1.05rem; }

    /* La maniglia: dice che il foglio si tira giu', ed e' il segno che
       tutti riconoscono su un foglio che sale dal basso. */
    .modal-header::before {
        content: '';
        position: absolute;
        top: 6px;
        left: 50%;
        transform: translateX(-50%);
        width: 2.5rem;
        height: 4px;
        border-radius: 2px;
        background: var(--c-border-mid);
    }

    .modal-body {
        flex: 1 1 auto;
        min-height: 0;
        overflow-y: auto;
        -webkit-overflow-scrolling: touch;
        /* Arrivati in fondo all'elenco, il dito continua a spingere: senza
           questa riga la spinta passa alla pagina dietro, che si mette a
           scorrere sotto il foglio. `contain` la ferma qui. */
        overscroll-behavior: contain;
        padding: var(--cp-pad-x, 0.85rem);
        /* Un po' di aria in fondo: l'ultimo tasto della sezione deve poter
           uscire da sotto la barra dei tasti, non restarci mezzo sotto. */
        padding-bottom: 1.6rem;
    }

    /* Una colonna sola: due campi affiancati su 375px sono due campi da
       centosettanta pixel, dove non ci sta ne' una data ne' un indirizzo. */
    .modal-body .form-row {
        display: flex;
        flex-direction: column;
        gap: 0;
    }

    .modal-body .form-control,
    .modal-body input:not([type="checkbox"]):not([type="radio"]),
    .modal-body select,
    .modal-body textarea {
        width: 100%;
        min-height: var(--cp-tocco, 48px);
        font-size: 16px;   /* sotto i 16px iOS ingrandisce la pagina da solo */
    }

    /* Le caselle di spunta e i radio no: sono quadratini, non campi.
       Stirati a tutta larghezza e a 48px di altezza diventano un
       rettangolo enorme con l'etichetta dall'altra parte dello schermo. */
    .modal-body input[type="checkbox"],
    .modal-body input[type="radio"] {
        width: 1.25rem;
        height: 1.25rem;
        min-height: 0;
        flex: 0 0 auto;
        margin: 0;
    }

    /* Una spunta si tocca insieme alla sua etichetta: la riga intera e' il
       bersaglio, e il quadratino resta un quadratino. */
    .modal-body label:has(input[type="checkbox"]),
    .modal-body label:has(input[type="radio"]) {
        display: flex;
        align-items: center;
        gap: 0.6rem;
        min-height: var(--cp-tocco, 48px);
        margin: 0;
        text-transform: none;
        letter-spacing: normal;
        font-weight: 500;
    }

    .modal-body textarea { min-height: 5rem; }

    .modal-body .form-label {
        display: block;
        margin-bottom: 0.2rem;
        font-size: 0.72rem;
        font-weight: 700;
        text-transform: uppercase;
        letter-spacing: 0.04em;
        color: var(--c-text-muted);
    }

    /* I tasti restano in fondo, sempre visibili, e sono larghi da toccare.
       Il principale a destra: e' dove arriva il pollice di chi tiene il
       telefono in una mano sola. */
    .modal-footer {
        position: sticky;
        bottom: 0;
        z-index: 2;
        flex: 0 0 auto;
        display: flex;
        gap: 0.5rem;
        padding: var(--cp-pad-y, 0.7rem) var(--cp-pad-x, 0.85rem);
        padding-bottom: calc(var(--cp-pad-y, 0.7rem) + env(safe-area-inset-bottom, 0px));
        background: var(--c-white);
        border-top: 1px solid var(--c-border);
        border-radius: 0;
    }

    .modal-footer .btn {
        flex: 1;
        min-height: var(--cp-tocco, 48px);
        font-size: 0.95rem;
    }

    /* Il tasto di chiusura: un bersaglio vero, non una crocetta da 12px. */
    .modal-close {
        min-width: var(--cp-tocco, 48px);
        min-height: var(--cp-tocco, 48px);
        font-size: 1.5rem;
    }

    /* Buttons - toccabili ma non giganti.
       (Era attaccato a un `.modal` rimasto in aria senza graffa: la regola
       diventava `.modal .btn`, e i tasti fuori dai modal non prendevano
       mai la misura da telefono.) */
    .btn {
        padding: 0.5rem 0.9rem;
        font-size: 0.88rem;
        min-height: 40px;
    }

    .btn-sm {
        padding: 0.35rem 0.6rem;
        font-size: 0.8rem;
        min-height: 34px;
    }

    /* Ricambi row → 2 columns */
    .ricambio-row {
        grid-template-columns: 1fr 1fr;
    }

    /* Manutenzione buttons → stack on mobile */
    .manutenzione-buttons {
        grid-template-columns: 1fr;
    }

    /* Tabs on mobile */
    .tabs {
        gap: 0.15rem;
        overflow-x: auto;
        -webkit-overflow-scrolling: touch;
    }

    .tab-btn {
        padding: 0.5rem 0.7rem;
        font-size: 0.85rem;
        white-space: nowrap;
        flex-shrink: 0;
    }

    /* Search input full width */
    .search-input {
        max-width: 100%;
        font-size: 16px;
    }

    /* Badges */
    .badge {
        font-size: 0.75rem;
        padding: 0.2rem 0.55rem;
    }

    /* Timeline */
    .timeline-header {
        flex-direction: column;
        align-items: flex-start;
        gap: 0.2rem;
    }

    .timeline-card {
        margin-left: 1rem;
    }

    /* Toast su mobile */
    .toast {
        max-width: calc(100vw - 2rem);
        font-size: 0.88rem;
    }

    .qty-input {
        min-height: 36px;
        font-size: 1rem;
    }

    /* Autocomplete/dropdown items - toccabili */
    .autocomplete-item,
    .search-dropdown-item {
        padding: 0.65rem 0.85rem;
    }

    /* Calendario */
    .cal-day {
        min-height: 65px;
        padding: 0.25rem;
    }
    .cal-day-num {
        font-size: 0.75rem;
    }
    .cal-bar {
        height: 14px;
        font-size: 0.52rem;
        line-height: 14px;
    }
    .fasce-grid {
        gap: 0.3rem;
    }
    .fascia-check {
        min-width: 60px;
        padding: 0.3rem;
    }
    .fascia-label {
        font-size: 0.7rem;
    }
    .fascia-orario {
        font-size: 0.6rem;
    }

    /* Grid 2col */
    .grid-2col {
        grid-template-columns: 1fr;
    }
}

/* CONFIGURAZIONE - SECTION GROUP */
.section-group {
    margin-bottom: 2rem;
}

/* TABS */
.tabs {
    display: flex;
    gap: 0.25rem;
    margin-bottom: 1.5rem;
    border-bottom: 2px solid var(--c-border);
}

.tab-btn {
    padding: 0.7rem 1.25rem;
    background: transparent;
    border: none;
    border-bottom: 3px solid transparent;
    cursor: pointer;
    font-size: 0.95rem;
    font-weight: 600;
    color: var(--c-text-muted);
    transition: all 0.2s;
    border-radius: 6px 6px 0 0;
}

.tab-btn:hover {
    color: var(--c-primary-dark);
    background: var(--c-info-bg);
}

.tab-btn.active {
    color: var(--c-primary-dark);
    border-bottom-color: var(--c-primary-dark);
    background: transparent;
}


/* Nascondi i modal durante la stampa */
@media print {
    .modal {
        display: none !important;
    }
    .navbar {
        position: static;
    }
}

/* SCHERMI GRANDI (1920px+) */
@media (min-width: 1600px) {
    .container {
        max-width: 1800px;
    }

    /* Anche sul monitor grande la riga dei numeri resta una striscia:
       piu' spazio vuol dire piu' riquadri in fila, non riquadri piu'
       grandi. Ci pensa auto-fit. */

    .modal-content {
        max-width: 900px;
    }
}

/* Schermi compatti (360px iPhone SE, Galaxy A) - solo ritocchi layout, NON ridurre le dimensioni */
@media (max-width: 390px) {
    .container {
        padding: 0 0.5rem;
    }

    .card {
        padding: 0.85rem;
    }

    .card-title {
        font-size: 1.05rem;
    }

    .stats-grid > * {
        width: 108px;
    }

    .home-card-desc {
        display: none;
    }

    /* Ricambi row → single column su schermi stretti */
    .ricambio-row {
        grid-template-columns: 1fr;
    }
}

/* Nascondi il titolo del modal rapportino */
#rapportinoModal .modal-title {
    display: none;
}

/* Rapportino modal non viene toccato — no compact styles */
#rapportinoModal .modal-content {
    padding: 1.5rem 2rem;
}
#rapportinoModal #rapportinoModal .form-label {
    margin-bottom: 0.5rem;
    font-size: 1rem;
}
#rapportinoModal .form-control {
    padding: 0.7rem;
    font-size: 1rem;
}
/* ==================== LAYOUT HELPERS ==================== */

/* Page header: titolo + pulsante sulla stessa riga */
.page-header-flex {
    display: flex;
    justify-content: space-between;
    align-items: center;
    flex-wrap: wrap;
    gap: 0.75rem;
    margin-bottom: 1.5rem;
}
.page-header-flex .card-title {
    margin: 0;
}

/* Quando la barra e' l'unica cosa dentro la card, il margine sotto e'
   spazio vuoto: la cornice ha gia' il suo respiro, e ventiquattro pixel di
   niente prima del primo dato si notano. */
.card > .page-header-flex:only-child {
    margin-bottom: 0;
}

/* I tasti di un'intestazione, in fila. La usano corsi, flotta e scadenze,
   ma era definita **solo** nel foglio di scadenze: sulle altre due pagine
   la classe non faceva niente e i tasti restavano uno sotto l'altro.
   Adesso sta dove la vedono tutti. */
.header-actions {
    display: flex;
    align-items: center;
    gap: 0.5rem;
    flex-wrap: wrap;
}

/* Search input compatto (in barre filtri) */
.search-input-sm {
    max-width: 220px;
    padding: 0.45rem 0.7rem;
    font-size: 0.85rem;
    border: 1px solid var(--c-border-mid);
    border-radius: var(--radius-sm);
    background: var(--c-bg-light);
    transition: border-color 0.2s, box-shadow 0.2s;
}

/* Form-row > form-group con flex:1 di default */
.form-row >
/* Blocco ricorrente (ordini) */
.ricorrente-box {
    background: var(--c-info-bg);
    border-radius: 10px;
    padding: 0.75rem 1rem;
    border: 1px solid var(--c-primary-bg-soft);
}
.ricorrente-label {
    display: flex;
    align-items: center;
    gap: 0.5rem;
    cursor: pointer;
    font-weight: 600;
    font-size: 0.9rem;
    margin: 0;
}

/* Dettaglio info sections */
.det-label {
    font-size: 0.75rem;
    color: var(--c-text-muted);
    text-transform: uppercase;
    letter-spacing: 0.03em;
    margin-bottom: 0.15rem;
}
.det-value {
    font-size: 0.95rem;
    line-height: 1.4;
}
.det-grid {
    display: grid;
    grid-template-columns: 1fr 1fr;
    gap: 0.75rem;
}
@media (max-width: 600px) {
    .det-grid {
        grid-template-columns: 1fr;
    }
}

/* ==================== UTILITY CLASSES ==================== */

/* Flex utilities */
.d-flex {
    display: flex;
}
.flex-wrap {
    flex-wrap: wrap;
}
.items-center {
    align-items: center;
}
.items-start {
    align-items: flex-start;
}
.justify-between {
    justify-content: space-between;
}
.justify-end {
    justify-content: flex-end;
}
.flex-1 {
    flex: 1;
}

/* TomSelect wrapper inside un .d-flex deve espandersi come faceva il <select>
   originale (che aveva .flex-1). TomSelect non sempre propaga le classi del
   select al wrapper, e .ts-wrapper di default è width:auto: senza questa
   regola in un contenitore flex il control si restringe al contenuto
   lasciando spazio vuoto a sinistra. */
.d-flex > .ts-wrapper {
    flex: 1 1 auto;
    min-width: 0;
}

/* Gap utilities */
.gap-sm {
    gap: 0.5rem;
}
.gap-md {
    gap: 0.75rem;
}
.gap-lg {
    gap: 1rem;
}

/* Text utilities */
.text-center {
    text-align: center;
}
.text-right {
    text-align: right;
}
.text-lighter {
    color: var(--c-text-lighter);
}
/* Color utilities semantiche addizionali */
.text-info { color: var(--c-info-dark); }
.text-pink { color: var(--c-pink-dark); }
.text-violet { color: var(--c-violet-darker); }
.text-indigo { color: var(--c-indigo-medium); }
.text-warning-dark { color: var(--c-warning-darker); }

/* Divider sottile (riusabile dentro card/list) */
.divider-soft {
    margin: 0.5rem 0;
    border: none;
    border-top: 1px solid var(--c-border-light);
}
.row-faded { opacity: 0.7; }

/* Disabilita animazioni di un singolo elemento (es. badge ferie/malattia) */
.no-anim { animation: none !important; }

/* Paragrafo compatto (modali, riepiloghi) */
.p-tight { margin: 0 0 .4rem; }
.p-tight--lg { margin: 0 0 .4rem; font-size: 1.1rem; }
.list-tight { margin: .2rem 0 0 1.2rem; }

/* Td differenza ore (positiva/negativa/zero) */
.td-diff-pos { color: var(--c-success-dark); }
.td-diff-neg { color: var(--c-danger-dark); }
.td-diff-zero { color: var(--c-text-muted); }

/* Riga "di cui" sotto ai totali */
.tot-dicui { font-size: 8pt; }
.tot-dicui--label { font-size: 7.5pt; color: var(--c-text-muted); }

/* Font size utilities */
.fs-xs {
    font-size: 0.7rem;
}
.fs-sm {
    font-size: 0.8rem;
}
.fs-md {
    font-size: 0.85rem;
}
.fs-base {
    font-size: 0.95rem;
}
.fs-lg {
    font-size: 1.05rem;
}
.fs-xl {
    font-size: 1.15rem;
}

/* Grid utilities */
.grid-2col {
    display: grid;
    grid-template-columns: 1fr 1fr;
    gap: 1rem;
}

/* Spacing & position utilities */
.mb-0 {
    margin-bottom: 0;
}
[hidden],
.hidden,
.is-hidden {
    display: none !important;
}

/* Wrapper per autocomplete con dropdown posizionato (matricole, anagrafica…). */
.ac-wrap {
    position: relative;
}
.mb-1 { margin-bottom: 0.25rem; }
.mb-2 { margin-bottom: 0.5rem; }
.mb-3 { margin-bottom: 1rem; }
.mb-4 { margin-bottom: 1.5rem; }
.mt-0 { margin-top: 0; }
.mt-1 { margin-top: 0.25rem; }
.mt-2 { margin-top: 0.5rem; }
.mt-3 { margin-top: 1rem; }
.mt-4 { margin-top: 1.5rem; }
.m-0 { margin: 0; }
.p-0 { padding: 0; }
.w-100 { width: 100%; }
.w-auto { width: auto; }
.cursor-pointer { cursor: pointer; }
.cursor-default { cursor: default; }
.fw-500 { font-weight: 500; }
.fw-600 { font-weight: 600; }
.fw-bold { font-weight: bold; }

/* Separatore verticale tra pulsanti in toolbar/formbar */
.btn-sep {
    display: inline-block;
    width: 1px; height: 20px;
    background: var(--c-border-grey);
    margin: 0 4px;
    vertical-align: middle;
    flex-shrink: 0;
}

/* === Alert/banner inline (riusabili tra moduli) === */
.alert-inline {
    padding: 0.5rem 0.75rem;
    border-radius: 6px;
    border: 1px solid transparent;
    font-size: 0.9rem;
    margin-bottom: 0.5rem;
}
.alert-inline--error {
    background: var(--c-danger-bg-light);
    border-color: var(--c-danger-bg-mid);
    color: var(--c-danger-dark);
}
.alert-inline--warning,
.alert-warning {
    background: var(--c-warning-bg-bright);
    border-color: var(--c-amber-300);
    color: var(--c-warning-darker);
}
.alert-inline--info,
.alert-info {
    background: var(--c-info-bg-bright);
    border-color: var(--c-blue-light);
    color: var(--c-primary-deep);
}
.alert-success {
    background: var(--c-success-bg-pale);
    border-color: var(--c-success-border-light);
    border-left: 4px solid var(--c-success);
    color: var(--c-success-deep);
}
/* Utility stampa: nasconde elementi @print (usato in ecommerce, flotta) */
@media print { .no-print { display: none; } }

/* Quick-half toggle (modulo /ore) — stato attivo verde */
.quick-half--active {
    background: var(--c-success-bg-soft);
    border-color: var(--c-success-deep);
    color: var(--c-success-darkest);
}
/* Input "spento" (grigio chiaro) quando una mezza giornata è impostata come assenza */

/* margin-left helpers (in linea con mb-/mt-) */
.ml-1 { margin-left: 0.25rem; }
.ml-2 { margin-left: 0.5rem; }

/* "msg inline": piccola etichetta accanto a un pulsante (es. ⏳/✅/❌) */
.msg-inline {
    margin-left: 0.75rem;
    font-weight: 600;
    font-size: 0.85rem;
}

/* Form field utilities (pattern di label/input ricorrenti) */
.field-label {
    display: block;
    font-size: 0.85rem;
    color: var(--c-text-darkish);
    margin-bottom: 0.25rem;
    font-weight: 500;
}
.field-flex {
    flex: 1;
    margin-bottom: 0.4rem;
}
.field-flex-100 {
    flex: 1;
    min-width: 100px;
    margin-bottom: 0.4rem;
}
.field-flex-120 {
    flex: 1;
    min-width: 120px;
    margin-bottom: 0.4rem;
}
.field-flex-200 {
    flex: 1;
    min-width: 200px;
}
.pad-cell { padding: 0.3rem 0.4rem; }
.mt-md { margin-top: 0.8rem; }
.mt-xs { margin-top: 0.3rem; }
.w-120 { width: 120px; }

/* Modal sub-heading (separatore di sezione nei form) */
.modal-subheading {
    color: var(--c-primary);
    margin: 0.75rem 0 0.5rem;
    font-size: 1rem;
    font-weight: 600;
}

/* Warning duplicati (magazzino).
 * Nota: la visibilità è controllata dalla classe globale .hidden (display:none !important).
 * NON usare display:none qui, altrimenti classList.remove('hidden') non rivela l'elemento.
 */
.duplicate-warning {
    background: var(--c-warning-bg-strong);
    border: 2px solid var(--c-warning-border-strong);
    border-radius: 8px;
    padding: 1rem;
    margin-bottom: 1rem;
}
.duplicate-warning-title {
    font-weight: bold;
    color: var(--c-warning-text-deep);
    margin-bottom: 0.5rem;
}
.duplicate-warning-info {
    font-size: 0.9rem;
    color: var(--c-warning-text-deep);
}
.duplicate-warning-close {
    background: none;
    border: none;
    font-size: 1.2rem;
    cursor: pointer;
    color: var(--c-warning-text-deep);
}


/* Card gradient headers */
.card-gradient,
.card-gradient-green,
.card-gradient-coral,
.card-gradient-lavender,
.card-gradient-teal,
.card-gradient-amber {
    border: none;
}
.card-gradient {
    background: none;
    color: var(--c-text-dark);
    box-shadow: none;
    border: 0;
    border-bottom: 1px solid var(--c-border);
    border-radius: 0;
    padding: 0.2rem 0 0.75rem;
    margin-bottom: 1rem;
}

@media (min-width: 880px) {
    .card-gradient {
        display: flex;
        align-items: baseline;
        gap: 1rem;
        flex-wrap: wrap;
    }
    .card-gradient .card-subtitle-white { margin-top: 0; }
}
.card-gradient-green {
    background: none;
    color: var(--c-text-dark);
    box-shadow: none;
    border: 0;
    border-bottom: 1px solid var(--c-border);
    border-radius: 0;
    padding: 0.2rem 0 0.75rem;
    margin-bottom: 1rem;
}
.card-gradient-coral {
    background: none;
    color: var(--c-text-dark);
    box-shadow: none;
    border: 0;
    border-bottom: 1px solid var(--c-border);
    border-radius: 0;
    padding: 0.2rem 0 0.75rem;
    margin-bottom: 1rem;
}
.card-gradient-lavender {
    background: none;
    color: var(--c-text-dark);
    box-shadow: none;
    border: 0;
    border-bottom: 1px solid var(--c-border);
    border-radius: 0;
    padding: 0.2rem 0 0.75rem;
    margin-bottom: 1rem;
}
.card-gradient-teal {
    background: none;
    color: var(--c-text-dark);
    box-shadow: none;
    border: 0;
    border-bottom: 1px solid var(--c-border);
    border-radius: 0;
    padding: 0.2rem 0 0.75rem;
    margin-bottom: 1rem;
}
.card-gradient-amber {
    background: linear-gradient(135deg, var(--c-warning) 0%, var(--c-warning-dark) 100%);
}
/* Si chiamano ancora "white" perche' il nome sta in ventinove template,
   ma le bande colorate su cui stavano non ci sono piu': su fondo chiaro il
   bianco sarebbe invisibile. Il nome e' rimasto indietro; il colore no. */
.card-title-white {
    color: var(--c-text-darkest);
    font-size: 1.4rem;
    font-weight: 600;
    letter-spacing: -0.01em;
    margin: 0;
}
.card-subtitle-white {
    color: var(--c-text-muted);
    font-size: 0.88rem;
    margin: 0.15rem 0 0;
    font-variant-numeric: tabular-nums;
}

/* Tag di provenienza (rubrica) */
.tag {
    gap: 0.2rem;
    padding: 0.1rem 0.5rem;
    font-size: 0.7rem;
}
.tag-ordini {
    background: rgba(99,102,241,0.12);
    color: var(--c-primary-dark);
}
.tag-noleggio {
    background: rgba(234,179,8,0.12);
    color: var(--c-warning-mid);
}
.tag-corsi {
    background: rgba(16,185,129,0.12);
    color: var(--c-success-dark);
}
.tag-flotta {
    background: rgba(239,68,68,0.12);
    color: var(--c-danger-dark);
}
.tag-legna {
    background: rgba(139,90,43,0.12);
    color: var(--c-brown-text-deep);
}
.tag-2bit {
    background: rgba(59,130,246,0.12);
    color: var(--c-info-dark);
}
.tag-metodo {
    background: rgba(124,58,237,0.12);
    color: var(--c-violet-darker);
}
.tag-nessuno {
    background: var(--c-border-light);
    color: var(--c-text-lighter);
}
/* Tag varianti semantiche generiche (riusabili in tutti i moduli) */
.tag-success { background: var(--c-success-bg); color: var(--c-success-darker); }
.tag-info    { background: var(--c-info-bg);    color: var(--c-info-dark); }
.tag-violet  { background: var(--c-violet-bg);  color: var(--c-violet-darker); }
.tag-pink    { background: var(--c-pink-bg);    color: var(--c-pink-dark); }
.tag-muted   { background: var(--c-border-light); color: var(--c-text-secondary); }

/* Filtri chip */
.filtro-chip {
    padding: 0.35rem 0.75rem;
    border-radius: 20px;
    border: 2px solid var(--c-border);
    background: white;
    font-size: 0.82rem;
    font-weight: 600;
    cursor: pointer;
    transition: all 0.2s;
    user-select: none;
}
.filtro-chip:hover {
    border-color: var(--c-primary);
    background: var(--c-info-bg);
}
.filtro-chip.active {
    border-color: var(--c-primary);
    background: var(--c-primary);
    color: white;
}
.filtro-chip .chip-count {
    font-weight: 700;
    margin-left: 0.25rem;
    opacity: 0.7;
}

/* Filtri bar */
.filtri-bar {
    display: flex;
    flex-wrap: wrap;
    gap: 0.5rem;
    align-items: center;
}

/* Un filtro non e' un campo di un modulo: si prende la larghezza che gli
   serve e sta in fila con gli altri. Larghi al 100% andavano uno per
   riga, e la barra dei filtri diventava un modulo da compilare. */
.filtri-bar .form-control {
    width: auto;
    min-width: 8.5rem;
}

.filtri-bar input[type="search"],
.filtri-bar input[type="text"] {
    min-width: 14rem;
    flex: 1 1 14rem;
}

.filtri-bar input[type="date"],
.filtri-bar input[type="month"] { min-width: 9rem; }

/* Stat mini cards */
.stat-mini {
    display: flex;
    align-items: center;
    gap: 0.4rem;
    padding: 0.4rem 0.75rem;
    background: white;
    border-radius: 8px;
    border: 1px solid var(--c-border);
    font-size: 0.82rem;
    font-weight: 600;
    color: var(--c-text-dark);
}
.stat-mini .stat-n {
    font-size: 1rem;
    font-weight: 700;
    color: var(--c-primary);
}
/* ==================== STORICO ORDINI ==================== */
.bar-row {
    display: flex;
    align-items: center;
    gap: 0.5rem;
    margin-bottom: 0.5rem;
}
.bar-label {
    min-width: 100px;
    font-size: 0.85rem;
    font-weight: 600;
    text-align: right;
    color: var(--c-text-dark);
}
.bar-track {
    flex: 1;
    height: 24px;
    background: var(--c-border-light);
    border-radius: 6px;
    overflow: hidden;
    position: relative;
}
.bar-fill {
    height: 100%;
    border-radius: 6px;
    background: var(--c-primary-gradient);
    transition: width 0.6s ease;
    display: flex;
    align-items: center;
    padding-left: 0.5rem;
    font-size: 0.75rem;
    color: white;
    font-weight: 600;
    min-width: fit-content;
}
.bar-fill.green {
    background: linear-gradient(135deg, var(--c-success) 0%, var(--c-success-dark) 100%);
}

.storico-item {
    display: flex;
    align-items: flex-start;
    gap: 0.75rem;
    padding: 0.7rem 0;
    border-bottom: 1px solid var(--c-border-light);
    animation: cardFadeIn 0.25s ease both;
}
.storico-item:last-child {
    border-bottom: none;
}
.storico-stato {
    width: 10px;
    height: 10px;
    border-radius: 50%;
    flex-shrink: 0;
    margin-top: 0.4rem;
    box-shadow: 0 0 0 3px rgba(0,0,0,0.06);
}
.storico-stato.consegnato {
    background: var(--c-success-bright);
}
.storico-stato.annullato {
    background: var(--c-danger);
}
.storico-body {
    flex: 1;
    min-width: 0;
}
.storico-desc {
    font-weight: 700;
    font-size: 0.95rem;
    margin-bottom: 0.15rem;
}
.storico-sub {
    font-size: 0.8rem;
    color: var(--c-text-muted);
    display: flex;
    flex-wrap: wrap;
    gap: 0.2rem 0.65rem;
}
.storico-actions {
    display: flex;
    gap: 0.3rem;
    flex-shrink: 0;
    align-items: flex-start;
}
.storico-badge {
    padding: 0.1rem 0.45rem;
    font-size: 0.65rem;
}
.storico-badge.consegnato {
    background: rgba(34,197,94,0.12);
    color: var(--c-success-deep);
}
.storico-badge.annullato {
    background: rgba(239,68,68,0.12);
    color: var(--c-danger-dark);
}

.podium-row {
    display: flex;
    align-items: center;
    gap: 0.75rem;
    padding: 0.5rem 0;
    border-bottom: 1px solid var(--c-border-light);
}
.podium-row:last-child {
    border-bottom: none;
}
.podium-pos {
    width: 28px;
    height: 28px;
    border-radius: 50%;
    display: flex;
    align-items: center;
    justify-content: center;
    font-size: 0.8rem;
    font-weight: 700;
    flex-shrink: 0;
    background: var(--c-border-light);
    color: var(--c-text-muted);
}
.podium-pos.gold {
    background: var(--c-warning-bg);
    color: var(--c-warning-dark);
}
.podium-pos.bronze {
    background: var(--c-danger-bg-light);
    color: var(--c-warning-mid);
}
.podium-name {
    font-weight: 600;
    font-size: 0.9rem;
    flex: 1;
}
.podium-count {
    font-weight: 700;
    color: var(--c-primary);
    font-size: 0.95rem;
}

/* ==================== NOLEGGIO - CALENDARIO ==================== */
/* La cornice del mese, uguale in tutti i moduli che ne hanno uno:
   noleggio, fioreria, calendario fornitori. Vedi la nota in fondo a
   questo foglio sul perche' sta qui e non nei moduli. */
.cal-grid {
    display: grid;
    grid-template-columns: repeat(7, 1fr);
    gap: 1px;
    background: var(--c-border);
    border: 1px solid var(--c-border);
    border-radius: var(--radius-sm);
    overflow: hidden;
}

.cal-hdr {
    background: var(--c-bg-lighter);
    padding: 0.6rem 0.3rem;
    text-align: center;
    font-weight: 700;
    font-size: 0.8rem;
    color: var(--c-text-darkish);
}
.cal-hdr.cal-we {
    color: var(--c-text-lighter);
}
.cal-day {
    background: white;
    min-height: 90px;
    padding: 0.4rem;
    cursor: pointer;
    transition: background 0.15s;
    position: relative;
}
.cal-day:hover {
    background: var(--c-info-bg);
}
.cal-day.cal-today {
    background: var(--c-warning-bg);
}
.cal-day.cal-today:hover {
    background: var(--c-yellow-highlight);
}
.cal-day.cal-other {
    background: var(--c-bg-light);
    opacity: 0.4;
    pointer-events: none;
}
.cal-day.cal-we {
    background: var(--c-bg-grey-light);
}
.cal-day-num {
    font-weight: 700;
    font-size: 0.85rem;
    margin-bottom: 0.2rem;
    color: var(--c-text-dark);
}
.cal-day.cal-today .cal-day-num {
    color: var(--c-primary-dark);
    font-size: 0.95rem;
}
.cal-day.cal-other .cal-day-num {
    color: var(--c-border-mid);
}
.cal-bookings {
    display: flex;
    flex-direction: column;
    gap: 2px;
}
.cal-bar {
    display: flex;
    height: 18px;
    border-radius: 4px;
    overflow: hidden;
    cursor: pointer;
    font-size: 0.6rem;
    font-weight: 600;
    color: white;
    line-height: 18px;
    border: 1px solid rgba(0,0,0,0.08);
    position: relative;
}
.cal-bar-seg {
    flex: 1;
    border-right: 1px solid rgba(255,255,255,0.35);
}
.cal-bar-seg:last-child {
    border-right: none;
}
.cal-bar-seg.cal-bar-empty {
    background: var(--c-bg-grey-very-light);
}

/* Calendario navigazione */
.cal-nav {
    display: flex;
    align-items: center;
    gap: 0.6rem;
    margin-bottom: 0.7rem;
}

.cal-nav h2,
.cal-nav .cal-month-label,
.cal-nav .cal-mese-label {
    flex: 1;
    margin: 0;
    text-align: center;
    font-size: 1.05rem;
    font-weight: 600;
    color: var(--c-text-dark);
    text-transform: capitalize;
}

.cal-nav button {
    flex: 0 0 auto;
    min-width: 36px;
    min-height: 36px;
    padding: 0 0.7rem;
    border: 1px solid var(--c-border-mid);
    border-radius: var(--radius-sm);
    background: var(--c-white);
    color: var(--c-text-dark);
    font-size: 0.9rem;
    cursor: pointer;
}

.cal-nav button:hover { background: var(--c-bg-lighter); }

.cal-nav-right {
    display: flex;
    gap: 0.5rem;
}
.cal-mese-label {
    font-weight: 700;
    font-size: 1.1rem;
    margin-left: 0.5rem;
    color: var(--c-primary-dark);
}

/* Legenda macchine/fasce */
.cal-legenda {
    display: flex;
    gap: 1rem;
    flex-wrap: wrap;
    margin-bottom: 0.5rem;
}
.cal-legenda-item {
    display: flex;
    align-items: center;
    gap: 0.3rem;
    font-size: 0.85rem;
    font-weight: 600;
}
.cal-legenda-dot {
    width: 14px;
    height: 14px;
    border-radius: 4px;
    display: inline-block;
}
.cal-legenda-fasce {
    display: flex;
    gap: 1rem;
    flex-wrap: wrap;
    margin-bottom: 1rem;
    font-size: 0.78rem;
    color: var(--c-text-muted);
}
.cal-fascia-dot {
    width: 10px;
    height: 10px;
    border-radius: 3px;
    display: inline-block;
    background: var(--c-text-lighter);
}

/* Fasce checkbox grid (modal prenotazione) */
.fasce-grid {
    display: flex;
    gap: 0.4rem;
    flex-wrap: wrap;
}
.fascia-check {
    display: flex;
    flex-direction: column;
    align-items: center;
    text-align: center;
    padding: 0.4rem 0.5rem;
    border: 2px solid var(--c-border);
    border-radius: 8px;
    cursor: pointer;
    transition: all 0.2s;
    flex: 1;
    min-width: 80px;
}
.fascia-check:has(input:checked) {
    border-color: var(--c-primary);
    background: var(--c-info-bg);
}
.fascia-check.fascia-occupata {
    opacity: 0.4;
    cursor: not-allowed;
    background: var(--c-danger-bg);
    border-color: var(--c-danger-bg-mid);
}
.fascia-check input[type="checkbox"] {
    margin-bottom: 0.2rem;
}
.fascia-label {
    font-weight: 600;
    font-size: 0.8rem;
    line-height: 1.2;
}
.fascia-orario {
    font-size: 0.7rem;
    color: var(--c-text-muted);
}

/* Day detail cards */
.giorno-card {
    border-radius: 8px;
    padding: 0.75rem;
    margin-bottom: 0.5rem;
    background: var(--c-bg-light);
}
.giorno-card:hover {
    box-shadow: 0 2px 8px rgba(0,0,0,0.08);
}

/* Toggle switch */
.toggle-switch {
    position: relative;
    display: inline-block;
    width: 44px;
    height: 24px;
    cursor: pointer;
}
.toggle-switch input {
    opacity: 0;
    width: 0;
    height: 0;
}
.toggle-slider {
    position: absolute;
    inset: 0;
    background: var(--c-border-mid);
    border-radius: 24px;
    transition: 0.3s;
}
.toggle-slider:before {
    content: '';
    position: absolute;
    height: 18px;
    width: 18px;
    left: 3px;
    bottom: 3px;
    background: white;
    border-radius: 50%;
    transition: 0.3s;
}
.toggle-switch input:checked + .toggle-slider {
    background: var(--c-success);
}
.toggle-switch input:checked + .toggle-slider:before {
    transform: translateX(20px);
}

/* Prezzo cards */
.prezzo-card {
    border-radius: 8px;
    padding: 0.75rem;
    margin-bottom: 0.75rem;
}
.prezzo-card .prezzo-header {
    display: flex;
    align-items: center;
    gap: 0.5rem;
    margin-bottom: 0.5rem;
    font-weight: 700;
}
.prezzo-card .prezzo-inputs {
    display: flex;
    gap: 0.75rem;
    flex-wrap: wrap;
}
.prezzo-card .prezzo-inputs .prezzo-card .prezzo-inputs label {
    font-size: 0.75rem;
    color: var(--c-text-muted);
}

/* ==================== KEYFRAMES ==================== */

@keyframes pageFadeIn {
    from { opacity: 0; }
    to { opacity: 1; }
}

@keyframes cardFadeIn {
    from { opacity: 0; transform: translateY(12px); }
    to { opacity: 1; transform: translateY(0); }
}

@keyframes rowSlideIn {
    from { opacity: 0; transform: translateX(-8px); }
    to { opacity: 1; transform: translateX(0); }
}

@keyframes timelineSlideIn {
    from { opacity: 0; transform: translateX(-16px); }
    to { opacity: 1; transform: translateX(0); }
}

@keyframes badgePulse {
    0%, 100% { opacity: 1; }
    50% { opacity: 0.8; }
}

@keyframes focusRing {
    from { box-shadow: 0 0 0 0 rgba(102, 126, 234, 0); }
    to { box-shadow: 0 0 0 3px rgba(102, 126, 234, 0.15); }
}

@keyframes spin {
    to { transform: rotate(360deg); }
}

/* Home cards hover ripple */
.home-card::after {
    content: '';
    position: absolute;
    top: 50%;
    left: 50%;
    width: 0;
    height: 0;
    background: rgba(102, 126, 234, 0.06);
    border-radius: 50%;
    transform: translate(-50%, -50%);
    transition: width 0.5s, height 0.5s;
}
.home-card:hover::after {
    width: 300%;
    height: 300%;
}

@media (prefers-reduced-motion: reduce) {
    *,
    *::before,
    *::after {
        animation: none !important;
        transition: none !important;
        scroll-behavior: auto;
    }
}

/* ==================== TOAST NOTIFICATIONS ==================== */
.toast {
    padding: 0.75rem 1.25rem;
    border-radius: var(--radius-sm);
    color: var(--c-white);
    font-size: 0.95rem;
    display: flex;
    align-items: center;
    gap: 0.5rem;
    box-shadow: 0 4px 12px rgba(0, 0, 0, 0.15);
    animation: toastSlideIn 0.3s ease, toastFadeOut 0.5s ease var(--toast-duration, 3s) forwards;
    max-width: 400px;
    word-break: break-word;
}
.toast-success {
    background: var(--c-success-dark);
}
.toast-error {
    background: var(--c-danger-dark);
}
.toast-warning {
    background: var(--c-warning-dark);
}
.toast-info {
    background: var(--c-info-dark);
}

@keyframes toastSlideIn {
    from { opacity: 0; transform: translateX(100%); }
    to { opacity: 1; transform: translateX(0); }
}
@keyframes toastFadeOut {
    from { opacity: 1; }
    to { opacity: 0; transform: translateY(-10px); }
}

.qty-input {
    width: 60px;
    text-align: center;
    border: 1px solid var(--c-border-mid);
    border-radius: 6px;
    padding: 0.3rem;
    font-size: 1rem;
    font-weight: 600;
    -moz-appearance: textfield;
    appearance: textfield;
}
.qty-input::-webkit-outer-spin-button,
.qty-input::-webkit-inner-spin-button {
    -webkit-appearance: none;
    margin: 0;
}
.qty-input.text-danger {
    color: var(--c-danger-dark);
}
.qty-input.text-warning {
    color: var(--c-warning-dark);
}
.qty-input.text-success {
    color: var(--c-success-dark);
}

/* ==================== DOCUMENTI ACQUISTO ==================== */
.doc-grid {
    display: grid;
    grid-template-columns: repeat(auto-fill, minmax(240px, 1fr));
    gap: 1rem;
}
.doc-card {
    border: 1px solid var(--c-border);
    border-radius: 10px;
    overflow: hidden;
    cursor: pointer;
    transition: transform 0.2s, box-shadow 0.2s;
    background: var(--c-white);
}
.doc-card:hover {
    transform: translateY(-3px);
    box-shadow: 0 6px 20px rgba(0, 0, 0, 0.1);
}
.doc-card-img {
    width: 100%;
    height: 180px;
    overflow: hidden;
    background: var(--c-border-light);
    display: flex;
    align-items: center;
    justify-content: center;
}
.doc-card-img img {
    width: 100%;
    height: 100%;
    object-fit: cover;
}
.doc-card-body {
    padding: 0.75rem;
}
.doc-card-desc {
    font-weight: 600;
    font-size: 0.9rem;
    color: var(--c-text-dark);
    margin-bottom: 0.3rem;
    white-space: nowrap;
    overflow: hidden;
    text-overflow: ellipsis;
}
.doc-card-date {
    font-size: 0.8rem;
    color: var(--c-text-muted);
    margin-bottom: 0.4rem;
}
.doc-card-cliente {
    font-size: 0.8rem;
    color: var(--c-text-darkish);
    font-weight: 500;
    margin-bottom: 0.3rem;
    white-space: nowrap;
    overflow: hidden;
    text-overflow: ellipsis;
}
.doc-card-macchine {
    display: flex;
    flex-wrap: wrap;
    gap: 0.3rem;
}
.doc-badge {
    display: inline-flex;
    align-items: center;
    gap: 0.2rem;
    background: var(--c-info-bg);
    color: var(--c-primary-dark);
    border-radius: 4px;
    padding: 0.15rem 0.4rem;
    font-size: 0.75rem;
    max-width: 220px;
    overflow: hidden;
    text-overflow: ellipsis;
    white-space: nowrap;
}
.doc-badge-removable {
    background: var(--c-primary-bg-soft);
    padding-right: 0.2rem;
}
.doc-badge-x {
    cursor: pointer;
    font-weight: bold;
    color: var(--c-info-bright);
    margin-left: 0.15rem;
    font-size: 0.9rem;
    line-height: 1;
}
.doc-badge-x:hover {
    color: var(--c-danger-dark);
}
.doc-drop-zone {
    border: 2px dashed var(--c-border-mid);
    border-radius: 10px;
    padding: 2rem;
    text-align: center;
    cursor: pointer;
    transition: border-color 0.2s, background 0.2s;
    display: flex;
    flex-direction: column;
    align-items: center;
    justify-content: center;
    min-height: 160px;
}
.doc-drop-zone:hover,
.doc-drop-active {
    border-color: var(--c-primary);
    background: var(--c-info-bg);
}
.doc-preview-img {
    max-width: 100%;
    max-height: 180px;
    object-fit: contain;
    border-radius: 6px;
}

/* DOCUMENT LINK CARDS (per modal robot/elettroutensili) */
.doc-link-list {
    display: flex;
    flex-direction: column;
    gap: 0.4rem;
    max-height: 220px;
    overflow-y: auto;
}
.doc-link-card {
    display: flex;
    align-items: center;
    gap: 0.5rem;
    padding: 0.4rem 0.5rem;
    background: var(--c-bg-light);
    border: 1px solid var(--c-border);
    border-radius: 6px;
    cursor: pointer;
    transition: background 0.15s, border-color 0.15s;
}
.doc-link-card:hover {
    background: var(--c-info-bg);
    border-color: var(--c-blue-light);
}
.doc-link-card input[type="checkbox"] {
    width: auto;
    margin: 0;
    accent-color: var(--c-primary-dark);
}
.doc-link-thumb {
    width: 40px;
    height: 40px;
    border-radius: 4px;
    object-fit: cover;
    flex-shrink: 0;
}
.doc-link-desc {
    font-size: 0.85rem;
    font-weight: 500;
    color: var(--c-text-darkish);
    overflow: hidden;
    text-overflow: ellipsis;
    white-space: nowrap;
}
.doc-link-date {
    font-size: 0.75rem;
    color: var(--c-text-lighter);
}

/* CERCA-MACCHINE: badge documenti */
.doc-count-badge {
    display: inline-flex;
    align-items: center;
    gap: 0.15rem;
    font-size: 0.7rem;
    padding: 0.1rem 0.35rem;
    border-radius: 10px;
    margin-left: 0.3rem;
    font-weight: 600;
}
.doc-count-badge.has-docs {
    background: var(--c-success-bg);
    color: var(--c-success-darkest);
}
.doc-count-badge.no-docs {
    background: var(--c-warning-bg);
    color: var(--c-warning-darker);
}

/* TOAST CONTAINER */
/* ===== Confirm modal (showConfirm) ===== */
.rt-confirm-overlay {
    position: fixed; inset: 0;
    background: rgba(0,0,0,0.45);
    display: flex; align-items: center; justify-content: center;
    z-index: calc(var(--z-alert) + 10);
}
.rt-confirm-box {
    background: var(--c-white);
    border-radius: 12px;
    padding: 1.5rem 2rem;
    min-width: 300px; max-width: 480px;
    box-shadow: 0 8px 30px rgba(0,0,0,0.25);
    display: flex; flex-direction: column; gap: 1rem;
}
.rt-confirm-title { font-weight: 700; font-size: 1.05rem; color: var(--c-text-dark); }
.rt-confirm-msg { font-size: 0.95rem; color: var(--c-text-secondary); line-height: 1.5; }
.rt-confirm-btns { display: flex; gap: 0.75rem; justify-content: flex-end; }

.toast-container {
    position: fixed;
    top: 20px;
    right: 20px;
    z-index: var(--z-alert);
    display: flex;
    flex-direction: column;
    gap: 0.5rem;
}

/* NAVBAR LOGOUT */
.nav-logout {
    color: var(--c-danger-bg-mid) !important;
}

/* USER SWITCH DROPDOWN */
.user-switch-wrapper {
    position: relative;
    display: inline-block;
}
.user-switch-trigger {
    display: flex; align-items: center; gap: 0.4rem;
    background: none; border: none; cursor: pointer;
    color: rgba(255,255,255,0.85); font-size: 0.85rem;
    padding: 0.3rem 0.5rem; border-radius: 8px;
    transition: background 0.15s;
    white-space: nowrap;
}
.user-switch-trigger:hover { background: rgba(255,255,255,0.1); }
.user-switch-wrapper.open .user-switch-trigger { background: rgba(255,255,255,0.15); }
.user-switch-avatar {
    width: 28px; height: 28px; border-radius: 50%;
    background: rgba(255,255,255,0.2); color: var(--c-white);
    display: flex; align-items: center; justify-content: center;
    font-weight: 700; font-size: 0.8rem; flex-shrink: 0;
}
.user-switch-name { max-width: 120px; overflow: hidden; text-overflow: ellipsis; }
.user-switch-arrow { font-size: 0.65rem; opacity: 0.6; transition: transform 0.15s; }
.user-switch-wrapper.open .user-switch-arrow { transform: rotate(180deg); }

.user-switch-menu {
    display: none; position: absolute; right: 0; top: calc(100% + 4px);
    background: var(--c-white); border: 1px solid var(--c-border); border-radius: 12px;
    min-width: 220px; padding: 0.35rem;
    box-shadow: 0 8px 30px rgba(0,0,0,0.18);
    z-index: var(--z-modal-backdrop);
    /* Lista utenti scrollabile quando supera l'altezza viewport disponibile */
    max-height: calc(100vh - 80px);
    overflow-y: auto;
    overscroll-behavior: contain;
    -webkit-overflow-scrolling: touch;
}
.user-switch-wrapper.open .user-switch-menu { display: block; }

.user-switch-item {
    display: flex; align-items: center; gap: 0.5rem;
    width: 100%; padding: 0.5rem 0.6rem; border: none;
    background: none; cursor: pointer; font-size: 0.85rem;
    color: var(--c-text-darkish); border-radius: 8px; text-decoration: none;
    transition: background 0.1s;
}
.user-switch-item:hover { background: var(--c-border-light); }
.user-switch-item.active { background: var(--c-info-bg); font-weight: 600; }
.user-switch-item-avatar {
    width: 30px; height: 30px; border-radius: 50%;
    background: var(--c-primary-bg-soft); color: var(--c-primary-dark);
    display: flex; align-items: center; justify-content: center;
    font-weight: 700; font-size: 0.8rem; flex-shrink: 0;
}
.user-switch-item.active .user-switch-item-avatar { background: var(--c-info-bright); color: var(--c-white); }
.user-switch-item-info { flex: 1; text-align: left; line-height: 1.2; }
.user-switch-item-user { display: block; font-size: 0.7rem; color: var(--c-text-lighter); font-weight: 400; }
.user-switch-check { color: var(--c-info-bright); font-size: 0.85rem; }
.user-switch-sep { height: 1px; background: var(--c-border); margin: 0.3rem 0.5rem; }
.user-switch-logout { color: var(--c-danger-dark) !important; }
.user-switch-logout:hover { background: var(--c-danger-bg-light) !important; }

@media (max-width: 600px) {
    .user-switch-menu { min-width: 200px; }
}

/* ================================================================
   ORDINI
   ================================================================ */

/* --- Sezione categoria --- */
@keyframes catSlideIn {
    from { opacity: 0; transform: translateY(16px); }
    to   { opacity: 1; transform: translateY(0); }
}
.cat-section {
    padding: 0;
    margin-bottom: 0.6rem;
    overflow: hidden;
    animation: catSlideIn 0.35s ease both;
}
.cat-header {
    display: flex;
    align-items: center;
    justify-content: space-between;
    padding: var(--riga-y, 0.45rem) var(--riga-x, 0.9rem);
    background: var(--c-bg-light);
    border-bottom: 1px solid var(--c-border);
    cursor: pointer;
    transition: background 0.2s;
    user-select: none;
}
.cat-header:hover { background: var(--c-bg-lighter); }
.cat-header-left {
    display: flex;
    align-items: center;
    gap: 0.6rem;
}
.cat-header h3 {
    margin: 0;
    font-size: 0.92rem;
    font-weight: 600;
    color: var(--c-text-dark);
}
/* La puntina davanti a ogni categoria non distingue una categoria
   dall'altra: lo fa il nome. */
.cat-header .cat-icon { display: none; }
.cat-count {
    background: var(--c-primary);
    color: white;
    border-radius: 10px;
    padding: 0.1rem 0.55rem;
    font-size: 0.72rem;
    font-weight: 700;
}
.cat-count.zero {
    background: var(--c-border-mid);
    color: var(--c-text-muted);
}

/* --- Riga ordine (card-like, ispirata a flotta) --- */
.order-list {
    list-style: none;
    margin: 0;
    padding: 0;
}
.order-item {
    display: flex;
    align-items: stretch;
    gap: 0;
    padding: 0;
    border-bottom: 1px solid var(--c-border);
    cursor: pointer;
    transition: background 0.2s, box-shadow 0.2s;
    animation: rowSlideIn 0.3s ease both;
    position: relative;
}
.order-item:last-child {
    border-bottom: none;
}
.order-item:hover {
    background: var(--c-bg-light);
    box-shadow: inset 0 0 0 1px rgba(102,126,234,0.15);
}

/* Barra laterale stato colorata */
.order-stato-bar {
    width: 5px;
    flex-shrink: 0;
    border-radius: 3px 0 0 3px;
}
.order-stato-bar[data-s="Nuovo"] {
    background: var(--c-info);
}
.order-stato-bar[data-s="Ordinato"] {
    background: var(--c-warning);
}
.order-stato-bar[data-s="Ricevuto"] {
    background: var(--c-success);
}
.order-stato-bar[data-s="Ricevuto Parzialmente"] {
    background: var(--c-cyan-500);
}
.order-stato-bar[data-s="Avvisato il Cliente"] {
    background: var(--c-violet);
}
.order-stato-bar[data-s="Consegnato"] {
    background: var(--c-success-bright);
}
.order-stato-bar[data-s="Annullato"] {
    background: var(--c-danger);
}
.order-stato-bar[data-s="Chiamato (no risp.)"] {
    background: var(--c-orange-vibrant);
}
.order-stato-bar[data-s="Preventivo"] {
    background: var(--c-primary);
}
.order-stato-bar[data-s="Rifiutato"] {
    background: var(--c-danger);
}

/* Colori sfondo riga per stato */
.order-item[data-stato="Nuovo"] {
    background: rgba(59,130,246,0.03);
}
.order-item[data-stato="Nuovo"]:hover {
    background: rgba(59,130,246,0.07);
}
.order-item[data-stato="Ordinato"] {
    background: rgba(245,158,11,0.03);
}
.order-item[data-stato="Ordinato"]:hover {
    background: rgba(245,158,11,0.07);
}
.order-item[data-stato="Ricevuto"] {
    background: rgba(16,185,129,0.03);
}
.order-item[data-stato="Ricevuto"]:hover {
    background: rgba(16,185,129,0.07);
}
.order-item[data-stato="Ricevuto Parzialmente"] {
    background: rgba(6,182,212,0.03);
}
.order-item[data-stato="Ricevuto Parzialmente"]:hover {
    background: rgba(6,182,212,0.07);
}
.order-item[data-stato="Avvisato il Cliente"] {
    background: rgba(139,92,246,0.03);
}
.order-item[data-stato="Avvisato il Cliente"]:hover {
    background: rgba(139,92,246,0.07);
}
.order-item[data-stato="Consegnato"] {
    background: rgba(34,197,94,0.03);
    opacity: 0.7;
}
.order-item[data-stato="Consegnato"]:hover {
    background: rgba(34,197,94,0.07);
}
.order-item[data-stato="Annullato"] {
    background: rgba(239,68,68,0.03);
    opacity: 0.5;
}
.order-item[data-stato="Annullato"]:hover {
    background: rgba(239,68,68,0.07);
}

/* Contenuto riga */
.order-body {
    flex: 1;
    min-width: 0;
    padding: var(--riga-y, 0.55rem) var(--riga-x, 0.9rem);
    display: flex;
    flex-direction: column;
    gap: var(--riga-gap, 0.2rem);
}
.order-top-row {
    display: flex;
    align-items: flex-start;
    justify-content: space-between;
    gap: 0.75rem;
}
.order-desc {
    font-size: 1rem;
    font-weight: 600;
    line-height: 1.3;
    color: var(--c-text-dark);
    word-break: break-word;
    flex: 1;
}
.order-oggetto {
    font-size: 0.88rem;
    color: var(--c-text-secondary);
    line-height: 1.3;
    word-break: break-word;
    overflow: hidden;
    display: -webkit-box;
    line-clamp: 2;
    -webkit-line-clamp: 2;
    -webkit-box-orient: vertical;
}
.order-meta-row {
    display: flex;
    flex-wrap: wrap;
    gap: 0.5rem 1rem;
    align-items: center;
}
.order-meta-item {
    display: inline-flex;
    align-items: center;
    gap: 0.3rem;
    font-size: 0.88rem;
    color: var(--c-text-secondary);
}
.order-meta-item .meta-icon {
    font-size: 0.85rem;
    opacity: 0.7;
}
.order-meta-item strong {
    color: var(--c-text-dark);
    font-weight: 600;
}
.order-badge {
    padding: 0.2rem 0.65rem;
    font-size: 0.75rem;
    font-weight: 700;
}
.order-badge-stato {
    background: rgba(59,130,246,0.12);
    color: var(--c-info);
}
.order-badge-stato[data-s="Ordinato"] {
    background: rgba(245,158,11,0.12);
    color: var(--c-warning-dark);
}
.order-badge-stato[data-s="Ricevuto"] {
    background: rgba(16,185,129,0.12);
    color: var(--c-success-dark);
}
.order-badge-stato[data-s="Ricevuto Parzialmente"] {
    background: rgba(6,182,212,0.12);
    color: var(--c-cyan-text-mid);
}
.order-badge-stato[data-s="Avvisato il Cliente"] {
    background: rgba(139,92,246,0.12);
    color: var(--c-violet-text-deep);
}
.order-badge-stato[data-s="Consegnato"] {
    background: rgba(34,197,94,0.12);
    color: var(--c-success-deep);
}
.order-badge-stato[data-s="Annullato"] {
    background: rgba(239,68,68,0.12);
    color: var(--c-danger-dark);
}
.order-badge-stato[data-s="Chiamato (no risp.)"] {
    background: rgba(249,115,22,0.1);
    color: var(--c-orange-vibrant);
}
.order-badge-stato[data-s="Preventivo"] {
    background: rgba(102,126,234,0.12);
    color: var(--c-primary);
}
.order-badge-stato[data-s="Rifiutato"] {
    background: rgba(239,68,68,0.1);
    color: var(--c-danger);
}
/* --- Preventivi righe / form --- */
.prev-inviato-badge {
    display: inline-flex;
    align-items: center;
    gap: .2rem;
    font-size: .72rem;
    padding: .15rem .45rem;
    border-radius: 10px;
    background: rgba(16,185,129,.1);
    color: var(--c-success-dark);
    font-weight: 600;
}
.prev-righe-table { width:100%; border-collapse:collapse; margin:.5rem 0; }
.prev-righe-table th { text-align:left; font-size:.75rem; color:var(--c-text-muted); padding:.3rem .5rem; border-bottom:1px solid var(--c-border); }
.prev-righe-table td { padding:.3rem .5rem; font-size:.85rem; border-bottom:1px solid var(--c-border-light); }
.prev-righe-table td.col-prezzo { text-align:right; font-weight:500; }
.prev-totale { text-align:right; font-weight:700; font-size:1rem; color:var(--c-primary); padding:.5rem .5rem 0; }
.prev-riga-form { display:flex; gap:.4rem; margin-bottom:.3rem; align-items:center; }
.prev-riga-form input { flex:1; }
.prev-riga-form input.prev-prezzo-input { max-width:110px; text-align:right; }
.prev-riga-form input.prev-qty-input { width:60px; flex:0 0 60px; text-align:center; }
.prev-riga-form .btn-rm { width:28px; height:28px; padding:0; border:none; background:var(--c-danger-bg); color:var(--c-danger-dark); border-radius:6px; cursor:pointer; font-size:.9rem; line-height:1; }
@media (max-width:600px) {
    .prev-riga-form { flex-wrap:wrap; }
    .prev-riga-form input:first-child { flex:1 1 100%; min-width:0; }
    .prev-riga-form input.prev-qty-input { flex:0 0 55px; width:55px; }
    .prev-riga-form input.prev-prezzo-input { max-width:none; flex:1; }
}
/* --- Ricerca articoli 2Bit --- */
.art2bit-box { position:relative; margin-bottom:.5rem; }
.art2bit-box input { padding-right:36px; }
.art2bit-dropdown { position:absolute; z-index:var(--z-sticky); left:0; right:0; top:100%; background:var(--c-white); border:1px solid var(--c-border-mid); border-radius:8px; box-shadow:0 8px 24px rgba(0,0,0,.12); max-height:280px; overflow-y:auto; }
.art2bit-item { padding:.55rem .75rem; cursor:pointer; display:flex; justify-content:space-between; align-items:center; border-bottom:1px solid var(--c-border-light); transition:background .1s; }
.art2bit-item:hover { background:var(--c-info-bg); }
.art2bit-item:last-child { border-bottom:none; }
.art2bit-item .art-desc { font-size:.85rem; color:var(--c-text-dark); flex:1; margin-right:.5rem; }
.art2bit-item .art-code { font-size:.72rem; color:var(--c-text-muted); margin-right:.5rem; }
.art2bit-item .art-price { font-size:.85rem; font-weight:600; color:var(--c-success-dark); white-space:nowrap; }
.art2bit-item .art-stock { font-size:.72rem; color:var(--c-text-lighter); margin-left:.4rem; }
.art2bit-barcode-ok { display:inline-flex; align-items:center; gap:.3rem; background:var(--c-success-bg); color:var(--c-success-darker); padding:.2rem .5rem; border-radius:6px; font-size:.8rem; font-weight:500; margin:.3rem 0; }
.order-giorni {
    display: inline-flex;
    align-items: center;
    gap: 0.25rem;
    font-size: 0.82rem;
    color: var(--c-text-muted);
    background: var(--c-border-light);
    padding: 0.15rem 0.55rem;
    border-radius: 12px;
}
.order-giorni.warn {
    color: var(--c-warning-dark);
    background: rgba(245,158,11,0.1);
    font-weight: 600;
}
.order-giorni.danger {
    color: var(--c-danger-dark);
    background: rgba(239,68,68,0.1);
    font-weight: 600;
}

/* --- Riga aggiungi --- */
.order-add-row {
    cursor: pointer;
    color: var(--c-primary);
    transition: background 0.2s;
}
.order-add-row:hover {
    background: var(--c-info-bg) !important;
}
.order-add-icon {
    width: 22px;
    height: 22px;
    border-radius: 50%;
    border: 2px dashed var(--c-primary);
    display: flex;
    align-items: center;
    justify-content: center;
    font-size: 0.9rem;
    font-weight: 700;
    flex-shrink: 0;
    transition: background 0.2s, color 0.2s;
}
.order-add-row:hover .order-add-icon {
    background: var(--c-primary);
    color: white;
    border-style: solid;
}
.order-add-label {
    font-size: 0.85rem;
    font-weight: 600;
}

/* --- Tasti rapidi sulla riga --- */
.order-quick-actions {
    display: flex;
    align-items: center;
    flex-shrink: 0;
    padding: 0 1rem;
    align-self: center;
}
.quick-btn {
    border-radius: 20px;
    padding: 0.4rem 0.85rem;
    border: 2px solid var(--c-border);
    background: white;
    font-size: 0.85rem;
    cursor: pointer;
    display: inline-flex;
    align-items: center;
    gap: 0.4rem;
    transition: all 0.2s;
    line-height: 1;
    white-space: nowrap;
}
.quick-btn-label {
    font-size: 0.75rem;
    font-weight: 600;
    color: var(--c-text-secondary);
}
.quick-btn:hover {
    border-color: var(--c-primary);
    background: var(--c-info-bg);
    transform: scale(1.05);
    box-shadow: 0 2px 8px rgba(102,126,234,0.25);
}
.quick-btn:hover .quick-btn-label {
    color: var(--c-primary-dark);
}

/* --- Ordini: layout mobile migliorato --- */
@media (max-width: 600px) {
    .order-item {
        flex-wrap: wrap;
    }
    .order-top-row {
        flex-direction: column;
        gap: 0.3rem;
    }
    .order-desc {
        font-size: 0.95rem;
    }
    .order-meta-row {
        flex-direction: column;
        gap: 0.2rem;
        align-items: flex-start;
    }
    .order-body {
        padding: 0.7rem 0.85rem;
        flex: 1 1 100%;
    }
    .order-quick-actions {
        flex-direction: row;
        flex-wrap: wrap;
        width: 100%;
        padding: 0 0.85rem 0.6rem;
        gap: 0.3rem;
        justify-content: flex-start;
    }
    .quick-btn {
        padding: 0.35rem 0.6rem;
        font-size: 0.78rem;
    }
    .quick-btn-label {
        font-size: 0.7rem;
    }
}

/* --- Input ricerca cliente (più visibile) --- */
#ordClienteSearch {
    background: var(--c-white);
    border: 2px solid var(--c-text-lighter);
    border-radius: 10px;
    padding: 0.65rem 0.85rem;
    font-size: 1rem;
    box-shadow: inset 0 1px 3px rgba(0,0,0,0.08), 0 1px 4px rgba(0,0,0,0.06);
    color: var(--c-text-dark);
}
#ordClienteSearch::placeholder {
    color: var(--c-text-muted);
    opacity: 1;
}
#ordClienteSearch:focus {
    border-color: var(--c-primary);
    box-shadow: 0 0 0 3px rgba(102,126,234,0.22), inset 0 1px 3px rgba(0,0,0,0.08);
    background: var(--c-white);
}

/* --- Cliente badge nel modal --- */
.ord-cliente-badge {
    margin-top: 0.4rem;
    padding: 0.5rem 0.75rem;
    background: var(--c-bg-light);
    border-radius: 8px;
    font-size: 0.85rem;
    border: 1px solid var(--c-border);
}

/* --- Autocomplete --- */
.autocomplete-dropdown {
    position: absolute;
    left: 0;
    right: 0;
    top: 100%;
    background: var(--c-white);
    border: 1px solid var(--c-border);
    border-radius: 0 0 10px 10px;
    max-height: 200px;
    overflow-y: auto;
    z-index: var(--z-modal-backdrop);
    box-shadow: 0 8px 24px rgba(0,0,0,0.15);
}
.autocomplete-item {
    padding: 0.55rem 0.85rem;
    cursor: pointer;
    font-size: 0.85rem;
    border-bottom: 1px solid var(--c-border);
    transition: background 0.15s;
    display: flex;
    align-items: center;
    flex-wrap: wrap;
    gap: 0.25rem;
}
.autocomplete-item:hover {
    background: var(--c-bg-light);
}
.autocomplete-item:last-child {
    border-bottom: none;
}
.autocomplete-new {
    padding: 0.55rem 0.85rem;
    cursor: pointer;
    font-size: 0.85rem;
    color: var(--c-primary);
    font-weight: 600;
}
.autocomplete-new:hover {
    background: var(--c-bg-light);
}


@keyframes statPop {
    from { opacity: 0; transform: translateY(10px) scale(0.97); }
    to   { opacity: 1; transform: translateY(0) scale(1); }
}
.stat-card-anim {
    animation: statPop 0.3s ease both;
}
.stat-card-anim[onclick] {
    transition: transform 0.15s, box-shadow 0.15s;
}
.stat-card-anim[onclick]:hover {
    transform: translateY(-2px);
    box-shadow: 0 4px 12px rgba(0,0,0,0.1);
}
/* Il riquadro su cui si sta filtrando: una riga sotto, come nella striscia
   dei numeri. Era un anello piu' un'ombra, imposti con !important per
   scavalcare l'hover del riquadro vecchio; ora il riquadro vecchio non c'e'
   piu' e il puntello si puo' togliere. */
.stat-card-active {
    background: var(--c-primary-bg-pale);
    box-shadow: inset 0 -3px 0 var(--c-primary);
}

/* ========== NOTIFICATION BELL ========== */
.notif-bell-container {
    position: relative;
    display: inline-flex;
    align-items: center;
}
.notif-bell-btn {
    background: none;
    border: none;
    font-size: 1.25rem;
    cursor: pointer;
    position: relative;
    padding: 0.2rem 0.4rem;
    line-height: 1;
    transition: transform 0.15s, filter 0.3s;
}
.notif-bell-btn:hover { transform: scale(1.15); }
/* Badge contatore */
.notif-badge {
    position: absolute;
    top: -6px;
    right: -8px;
    background: var(--c-danger);
    color: white;
    font-size: 0.75rem;
    font-weight: 700;
    min-width: 20px;
    height: 20px;
    line-height: 20px;
    text-align: center;
    border-radius: 99px;
    padding: 0 5px;
    pointer-events: none;
    box-shadow: 0 0 0 2px rgba(0,0,0,0.15);
}
/* Stato "ha notifiche non lette" */
.notif-bell-container.has-unread .notif-bell-btn {
    filter: drop-shadow(0 0 6px rgba(239,68,68,0.7));
    animation: notif-ring 3s ease-in-out infinite;
}
.notif-bell-container.has-unread .notif-badge {
    animation: notif-pulse 2s ease-in-out infinite;
}
@keyframes notif-ring {
    0%, 100% { transform: rotate(0deg); }
    5%  { transform: rotate(14deg); }
    10% { transform: rotate(-12deg); }
    15% { transform: rotate(10deg); }
    20% { transform: rotate(-6deg); }
    25% { transform: rotate(0deg); }
}
@keyframes notif-pulse {
    0%, 100% { transform: scale(1); }
    50%  { transform: scale(1.15); }
}
/* Navbar: colori ok di default */
.navbar .notif-bell-btn { color: rgba(255,255,255,0.85); font-size: 1.1rem; }
.navbar .notif-bell-btn:hover { color: white; }
.navbar .has-unread .notif-bell-btn {
    color: var(--c-amber-bright);
    filter: drop-shadow(0 0 8px rgba(251,191,36,0.6));
}

/* Dropdown */
.notif-dropdown {
    position: absolute;
    top: calc(100% + 8px);
    right: 0;
    width: 340px;
    max-height: 420px;
    background: white;
    border-radius: 12px;
    box-shadow: 0 8px 32px rgba(0,0,0,0.18);
    z-index: var(--z-modal);
    overflow: hidden;
    border: 1px solid var(--c-border);
}
.notif-dropdown-header {
    display: flex;
    justify-content: space-between;
    align-items: center;
    padding: 0.75rem 1rem;
    border-bottom: 1px solid var(--c-border);
    font-weight: 700;
    font-size: 0.95rem;
    color: var(--c-text-dark);
}
.notif-mark-all {
    background: none;
    border: none;
    color: var(--c-primary);
    font-size: 0.8rem;
    cursor: pointer;
    font-weight: 600;
}
.notif-mark-all:hover { text-decoration: underline; }
.notif-dropdown-list {
    max-height: 360px;
    overflow-y: auto;
}
.notif-empty, .notif-loading {
    text-align: center;
    color: var(--c-text-lighter);
    padding: 2rem 1rem;
    font-size: 0.9rem;
}
.notif-item {
    display: block;
    padding: 0.7rem 1rem;
    border-bottom: 1px solid var(--c-border-light);
    text-decoration: none;
    color: var(--c-text-darkish);
    transition: background 0.15s;
}
.notif-item-wrap {
    position: relative;
    display: flex;
    align-items: stretch;
    border-bottom: 1px solid var(--c-border-light);
    transition: background 0.15s;
}
.notif-item-wrap:hover { background: var(--c-bg-light); }
.notif-item-wrap.unread {
    background: var(--c-info-bg);
    border-left: 3px solid var(--c-primary);
}
.notif-item-wrap.read { opacity: 0.7; }
.notif-item-link {
    flex: 1;
    display: block;
    padding: 0.7rem 1rem;
    text-decoration: none;
    color: var(--c-text-darkish);
    min-width: 0;
}
.notif-mark-single {
    background: none;
    border: none;
    color: var(--c-text-lighter);
    font-size: 1rem;
    cursor: pointer;
    padding: 0 0.6rem;
    display: flex;
    align-items: center;
    transition: color 0.15s, background 0.15s;
    flex-shrink: 0;
}
.notif-mark-single:hover {
    color: var(--c-success);
    background: rgba(16,185,129,0.08);
}
.notif-item:hover { background: var(--c-bg-light); }
.notif-item.unread {
    background: var(--c-info-bg);
    border-left: 3px solid var(--c-primary);
}
.notif-item.read { opacity: 0.7; }
.notif-item-title {
    font-weight: 600;
    font-size: 0.85rem;
    margin-bottom: 0.15rem;
}
.notif-item-body {
    font-size: 0.8rem;
    color: var(--c-text-muted);
    white-space: nowrap;
    overflow: hidden;
    text-overflow: ellipsis;
}
.notif-item-time {
    font-size: 0.7rem;
    color: var(--c-text-lighter);
    margin-top: 0.2rem;
}

@media (max-width: 600px) {
    .notif-dropdown {
        position: fixed;
        top: 48px;
        right: 0.5rem;
        left: 0.5rem;
        width: auto;
    }
}

/* ═══════════════════════════════════════════════════════════
   TAG CHIP
   ═══════════════════════════════════════════════════════════ */
.tag-chip {
    display:inline-flex; align-items:center; gap:0.3rem;
    background:var(--c-primary-bg-soft); color:var(--c-primary-deep); padding:0.2rem 0.5rem;
    border-radius:6px; font-size:0.8rem; font-weight:500; white-space:nowrap;
}

/* ═══════════════════════════════════════════════════════════
   PHOTO GRID + LIGHTBOX
   ═══════════════════════════════════════════════════════════ */
.foto-grid { display:grid; grid-template-columns:repeat(auto-fill, minmax(90px,1fr)); gap:.5rem; margin-top:.5rem; }
.foto-thumb { position:relative; width:100%; aspect-ratio:1; border-radius:8px; overflow:hidden; cursor:pointer; border:1px solid var(--c-border); }
.foto-thumb img { width:100%; height:100%; object-fit:cover; }
.foto-thumb .foto-del {
    position:absolute; top:2px; right:2px; background:rgba(0,0,0,.6); color:var(--c-white);
    border:none; border-radius:50%; width:22px; height:22px; font-size:.75rem;
    cursor:pointer; display:none; align-items:center; justify-content:center; line-height:1;
}
.foto-thumb:hover .foto-del { display:flex; }
.lightbox { position:fixed; top:0; left:0; width:100%; height:100%; background:rgba(0,0,0,0.88); z-index:var(--z-alert); display:flex; align-items:center; justify-content:center; }
.lightbox img { max-width:92vw; max-height:90vh; border-radius:8px; box-shadow:0 0 40px rgba(0,0,0,.5); }
.lightbox-close { position:absolute; top:1rem; right:1.5rem; color:var(--c-white); font-size:2.2rem; cursor:pointer; background:none; border:none; z-index:var(--z-alert); }

/* Form foto preview */
.form-foto-preview { display:flex; flex-wrap:wrap; gap:.4rem; margin-top:.4rem; }
.form-foto-preview .foto-preview-item {
    position:relative; width:70px; height:70px; border-radius:8px; overflow:hidden;
    border:1px solid var(--c-border);
}
.form-foto-preview .foto-preview-item img { width:100%; height:100%; object-fit:cover; }
.form-foto-preview .foto-preview-rm {
    position:absolute; top:1px; right:1px; background:rgba(0,0,0,.6); color:var(--c-white);
    border:none; border-radius:50%; width:18px; height:18px; font-size:.65rem;
    cursor:pointer; display:flex; align-items:center; justify-content:center; line-height:1;
}

/* ═══════════════════════════════════════════════════════════
   CONFIG LIST (ordini / ordini fornitore)
   ═══════════════════════════════════════════════════════════ */
.cfg-card { background: var(--c-white); border: 1px solid var(--c-border); border-radius: 12px; overflow:hidden; }
.cfg-card-header { padding: 0.75rem 1rem; border-bottom: 1px solid var(--c-border); background: var(--c-bg-light); }
.cfg-card-body { padding: 1rem; }
.cfg-item {
    display: flex; align-items: center; gap: 0.5rem;
    padding: 0.5rem 0.75rem; background: var(--c-bg-light);
    border-radius: 8px; font-size: 0.9rem; margin-bottom: 0.4rem;
}
.cfg-item:last-child { margin-bottom: 0; }
.cfg-item-name { flex: 1; font-weight: 500; }
.cfg-item .btn-icon {
    background: none; border: none; cursor: pointer; font-size: 0.9rem;
    padding: 0.2rem 0.4rem; border-radius: 4px; transition: background 0.2s;
}
.cfg-item .btn-icon:hover { background: rgba(255,255,255,0.1); }
.cfg-item-edit { display: none; flex: 1; }
.cfg-item-edit input { width: 100%; padding: 0.3rem 0.5rem; font-size: 0.85rem; }
.cfg-empty { text-align: center; color: var(--c-text-muted); padding: 1.5rem 1rem; font-size: 0.9rem; }

.subcat-group { margin-bottom:.75rem; border:1px solid var(--c-border); border-radius:8px; overflow:hidden }
.subcat-group-header {
    display:flex; align-items:center; gap:.5rem; padding:.6rem .75rem;
    background:var(--c-bg-lighter); cursor:pointer; font-weight:600; font-size:.9rem; user-select:none
}
.subcat-group-header:hover { background:var(--c-border-light2) }
.subcat-group-header .arrow { transition:transform .15s; font-size:.7rem }
.subcat-group-header .arrow.open { transform:rotate(90deg) }
.subcat-group-body { display:none; padding:.5rem .75rem }
.subcat-group-body.open { display:block }

/* ═══════════════════════════════════════════════════════════
   CAPACITY BAR
   ═══════════════════════════════════════════════════════════ */
.capacity-bar, .cap-bar { background:var(--c-border); border-radius:6px; height:8px; overflow:hidden; }
.capacity-fill, .cap-fill { height:100%; border-radius:6px; transition:width 0.3s; }
.capacity-text { font-size:0.8rem; color:var(--c-text-muted); }

/* ════════════════════════════════════════════════════════════
   page_base.html — layout canonico per pagine modulo
   ════════════════════════════════════════════════════════════ */
.page-wrapper {
  display: flex;
  flex-direction: column;
  gap: 1rem;
}
.page-header {
  display: flex;
  flex-direction: column;
  gap: 0.5rem;
  padding-bottom: 0.75rem;
  border-bottom: 1px solid var(--c-border);
}
.page-header-row {
  display: flex;
  flex-wrap: wrap;
  gap: 1rem;
  align-items: flex-end;
  justify-content: space-between;
}
.page-header-text { flex: 1 1 auto; min-width: 0; }
.page-title {
  margin: 0;
  font-size: 1.5rem;
  font-weight: 600;
  color: var(--c-text);
}
.page-error-banner {
  background: var(--c-danger-bg);
  color: var(--c-danger-darker);
  border: 1px solid var(--c-danger-bg-mid);
  border-radius: 6px;
  padding: 0.75rem 1rem;
  font-size: 0.95rem;
}
.page-error-banner[hidden] { display: none; }
.page-content { min-height: 200px; }

/* Hover utility classes — sostituiscono onmouseover/onmouseout inline (CSP-safe). */
.hover-bg-blue-pale:hover { background: var(--c-bg-cyan-bright); }
.hover-bg-gray-pale:hover { background-color: var(--c-bg-grey-pale); }
.hover-bg-blue-pale-row:hover { background: var(--c-primary-bg-pale); }

/* Classi turno per <select> giorno lavorativo (ore_configurazione, ore_mie_ore) */
.turno-riposo           { background: var(--c-border-light) !important; }
.turno-intero           { background: var(--c-success-bg-soft) !important; }
.turno-solo_mattina     { background: var(--c-info-bg-pale) !important; }
.turno-solo_pomeriggio  { background: var(--c-warning-bg-pale) !important; }


/* === Utility classi state per box (utilita.js, manutenzione_page.js, ecc.) === */
.state-box-ok      { background: var(--c-success-bg-pale, #dcfce7); border: 1px solid var(--c-success-bright, #22c55e); }
.state-box-error   { background: var(--c-danger-bg, #fee2e2);      border: 1px solid var(--c-danger, #ef4444); }
.state-box-warning { background: var(--c-warning-bg, #fef9c3); border: 1px solid var(--c-warning-border); }
.btn-push-on  { background: var(--c-danger, #ef4444) !important; }
.btn-push-off { background: var(--c-primary-dark, #4f46e5) !important; }
.text-error   { color: var(--c-danger-dark, #dc2626) !important; }
.utilita-tr-divider { border-bottom: 1px solid var(--c-border-light, #f3f4f6); }


/* === Input validation states (manutenzione_page.js, etc) === */
.input-valid   { border-color: var(--c-success-dark, #059669) !important; border-width: 2px !important; }
.input-invalid { border-color: var(--c-danger-dark, #dc2626) !important; border-width: 2px !important; }

/* Shared helpers for dynamic markup. Prefer u-* for new layout primitives. */
.cfg-hint { display: none; flex: 1; font-size: .85rem; margin: -0.2rem 0; }
.d-block { display: block; }
.flex-between { display: flex; align-items: center; justify-content: space-between; }
.flex-center-sm { display: flex; align-items: center; gap: 0.5rem; }
.flex-center-wrap { display: flex; align-items: center; flex-wrap: wrap; gap: 0.5rem; }
.flex-center-xs { display: flex; align-items: center; gap: 0.4rem; }
.flex-center-xxs { display: flex; align-items: center; gap: 0.3rem; }
.flex-end { display: flex; justify-content: flex-end; }
.flex-gap-sm { display: flex; gap: 0.4rem; }
.flex-gap-xxs { flex-shrink: 0; }
.flex-wrap-md { display: flex; flex-wrap: wrap; gap: 0.5rem; }
.flex-wrap-sm { display: flex; flex-wrap: wrap; gap: 0.3rem; }
.font-italic { font-style: italic; }
.font-mono { font-family: monospace; }
.fs-sm2 { font-size: 0.9rem; }
.fs-xs2 { font-size: 0.75rem; }
.fs-xs3 { font-size: 0.78rem; }
.fw-700 { font-weight: 700; }
.line-through { text-decoration: line-through; }
.mb-px1 { margin-bottom: 0.1rem; }
.mh-40 { min-height: 40px; }
.ml-auto { margin-left: auto; }
.mr-1 { margin-right: 0.25rem; }
.mr-3 { margin-right: 0.75rem; }
.no-underline { text-decoration: none; }
.opacity-60 { opacity: 0.6; }
.opacity-70 { opacity: 0.7; }
.ovx-auto { overflow-x: auto; }
.p-lg { padding: 2rem; }
.p-md { padding: 1rem; }
.p-sm { padding: 0.5rem; }
.px-sm { padding: 0.2rem 0.6rem; }
.text-border-mid { color: var(--c-border-mid); }
.text-danger-dark { color: var(--c-danger-dark); }
.text-dark { color: var(--c-text-dark); }
.text-darkish { color: var(--c-text-darkish); }
.text-faint { color: var(--c-text-faint); }
.text-left { text-align: left; }
.text-mid { color: var(--c-text-mid); }
.text-muted { color: var(--c-text-muted); }
.text-primary { color: var(--c-primary); }
.text-primary-dark { color: var(--c-primary-dark); }
.text-primary-darker { color: var(--c-primary-darker); }
.text-success-bright { color: var(--c-success-bright); }
.text-success-dark { color: var(--c-success-dark); }
.underline { text-decoration: underline; }
.ws-nowrap { white-space: nowrap; }
.ws-prewrap { white-space: pre-wrap; }

/* Compact primitives still used by legacy dynamic templates. */
.anim-delay-0 { animation-delay: 0s; }
.anim-delay-1 { animation-delay: 0.08s; }
.badge-success-pill { display: inline-block; background: var(--c-success-bg); color: var(--c-success-darker); padding: 1px 6px; border-radius: 10px; font-size: 0.7rem; font-weight: 600; vertical-align: middle; }
.badge-warning-pill { display: inline-block; background: var(--c-warning-bg); color: var(--c-warning-darker); padding: 1px 6px; border-radius: 10px; font-size: 0.7rem; font-weight: 600; vertical-align: middle; }
.btn-danger-outline-xs { color: var(--c-danger); background: white; border: 1px solid var(--c-danger-bg-mid); border-radius: 6px; padding: 0.2rem 0.55rem; font-size: 0.75rem; cursor: pointer; }
.flex-nowrap-xs { display: flex; gap: 2px; flex-wrap: nowrap; }
.flex-wrap-2rem { display: flex; gap: 2rem; flex-wrap: wrap; }
.fs-3xl { font-size: 3rem; }
.fs-md2 { font-size: 0.82rem; }
.fs-md3 { font-size: 0.88rem; }
.fs-md4 { font-size: 0.95rem; }
.fs-xxs { font-size: 0.65rem; }
.mt-px2 { margin-top: 2px; }
.mt-px4 { margin-top: 4px; }
.opacity-40 { opacity: 0.4; }
.opacity-50 { opacity: 0.5; }
.p-3 { padding: 0.75rem; }
.p-btn { padding: 0.4rem 0.5rem; }
.px-btn-md { padding: 0.3rem 0.8rem; }
.px-card { padding: 0.6rem 1rem; }
.px-tiny-v { padding: 0.15rem 0.5rem; }
.px-xs { padding: 0.2rem 0.5rem; }
.tag-cyan { display: inline-block; background: var(--c-cyan-bg-pale); color: var(--c-cyan-text-deep); padding: 2px 6px; border-radius: 3px; margin: 2px; font-size: 0.8rem; }
.text-info-dark { color: var(--c-info-dark); }
.truncate-150 { max-width: 150px; overflow: hidden; text-overflow: ellipsis; }
.truncate-200 { max-width: 200px; overflow: hidden; text-overflow: ellipsis; }
.text-border-pale { color: var(--c-border-light); }

/* Component fragments shared by dynamic templates. */
.alert-danger-bar { border-left: 4px solid var(--c-danger); background: var(--c-danger-bg-light); }
.autocomplete-row { padding: 0.6rem 1rem; cursor: pointer; border-bottom: 1px solid var(--c-border-faint); display: flex; align-items: center; gap: 0.5rem; background: var(--c-white); }
.bg-warn-pale { background: var(--c-warm-bg); }
.btn-danger-fill-sm { background: var(--c-danger); border-color: var(--c-danger); color: white; font-size: 0.8rem; }
.btn-indigo { background: var(--c-info-bright); color: white; }
.card-success-pale { background: var(--c-success-bg); border-radius: 8px; padding: 0.65rem 0.85rem; border: 1px solid var(--c-success-border-light); }
.card-violet-pale { background: var(--c-violet-bg-pale); border-radius: 8px; padding: 0.65rem 0.85rem; border: 1px solid var(--c-primary-bg); }
.dropdown-extra { margin-top: 0.5rem; padding: 0.6rem; background: var(--c-bg-light); border-radius: 8px; border: 1px solid var(--c-border-faint); }
.flex-between-start-wrap { display: flex; justify-content: space-between; align-items: flex-start; flex-wrap: wrap; gap: 0.5rem; }
.flex-center-jc { display: flex; align-items: center; justify-content: center; gap: 0.5rem; }
.flex-gap-3xs { display: flex; gap: 0.3rem; }
.flex-jc-gap-sm { display: flex; gap: 0.5rem; justify-content: center; }
.flex-wrap-xs { display: flex; flex-wrap: wrap; gap: 0.4rem; }
.fw-400 { font-weight: 400; }
.mt-3a { margin-top: 0.75rem; }
.mt-tiny { margin-top: 0.3rem; }
.mw-100 { min-width: 100px; }
.my-px2 { margin: 2px 0; }
.my-px3 { margin: 3px 0; }
.p-tiny2 { padding: 0.3rem; }
.p-xl { padding: 1.5rem; }
.push-event-card { margin-bottom: 1.5rem; background: var(--c-bg-light); border-radius: 10px; padding: 1rem 1.25rem; }
.section-badge { font-size: 0.78rem; font-weight: 700; text-transform: uppercase; padding: 0.3rem 0.5rem; letter-spacing: 0.03em; }
.text-amber-deep { color: var(--c-amber-text-deep); }
.th-border-b { border-bottom: 2px solid var(--c-border-light); text-align: left; }
.tr-border-b { border-bottom: 1px solid var(--c-border-faint); }

/* Small state and card fragments used by older modules. */
.anim-delay-2 { animation-delay: 0.16s; }
.bg-border { background: var(--c-border-light); }
.bg-warm-pale { background: var(--c-warm-bg-soft); }
.border-t-sum { border-top: 1px solid var(--c-border-mid); padding-top: 0.5rem; margin-top: 0.5rem; }
.btn-gray-confirm { background: var(--c-bg-light); color: var(--c-text-darkish); padding: 0.5rem 1rem; margin-left: 0.5rem; }
.btn-indigo-xl { background: var(--c-primary); color: white; padding: 0.5rem 1.5rem; }
.btn-success-fill { background: var(--c-success-dark); color: white; border-color: var(--c-success-dark); }
.card-border-dashed { border: 1px solid var(--c-border-faint); padding: 0.6rem; margin-bottom: 0.5rem; border-radius: 4px; }
.card-border-green { animation-delay: 0.35s; border-left-color: var(--c-success-bright); background: rgba(34,197,94,0.06); text-decoration: none; color: inherit; }
.card-border-success { animation-delay: 0.28s; border-left-color: var(--c-success-dark); background: rgba(5,150,105,0.06); cursor: pointer; }
.card-primary-pale { background: var(--c-primary-bg-pale); border-radius: 8px; padding: 0.65rem 0.85rem; border: 1px solid var(--c-primary-bg-soft); }
.card-success-light { background: var(--c-success-bg-pale); border: 1px solid var(--c-success-border-light); border-radius: 8px; padding: 1rem; }
.card-warning-hint { margin-top: 0.75rem; padding: 0.5rem 0.75rem; background: var(--c-warning-bg); border-radius: 6px; font-size: 0.85rem; color: var(--c-amber-text-deep); }
.cell-box { border: 1px solid var(--c-border-light); border-radius: 6px; padding: 0.4rem 0.6rem; text-align: center; min-width: 80px; }
.color-dot-gray { display: inline-block; width: 10px; height: 10px; border-radius: 3px; background: var(--c-text-lighter); margin-right: 4px; }
.flex-70-0 { flex: 0 0 70px; margin: 0; }
.flex-auto-end { flex: 0 0 auto; display: flex; align-items: flex-end; }
.flex-wrap-micro { display: flex; flex-wrap: wrap; gap: 0.35rem; }
.fs-4xl { font-size: 2.5rem; }
.fs-xxl { font-size: 2rem; }
.gap-3 { gap: 0.6rem; padding: 0.85rem 1.25rem; }
.grid-auto-200 { display: grid; grid-template-columns: repeat(auto-fill, minmax(200px, 1fr)); gap: 0.5rem; }
.grid-full-divider { grid-column: 1 / -1; margin-top: 1rem; padding-top: 0.75rem; border-top: 1px solid var(--c-border-light); }
.img-del-btn { position: absolute; top: -4px; right: -4px; background: var(--c-danger); color: white; border: none; border-radius: 50%; width: 18px; height: 18px; font-size: 0.7rem; cursor: pointer; line-height: 1; display: flex; align-items: center; justify-content: center; }
.img-del-btn-sm { position: absolute; top: -4px; right: -4px; background: var(--c-danger); color: white; border: none; border-radius: 50%; width: 16px; height: 16px; font-size: 0.65rem; cursor: pointer; line-height: 1; display: flex; align-items: center; justify-content: center; }
.img-thumb { width: 80px; height: 80px; object-fit: cover; border-radius: 6px; cursor: pointer; border: 1px solid var(--c-border-light); }
.img-thumb-sm { width: 70px; height: 70px; object-fit: cover; border-radius: 6px; cursor: pointer; border: 1px solid var(--c-border-light); }
.img-thumb-wrap { position: relative; width: 80px; height: 80px; }
.img-thumb-wrap-sm { position: relative; width: 70px; height: 70px; }
.info-block-cyan { font-size: 0.78rem; color: var(--c-cyan-text-deep); margin-bottom: 0.4rem; padding: 4px 6px; background: var(--c-info-bg-pale-cyan); border-radius: 4px; display: flex; flex-wrap: wrap; gap: 0.3rem 0.8rem; }
.info-block-cyan-sm { font-size: 0.78rem; color: var(--c-cyan-text-deep); margin-bottom: 0.4rem; padding: 4px 6px; background: var(--c-info-bg-pale-cyan); border-radius: 4px; }
.input-item-sm { padding: 6px 8px; margin: 4px 0; border: 1px solid var(--c-border-mid); border-radius: 4px; background: var(--c-bg-light); }
.label-xs-2 { font-size: 0.75rem; color: var(--c-text-muted); text-transform: uppercase; letter-spacing: 0.02em; margin-bottom: 0.15rem; }
.label-xs-4 { font-size: 0.75rem; color: var(--c-text-muted); text-transform: uppercase; letter-spacing: 0.02em; margin-bottom: 0.4rem; }
.left-accent-card { padding: 0.5rem 0.75rem; margin-bottom: 0.4rem; border-left: 3px solid var(--c-primary); }
.list-item-hover { padding: 0.5rem 0.75rem; cursor: pointer; border-bottom: 1px solid var(--c-border-faint); }
.map-marker-danger { background: var(--c-danger-dark); width: 32px; height: 32px; border-radius: 50%; border: 3px solid white; box-shadow: 0 2px 8px rgba(0,0,0,0.3); display: flex; align-items: center; justify-content: center; color: white; font-size: 16px; font-weight: bold; }
.text-orange { color: var(--c-orange-vibrant); }
.text-slate { color: var(--c-slate-text); }
.truncate-350 { max-width: 350px; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }

/* Module-specific fragments kept global until their modules get scoped CSS. */
.bg-navy { background: var(--c-primary-darker); }
.card-xs-white { border: 1px solid var(--c-border-light); border-radius: 8px; padding: 0.5rem; margin-bottom: 0.5rem; background: white; }
.flex-row-xs-card { display: flex; align-items: center; justify-content: space-between; padding: 0.35rem 0.5rem; background: white; border: 1px solid var(--c-border-light); border-radius: 6px; margin-bottom: 0.3rem; }
/* === Classi dinamiche per refactoring JS inline styles === */
.panel-disabled { opacity: 0.45; pointer-events: none; }
.badge-status-ok { background: var(--c-success-bg); color: var(--c-success-darker); font-size: 0.72rem; padding: 1px 5px; border-radius: 3px; }
.badge-status-warn { background: var(--c-warning-bg); color: var(--c-warning-darker); font-size: 0.72rem; padding: 1px 5px; border-radius: 3px; }
.badge-status-danger { background: var(--c-danger-bg); color: var(--c-danger-darker); font-size: 0.72rem; padding: 1px 5px; border-radius: 3px; }
.storico-stato-badge { font-size: 0.72rem; padding: 1px 5px; border-radius: 3px; }
.storico-consegnato { background: var(--c-success-bg); color: var(--c-success-darker); }
.storico-annullato { background: var(--c-danger-bg); color: var(--c-danger-darker); }
.ul-scroll-sm { margin: 0.4rem 0 0; padding-left: 1.2rem; max-height: 180px; overflow-y: auto; font-size: 0.9em; }
.color-dot-dyn { display: inline-block; width: 10px; height: 10px; border-radius: 3px; margin-right: 4px; }
.dash-card-inner { border-radius: 8px; padding: 0.6rem; text-align: center; }
.dash-card-val { font-size: 1.2rem; font-weight: 800; }
.mac-stat-card { border: 1px solid var(--c-border-light); border-radius: 8px; padding: 0.6rem; }
.mac-stat-card-inactive { opacity: 0.5; }
.btn-xs-h28 { height: 28px; padding: 0.15rem 0.3rem; font-size: 0.8rem; }
.marker-order-icon { border-radius: 50%; border: 3px solid white; box-shadow: 0 2px 8px rgba(0,0,0,0.3); display: flex; align-items: center; justify-content: center; color: white; font-weight: bold; cursor: pointer; }
.marker-cliente-icon { width: 24px; height: 24px; border-radius: 50%; border: 2px solid white; box-shadow: 0 2px 6px rgba(0,0,0,0.25); display: flex; align-items: center; justify-content: center; color: white; font-size: 10px; font-weight: bold; cursor: pointer; }

/* Utility atomiche condivise, mantenute a mano. Preferire classi di modulo
    quando una combinazione diventa specifica di una schermata o componente. */
.u-block { display: block; }
.u-inline-block { display: inline-block; }
.u-inline { display: inline; }
.u-flex { display: flex; }
.u-inline-flex { display: inline-flex; }
.u-flex-col { display: flex; flex-direction: column; }
.u-grid { display: grid; }
.u-grid-1 { display: grid; grid-template-columns: 1fr; }
.u-grid-full { grid-column: 1 / -1; }
.u-items-start { align-items: flex-start; }
.u-items-center { align-items: center; }
.u-items-end { align-items: flex-end; }
.u-justify-center { justify-content: center; }
.u-justify-end { justify-content: flex-end; }
.u-justify-between { justify-content: space-between; }
.u-wrap { flex-wrap: wrap; }
.u-nowrap { white-space: nowrap; }
.u-flex-1 { flex: 1; }
.u-flex-auto { flex: 0 0 auto; }
.u-flex-wrap { flex-wrap: wrap; }
.u-shrink-0 { flex-shrink: 0; }
.u-gap-2xs { gap: 0.25rem; }
.u-gap-xs { gap: 0.35rem; }
.u-gap-sm { gap: 0.5rem; }
.u-gap-md { gap: 1rem; }
.u-gap-lg { gap: 1.5rem; }
.u-m-0 { margin: 0; }
.u-mb-0 { margin-bottom: 0; }
.u-mx-auto { margin-left: auto; margin-right: auto; }
.u-mx-sm { margin-left: 0.5rem; margin-right: 0.5rem; }
.u-ml-auto { margin-left: auto; }
.u-ms-auto { margin-left: auto; }
.u-mr-auto { margin-right: auto; }
.u-ml-sm { margin-left: 0.5rem; }
.u-mr-sm { margin-right: 0.5rem; }
.u-ml-md { margin-left: 1rem; }
.u-mt-2xs { margin-top: 0.2rem; }
.u-mt-xs { margin-top: 0.25rem; }
.u-mt-0 { margin-top: 0; }
.u-mt-sm { margin-top: 0.5rem; }
.u-mt-md { margin-top: 1rem; }
.u-mt-lg { margin-top: 1.5rem; }
.u-mt-xl { margin-top: 2rem; }
.u-mb-xs { margin-bottom: 0.25rem; }
.u-mb-sm { margin-bottom: 0.5rem; }
.u-mb-md { margin-bottom: 1rem; }
.u-mb-lg { margin-bottom: 1.5rem; }
.u-mb-xl { margin-bottom: 2rem; }
.u-my-xs { margin-top: 0.25rem; margin-bottom: 0.25rem; }
.u-my-sm { margin-top: 0.5rem; margin-bottom: 0.5rem; }
.u-my-md { margin-top: 1rem; margin-bottom: 1rem; }
.u-my-xl { margin-top: 1.5rem; margin-bottom: 1.5rem; }
.u-p-2xs { padding: 0.25rem; }
.u-p-0 { padding: 0; }
.u-p-xs { padding: 0.4rem; }
.u-p-sm { padding: 0.5rem; }
.u-p-md { padding: 1rem; }
.u-p-lg { padding: 1.5rem; }
.u-p-xl { padding: 2rem; }
.u-px-xs { padding-left: 0.5rem; padding-right: 0.5rem; }
.u-px-sm { padding-left: 0.75rem; padding-right: 0.75rem; }
.u-px-md { padding-left: 1rem; padding-right: 1rem; }
.u-py-xs { padding-top: 0.25rem; padding-bottom: 0.25rem; }
.u-py-sm { padding-top: 0.5rem; padding-bottom: 0.5rem; }
.u-py-2px { padding-top: 2px; padding-bottom: 2px; }
.u-pt-sm { padding-top: 0.5rem; }
.u-pt-md { padding-top: 0.75rem; }
.u-pb-xs { padding-bottom: 0.25rem; }
.u-pb-md { padding-bottom: 0.75rem; }
.u-pl-sm { padding-left: 0.5rem; }
.u-pl-md { padding-left: 0.75rem; }
.u-fs-xs { font-size: 0.75rem; }
.u-fs-sm { font-size: 0.82rem; }
.u-fs-md { font-size: 1rem; }
.u-fs-lg { font-size: 1.25rem; }
.u-fs-xl { font-size: 1.5rem; }
.u-fs-2xl { font-size: 2rem; }
.u-lh-14 { line-height: 1.4; }
.u-fw-400 { font-weight: 400; }
.u-fw-500 { font-weight: 500; }
.u-fw-600 { font-weight: 600; }
.u-fw-700 { font-weight: 700; }
.u-text-muted { color: var(--c-text-muted); }
.u-text-faint { color: var(--c-text-faint); }
.u-text-dark { color: var(--c-text-dark); }
.u-text-primary { color: var(--c-primary); }
.u-text-success { color: var(--c-success); }
.u-text-danger { color: var(--c-danger); }
.u-text-info { color: var(--c-info); }
.u-text-warning { color: var(--c-warning); }
.u-text-amber { color: var(--c-amber-text); }
.u-text-center { text-align: center; }
.u-text-right { text-align: right; }
.u-text-left { text-align: left; }
.u-uppercase { text-transform: uppercase; }
.u-bg-light { background: var(--c-bg-light); }
.u-bg-lighter { background: var(--c-bg-lighter); }
.u-bg-primary { background: var(--c-primary); }
.u-bg-success { background: var(--c-success); }
.u-bg-danger { background: var(--c-danger); }
.u-bg-info { background: var(--c-info); }
.u-bg-warning { background: var(--c-warning); }
.u-border { border: 1px solid var(--c-border-mid); }
.u-border-faint { border: 1px solid var(--c-border-faint); }
.u-border-top { border-top: 1px solid var(--c-border-mid); }
.u-border-top-dashed { border-top: 1px dashed var(--c-border-mid); }
.u-border-left-primary { border-left: 3px solid var(--c-primary); padding-left: 0.75rem; }
.u-border-left-success { border-left: 3px solid var(--c-success); padding-left: 0.75rem; }
.u-border-left-info { border-left: 3px solid var(--c-info); padding-left: 0.75rem; }
.u-border-left-danger { border-left: 3px solid var(--c-danger); padding-left: 0.75rem; }
.u-border-left-warning { border-left: 3px solid var(--c-warning); padding-left: 0.75rem; }
.u-rounded-sm { border-radius: var(--radius-sm); }
.u-rounded-md { border-radius: 6px; }
.u-rounded-lg { border-radius: 8px; }
.u-relative { position: relative; }
.u-absolute { position: absolute; }
.u-sticky { position: sticky; }
.u-z-dropdown { z-index: var(--z-dropdown); }
.u-overflow-auto { overflow: auto; }
.u-overflow-hidden { overflow: hidden; }
.u-overflow-y-auto { overflow-y: auto; }
.u-w-full { width: 100%; }
.u-w-auto { width: auto; }
.u-h-full { height: 100%; }
.u-h-control { height: 3rem; }
.u-h-progress { height: 10px; }
.u-h-lg { height: 1.5rem; }
.u-maxw-full { max-width: 100%; }
.u-maxw-200 { max-width: 200px; }
.u-maxw-220 { max-width: 220px; }
.u-maxw-250 { max-width: 250px; }
.u-maxw-120 { max-width: 120px; }
.u-maxw-260 { max-width: 260px; }
.u-maxw-300 { max-width: 300px; }
.u-maxw-320 { max-width: 320px; }
.u-maxw-400 { max-width: 400px; }
.u-maxw-420 { max-width: 420px; }
.u-maxw-480 { max-width: 480px; }
.u-maxw-500 { max-width: 500px; }
.u-maxw-520 { max-width: 520px; }
.u-maxw-700 { max-width: 700px; }
.u-maxw-760 { max-width: 760px; }
.u-maxw-900 { max-width: 900px; }
.u-maxw-1100 { max-width: 1100px; }
.u-minw-36 { min-width: 36px; }
.u-minw-70 { min-width: 70px; }
.u-minw-40 { min-width: 40px; }
.u-minw-80 { min-width: 80px; }
.u-minw-90 { min-width: 90px; }
.u-minw-100 { min-width: 100px; }
.u-minw-110 { min-width: 110px; }
.u-minw-120 { min-width: 120px; }
.u-minw-130 { min-width: 130px; }
.u-minw-140 { min-width: 140px; }
.u-minw-150 { min-width: 150px; }
.u-minw-160 { min-width: 160px; }
.u-minw-180 { min-width: 180px; }
.u-minw-200 { min-width: 200px; }
.u-w-30 { width: 30px; }
.u-w-32 { width: 32px; }
.u-w-40 { width: 40px; }
.u-w-50 { width: 50px; }
.u-w-60 { width: 60px; }
.u-w-70 { width: 70px; }
.u-w-80 { width: 80px; }
.u-w-90 { width: 90px; }
.u-w-0 { width: 0; }
.u-w-50p { width: 50%; }
.u-w-60p { width: 60%; }
.u-w-70p { width: 70%; }
.u-w-80p { width: 80%; }
.u-w-90p { width: 90%; }
.u-w-110 { width: 110px; }
.u-w-120 { width: 120px; }
.u-w-130 { width: 130px; }
.u-w-140 { width: 140px; }
.u-w-160 { width: 160px; }
.u-w-280 { width: 280px; }
.u-w-600 { width: 600px; }
.u-w-xl { width: 3rem; }
.u-h-xl { height: 3rem; }
.u-object-contain { object-fit: contain; }
.u-list-disc { list-style: disc; }
.u-list-indent { margin-left: 1.2rem; }
.u-password-disc { -webkit-text-security: disc; }
.u-opacity-30 { opacity: 0.3; }
.u-invisible { visibility: hidden; }
.u-panel-muted { background: var(--c-bg-light); border: 1px solid var(--c-border-mid); border-radius: 8px; padding: 1rem; }
.u-panel-soft { background: var(--c-bg-light); border-radius: 6px; padding: 0.5rem 0.75rem; }
.u-panel-success { background: var(--c-success); border-radius: 8px; padding: 0.5rem; }
.u-panel-danger { background: var(--c-danger); border-radius: 8px; padding: 0.5rem; }
.u-panel-warning { background: var(--c-warning); border-radius: 8px; padding: 0.5rem; }

/* Dettaglio articolo 2Bit condiviso tra Magazzino, Etichette e Legna */
.mag-detail-grid { display: grid; grid-template-columns: 1fr 1fr; gap: 0.75rem; }
.mag-detail-label { font-size: 0.78rem; color: var(--c-text-muted); margin-bottom: 0.15rem; }
.mag-detail-value { font-size: 0.95rem; font-weight: 500; color: var(--c-text-dark); }
.mag-section-title-row { display: flex; align-items: center; justify-content: space-between; gap: 0.75rem; }
.mag-modal-context { margin-bottom: 0.75rem; padding: 0.55rem 0.7rem; border: 1px solid var(--c-border-light); border-radius: 6px; background: var(--c-bg-light); color: var(--c-text-dark); font-size: 0.9rem; }
.mag-source-badge { display: inline-flex; margin-left: 0.45rem; border-radius: 999px; padding: 0.08rem 0.4rem; background: var(--c-bg-light); color: var(--c-text-muted); font-size: 0.7rem; font-weight: 700; vertical-align: middle; }
.mag-status-row { display: flex; align-items: center; gap: 0.45rem; flex-wrap: wrap; }
.mag-status-pill { display: inline-flex; align-items: center; border-radius: 999px; padding: 0.18rem 0.55rem; font-size: 0.78rem; font-weight: 700; }
.mag-status-pill.is-ok { background: var(--c-success-bg); color: var(--c-success-darker); }
.mag-status-pill.is-warn { background: var(--c-warning-bg); color: var(--c-warning-dark); }
.mag-status-pill.is-muted { background: var(--c-bg-light); color: var(--c-text-muted); }
.mag-check-row { display: flex; align-items: center; gap: 0.55rem; margin: 0.55rem 0; font-weight: 600; color: var(--c-text-dark); }
.mag-barcode-list { display: grid; gap: 0.4rem; margin-bottom: 0.65rem; }
.mag-barcode-row { display: flex; align-items: center; justify-content: space-between; gap: 0.75rem; padding: 0.45rem 0.55rem; border: 1px solid var(--c-border-light); border-radius: 6px; background: var(--c-bg-light); }
.mag-barcode-code { display: flex; align-items: center; gap: 0.45rem; min-width: 0; }
.mag-barcode-code code { overflow-wrap: anywhere; }
.mag-barcode-badge { display: inline-flex; align-items: center; border-radius: 999px; padding: 0.1rem 0.45rem; font-size: 0.7rem; font-weight: 700; }
.mag-barcode-badge-primary { background: var(--c-primary-bg); color: var(--c-primary-dark); }
.mag-barcode-badge-alt { background: var(--c-border-light); color: var(--c-text-muted); }
.mag-barcode-actions { display: flex; align-items: center; gap: 0.25rem; flex-shrink: 0; }
.mag-barcode-add,
.mag-barcode-edit-row { display: flex; align-items: center; gap: 0.45rem; flex-wrap: wrap; }
.mag-barcode-input { flex: 1 1 220px; min-width: 160px; }
.mag-quick-stock-row { display: flex; align-items: flex-end; gap: 0.5rem; flex-wrap: wrap; margin-top: 0.75rem; }
.mag-quick-stock-input { flex: 1 1 220px; max-width: 300px; margin-bottom: 0; }
.mag-mov-table { width: 100%; border-collapse: collapse; font-size: 0.82rem; }
.mag-mov-table th { text-align: left; padding: 0.4rem 0.5rem; border-bottom: 2px solid var(--c-border); color: var(--c-text-muted); font-weight: 600; }
.mag-mov-table td { padding: 0.4rem 0.5rem; border-bottom: 1px solid var(--c-border-light); }
.mag-mov-tipo { font-size: 0.72rem; padding: 0.15rem 0.4rem; border-radius: 4px; font-weight: 600; }
.mag-mov-tipo.carico { background: var(--c-success-bg); color: var(--c-success-darker); }
.mag-mov-tipo.scarico { background: var(--c-danger-bg-light); color: var(--c-danger-dark); }
.mag-mov-report { display: grid; grid-template-columns: repeat(2, minmax(0, 1fr)); gap: 0.55rem; margin-bottom: 0.75rem; }
.mag-mov-report-card { border: 1px solid var(--c-border-light); border-radius: 6px; background: var(--c-bg-light); padding: 0.55rem 0.65rem; }
.mag-mov-report-title { font-size: 0.78rem; font-weight: 700; color: var(--c-text-muted); margin-bottom: 0.35rem; }
.mag-mov-report-row { display: flex; justify-content: space-between; gap: 0.75rem; font-size: 0.86rem; margin: 0.16rem 0; }

@media (max-width: 640px) {
    .mag-detail-grid,
    .mag-mov-report { grid-template-columns: 1fr; }
}

/* ═══════════════════════════════════════════════════════════════════
   CLASSI MARKER JS — hook per querySelector()/querySelectorAll().
   Hanno stile minimo; il visual viene da classi già presenti sull'elemento
   (btn, card, ecc.). Non rimuovere senza aggiornare i JS corrispondenti.
   ═══════════════════════════════════════════════════════════════════ */
/* /ore: pulsante compilazione rapida mezza giornata (btn btn-secondary btn-xs fornisce lo stile) */
.quick-half { cursor: pointer; }
/* /legna: bottone tab e categoria switcher (btn btn-primary/secondary fornisce lo stile) */
.tabBtn { transition: background-color 0.15s ease; }
.catBtn { transition: background-color 0.15s ease; }
/* /legna: pannello tab (.card fornisce lo stile; JS gestisce display/hidden) */
.tab-panel { transition: opacity 0.1s ease; }
/* /flotta: pulsante scan barcode (.btn btn-secondary fornisce lo stile) */
.camera-scan-btn { vertical-align: middle; }
/* /flotta: dropdown autocomplete ricambi/macchine (posizionato in assoluto via JS) */
.ricambi-dropdown { position: absolute; z-index: var(--z-dropdown, 200); min-width: 220px; }

/* ==================== MARGINE MAGAZZINO 2BIT ==================== */
/* Barra di copertura: quanto del venduto ha davvero un costo. Le tre quote
   stanno in fila e la larghezza la imposta il JS, perche' dipende dai dati. */
.margine-barra {
    display: flex;
    height: 14px;
    border-radius: 7px;
    overflow: hidden;
    background: var(--c-border-light);
}
.margine-barra-quota { display: block; height: 100%; }
.margine-quota-coperto { background: var(--c-success); }
.margine-quota-mancante { background: var(--c-warning); }
.margine-quota-generico { background: var(--c-text-lighter); }

/* ==================== CONFRONTO LISTINI ==================== */
/* Evidenzia cosa cambia rispetto a 2Bit: in una bolla da 800 righe senza
   questo non si vede quali tre prezzi si stanno muovendo. */
.listino-variato {
    background: var(--c-warning-bg);
    font-weight: 600;
}
.listino-generato {
    font-size: .7rem;
    font-weight: 400;
}
.listino-riga { cursor: pointer; }
.listino-riga:hover { background: var(--c-bg-lighter); }
/* La descrizione si apre: deve sembrare cliccabile senza urlare, perche' in
   colonna ce ne sono centinaia una sotto l'altra. */
/* La riga in ricalcolo: si vede che sta lavorando senza spostare niente. */
.listino-riga--in-calcolo { opacity: .55; transition: opacity .12s; }
.listino-descrizione {
    background: none;
    border: 0;
    padding: 0;
    font: inherit;
    color: inherit;
    text-align: left;
    cursor: pointer;
    border-bottom: 1px dotted var(--c-border);
}
.listino-descrizione:hover,
.listino-descrizione:focus-visible {
    color: var(--c-primary);
    border-bottom-color: var(--c-primary);
}
/* La finestra delle colonne: a sinistra cosa c'e' scritto nel file, a destra
   cosa ci si legge. Le celle di esempio sono la meta' che decide, quindi
   stanno accanto alla tendina e non in una tabella piu' sotto. */
.listino-colonna {
    display: grid;
    grid-template-columns: minmax(0, 1fr) minmax(0, 1fr);
    gap: .5rem;
    align-items: center;
    padding: .35rem .5rem;
    border: 1px solid var(--c-border);
    border-radius: var(--radius-sm);
}
.listino-colonna-nome { font-weight: 600; font-size: .85rem; }
.listino-colonna-esempi {
    font-size: .75rem;
    color: var(--c-text-light);
    overflow-wrap: anywhere;
}
/* I numeri di questa pagina si scrivono a tastiera. Le freccette rubavano
   meta' campo — nel prezzo non ci stavano due cifre e due decimali — per un
   incremento da un centesimo che nessuno usa, e con la rotella del mouse
   cambiavano il valore per sbaglio mentre si scorre una bolla lunga. */
#risultatoDocumento input[type="number"],
#campiMappatura input[type="number"] {
    -moz-appearance: textfield;
    appearance: textfield;
}
#risultatoDocumento input[type="number"]::-webkit-outer-spin-button,
#risultatoDocumento input[type="number"]::-webkit-inner-spin-button,
#campiMappatura input[type="number"]::-webkit-outer-spin-button,
#campiMappatura input[type="number"]::-webkit-inner-spin-button {
    -webkit-appearance: none;
    margin: 0;
}
/* Il prezzo, oltre alle freccette, vuole spazio: 12,34 ci deve stare. */
.listino-prezzo {
    width: 6.5rem;
    max-width: none;
    text-align: right;
}

/* L'esito dell'applicazione: righe lunghe, una sotto l'altra, leggibili. */
.listino-esito { margin: .25rem 0 0 1.1rem; }
.listino-esito li { margin-bottom: .15rem; }

/* La dichiarazione si scrive nella scheda del prodotto: e' un testo lungo che
   finisce su un documento firmato, quindi il campo deve mostrarne abbastanza
   da rileggerlo, e a larghezza fissa perche' gli elenchi restino allineati. */
.pesa-dichiarazione-testo {
    width: 100%;
    /* Alto come lo spazio che il testo ha sulla bolla: si scrive guardando
       quanto occupa davvero, non due righe alla volta dentro una feritoia. */
    min-height: min(60vh, 34rem);
    font-family: var(--font-mono, ui-monospace, Consolas, monospace);
    font-size: .82rem;
    line-height: 1.45;
    resize: vertical;
}

/* Le schede di Configurazione stampe. Sono due viste della stessa cosa —
   dove va il documento e com'e' fatto — e stare su due pagine costringeva a
   rimbalzare fra loro con un pulsante. */
.pesa-tabs {
    display: flex;
    gap: .25rem;
    margin: .75rem 0 .5rem;
    border-bottom: 1px solid var(--c-border);
}
.pesa-tab {
    background: none;
    border: 1px solid transparent;
    border-bottom: 0;
    border-radius: var(--radius-sm) var(--radius-sm) 0 0;
    padding: .45rem .9rem;
    font: inherit;
    font-weight: 600;
    color: var(--c-text-light);
    cursor: pointer;
}
.pesa-tab:hover { color: var(--c-text); background: var(--c-bg-lighter); }
.pesa-tab.is-active {
    color: var(--c-primary);
    background: var(--c-bg);
    border-color: var(--c-border);
    margin-bottom: -1px;
}

/* ==================== MODELLI DI STAMPA (PESA) ==================== */
/* Il mittente come esce sul foglio: chi scrive l'indirizzo lo vede montato
   invece di immaginarselo e scoprirlo alla prima bolla stampata. */
.pesa-mittente-anteprima {
    margin: .25rem 0 0;
    padding: .5rem .7rem;
    background: var(--c-bg-lighter);
    border: 1px solid var(--c-border);
    border-radius: var(--radius-sm);
    font-family: var(--font-mono, ui-monospace, Consolas, monospace);
    font-size: .78rem;
    line-height: 1.4;
    white-space: pre-wrap;
}
.modello-card { cursor: pointer; }
.modello-card:hover { background: var(--c-bg-lighter); }
/* I layout storici stanno li' per poterci tornare, non per essere scelti:
   restano leggibili ma non attirano il clic. */
.modello-card--storico { opacity: .72; }
.modello-card--storico:hover { opacity: 1; }
.doc-preview-frame { height: 70vh; }
.doc-preview-frame iframe {
    width: 100%;
    height: 100%;
    border: 1px solid var(--c-border);
    border-radius: var(--radius-sm);
}

.listino-descrizione-confronto {
    background: var(--c-bg-lighter);
    border-radius: var(--radius-sm);
    padding: .4rem .6rem;
    min-height: 2rem;
}

/* ===== Ricerca in rubrica dentro il telefono ===== */
.phone-rubrica { margin-top: 0.75rem; }
.phone-rubrica-risultati { max-height: 14rem; overflow-y: auto; margin-top: 0.4rem; }
.phone-rubrica-riga {
    display: flex; justify-content: space-between; gap: 0.5rem; width: 100%;
    text-align: left; padding: 0.5rem 0.6rem; margin-bottom: 0.25rem;
    border: 1px solid var(--c-border); border-radius: 8px;
    background: var(--c-white); cursor: pointer;
}
.phone-rubrica-riga:hover { border-color: var(--c-primary); background: var(--c-bg-light); }
.phone-rubrica-nome { font-weight: 600; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
.phone-rubrica-numero { color: var(--c-text-muted); font-variant-numeric: tabular-nums; }
.phone-rubrica-vuoto { color: var(--c-text-muted); font-size: 0.9rem; margin: 0.4rem 0; }

/* ===== Schede e chiamate dentro il telefono ===== */
.phone-schede { display: flex; gap: 0.35rem; margin-top: 0.75rem; }
.phone-scheda {
    flex: 1; padding: 0.4rem 0.5rem; border: 1px solid var(--c-border);
    border-radius: 8px; background: var(--c-white); cursor: pointer;
    font-weight: 600; color: var(--c-text-muted);
}
.phone-scheda.attiva { border-color: var(--c-primary); color: var(--c-primary); }
.phone-chiamate { margin-top: 0.5rem; max-height: 16rem; overflow-y: auto; }
.phone-chiamata {
    display: flex; flex-direction: column; align-items: stretch; gap: 0.15rem;
    width: 100%; padding: 0.45rem 0.6rem; margin-bottom: 0.25rem;
    border: 1px solid var(--c-border); border-radius: 8px;
    background: var(--c-white);
}
.phone-chiamata:hover { border-color: var(--c-primary); }
.phone-chiamata.senza-risposta .phone-chiamata-chi { color: var(--c-danger); }
/* Il numero richiama, la nota si corregge: bersagli separati, e larghi
   abbastanza da non sbagliare col pollice. */
.phone-chiamata-chiama {
    display: flex; flex-direction: column; align-items: flex-start; gap: 0.1rem;
    width: 100%; min-height: 44px; padding: 0.15rem 0; border: 0;
    background: none; text-align: left; font: inherit; color: inherit;
    cursor: pointer;
}
.phone-chiamata-chi { font-weight: 600; }
.phone-chiamata-sotto { font-size: 0.8rem; color: var(--c-text-muted); }
.phone-chiamata-nota {
    width: 100%; min-height: 32px; padding: 0.2rem 0.4rem; border: 0;
    border-top: 1px dashed var(--c-border); border-radius: 0 0 5px 5px;
    background: none; text-align: left; cursor: pointer;
    font-family: inherit; font-size: 0.8rem; font-style: italic;
    color: var(--c-text); white-space: normal;
}
.phone-chiamata-nota:hover { background: var(--c-bg-light); }
.phone-chiamata-nota.vuota { color: var(--c-text-muted); font-style: normal; }



/* ── Il banco di lavoro ────────────────────────────────────────────────
   Un compito con dei passi e una fine: si porta dentro un documento, si
   guarda cosa cambia, si applica. La pagina non e' un elenco da sfogliare
   ne' una scheda da leggere: e' un tavolo, e quasi tutto lo schermo deve
   essere il confronto. Vale per i listini, l'import Metodo, i colli. */
.banco-avvio {
    display: flex;
    align-items: center;
    gap: 0.75rem;
    flex-wrap: wrap;
    padding: 0.7rem 0.9rem;
    margin-bottom: 1rem;
    border: 1px dashed var(--c-border-mid);
    border-radius: var(--radius-sm);
    background: var(--c-bg-light);
}

.banco-avvio-testo {
    display: flex;
    flex-direction: column;
    gap: 0.1rem;
    margin-right: auto;
    min-width: 12rem;
}

/* La barra sopra la tabella: cosa si sta guardando e quanto ne resta. */
.banco-barra {
    display: flex;
    align-items: center;
    gap: 0.6rem;
    flex-wrap: wrap;
    padding-bottom: 0.5rem;
    border-bottom: 1px solid var(--c-border);
    margin-bottom: 0.5rem;
}

/* La pastiglia col quadratino dentro: il quadratino sparisce, acceso o
   spento lo dice la pastiglia intera, come i filtri del telefono. */
.banco-barra .filtro-pastiglia { position: relative; user-select: none; }
.banco-barra .filtro-pastiglia input { position: absolute; opacity: 0; pointer-events: none; }

.banco-barra .filtro-pastiglia:not(:has(input:checked)) {
    border-color: var(--c-border-mid);
    background: var(--c-white);
    color: var(--c-text-muted);
}

/* LA QUANTITÀ CHE SI TOCCA — il numero, non due tasti.
   Dentro una riga di lista il "meno / numero / piu'" costa centotrenta
   pixel di larghezza: su un telefono da 390 e' un terzo della riga, e
   quello che resta non basta a far vedere il prezzo. Qui il numero e' un
   tasto solo: si tocca e si apre la finestrella della quantita'
   (static/js/quantita_modal.js), dove i tasti sono larghi da premere. */
.cp-qta {
    display: inline-flex;
    align-items: center;
    gap: 0.15rem;
    min-width: 3.1rem;
    min-height: 40px;
    padding: 0 0.55rem;
    border: 1px solid var(--c-border-mid);
    border-radius: 9px;
    background: var(--c-white);
    color: var(--c-text-dark);
    font: inherit;
    font-weight: 700;
    font-variant-numeric: tabular-nums;
    cursor: pointer;
    white-space: nowrap;
}

.cp-qta:active { background: var(--c-bg-light); }
.cp-qta-segno { color: var(--c-text-lighter); font-weight: 400; }

/* La finestrella: il numero grande in mezzo, i tasti ai lati. */
.qta-controllo {
    display: flex;
    align-items: center;
    gap: 0.6rem;
    margin: 0.75rem 0;
}

.qta-controllo .btn {
    flex: 0 0 auto;
    min-width: 3.2rem;
    min-height: 3.2rem;
    font-size: 1.5rem;
}

.qta-controllo .form-control {
    flex: 1 1 auto;
    min-height: 3.2rem;
    text-align: center;
    font-size: 1.8rem;
    font-weight: 700;
    font-variant-numeric: tabular-nums;
    /* Le freccette del browser dentro un campo grande come questo sono due
       triangolini da tre pixel accanto a una cifra da 1,8rem: si mira e non
       si prende. I tasti sono quelli larghi ai lati. */
    -moz-appearance: textfield;
    appearance: textfield;
}

.qta-controllo .form-control::-webkit-outer-spin-button,
.qta-controllo .form-control::-webkit-inner-spin-button {
    -webkit-appearance: none;
    margin: 0;
}

.qta-scorciatoie {
    display: flex;
    flex-wrap: wrap;
    gap: 0.35rem;
}

/* IL BANCO A SCHERMO PIENO — quando il documento e' caricato, la pagina
   smette di presentarsi e diventa il documento. Il titolo grande e la
   spiegazione del formato servono a chi arriva col file in mano: dopo
   sono duecento pixel spesi sopra la prima riga della bolla, e a schermo
   ne restavano due. La tabella prende quello che avanza e scorre da
   sola: la pagina no. */
.banco-schermo {
    display: flex;
    flex-direction: column;
    max-height: calc(100vh - 7rem);
}

.banco-schermo > *:not(.banco-tabella) { flex: 0 0 auto; }

.banco-schermo > .banco-tabella { min-height: 0; }

body.banco-attivo .card-gradient { display: none; }

body.banco-attivo .banco-avvio {
    padding: 0.35rem 0.6rem;
    margin-bottom: 0.5rem;
}

body.banco-attivo .banco-avvio-testo { display: none; }

/* Le file di parametri sopra la tabella: stanno, ma strette. */
.banco-schermo .u-mb-sm { margin-bottom: 0.35rem; }
.banco-schermo .u-mb-md { margin-bottom: 0.5rem; }

.banco-anagrafica {
    max-height: 40vh;
    overflow-y: auto;
}

/* Il tasto che conclude non deve stare in fondo a quattrocento righe. */
.banco-chiusura {
    position: sticky;
    bottom: 0;
    z-index: 3;
    display: flex;
    align-items: center;
    gap: 0.75rem;
    flex-wrap: wrap;
    margin: 0 -1rem -1rem;
    padding: 0.7rem 1rem;
    background: var(--c-white);
    border-top: 1px solid var(--c-border);
    box-shadow: 0 -4px 12px rgba(0, 0, 0, 0.05);
}

/* ==================== ANALISI DI LABORATORIO ====================
   La scheda Analisi della pesa: a sinistra il referto dell'analisi appena
   fatta, a destra il campione da analizzare. Sotto, l'archivio. Sullo
   schermo del laboratorio le due colonne stanno affiancate; su un tablet
   si impilano, e il pulsante che avvia resta il piu' grande della pagina.

   E' una pagina da bancone: si stringe. Chi la usa ha una strip in mano e
   due tasti da premere, e non deve scorrere per arrivarci - il 27" del
   laboratorio deve tenere stato, referto e pulsanti nella prima schermata. */
.analisi-pagina .card {
    padding: 0.8rem 1rem;
    margin-bottom: 0.7rem;
}

.analisi-pagina .card-title {
    margin-bottom: 0.4rem;
    font-size: 1.05rem;
}

.analisi-pagina .card-header-actions { margin-bottom: 0.4rem; }

.analisi-pagina .form-grid-2 { gap: 0.4rem 0.7rem; }

.analisi-pagina .table th,
.analisi-pagina .table td {
    padding: 0.28rem 0.5rem;
    font-size: 0.85rem;
}

.analisi-colonne {
    display: grid;
    grid-template-columns: minmax(0, 1fr) minmax(0, 1fr);
    gap: 0.7rem;
    /* Le due carte alte uguali: affiancate, una piu' corta dell'altra
       sembra un pezzo mancante. Il tasto che avvia scende in fondo. */
    align-items: stretch;
}

.analisi-colonne > .card {
    display: flex;
    flex-direction: column;
}

/* La riga dei pulsanti si appoggia al fondo della carta. */
.analisi-colonne > .card > .analisi-fondo { margin-top: auto; }

@media (max-width: 900px) {
    .analisi-colonne { grid-template-columns: minmax(0, 1fr); }
}

/* Il referto a schermo: etichetta grigia a sinistra, valore a destra, come
   sul foglio stampato. */
.analisi-referto {
    display: grid;
    grid-template-columns: 9rem minmax(0, 1fr);
    gap: 0.1rem 0.5rem;
    align-items: baseline;
    margin: 0;
}

.analisi-referto dt {
    color: var(--c-text-muted);
    font-size: 0.82rem;
}

.analisi-referto dd {
    margin: 0;
    font-size: 0.88rem;
    font-weight: 500;
    overflow-wrap: anywhere;
}

/* La tabella delle linee dentro il referto: e' un dettaglio di controllo,
   non il risultato. Sta strettta e non allarga la colonna. */
.analisi-referto .table th,
.analisi-referto .table td {
    padding: 0.2rem 0.4rem;
    font-size: 0.8rem;
}

.analisi-sezione {
    grid-column: 1 / -1;
    margin: 0.4rem 0 0.15rem;
    padding-bottom: 0.15rem;
    border-bottom: 1px solid var(--c-border);
    color: var(--c-text-muted);
    font-size: 0.72rem;
    font-weight: 700;
    letter-spacing: 0.06em;
    text-transform: uppercase;
}

.analisi-sezione:first-child { margin-top: 0; }

/* Il numero che si va a leggere: si vede dall'altra parte del bancone. */
.analisi-finale {
    color: var(--c-primary);
    font-size: 1.7rem;
    font-weight: 700;
    line-height: 1.1;
}

.analisi-finale.is-invalido,
.analisi-finale.is-sospetto { color: var(--c-danger); }

.analisi-finale.is-attesa {
    color: var(--c-text-muted);
    font-size: 1.05rem;
    font-weight: 500;
}

/* Il tasto che avvia: il piu' grande della pagina, ma senza rubare
   un'altra riga di scorrimento. */
.analisi-avvia {
    flex: 1;
    padding: 0.6rem 1rem;
    font-size: 1.1rem;
    font-weight: 700;
}

/* Il metodo letto dalla strip: una riga, non un riquadro. */
.analisi-metodo {
    display: flex;
    align-items: center;
    gap: 0.5rem;
    flex-wrap: wrap;
    padding: 0.35rem 0.6rem;
    border-radius: var(--radius-sm);
    background: var(--c-bg-lighter);
}

/* La barra di stato dello strumento: verde quando risponde, rossa quando no. */
.analisi-stato {
    display: flex;
    align-items: center;
    gap: 0.6rem;
    flex-wrap: wrap;
    padding: 0.4rem 0.7rem;
    border-left: 4px solid var(--c-border-mid);
    border-radius: var(--radius-sm);
    background: var(--c-bg-light);
    font-size: 0.88rem;
}

.analisi-stato.is-ok { border-left-color: var(--c-success); }
.analisi-stato.is-ko { border-left-color: var(--c-danger); }
.analisi-stato.is-attesa { border-left-color: var(--c-warning); }

.analisi-stato-voce { color: var(--c-text-secondary); }

.analisi-stato-voce b { color: var(--c-text-dark); }

/* La pesata collegata: si vede a colpo d'occhio se c'e' o no. */
.analisi-pesata {
    display: flex;
    align-items: center;
    gap: 0.5rem;
    flex-wrap: wrap;
    margin-top: 0.4rem;
    padding: 0.35rem 0.6rem;
    border: 1px dashed var(--c-border-mid);
    border-radius: var(--radius-sm);
    background: var(--c-bg-light);
}

.analisi-pesata.is-collegata {
    border-style: solid;
    border-color: var(--c-primary-soft);
    background: var(--c-primary-bg-soft);
}

/* Le righe dell'archivio: la riga non attendibile si riconosce senza
   leggerla, perche' quella non si stampa e non si consegna. */
.analisi-riga-sospetta { background: var(--c-danger-bg-light); }

/* Il riquadro delle aflatossine dentro il form della bolla. */
.pesa-analisi-box {
    display: flex;
    align-items: center;
    gap: 0.75rem;
    flex-wrap: wrap;
}

.pesa-analisi-esito {
    font-weight: 600;
    white-space: nowrap;
}
