/* DELTA — design «Sereno» (pilota /anteprima). Token+componenti portati dall'artifact
   validato 2026-07-11. Self-contained: NON dipende da style.css. */
/* ============ FONT (self-hosted su file, no CDN) ============ */
@font-face{font-family:"Hanken Grotesk";font-weight:400;font-style:normal;font-display:swap;src:url("/static/fonts/hanken-grotesk-400.woff2") format("woff2");}
@font-face{font-family:"Hanken Grotesk";font-weight:500;font-style:normal;font-display:swap;src:url("/static/fonts/hanken-grotesk-500.woff2") format("woff2");}
@font-face{font-family:"Hanken Grotesk";font-weight:600;font-style:normal;font-display:swap;src:url("/static/fonts/hanken-grotesk-600.woff2") format("woff2");}
@font-face{font-family:"Hanken Grotesk";font-weight:700;font-style:normal;font-display:swap;src:url("/static/fonts/hanken-grotesk-700.woff2") format("woff2");}
@font-face{font-family:"Fraunces";font-weight:400;font-style:normal;font-display:swap;src:url("/static/fonts/fraunces-400.woff2") format("woff2");}
@font-face{font-family:"Fraunces";font-weight:500;font-style:normal;font-display:swap;src:url("/static/fonts/fraunces-500.woff2") format("woff2");}
@font-face{font-family:"Fraunces";font-weight:600;font-style:normal;font-display:swap;src:url("/static/fonts/fraunces-600.woff2") format("woff2");}

/* ============ FONT (self-hosted, data-URI — nessuna CDN) ============ */

/* ============ TOKEN — Sereno (chiaro, fedele al mock) ============ */
:root{
  color-scheme:light;
  --ground:#F5F6F8; --surface:#FFFFFF; --surface-2:#EEF0F3; --top-bg:rgba(255,255,255,.82);
  --ink:#14181D; --ink-soft:#5B6472; --muted:#98A2B0; --line:#E4E7EC; --line-strong:#D6DAE1;
  --accent:#0E9F6E; --accent-ink:#FFFFFF; --accent-2:#0B7F58; --accent-wash:#D8F3E7; --chip-bg:#EEF0F3;
  --ok:#16A34A; --ok-bg:#E6F6EC; --ok-line:#C6E9D2;
  --info:#2E6FA6; --info-bg:#EAF1F8; --info-line:#D4E1F0;
  --warn:#CA8A04; --warn-bg:#FBF3DA; --warn-line:#EFE0B0;
  --crit:#DC2626; --crit-bg:#FCEAEA; --crit-line:#F5D0D0;
  --neu:#6B7280; --neu-bg:#EEF0F3;
  /* Varianti LEGGIBILI dei semantici: gli stessi colori usati come TESTO su fondo
     chiaro non arrivano a 4.5:1 (accento 3.39, ok 2.94, warn 2.72). Questi token
     servono SOLO per il testo; sfondi, bordi e icone continuano a usare gli originali,
     così la tavolozza di marca resta quella. Il fondo dei pulsanti primari sta in
     --accent-strong (sotto): per un tenant con accento proprio lo calcola branding.py e lo
     inietta base_sereno.html, perché la quantità di scurimento dipende dalla tinta e in CSS
     non si può misurare. */
  /* Fondo dei pulsanti primari: la stessa tinta dell'accento, scurita quanto basta perché il
     testo sopra regga AA (#0E9F6E col bianco è 3.39:1). NON è un color-mix: scurire di una
     quantità costante non basta su una tinta chiara e non ha ripiego sui motori che non lo
     supportano. Per un tenant con accento proprio, base_sereno.html sovrascrive questa coppia
     col valore calcolato da branding.py. */
  --accent-strong:#0C845B;
  --accent-text:#0A7752; --ok-text:#12703A; --warn-text:#92610A;
  --crit-text:#C81E1E; --neu-text:#565E6B;
  /* Le cinque bande di scadenza escono tutte da `ui.banda_pill`, dichiarata «unica
     traduzione banda→colore dell'app»: lasciarle indietro voleva dire due ori diversi
     sulla stessa riga di scadenza. Ognuna è la propria tinta, scurita quanto basta sul
     proprio fondo. */
  --sc-scaduto-text:#CD2323; --sc-30-text:#B94609; --sc-60-text:#916303;
  --sc-ok-text:#117C38; --sc-nd-text:#656B78;
  /* Il pill PIENO porta il testo sopra la tinta piena, non sul suo wash: nel tema scuro
     --crit è più brillante e il bianco ci cade a 3.76:1, quindi lì l'inchiostro si
     scurisce. */
  --crit-solid-ink:#FFFFFF;
  /* Bande di scadenza (Figma 0:1) — cinque livelli, allineati a dataload.alert_da_giorni.
     Distinte dai semantici generici: «≤ 30» ha un arancio proprio, che --warn non dava. */
  --sc-scaduto:#DC2626; --sc-scaduto-bg:#FCEAEA; --sc-scaduto-line:#F5D0D0;
  --sc-30:#EA580C; --sc-30-bg:#FDEEE3; --sc-30-line:#F8D5BC;
  --sc-60:#CA8A04; --sc-60-bg:#FBF3DA; --sc-60-line:#EFE0B0;
  --sc-ok:#16A34A; --sc-ok-bg:#E6F6EC; --sc-ok-line:#C6E9D2;
  --sc-nd:#6B7280; --sc-nd-bg:#EEF0F3; --sc-nd-line:#DCE0E6;
  --shadow-sm:0 1px 2px rgba(20,30,50,.05);
  --shadow:0 1px 2px rgba(20,30,50,.04),0 8px 24px rgba(20,30,50,.06);
  --shadow-lg:0 12px 44px rgba(20,30,50,.14);
  --r-shell:16px; --r-card:14px; --r-el:12px; --r-pill:999px;
  --font-display:"Fraunces",Georgia,"Times New Roman",serif;
  --font-body:"Hanken Grotesk",-apple-system,system-ui,"Segoe UI",Roboto,sans-serif;
  /* Sidebar (Figma 97:7 aperta / 97:208 rail). `--sb-gap` è il distacco della scheda dal
     bordo: sta sulla .sidebar e NON su .app, così la colonna del contenuto non si sposta in
     verticale — la workspace posta ha l'altezza cablata su quella geometria. */
  --sb-w:256px; --sb-mini-w:78px; --sb-gap:12px;
  /* Scala spaziatura (griglia 4px) — margini/gap/padding SOLO da questi token */
  --sp-1:4px; --sp-2:8px; --sp-3:12px; --sp-4:16px; --sp-5:24px; --sp-6:32px; --sp-8:48px;
}
@media (prefers-color-scheme:dark){
  :root{
    color-scheme:dark;
    --ground:#0B0D10; --surface:#14171C; --surface-2:#1A1E24; --top-bg:rgba(11,13,16,.72);
    --ink:#F2F4F7; --ink-soft:#98A2B0; --muted:#667085; --line:#262C34; --line-strong:#333A44;
    --accent:#10B981; --accent-ink:#04140E; --accent-2:#34D3A2; --accent-wash:#0F2E24; --chip-bg:#1A1E24;
    --ok:#22C55E; --ok-bg:#0F2A1B; --ok-line:#1E4A31;
    --info:#5AA0DE; --info-bg:#122130; --info-line:#274a68;
    --warn:#EAB308; --warn-bg:#2A2413; --warn-line:#4E4324;
    --crit:#F04438; --crit-bg:#2B1615; --crit-line:#5A2A28;
    --neu:#98A2B0; --neu-bg:#1A1E24;
    /* Su fondo scuro i semantici passano già (accento 7.08, ok 7.88, warn 9.37):
       i token di testo puntano agli originali e --accent-strong non scurisce nulla,
       perché lì il testo sull'accento è quasi nero, non bianco. */
    --accent-strong:var(--accent);
    --accent-text:var(--accent-2); --ok-text:var(--ok); --warn-text:var(--warn);
    --crit-text:var(--crit); --neu-text:var(--ink-soft);
    --sc-scaduto-text:var(--sc-scaduto); --sc-30-text:var(--sc-30);
    --sc-60-text:var(--sc-60); --sc-ok-text:var(--sc-ok); --sc-nd-text:var(--sc-nd);
    --crit-solid-ink:#14181D;
    /* Bande di scadenza (Figma 0:1) — cinque livelli, allineati a dataload.alert_da_giorni.
       Distinte dai semantici generici: «≤ 30» ha un arancio proprio, che --warn non dava. */
    --sc-scaduto:#F04438; --sc-scaduto-bg:#2B1615; --sc-scaduto-line:#5A2A28;
    --sc-30:#F97316; --sc-30-bg:#2A1A0F; --sc-30-line:#55321A;
    --sc-60:#EAB308; --sc-60-bg:#2A2413; --sc-60-line:#4E4324;
    --sc-ok:#22C55E; --sc-ok-bg:#0F2A1B; --sc-ok-line:#1E4A31;
    --sc-nd:#98A2B0; --sc-nd-bg:#1A1E24; --sc-nd-line:#2E353E;
    --shadow-sm:0 1px 2px rgba(0,0,0,.4);
    --shadow:0 1px 2px rgba(0,0,0,.35),0 10px 30px rgba(0,0,0,.45);
    --shadow-lg:0 14px 48px rgba(0,0,0,.6);
  }
}
:root[data-theme="light"]{
  color-scheme:light;
  --ground:#F5F6F8; --surface:#FFFFFF; --surface-2:#EEF0F3; --top-bg:rgba(255,255,255,.82);
  --ink:#14181D; --ink-soft:#5B6472; --muted:#98A2B0; --line:#E4E7EC; --line-strong:#D6DAE1;
  --accent:#0E9F6E; --accent-ink:#FFFFFF; --accent-2:#0B7F58; --accent-wash:#D8F3E7; --chip-bg:#EEF0F3;
  --ok:#16A34A; --ok-bg:#E6F6EC; --ok-line:#C6E9D2;
  --info:#2E6FA6; --info-bg:#EAF1F8; --info-line:#D4E1F0;
  --warn:#CA8A04; --warn-bg:#FBF3DA; --warn-line:#EFE0B0;
  --crit:#DC2626; --crit-bg:#FCEAEA; --crit-line:#F5D0D0;
  --neu:#6B7280; --neu-bg:#EEF0F3;
  /* Varianti LEGGIBILI dei semantici: gli stessi colori usati come TESTO su fondo
     chiaro non arrivano a 4.5:1 (accento 3.39, ok 2.94, warn 2.72). Questi token
     servono SOLO per il testo; sfondi, bordi e icone continuano a usare gli originali,
     così la tavolozza di marca resta quella. Il fondo dei pulsanti primari sta in
     --accent-strong (sotto): per un tenant con accento proprio lo calcola branding.py e lo
     inietta base_sereno.html, perché la quantità di scurimento dipende dalla tinta e in CSS
     non si può misurare. */
  /* Fondo dei pulsanti primari: la stessa tinta dell'accento, scurita quanto basta perché il
     testo sopra regga AA (#0E9F6E col bianco è 3.39:1). NON è un color-mix: scurire di una
     quantità costante non basta su una tinta chiara e non ha ripiego sui motori che non lo
     supportano. Per un tenant con accento proprio, base_sereno.html sovrascrive questa coppia
     col valore calcolato da branding.py. */
  --accent-strong:#0C845B;
  --accent-text:#0A7752; --ok-text:#12703A; --warn-text:#92610A;
  --crit-text:#C81E1E; --neu-text:#565E6B;
  /* Le cinque bande di scadenza escono tutte da `ui.banda_pill`, dichiarata «unica
     traduzione banda→colore dell'app»: lasciarle indietro voleva dire due ori diversi
     sulla stessa riga di scadenza. Ognuna è la propria tinta, scurita quanto basta sul
     proprio fondo. */
  --sc-scaduto-text:#CD2323; --sc-30-text:#B94609; --sc-60-text:#916303;
  --sc-ok-text:#117C38; --sc-nd-text:#656B78;
  /* Il pill PIENO porta il testo sopra la tinta piena, non sul suo wash: nel tema scuro
     --crit è più brillante e il bianco ci cade a 3.76:1, quindi lì l'inchiostro si
     scurisce. */
  --crit-solid-ink:#FFFFFF;
  /* Bande di scadenza (Figma 0:1) — cinque livelli, allineati a dataload.alert_da_giorni.
     Distinte dai semantici generici: «≤ 30» ha un arancio proprio, che --warn non dava. */
  --sc-scaduto:#DC2626; --sc-scaduto-bg:#FCEAEA; --sc-scaduto-line:#F5D0D0;
  --sc-30:#EA580C; --sc-30-bg:#FDEEE3; --sc-30-line:#F8D5BC;
  --sc-60:#CA8A04; --sc-60-bg:#FBF3DA; --sc-60-line:#EFE0B0;
  --sc-ok:#16A34A; --sc-ok-bg:#E6F6EC; --sc-ok-line:#C6E9D2;
  --sc-nd:#6B7280; --sc-nd-bg:#EEF0F3; --sc-nd-line:#DCE0E6;
  --shadow-sm:0 1px 2px rgba(20,30,50,.05);
  --shadow:0 1px 2px rgba(20,30,50,.04),0 8px 24px rgba(20,30,50,.06);
  --shadow-lg:0 12px 44px rgba(20,30,50,.14);
}
:root[data-theme="dark"]{
  color-scheme:dark;
  --ground:#0B0D10; --surface:#14171C; --surface-2:#1A1E24; --top-bg:rgba(11,13,16,.72);
  --ink:#F2F4F7; --ink-soft:#98A2B0; --muted:#667085; --line:#262C34; --line-strong:#333A44;
  --accent:#10B981; --accent-ink:#04140E; --accent-2:#34D3A2; --accent-wash:#0F2E24; --chip-bg:#1A1E24;
  --ok:#22C55E; --ok-bg:#0F2A1B; --ok-line:#1E4A31;
  --info:#5AA0DE; --info-bg:#122130; --info-line:#274a68;
  --warn:#EAB308; --warn-bg:#2A2413; --warn-line:#4E4324;
  --crit:#F04438; --crit-bg:#2B1615; --crit-line:#5A2A28;
  --neu:#98A2B0; --neu-bg:#1A1E24;
    /* Su fondo scuro i semantici passano già (accento 7.08, ok 7.88, warn 9.37):
       i token di testo puntano agli originali e --accent-strong non scurisce nulla,
       perché lì il testo sull'accento è quasi nero, non bianco. */
    --accent-strong:var(--accent);
    --accent-text:var(--accent-2); --ok-text:var(--ok); --warn-text:var(--warn);
    --crit-text:var(--crit); --neu-text:var(--ink-soft);
    --sc-scaduto-text:var(--sc-scaduto); --sc-30-text:var(--sc-30);
    --sc-60-text:var(--sc-60); --sc-ok-text:var(--sc-ok); --sc-nd-text:var(--sc-nd);
    --crit-solid-ink:#14181D;
  /* Bande di scadenza (Figma 0:1) — cinque livelli, allineati a dataload.alert_da_giorni.
     Distinte dai semantici generici: «≤ 30» ha un arancio proprio, che --warn non dava. */
  --sc-scaduto:#F04438; --sc-scaduto-bg:#2B1615; --sc-scaduto-line:#5A2A28;
  --sc-30:#F97316; --sc-30-bg:#2A1A0F; --sc-30-line:#55321A;
  --sc-60:#EAB308; --sc-60-bg:#2A2413; --sc-60-line:#4E4324;
  --sc-ok:#22C55E; --sc-ok-bg:#0F2A1B; --sc-ok-line:#1E4A31;
  --sc-nd:#98A2B0; --sc-nd-bg:#1A1E24; --sc-nd-line:#2E353E;
  --shadow-sm:0 1px 2px rgba(0,0,0,.4);
  --shadow:0 1px 2px rgba(0,0,0,.35),0 10px 30px rgba(0,0,0,.45);
  --shadow-lg:0 14px 48px rgba(0,0,0,.6);
}

*{box-sizing:border-box;}
/* `[hidden]{display:none}` è una regola dello USER-AGENT: perde contro qualunque `display:`
   d'autore di pari specificità. Tre componenti (.tabbar-pop, .paga-edit/.compenso-form,
   .cf-row) la sconfiggevano e restavano disegnati; altri tredici se la ridichiaravano a mano,
   uno per uno. Questa riga la rende vera una volta per tutte, per ogni componente presente e
   futuro: `hidden` torna a essere un contratto e non un suggerimento.
   Chi deve mostrare l'elemento toglie l'attributo (modalOpen, sereno-tabs.js…), non lo
   sovrascrive col CSS. */
[hidden]{display:none !important;}
html,body{margin:0;padding:0;}
body{
  background:var(--ground); color:var(--ink);
  font-family:var(--font-body); font-size:15px; line-height:1.55;
  -webkit-font-smoothing:antialiased; text-rendering:optimizeLegibility;
}
svg{display:block;}
.ic{width:20px;height:20px;fill:none;stroke:currentColor;stroke-width:1.9;stroke-linecap:round;stroke-linejoin:round;flex:0 0 auto;}
.ic-sm{width:16px;height:16px;stroke-width:2;}
.ic-xs{width:12px;height:12px;stroke-width:2.2;}   /* icona dentro un pill/chip */
.sr{position:absolute;width:1px;height:1px;padding:0;margin:-1px;overflow:hidden;clip:rect(0 0 0 0);white-space:nowrap;border:0;}
/* Utility di layout — sostituiscono gli stili inline (spazi solo dai token --sp-*) */
.stack{display:flex;flex-direction:column;gap:var(--sp-4);}
.stack-sm{display:flex;flex-direction:column;gap:var(--sp-2);}
.stack-lg{display:flex;flex-direction:column;gap:var(--sp-6);}
.row{display:flex;align-items:center;gap:var(--sp-3);}
.cluster{display:flex;align-items:center;gap:var(--sp-2);flex-wrap:wrap;}
.toolbar{display:flex;align-items:center;gap:var(--sp-3);flex-wrap:wrap;margin:0 0 var(--sp-4);}
.spacer{flex:1;}
.grow{flex:1;min-width:0;}
a{color:inherit;text-decoration:none;}
:focus-visible{outline:2px solid var(--accent);outline-offset:2px;border-radius:6px;}
button{font-family:inherit;}

/* ============ SHELL ============ */
.app{display:flex;min-height:100vh;}
/* Scheda staccata dal fondo (Figma 97:7): bordo su TUTTI i lati, non solo a destra.
   Non scorre più lei: scorre `.nav-scroll`, così marchio e footer restano fermi. */
.sidebar{
  width:var(--sb-w);flex:0 0 var(--sb-w);
  background:var(--surface);border:1px solid var(--line);border-radius:var(--r-shell);
  box-shadow:var(--shadow-sm);
  display:flex;flex-direction:column;position:sticky;overflow:hidden;
  margin:var(--sb-gap);top:var(--sb-gap);height:calc(100vh - var(--sb-gap)*2);
  transition:width .18s ease,flex-basis .18s ease;
}
.brand{display:flex;align-items:center;justify-content:space-between;gap:10px;
  padding:20px 16px 16px;border-bottom:1px solid var(--line);}
.brand-mark{
  width:38px;height:38px;border-radius:11px;flex:0 0 auto;
  background:var(--accent-strong);color:var(--accent-ink);
  display:grid;place-items:center;font-family:var(--font-display);font-weight:600;font-size:17px;letter-spacing:.02em;
}
/* Logo ufficiale (immagine) nella sidebar: contenuto intatto, angoli morbidi. */
.brand-logo{width:36px;height:36px;border-radius:10px;object-fit:contain;flex:0 0 auto;}
.brand-in{display:flex;align-items:center;gap:10px;min-width:0;}
.brand-txt{display:flex;flex-direction:column;line-height:1.2;min-width:0;}
.brand-txt b{font-family:var(--font-display);font-weight:600;font-size:15px;letter-spacing:-.01em;}
.brand-txt small{color:var(--ink-soft);font-size:11px;}
/* Comando del rail. Non è `.icon-btn`: quello è 34px tondo da topbar, questo 28px quadrato. */
.sb-toggle{width:28px;height:28px;flex:0 0 auto;display:grid;place-items:center;border:0;cursor:pointer;
  background:var(--surface-2);color:var(--ink-soft);border-radius:6px;transition:background .15s,color .15s;}
.sb-toggle:hover{background:var(--line);color:var(--ink);}
.sb-toggle .ic{width:20px;height:20px;}
.side-nav{flex:1;min-height:0;display:flex;flex-direction:column;}
/* `overflow-x:hidden` esplicito: con il solo `overflow-y:auto` l'asse X vale `auto`, e bastava
   un contatore a tre cifre nel rail per far comparire una barra di scorrimento ORIZZONTALE
   dentro una colonna da 78px. Qui non c'è niente che debba scorrere in orizzontale. */
.nav-scroll{flex:1;min-height:0;overflow-y:auto;overflow-x:hidden;padding:12px;
  display:flex;flex-direction:column;gap:2px;}
.nav-group{display:flex;flex-direction:column;gap:2px;}
/* Il filetto della sezione è il bordo dell'etichetta stessa: un nodo in meno per sezione.
   Colore `--line` e NON `--surface-2` come nel frame: in tema scuro --surface-2 (#1A1E24)
   su --surface (#14171C) non si vede. */
.nav-lbl{margin:12px 12px 4px;padding-bottom:4px;border-bottom:1px solid var(--line);
  font-size:10px;font-weight:800;letter-spacing:1px;text-transform:uppercase;color:var(--ink-soft);}
.nav-item{
  display:flex;align-items:center;gap:11px;padding:10px 12px;border-radius:10px;
  color:var(--ink);font-size:13.5px;font-weight:500;transition:background .15s,color .15s;
}
.nav-item:hover{background:var(--surface-2);color:var(--ink);}
.nav-item .ic{width:18px;height:18px;color:var(--ink-soft);transition:color .15s;}
.nav-item:hover .ic{color:var(--ink);}
/* La barretta d'accento è un'ombra INTERNA, non un border-left: un bordo sposterebbe di 3px
   il contenuto della sola riga attiva rispetto a tutte le altre. */
.nav-item.is-active{background:var(--accent-wash);color:var(--accent-text);font-weight:700;
  box-shadow:inset 3px 0 0 var(--accent-strong);}
.nav-item.is-active .ic{color:var(--accent);}
.nav-txt{flex:1;min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;}
.nav-mini{display:none;}
.nav-foot{border-top:1px solid var(--line);padding:12px;display:flex;flex-direction:column;gap:2px;}
/* Contatore in riga (non lette della posta): pill pieno, come gli altri rossi dell'app. */
.nav-count{margin-left:auto;font-size:10px;font-weight:700;padding:2px 6px;border-radius:var(--r-pill);
  background:var(--crit);color:var(--crit-solid-ink);font-variant-numeric:tabular-nums;}

/* ---- Rail chiuso (Figma 97:208). La classe sta su <html>, non su .app: lì Alpine gestisce
   già `nav-open` del drawer mobile e due sorgenti sulla stessa lista di classi si pestano.
   Tutto il blocco vive sopra i 920px: sotto la sidebar è un drawer, e un drawer da 78px non
   ha senso. Scoprendo la soglia col media query non serve rimettere a mano nessun valore. ---- */
@media (min-width:921px){
html.sb-mini{--sb-w:var(--sb-mini-w);}
html.sb-mini .brand{flex-direction:column;justify-content:center;gap:8px;padding:16px 4px 12px;}
html.sb-mini .brand-txt{display:none;}
html.sb-mini .brand-logo{width:32px;height:32px;}
/* Nel rail la barra di scorrimento si nasconde. Due motivi, uno di allineamento e uno di
   spazio: toglieva larghezza a .nav-scroll ma non a .nav-foot, e in una colonna a contenuto
   CENTRATO questo sfasava di ~7,5px le icone della lista rispetto a quelle del piede fisso;
   e i 15px che si prendeva su 78 troncavano le mini-etichette che esistono apposta per non
   essere troncate (riservare il varco sui due lati raddrizzava il centro ma peggiorava il
   troncamento). Lo scorrimento resta: rotella, trackpad, tastiera. Sopra i 920px, cioè con la
   sidebar aperta, la barra è quella normale. */
html.sb-mini .nav-scroll{padding:10px 4px;gap:6px;scrollbar-width:none;}
html.sb-mini .nav-scroll::-webkit-scrollbar{width:0;height:0;}
html.sb-mini .nav-item{flex-direction:column;gap:4px;padding:8px 4px;border-radius:8px;
  text-align:center;position:relative;}
html.sb-mini .nav-item.is-active{box-shadow:none;}
html.sb-mini .nav-txt{display:none;}
html.sb-mini .nav-mini{display:block;font-size:10px;line-height:1.1;max-width:100%;
  overflow:hidden;text-overflow:ellipsis;white-space:nowrap;}
/* L'etichetta di sezione si riduce al solo filetto: la parola non ci sta in 78px. */
html.sb-mini .nav-lbl{margin:6px auto;padding:0;width:40px;height:0;overflow:hidden;
  border-bottom:1px solid var(--line);}
html.sb-mini .nav-foot{padding:10px 4px;gap:6px;}
/* Nel rail il contatore diventa un PUNTO. Il numero era ancorato col bordo sinistro al centro
   della voce, quindi cresceva solo verso destra: copriva un terzo dell'icona e da tre cifre
   usciva dalla colonna. E il numero vero non è piccolo — la casella di produzione ne ha 1.477.
   In 78px accanto a un'icona da 18 un pill a più cifre non ci sta: il punto dice «c'è posta da
   leggere» senza mai sbordare, e il numero esatto resta nel nome accessibile della voce e
   nella sidebar aperta. Il Figma 97:208 disegna un badge da 12px con una cifra sola: stessa
   posizione (angolo in alto a destra dell'icona), senza la cifra che a quella misura non regge. */
html.sb-mini .nav-count{position:absolute;top:6px;left:calc(50% + 6px);margin:0;
  width:8px;height:8px;padding:0;font-size:0;line-height:0;border-radius:50%;}
}

.main{flex:1;min-width:0;display:flex;flex-direction:column;}
.topbar{
  position:sticky;top:0;z-index:20;display:flex;align-items:center;gap:14px;
  padding:12px 26px;background:var(--top-bg);backdrop-filter:saturate(1.4) blur(10px);
  border-bottom:1px solid var(--line);
}
.tb-left{display:flex;align-items:center;gap:18px;flex:1;min-width:0;}
.page-title{margin:0;font-family:var(--font-display);font-weight:600;font-size:22px;letter-spacing:-.015em;white-space:nowrap;}
.search{display:flex;align-items:center;gap:8px;background:var(--surface-2);border:1px solid var(--line);
  border-radius:var(--r-pill);padding:7px 14px;max-width:300px;flex:1;transition:border-color .15s,box-shadow .15s;}
.search:focus-within{border-color:var(--accent);box-shadow:0 0 0 3px var(--accent-wash);}
.search .ic{color:var(--ink-soft);}
.search input{border:0;background:transparent;color:var(--ink);font-size:13.5px;width:100%;outline:none;}
.search input::placeholder{color:var(--ink-soft);}
.search{position:relative;}
.search-live{position:absolute;top:100%;left:0;right:0;margin-top:8px;background:var(--surface);border:1px solid var(--line);border-radius:var(--r-card);box-shadow:var(--shadow-lg);max-height:360px;overflow:auto;z-index:50;}
.search-live[hidden]{display:none;}
.sl-titolo{padding:8px 14px;font-size:11px;font-weight:700;text-transform:uppercase;color:var(--ink-soft);letter-spacing:.04em;border-bottom:1px solid var(--line);}
.sl-voce{display:flex;flex-direction:column;gap:2px;padding:9px 14px;border-bottom:1px solid var(--line);text-decoration:none;color:var(--ink-soft);font-size:13.5px;}
.sl-voce:last-child{border-bottom:0;}
.sl-voce:hover{background:var(--accent-wash);color:var(--accent-text);}
.sl-label{font-weight:500;color:var(--ink);}
.sl-meta{font-size:11px;color:var(--ink-soft);}

/* ============ COMMAND PALETTE (Figma 12:53) ============ */
.cmdk-overlay{position:fixed;inset:0;z-index:60;background:rgba(0,0,0,.45);display:flex;align-items:flex-start;justify-content:center;padding-top:12vh;}
.cmdk-overlay[hidden]{display:none;}
.cmdk-box{width:min(603px,92vw);background:var(--surface);border:1px solid var(--line);border-radius:var(--r-card);box-shadow:var(--shadow-lg);overflow:hidden;}
.cmdk-input{width:100%;border:0;border-bottom:1px solid var(--line);background:transparent;padding:var(--sp-4) var(--sp-5);font-family:var(--font-body);font-size:15px;color:var(--ink);outline:none;}
.cmdk-input::placeholder{color:var(--ink-soft);}
.cmdk-list{max-height:52vh;overflow-y:auto;padding:var(--sp-2);}
.cmdk-list .sl-voce.is-sel{background:var(--accent-wash);}
.cmdk-list .sl-voce.is-sel .sl-label{color:var(--accent-2);}
.tb-right{display:flex;align-items:center;gap:10px;flex:0 0 auto;}
.data-chip{font-size:12px;color:var(--ink-soft);white-space:nowrap;}
.data-chip b{color:var(--ink-soft);font-weight:600;font-variant-numeric:tabular-nums;}
.icon-btn,.notif-bell{
  width:38px;height:38px;border-radius:11px;border:1px solid transparent;background:transparent;color:var(--ink-soft);
  display:grid;place-items:center;cursor:pointer;transition:background .15s,color .15s,border-color .15s;position:relative;
}
.icon-btn:hover,.notif-bell:hover{background:var(--surface-2);color:var(--ink);}
.avatar{width:36px;height:36px;border-radius:var(--r-pill);background:var(--accent-strong);color:var(--accent-ink);
  display:grid;place-items:center;font-size:12.5px;font-weight:700;letter-spacing:.03em;flex:0 0 auto;}

/* ============ MENU UTENTE (Figma 3:7) ============ */
/* `.avatar` resta quella storica (sereno.css:189): qui si azzerano solo gli stili di button. */
.usermenu{position:relative;flex:0 0 auto;}
.avatar--btn{border:0;cursor:pointer;padding:0;font-family:var(--font-body);}
.usermenu-pop{position:absolute;right:0;top:calc(100% + var(--sp-2));z-index:30;
  min-width:216px;background:var(--surface);border:1px solid var(--line);
  border-radius:var(--r-el);box-shadow:var(--shadow-lg);padding:var(--sp-2);
  display:flex;flex-direction:column;gap:2px;}
.usermenu-head{display:flex;align-items:center;gap:10px;padding:10px 12px;}
.usermenu-id{display:flex;flex-direction:column;min-width:0;}
.usermenu-id b{font-size:13px;font-weight:500;color:var(--ink);}
.usermenu-id small{font-size:11px;color:var(--ink-soft);}
.usermenu-sep{height:1px;border:0;background:var(--line);margin:var(--sp-1) var(--sp-2);}
.usermenu-item{display:flex;align-items:center;gap:var(--sp-2);width:200px;
  padding:9px 12px;border:0;border-radius:6px;background:transparent;cursor:pointer;
  font-family:var(--font-body);font-size:13px;color:var(--ink);text-align:left;}
.usermenu-item:hover{background:var(--surface-2);}
.usermenu-item .ic{color:var(--ink-soft);}
.usermenu-item.is-esci,.usermenu-item.is-esci .ic{color:var(--crit);}
.usermenu-item.is-esci:hover{background:var(--crit-bg);}

/* ============ TAB BAR CON OVERFLOW (Figma 3:37) ============ */
.tabbar{display:flex;align-items:center;gap:4px;padding:6px;position:relative;
  background:var(--surface);border:1px solid var(--line);border-radius:10px;margin:4px 0 18px;}
.tabbar-tab{border:0;background:transparent;cursor:pointer;padding:7px 14px;border-radius:7px;
  font-family:var(--font-body);font-size:13px;font-weight:500;color:var(--ink-soft);white-space:nowrap;}
.tabbar-tab:hover{background:var(--surface-2);color:var(--ink);}
.tabbar-tab.is-on{background:var(--accent-wash);color:var(--accent-text);}
.tabbar-more{margin-left:auto;border:0;background:transparent;cursor:pointer;padding:7px 14px;
  border-radius:7px;font-family:var(--font-body);font-size:13px;color:var(--ink-soft);white-space:nowrap;}
.tabbar-more:hover{background:var(--surface-2);color:var(--ink);}
.tabbar-pop{position:absolute;right:6px;top:calc(100% + 4px);z-index:25;
  background:var(--surface);border:1px solid var(--line);border-radius:var(--r-el);
  box-shadow:var(--shadow-lg);padding:6px;display:flex;flex-direction:column;gap:2px;}
.tabbar-popitem{width:170px;padding:8px 12px;border:0;border-radius:6px;background:transparent;
  cursor:pointer;text-align:left;font-family:var(--font-body);font-size:13px;color:var(--ink);}
.tabbar-popitem:hover{background:var(--surface-2);}

/* ============ SKELETON (Figma 3:57) ============ */
.skeleton{display:flex;flex-direction:column;gap:var(--sp-3);padding:var(--sp-5);
  background:var(--surface);border:1px solid var(--line);border-radius:var(--r-card);}
.skeleton-bar{height:12px;border-radius:6px;background:var(--surface-2);
  background-image:linear-gradient(90deg,var(--surface-2) 0%,var(--chip-bg) 50%,var(--surface-2) 100%);
  background-size:200% 100%;animation:skeleton-shimmer 1.4s ease-in-out infinite;}
@keyframes skeleton-shimmer{from{background-position:200% 0;}to{background-position:-200% 0;}}
@media (prefers-reduced-motion:reduce){
  .skeleton-bar{animation:none;background-image:none;}
}

/* ============ KPI: trend e sparkline (Figma 3:72) ============ */
.kpi-trend{display:inline-flex;align-items:center;margin-left:var(--sp-3);padding:3px 8px;
  border-radius:var(--r-pill);font-size:11px;font-weight:500;
  background:var(--neu-bg);color:var(--neu);white-space:nowrap;}
.kpi-trend.is-buono{background:var(--accent-wash);color:var(--accent-text);}
.kpi-trend.is-cattivo{background:var(--crit-bg);color:var(--crit-text);}
.kpi-spark{display:block;width:140px;height:26px;margin-top:var(--sp-2);color:var(--accent);}
.kpi.is-crit .kpi-spark{color:var(--crit);}

/* ============ EMPTY STATE (Figma 3:64) ============ */
.empty-ico{width:48px;height:48px;border-radius:var(--r-pill);display:grid;place-items:center;
  background:var(--surface-2);color:var(--ink-soft);margin:0 auto var(--sp-2);}
.empty-hint{max-width:260px;margin:0 auto;text-align:center;font-size:12px;color:var(--ink-soft);}

/* ============ COSTI: colonna dipendente e menu di riga (Figma 5:89) ============ */
.costo-dip{display:flex;flex-direction:column;line-height:1.25;}
.costo-dip b{font-weight:500;color:var(--ink);}
.costo-dip-cf{font-size:11px;color:var(--ink-soft);font-variant-numeric:tabular-nums;}
/* La colonna azioni resta ancorata a destra: nel Figma «···» è sempre visibile,
   niente scroll orizzontale per raggiungerla. */
.costo-azioni{position:sticky;right:0;background:var(--surface);width:48px;}
.rowmenu{position:relative;}
.rowmenu-pop{position:absolute;right:0;top:calc(100% + 4px);z-index:25;min-width:152px;
  background:var(--surface);border:1px solid var(--line);border-radius:var(--r-el);
  box-shadow:var(--shadow-lg);padding:6px;display:flex;flex-direction:column;gap:2px;}
.rowmenu-item{border:0;background:transparent;cursor:pointer;padding:8px 12px;border-radius:6px;
  text-align:left;font-family:var(--font-body);font-size:13px;color:var(--ink);white-space:nowrap;}
.rowmenu-item:hover{background:var(--surface-2);}
.rowmenu-item.is-elimina{color:var(--crit);}
.rowmenu-item.is-elimina:hover{background:var(--crit-bg);}

/* ============ COSTI — VISTA ANALITICA (Figma 11:2) ============ */
.graf-barre{width:100%;height:200px;color:var(--accent);}
.graf-lbl{font-size:9px;fill:var(--ink-soft);}   /* `fill:` non è `color:`: era sfuggita */
.budget-riga{display:grid;grid-template-columns:100px 1fr auto;align-items:center;
  gap:var(--sp-3);padding:var(--sp-2) 0;border-bottom:1px solid var(--line);}
.budget-riga:last-child{border-bottom:0;}
.budget-code{font-weight:600;font-variant-numeric:tabular-nums;}
.budget-bar{height:8px;border-radius:var(--r-pill);background:var(--surface-2);overflow:hidden;}
.budget-fill{display:block;height:100%;background:var(--accent);}
.budget-bar.is-sforato .budget-fill{background:var(--crit);}
.budget-bar.is-vuota{background:var(--surface-2);}
.budget-num{font-size:12px;color:var(--ink-soft);font-variant-numeric:tabular-nums;white-space:nowrap;}

.notif{position:relative;}
.notif-badge{position:absolute;top:4px;right:4px;min-width:16px;height:16px;padding:0 4px;border-radius:var(--r-pill);
  background:var(--crit);color:var(--crit-solid-ink);font-size:10px;font-weight:700;display:grid;place-items:center;
  border:2px solid var(--surface);font-variant-numeric:tabular-nums;}
.notif-panel{
  position:absolute;top:calc(100% + 10px);right:0;width:320px;max-width:82vw;
  background:var(--surface);border:1px solid var(--line);border-radius:var(--r-card);box-shadow:var(--shadow-lg);
  overflow:hidden;z-index:40;
}
.notif-panel[hidden]{display:none;}
.np-head{display:flex;align-items:center;justify-content:space-between;padding:13px 16px;border-bottom:1px solid var(--line);}
.np-head b{font-family:var(--font-display);font-weight:600;font-size:15px;}
.np-clear{background:none;border:0;color:var(--accent-2);font-size:12px;font-weight:600;cursor:pointer;padding:4px;}
.np-list{max-height:340px;overflow-y:auto;}
.np-item{display:flex;gap:11px;padding:12px 16px;border-bottom:1px solid var(--line);}
.np-item:last-child{border-bottom:0;}
.np-dot{width:8px;height:8px;border-radius:50%;margin-top:6px;flex:0 0 auto;background:var(--muted);}
.np-item.unread .np-dot{background:var(--accent);}
.np-item.unread{background:var(--accent-wash);}
.np-txt b{display:block;font-size:13px;font-weight:600;}
.np-txt span{font-size:12px;color:var(--ink-soft);}

/* ============ CONTENT ============ */
.content{padding:26px;max-width:1200px;width:100%;margin:0 auto;display:flex;flex-direction:column;gap:22px;}
/* Variante full-width: SOLO le pagine che la chiedono via `{% block content_class %}`
   (oggi /mail, layout stile Gmail). Il default 1200px centrato resta per tutte le altre. */
.content--full{max-width:none;padding:16px 20px;}
.eyebrow{display:inline-flex;align-items:center;gap:7px;margin:0;font-size:11px;font-weight:600;
  letter-spacing:.1em;text-transform:uppercase;color:var(--ink-soft);}
.eyebrow .ic{width:15px;height:15px;color:var(--accent);}

/* banner onboarding */
.banner{display:flex;align-items:center;gap:18px;background:var(--surface);border:1px solid var(--line);
  border-radius:var(--r-shell);box-shadow:var(--shadow);padding:18px 22px;overflow:hidden;
  transition:opacity .3s,transform .3s,margin .3s,max-height .3s;}
.banner-copy{flex:1;min-width:0;}
.banner-copy h2{margin:8px 0 12px;font-family:var(--font-display);font-weight:600;font-size:19px;letter-spacing:-.01em;}
.banner-copy h2 span{color:var(--accent-2);}
.track{height:7px;border-radius:var(--r-pill);background:var(--surface-2);overflow:hidden;max-width:420px;}
.track>span{display:block;height:100%;border-radius:var(--r-pill);
  background:linear-gradient(90deg,var(--accent),var(--accent-2));}
.banner-actions{display:flex;align-items:center;gap:10px;flex:0 0 auto;}
.banner.closing{opacity:0;transform:translateY(-6px);max-height:0;margin-top:-22px;padding-top:0;padding-bottom:0;border-color:transparent;}

.btn{display:inline-flex;align-items:center;gap:8px;font-size:13.5px;font-weight:600;
  padding:9px 16px;border-radius:var(--r-pill);cursor:pointer;border:1px solid transparent;
  transition:filter .15s,background .15s,border-color .15s,transform .05s;}
.btn:active{transform:translateY(1px);}
.btn-pri{background:var(--accent-strong);color:var(--accent-ink);}
.btn-pri:hover{filter:brightness(1.06);}
.btn-ghost{background:transparent;color:var(--ink-soft);border-color:var(--line-strong);}
.btn-ghost:hover{background:var(--surface-2);color:var(--ink);}

/* KPI */
.kpis{display:grid;grid-template-columns:repeat(5,1fr);gap:16px;}
.kpi{background:var(--surface);border:1px solid var(--line);border-radius:var(--r-card);box-shadow:var(--shadow-sm);
  padding:16px 17px;display:flex;flex-direction:column;gap:2px;transition:box-shadow .18s,transform .18s,border-color .18s;}
.kpi:hover{box-shadow:var(--shadow);transform:translateY(-2px);border-color:var(--line-strong);}
.kpi-top{display:flex;align-items:center;justify-content:space-between;margin-bottom:8px;}
.kpi-ico{width:34px;height:34px;border-radius:10px;background:var(--accent-wash);color:var(--accent);display:grid;place-items:center;}
.kpi-ico .ic{width:18px;height:18px;}
.kpi-badge{font-size:10px;font-weight:600;letter-spacing:.06em;text-transform:uppercase;
  padding:3px 9px;border-radius:var(--r-pill);background:var(--chip-bg);color:var(--ink-soft);}
.kpi-lbl{margin:0;font-size:12.5px;color:var(--ink-soft);font-weight:500;}
.kpi-n{margin:1px 0 0;font-size:34px;font-weight:600;line-height:1;letter-spacing:-.02em;font-variant-numeric:tabular-nums;}
.kpi-d{margin:4px 0 0;font-size:11.5px;color:var(--ink-soft);}
.kpi.is-crit .kpi-ico{background:var(--crit-bg);color:var(--crit-text);} .kpi.is-crit .kpi-n{color:var(--crit-text);} .kpi.is-crit .kpi-badge{background:var(--crit-bg);color:var(--crit-text);}
.kpi.is-warn .kpi-ico{background:var(--warn-bg);color:var(--warn-text);} .kpi.is-warn .kpi-n{color:var(--warn-text);} .kpi.is-warn .kpi-badge{background:var(--warn-bg);color:var(--warn-text);}
.kpi.is-info .kpi-ico{background:var(--info-bg);color:var(--info);} .kpi.is-info .kpi-badge{background:var(--info-bg);color:var(--info);}
/* is-ok: il tono positivo mancava, così un badge «In Uso» usciva neutro come «In Stock».
   Il numero resta su --ink: colorarlo di verde farebbe sembrare un'allerta ciò che è normale. */
.kpi.is-ok .kpi-ico{background:var(--ok-bg);color:var(--ok-text);} .kpi.is-ok .kpi-badge{background:var(--ok-bg);color:var(--ok-text);}

/* panel */
.panel{background:var(--surface);border:1px solid var(--line);border-radius:var(--r-shell);box-shadow:var(--shadow);overflow:hidden;}
.panel-head{display:flex;align-items:center;justify-content:space-between;gap:12px;padding:17px 20px 14px;}
.panel-head h2{margin:0;display:flex;align-items:center;gap:9px;font-family:var(--font-display);font-weight:600;font-size:17px;letter-spacing:-.01em;}
.panel-head h2 .ic{width:18px;height:18px;color:var(--accent);}
.head-actions{display:flex;align-items:center;gap:8px;}
.chip-btn{display:inline-flex;align-items:center;gap:6px;font-size:12.5px;font-weight:500;color:var(--ink-soft);
  background:var(--surface-2);border:1px solid var(--line);border-radius:var(--r-pill);padding:6px 13px;cursor:pointer;transition:background .15s,border-color .15s;}
.chip-btn:hover{background:var(--chip-bg);border-color:var(--line-strong);}
.panel-sub{margin:0;padding:0 20px 14px;font-size:13px;color:var(--ink-soft);}
.panel-sub b{color:var(--crit);font-weight:700;}

/* stato scadenze bar */
.bar{display:flex;gap:4px;height:16px;padding:0 20px;margin-bottom:16px;}
.bar-seg{border-radius:var(--r-pill);min-width:8px;transition:filter .15s,transform .15s;cursor:pointer;}
.bar-seg:hover{filter:brightness(1.08);transform:scaleY(1.18);}
.seg-scad{background:var(--crit);} .seg-r{background:#E07A54;} .seg-g{background:var(--warn);} .seg-v{background:var(--ok);} .seg-o{background:var(--neu);opacity:.55;}
.legend{display:flex;flex-wrap:wrap;gap:10px 22px;padding:0 20px 20px;}
.lg{display:flex;align-items:center;gap:9px;}
.lg .sw{width:11px;height:11px;border-radius:4px;flex:0 0 auto;}
.lg-txt{display:flex;flex-direction:column;line-height:1.25;}
.lg-lbl{font-size:10.5px;font-weight:600;letter-spacing:.06em;text-transform:uppercase;color:var(--ink-soft);}
.lg-n{font-size:15px;font-weight:600;font-variant-numeric:tabular-nums;}

/* urgenti */
.filterbar{display:flex;align-items:center;gap:8px;padding:0 20px 8px;}
.seg-toggle{display:inline-flex;background:var(--surface-2);border:1px solid var(--line);border-radius:var(--r-pill);padding:3px;gap:2px;}
.seg-toggle button{border:0;background:transparent;color:var(--ink-soft);font-size:12.5px;font-weight:600;
  padding:6px 14px;border-radius:var(--r-pill);cursor:pointer;transition:background .15s,color .15s;}
.seg-toggle button.seg-on{background:var(--surface);color:var(--ink);box-shadow:var(--shadow-sm);}
.reclist{list-style:none;margin:0;padding:0;transition:opacity .2s;}
.reclist.busy{opacity:.45;pointer-events:none;}
.rec{display:flex;align-items:center;gap:16px;padding:14px 20px;border-top:1px solid var(--line);}
.rec-lead{display:flex;flex-direction:column;gap:6px;align-items:flex-start;flex:0 0 128px;}
.rec-gg{font-size:12px;font-weight:700;font-variant-numeric:tabular-nums;color:var(--ink-soft);}
.rec-gg.is-crit{color:var(--crit-text);} .rec-gg.is-warn{color:var(--warn-text);} .rec-gg.is-ok{color:var(--ok-text);} .rec-gg.is-info{color:var(--info);}
.rec-main{flex:1;min-width:0;}
.rec-title{margin:0;font-size:14.5px;font-weight:600;}
.rec-sub{margin:2px 0 0;font-size:12.5px;color:var(--ink-soft);}
.rec-foot{display:flex;align-items:center;gap:14px;flex:0 0 auto;}
.rec-date{display:inline-flex;align-items:center;gap:6px;font-size:12.5px;color:var(--ink-soft);font-variant-numeric:tabular-nums;}
.rec-date .ic{width:15px;height:15px;}
.rec[hidden]{display:none;}
.rec-updated{padding:12px 20px;font-size:11.5px;color:var(--ink-soft);border-top:1px solid var(--line);display:flex;align-items:center;gap:8px;}
.spin{width:13px;height:13px;border-radius:50%;border:2px solid var(--line-strong);border-top-color:var(--accent);animation:sp .7s linear infinite;}
.rec-updated .spin{display:none;} .rec-updated.loading .spin{display:inline-block;} .rec-updated.loading .rec-updated-txt{opacity:.6;}
@keyframes sp{to{transform:rotate(360deg);}}

/* pill */
.pill{display:inline-flex;align-items:center;font-size:10.5px;font-weight:600;letter-spacing:.02em;
  padding:4px 11px;border-radius:var(--r-pill);border:1px solid transparent;white-space:nowrap;}
.pill-ok{background:var(--ok-bg);color:var(--ok-text);border-color:var(--ok-line);}
.pill-info{background:var(--info-bg);color:var(--info);border-color:var(--info-line);}
.pill-warn{background:var(--warn-bg);color:var(--warn-text);border-color:var(--warn-line);}
.pill-crit{background:var(--crit-bg);color:var(--crit-text);border-color:var(--crit-line);}
.pill-neu{background:var(--neu-bg);color:var(--neu-text);}
/* Bande di scadenza — soft, come i .pill semantici; la banda SCADUTO resta la più forte. */
.pill-sc-scaduto{background:var(--sc-scaduto-bg);color:var(--sc-scaduto-text);border-color:var(--sc-scaduto-line);}
.pill-sc-30{background:var(--sc-30-bg);color:var(--sc-30-text);border-color:var(--sc-30-line);}
.pill-sc-60{background:var(--sc-60-bg);color:var(--sc-60-text);border-color:var(--sc-60-line);}
.pill-sc-ok{background:var(--sc-ok-bg);color:var(--sc-ok-text);border-color:var(--sc-ok-line);}
.pill-sc-nd{background:var(--sc-nd-bg);color:var(--sc-nd-text);border-color:var(--sc-nd-line);}
/* Data/ora standard: il tempo relativo è secondario rispetto alla data. */
.dtf{font-variant-numeric:tabular-nums;white-space:nowrap;}
.dtf.is-vuoto{color:var(--ink-soft);}
.sec-link{display:inline-flex;align-items:center;gap:5px;font-size:12.5px;font-weight:600;color:var(--accent-2);}
.sec-link .ic{width:15px;height:15px;}

/* footer note */
.pv-note{max-width:1200px;margin:2px auto 8px;padding:0 26px 24px;color:var(--ink-soft);font-size:12px;line-height:1.6;}
.pv-note b{color:var(--ink-soft);}

/* mobile chrome */
.only-mobile{display:none;}
.backdrop{display:none;}
.bottomnav{display:none;}

@media (max-width:920px){
  .kpis{grid-template-columns:repeat(2,1fr);}
  /* Il drawer resta a filo: la scheda staccata (margine+raggio) è un fatto da desktop,
     su mobile fluttuerebbe dentro lo schermo con una striscia di fondo intorno. */
  .sidebar{position:fixed;left:0;top:0;z-index:60;transform:translateX(-100%);transition:transform .25s ease;box-shadow:var(--shadow-lg);
    margin:0;height:100vh;border-radius:0;border-width:0 1px 0 0;}
  .app.nav-open .sidebar{transform:translateX(0);}
  .sb-toggle{display:none;}   /* il drawer si apre dall'hamburger, non dal rail */
  .backdrop{display:block;position:fixed;inset:0;background:rgba(10,15,13,.42);z-index:50;opacity:0;pointer-events:none;transition:opacity .25s;}
  .app.nav-open .backdrop{opacity:1;pointer-events:auto;}
  .only-mobile{display:grid;}
  .search{display:none;}
  .content{padding:18px 16px 90px;}
  .topbar{padding:11px 16px;}
  .bottomnav{display:flex;position:fixed;bottom:0;left:0;right:0;z-index:45;background:var(--surface);
    border-top:1px solid var(--line);padding:6px 8px calc(6px + env(safe-area-inset-bottom));justify-content:space-around;}
  .bn{display:flex;flex-direction:column;align-items:center;gap:3px;padding:6px 10px;border-radius:10px;color:var(--ink-soft);font-size:10.5px;font-weight:600;background:none;border:0;cursor:pointer;}
  .bn .ic{width:21px;height:21px;}
  .bn.on{color:var(--accent);}
  .rec{flex-wrap:wrap;gap:8px 14px;}
  .rec-lead{flex-direction:row;align-items:center;flex-basis:auto;gap:10px;}
  .rec-foot{width:100%;justify-content:space-between;}
  .banner{flex-direction:column;align-items:flex-start;}
  .data-chip{display:none;}
}
@media (max-width:480px){ .kpis{grid-template-columns:1fr 1fr;} .kpi-n{font-size:30px;} }

/* entrance */
@media (prefers-reduced-motion:no-preference){
  .rise{opacity:0;transform:translateY(10px);animation:rise .5s cubic-bezier(.2,.7,.3,1) forwards;}
  @keyframes rise{to{opacity:1;transform:none;}}
}

/* ============ Filtro Tutte/Critiche (Alpine mette data-mode; il CSS filtra) ============ */
.urgenti-scope[data-mode="crit"] .rec:not([data-sev="crit"]){display:none;}
/* ============ Spinner refresh HTMX (hx-indicator) ============ */
.htmx-indicator{display:none;}
.htmx-request .htmx-indicator,.htmx-request.htmx-indicator{display:inline-block;}
/* Alpine: nascondi finche' non inizializzato per evitare flash */
[x-cloak]{display:none!important;}

/* ══════════════════════════════════════════════════════════════════════════════
   LIBRERIA COMPONENTI (Fase 0) — stessi nomi-classe dei template legacy, in Sereno.
   Migrare una pagina = `extends base_sereno.html`; il markup esistente si stila qui.
   ══════════════════════════════════════════════════════════════════════════════ */

/* ---------- Tipografia helper ---------- */
.muted{color:var(--ink-soft);}
.t-eyebrow{font-size:10.5px;font-weight:600;letter-spacing:.1em;text-transform:uppercase;color:var(--ink-soft);}
.t-data{font-variant-numeric:tabular-nums;}
.t-section{font-family:var(--font-display);font-weight:600;font-size:17px;line-height:24px;letter-spacing:-.01em;}
.t-caption{font-size:13px;line-height:18px;color:var(--ink-soft);}
.txt-err{color:var(--crit-text);} .txt-ok{color:var(--ok-text);} .txt-warn{color:var(--warn-text);} .txt-info{color:var(--info);}

/* ---------- Intestazione di pagina ---------- */
.page-head{display:flex;align-items:center;gap:11px;margin:0 0 6px;}
.page-head h1{margin:0;font-family:var(--font-display);font-weight:600;font-size:28px;line-height:34px;letter-spacing:-.015em;text-wrap:balance;}
.page-head .ph-icon{color:var(--accent);}
/* Variante `page_head(..., cls='page-head--chip')`: l'icona sta in una pastiglia invece che
   nuda accanto al titolo. Il padding vale perché il viewBox dell'SVG si mappa sul content box,
   quindi il disegno resta di 20px dentro un riquadro di 38. */
.page-head--chip .ph-icon{box-sizing:border-box;width:38px;height:38px;padding:9px;
  border-radius:10px;background:var(--accent-wash);color:var(--accent-text);}
/* `.page-head` è `justify-content:space-between` (riga più sotto): con tre figli — icona,
   titolo, azioni — il titolo finiva spinto in mezzo alla fascia, staccato dalla sua icona.
   L'`auto` lo riattacca a sinistra e lascia le azioni a destra. */
.page-head--chip h1{margin-right:auto;}

/* ---------- Bottoni (varianti legacy unificate) ---------- */
.btn-soft,button.ghost,.mini{font-family:var(--font-body);font-size:13.5px;font-weight:600;cursor:pointer;
  /* un <button> azzera line-height da UA, un <a> eredita l'1,55 del body: senza questa
     riga un comando-link è ~2,4px più alto del bottone gemello che ha accanto */
  line-height:normal;
  border-radius:var(--r-pill);border:1px solid var(--line-strong);padding:9px 16px;background:var(--surface);color:var(--ink-soft);
  display:inline-flex;align-items:center;gap:8px;transition:background .15s,border-color .15s,filter .15s,transform .05s;}
.btn-soft:hover,button.ghost:hover,.mini:hover{background:var(--surface-2);color:var(--ink);}
.btn-soft:active,button.ghost:active,.mini:active{transform:translateY(1px);}
.mini{padding:6px 12px;font-size:12.5px;}
button[type=submit]:not(.ghost):not(.danger):not(.chip-btn),.btn-primary{background:var(--accent-strong);color:var(--accent-ink);border-color:transparent;
  font-family:var(--font-body);font-size:13.5px;font-weight:600;cursor:pointer;border-radius:var(--r-pill);padding:9px 16px;
  border-width:1px;border-style:solid;transition:filter .15s,transform .05s;}
button[type=submit]:not(.ghost):not(.danger):not(.chip-btn):hover,.btn-primary:hover{filter:brightness(1.06);}
.danger,button.danger{background:transparent;color:var(--crit);border:1px solid var(--crit-line);
  font-weight:600;font-size:13.5px;border-radius:var(--r-pill);padding:9px 16px;cursor:pointer;transition:background .15s;}
.danger:hover,button.danger:hover{background:var(--crit-bg);}
/* Un bottone spento deve VEDERSI spento. Senza questa regola restava pixel-identico a uno
   attivo — verde, cursore a manina — e il click non faceva niente né diceva perché: è così
   che l'import alloggi sembrava rotto. Il selettore del primario ha specificità 0-4-1, quindi
   un `button:disabled` da solo gli perderebbe sotto: le varianti vanno ripetute. Colore
   `--ink-soft` e non `--muted`: il testo di un controllo spento resta da leggere (5,2:1 su
   chiaro, 6,5:1 su scuro). */
button:disabled,.btn-primary:disabled,.btn-soft:disabled,button.ghost:disabled,.mini:disabled,
.danger:disabled,button.danger:disabled,
button[type=submit]:not(.ghost):not(.danger):not(.chip-btn):disabled{
  background:var(--surface-2);color:var(--ink-soft);border-color:var(--line-strong);
  cursor:not-allowed;filter:none;box-shadow:none;}
button:disabled:hover,.btn-primary:disabled:hover,.btn-soft:disabled:hover,
button.ghost:disabled:hover,.mini:disabled:hover,.danger:disabled:hover,
button[type=submit]:not(.ghost):not(.danger):not(.chip-btn):disabled:hover{
  background:var(--surface-2);color:var(--ink-soft);filter:none;}
button:disabled:active,.btn-primary:disabled:active,.btn-soft:disabled:active,
button.ghost:disabled:active,.mini:disabled:active,
button[type=submit]:not(.ghost):not(.danger):not(.chip-btn):disabled:active{transform:none;}

/* ---------- Form ---------- */
.form-grid{display:flex;flex-direction:column;gap:14px;}
.form-grid label{display:flex;flex-direction:column;gap:6px;font-size:12.5px;font-weight:600;color:var(--ink-soft);}
.form-grid label .muted{font-weight:400;}
/* Nota: include `input:not([type])` — in questa codebase molti campi testo sono scritti senza
   attributo `type` (es. <input name="descrizione">); senza questa regola resterebbero nativi, con
   angoli spigolosi. `:not([type])` non matcha checkbox/radio/hidden (che hanno sempre il type). */
input:not([type]),input[type=text],input[type=search],input[type=date],input[type=email],input[type=password],input[type=number],input[type=tel],input[type=url],input[type=time],input[type=datetime-local],select,textarea{
  font-family:var(--font-body);font-size:14px;color:var(--ink);background:var(--surface);
  border:1px solid var(--line-strong);border-radius:10px;padding:9px 12px;width:100%;transition:border-color .15s,box-shadow .15s;}
input:focus,select:focus,textarea:focus{outline:none;border-color:var(--accent);box-shadow:0 0 0 3px var(--accent-wash);}
input::placeholder,textarea::placeholder{color:var(--ink-soft);}
textarea{resize:vertical;min-height:80px;}
/* Messaggio d'errore di un form. Era USATA in tre template e due JS e DEFINITA in nessuno:
   usciva col colore del testo normale, indistinguibile da una didascalia. Il `<p>` diventa un
   riquadro perché di solito è solo in mezzo a contenuto denso; `<span>`/`<li>` restano in
   linea, che è come li usa l'import magazzino. */
.form-err{color:var(--crit-text);font-weight:600;font-size:13.5px;}
p.form-err{margin-top:12px;padding:10px 13px;border-radius:var(--r-el);
  background:var(--crit-bg);border:1px solid var(--crit-line);}

/* ---------- Tabelle ---------- */
table,.data-table{width:100%;border-collapse:collapse;font-size:13px;}
table th,.data-table th{text-align:left;font-size:10.5px;font-weight:600;letter-spacing:.06em;text-transform:uppercase;
  color:var(--ink-soft);padding:10px 12px;border-bottom:1px solid var(--line);white-space:nowrap;}
table td,.data-table td{padding:11px 12px;border-bottom:1px solid var(--line);}
table tr:last-child td{border-bottom:0;}
.data-table tbody tr:hover{background:var(--surface-2);}
.data-table td.num,.data-table th.num{text-align:right;font-variant-numeric:tabular-nums;}
/* riga totali (cost-ledger) */
.data-table tr.tot td{border-top:2px solid var(--line-strong);font-weight:700;}
/* banda di stato a sinistra della riga (primo td) */
tr[class*="t-"] td:first-child{position:relative;}
tr.t-scaduto td:first-child::before,tr.t-rosso td:first-child::before,tr.t-giallo td:first-child::before,tr.t-verde td:first-child::before,tr.t-ok td:first-child::before{
  content:"";position:absolute;left:0;top:6px;bottom:6px;width:3px;border-radius:3px;}
tr.t-scaduto td:first-child::before,tr.t-rosso td:first-child::before{background:var(--crit);}
tr.t-giallo td:first-child::before{background:var(--warn);}
tr.t-verde td:first-child::before,tr.t-ok td:first-child::before{background:var(--ok);}
.tbl-wrap{overflow-x:auto;}

/* ---------- Chip / badge (semantici + metadati) ---------- */
.chip{display:inline-flex;align-items:center;gap:5px;font-size:10.5px;font-weight:600;padding:4px 10px;
  border-radius:var(--r-pill);background:var(--chip-bg);color:var(--ink-soft);border:1px solid transparent;white-space:nowrap;}
.chip.attivo,.chip.verde,.chip.ok{background:var(--ok-bg);color:var(--ok-text);border-color:var(--ok-line);}
.chip.giallo,.chip.incerto{background:var(--warn-bg);color:var(--warn-text);border-color:var(--warn-line);}
.chip.distaccato{background:var(--info-bg);color:var(--info);border-color:var(--info-line);}
.chip.rosso,.chip.scaduto{background:var(--crit-bg);color:var(--crit-text);border-color:var(--crit-line);}
.chip.cessato,.chip.neu{background:var(--neu-bg);color:var(--neu-text);}
.chip.tag{background:var(--info-bg);color:var(--info);}
.chip.cat{background:var(--accent-wash);color:var(--accent-text);}
.chip.area{background:var(--warn-bg);color:var(--warn-text);}

/* ---------- Pill (estende quelle del pilota con gli stati legacy) ---------- */
.pill.attivo,.pill.verde{background:var(--ok-bg);color:var(--ok-text);border:1px solid var(--ok-line);}
.pill.giallo{background:var(--warn-bg);color:var(--warn-text);border:1px solid var(--warn-line);}
.pill.distaccato,.pill.info{background:var(--info-bg);color:var(--info);border:1px solid var(--info-line);}
.pill.rosso,.pill.scaduto,.pill.scadenza{background:var(--crit-bg);color:var(--crit-text);border:1px solid var(--crit-line);}
.pill.cessato,.pill.neu{background:var(--neu-bg);color:var(--neu-text);}
.pill.pill--solid{background:var(--crit);color:var(--crit-solid-ink);border-color:transparent;}
.pill{display:inline-flex;align-items:center;font-size:10.5px;font-weight:600;padding:4px 11px;border-radius:var(--r-pill);white-space:nowrap;}

/* ---------- Card generiche ---------- */
.card{background:var(--surface);border:1px solid var(--line);border-radius:var(--r-card);box-shadow:var(--shadow-sm);overflow:hidden;}
.card > .ch,.card-h{display:flex;align-items:center;justify-content:space-between;gap:10px;padding:14px 18px;border-bottom:1px solid var(--line);}
.card .ch b{font-family:var(--font-display);font-weight:600;font-size:15px;}
.card-list{list-style:none;margin:0;padding:0;display:grid;grid-template-columns:repeat(auto-fill,minmax(280px,1fr));gap:14px;}
.rec-card{background:var(--surface);border:1px solid var(--line);border-radius:var(--r-card);box-shadow:var(--shadow-sm);
  padding:15px 16px;position:relative;overflow:hidden;list-style:none;transition:box-shadow .18s,transform .18s;}
.rec-card:hover{box-shadow:var(--shadow);transform:translateY(-2px);}
.rec-card[class*="t-"]::before{content:"";position:absolute;left:0;top:0;bottom:0;width:3px;}
.rec-card.t-scaduto::before,.rec-card.t-rosso::before{background:var(--crit);}
.rec-card.t-giallo::before{background:var(--warn);}
.rec-card.t-verde::before,.rec-card.t-ok::before{background:var(--ok);}

/* ---------- Toast ---------- */
.toast{position:fixed;left:50%;bottom:24px;transform:translateX(-50%) translateY(20px);z-index:80;
  background:var(--ink);color:var(--surface);font-size:13.5px;font-weight:500;padding:11px 18px;border-radius:var(--r-pill);
  box-shadow:var(--shadow-lg);opacity:0;pointer-events:none;transition:opacity .2s,transform .2s;max-width:90vw;}
.toast.show{opacity:1;transform:translateX(-50%) translateY(0);}
.toast.ok{background:var(--accent-strong);color:var(--accent-ink);}
/* Azione dentro il toast (es. «Aggiungi la voce a mano»): il toast normale non riceve click
   (`pointer-events:none`), il link sì — altrimenti il rimedio sarebbe lì solo per bellezza. */
.toast-azione{color:inherit;text-decoration:underline;font-weight:600;pointer-events:auto;}

/* ---------- Modal / drawer-sheet ---------- */
.modal{position:fixed;inset:0;z-index:70;display:grid;place-items:center;padding:20px;
  background:rgba(10,15,13,.42);opacity:1;transition:opacity .2s;}
.modal[hidden]{display:none;}
.modal-box{background:var(--surface);border:1px solid var(--line);border-radius:var(--r-shell);box-shadow:var(--shadow-lg);
  width:100%;max-width:460px;max-height:88vh;overflow-y:auto;padding:22px;}
.modal-box h3{margin:0 0 14px;font-family:var(--font-display);font-weight:600;font-size:18px;}
.modal--sheet .modal-box{border-radius:var(--r-shell);}
.sheet-handle{display:none;}
.modal-actions{display:flex;gap:10px;justify-content:flex-end;margin-top:18px;flex-wrap:wrap;}
.scad-detail{margin:0 0 16px;display:grid;gap:10px;}
.scad-detail > div{display:flex;justify-content:space-between;gap:12px;border-bottom:1px solid var(--line);padding-bottom:8px;}
.scad-detail dt{color:var(--ink-soft);font-size:12.5px;} .scad-detail dd{margin:0;font-weight:600;font-size:13.5px;text-align:right;}
.scad-sheet-links{display:flex;gap:10px;flex-wrap:wrap;margin-bottom:14px;}
@media (max-width:560px){
  .modal{place-items:end center;padding:0;}
  .modal-box{max-width:none;border-radius:var(--r-shell) var(--r-shell) 0 0;max-height:90vh;}
  .sheet-handle{display:block;width:40px;height:4px;border-radius:2px;background:var(--line-strong);margin:0 auto 12px;}
}

/* ---------- Empty state / banner generici ---------- */
.empty{text-align:center;color:var(--ink-soft);padding:28px 16px;font-size:13.5px;}
.empty .ic{width:28px;height:28px;margin:0 auto var(--sp-2);color:var(--ink-soft);stroke-width:1.6;}
.empty h3{margin:0 0 var(--sp-1);font-size:15px;font-weight:600;color:var(--ink-soft);}
.empty p{margin:0;}
.empty p.empty-act{margin-top:var(--sp-3);}
.banner.err,.banner.onb-banner,.banner.banner-warn{display:flex;align-items:center;gap:10px;padding:14px 18px;border-radius:var(--r-card);font-size:13.5px;}
.banner.err{background:var(--crit-bg);color:var(--crit-text);border:1px solid var(--crit-line);}
.banner.onb-banner{background:var(--accent-wash);color:var(--accent-text);border:1px solid transparent;}
.banner.banner-warn{background:var(--warn-bg);color:var(--warn-text);border:1px solid var(--warn-line);}

/* ---------- Filtri / searchbar ---------- */
.filters,.searchbar{display:flex;flex-wrap:wrap;gap:10px;align-items:center;margin-bottom:16px;}
.filters label{display:flex;flex-direction:column;gap:3px;font-size:10.5px;font-weight:600;letter-spacing:.06em;text-transform:uppercase;color:var(--ink-soft);}

/* ---------- Testo lungo (informative, prose) ---------- */
.prose{padding:22px 24px;}
.prose h2{font-family:var(--font-display);font-weight:600;font-size:17px;letter-spacing:-.01em;margin:22px 0 8px;}
.prose h2:first-child{margin-top:0;}
.prose p{margin:0 0 12px;max-width:70ch;}
.prose ul{margin:0 0 12px;padding-left:20px;display:flex;flex-direction:column;gap:5px;}
.prose b{font-weight:600;}

/* ══════════════════════════════════════════════════════════════════════════════
   LIBRERIA FASE 2 — liste & schede (classi condivise; page-specifiche nei rispettivi task)
   ══════════════════════════════════════════════════════════════════════════════ */
/* intestazione di pagina con azione a destra (l'azione è un <button>/<div> accanto all'<h1>) */
.page-head{justify-content:space-between;flex-wrap:wrap;}
.page-head-actions{display:flex;align-items:center;gap:10px;flex-wrap:wrap;}
.page-sub{margin:-4px 0 4px;color:var(--ink-soft);font-size:13px;}

/* titoli di sezione (h2 diretto nel contenuto) + pallino di stato */
.content>h1{font-family:var(--font-display);font-weight:600;font-size:26px;letter-spacing:-.02em;margin:2px 0 12px;text-wrap:balance;}
.content h2{font-family:var(--font-display);font-weight:600;font-size:18px;letter-spacing:-.01em;margin:8px 0 2px;}
.content h2 .muted{font-weight:400;font-family:var(--font-body);font-size:14px;}
.hdot{display:inline-block;width:9px;height:9px;border-radius:50%;background:var(--neu);margin-right:8px;vertical-align:1px;}
.hdot.ok{background:var(--ok);} .hdot.err{background:var(--crit);}

/* card di record (macro record_card): righe interne eyebrow/titolo/sub/meta/azioni */
.rec-eyebrow{display:flex;align-items:center;gap:8px;flex-wrap:wrap;margin-bottom:8px;}
.rec-card .rec-title{font-family:var(--font-display);font-weight:600;font-size:15.5px;letter-spacing:-.01em;margin:0 0 3px;}
.rec-card .rec-title a:hover{color:var(--accent-2);}
.rec-card .rec-sub{color:var(--ink-soft);font-size:12.5px;margin:0 0 6px;}
.rec-meta{color:var(--ink-soft);font-size:12.5px;display:inline-flex;align-items:center;gap:6px;}
.rec-meta .ic{width:15px;height:15px;color:var(--ink-soft);}
.rec-actions{display:flex;flex-wrap:wrap;gap:8px;margin-top:12px;}
.rec-lbl{margin:0 0 3px;}
.rec-gg.sev-err{color:var(--crit-text);} .rec-gg.sev-warn{color:var(--warn-text);}
.rec-date.sev-err{color:var(--crit-text);} .rec-date.sev-warn{color:var(--warn-text);} .rec-date.sev-ok{color:var(--ok-text);}

/* griglia riepilogo (schede cliente/dipendente) */
.summary{display:grid;grid-template-columns:repeat(auto-fill,minmax(190px,1fr));gap:1px;background:var(--line);
  border:1px solid var(--line);border-radius:var(--r-card);overflow:hidden;margin:0 0 18px;}
.summary .s{background:var(--surface);padding:11px 14px;display:flex;flex-direction:column;gap:2px;min-width:0;}
.summary .s span{color:var(--ink-soft);font-size:11px;font-weight:600;letter-spacing:.04em;text-transform:uppercase;}
.summary .s b{font-weight:600;font-size:14px;word-break:break-word;}
.summary .s b a:hover{color:var(--accent-2);}

/* breadcrumbs (nel topbar via block page_title) + link «indietro» */
.crumbs{display:flex;align-items:center;gap:8px;font-family:var(--font-display);font-weight:600;font-size:20px;letter-spacing:-.01em;min-width:0;}
.crumbs a{color:var(--ink);} .crumbs a:hover{color:var(--accent-text);}
.crumbs .sep{color:var(--ink-soft);font-weight:400;}
.crumbs .crumb-cur{white-space:nowrap;overflow:hidden;text-overflow:ellipsis;}
.back{display:inline-flex;align-items:center;gap:6px;color:var(--ink-soft);font-size:13px;font-weight:600;margin-bottom:8px;}
.back:hover{color:var(--accent-2);}
.back .ic{width:16px;height:16px;}
@media (max-width:560px){.hide-sm{display:none;}}

/* tab bar (liste dipendenti + schede) */
.tabs{display:flex;gap:4px;border-bottom:1px solid var(--line);margin:4px 0 18px;overflow-x:auto;}
.tab{border:0;background:transparent;color:var(--ink-soft);font-family:var(--font-body);font-size:13.5px;font-weight:600;
  padding:10px 14px;cursor:pointer;border-bottom:2px solid transparent;margin-bottom:-1px;white-space:nowrap;transition:color .15s,border-color .15s;}
.tab:hover{color:var(--ink);}
.tab.on{color:var(--accent-2);border-bottom-color:var(--accent);}
.tabcnt,.cnt,.cnt2{display:inline-flex;align-items:center;justify-content:center;min-width:18px;height:18px;padding:0 5px;
  border-radius:var(--r-pill);background:var(--chip-bg);color:var(--ink-soft);font-size:11px;font-weight:700;margin-left:5px;}
.tabpanel{display:flex;flex-direction:column;gap:14px;}
.tabpanel[hidden]{display:none;}

/* filtri a link (scadenzario) + tagfilter (chip navigabili, dipendenti) */
.filters a{font-size:12.5px;font-weight:600;color:var(--ink-soft);background:var(--surface-2);border:1px solid var(--line);
  border-radius:var(--r-pill);padding:6px 13px;transition:background .15s,border-color .15s,color .15s;}
.filters a:hover{background:var(--chip-bg);}
.filters a.on{background:var(--accent-wash);color:var(--accent-text);border-color:transparent;}
.tagfilter{display:flex;flex-wrap:wrap;gap:8px;margin:0 0 16px;}
.tagfilter .chip{cursor:pointer;}

/* Selettore «chi c'era nel mese» (punto 10). Sta a parte dai chip di stato: quelli descrivono
   com'è adesso, questo ricostruisce un mese passato. */
.dip-mese{display:flex;align-items:center;gap:var(--sp-3);margin:0 0 var(--sp-3);}
.dip-mese label{display:flex;align-items:center;gap:var(--sp-2);font-size:13px;color:var(--ink-soft);}
.dip-mese input[type=month]{font:inherit;color:var(--ink);}
.tagfilter .chip.on{background:var(--accent-wash);color:var(--accent-text);border-color:transparent;}

/* barra conteggi/azioni sopra le liste + searchbar */
.listbar{display:flex;align-items:center;gap:12px;flex-wrap:wrap;margin-bottom:14px;}
.listbar .spacer{flex:1;}
.searchbar{margin-bottom:14px;}
.searchbar input{max-width:420px;}
.note-criterio{font-size:12.5px;line-height:1.75;}
.table-wrap{overflow-x:auto;}

/* details «sheet» (modifica in-scheda: cliente/commessa) */
details.sheet{background:var(--surface);border:1px solid var(--line);border-radius:var(--r-card);
  box-shadow:var(--shadow-sm);margin:0 0 16px;overflow:hidden;}
details.sheet>summary{list-style:none;cursor:pointer;display:flex;align-items:center;gap:8px;
  padding:13px 16px;font-size:13.5px;font-weight:600;color:var(--ink-soft);}
details.sheet>summary::-webkit-details-marker{display:none;}
details.sheet>summary .ic{width:16px;height:16px;color:var(--accent);}
details.sheet>summary:hover{background:var(--surface-2);}
details.sheet[open]>summary{border-bottom:1px solid var(--line);}
details.sheet .form-grid{padding:16px;}
/* variante «pericolo» sui bottoni soft/ghost (elimina) */
.btn-soft.err,button.ghost.err,.err.ghost{color:var(--crit);border-color:var(--crit-line);}
.btn-soft.err:hover,button.ghost.err:hover{background:var(--crit-bg);}
.meta-btn{padding:4px 8px;}

/* ══════════ Commesse (liste) ══════════ */
.com-card{display:flex;flex-direction:column;gap:8px;padding:16px 17px;}
.com-top{display:flex;align-items:center;justify-content:space-between;gap:10px;}
.com-code{font-family:var(--font-display);font-weight:600;font-size:17px;letter-spacing:-.01em;}
.com-code:hover{color:var(--accent-2);}
.com-client{font-weight:600;font-size:13.5px;}
.com-nz,.com-none{color:var(--ink-soft);font-weight:400;}
.com-desc{margin:0;color:var(--ink-soft);font-size:12.5px;line-height:1.5;}
.com-tags{display:flex;align-items:center;gap:8px;flex-wrap:wrap;}
.com-tags .rec-meta .ic{width:14px;height:14px;}
.com-foot{display:flex;align-items:flex-end;justify-content:space-between;gap:10px;border-top:1px solid var(--line);padding-top:12px;margin-top:2px;}
.com-scad .rec-lbl{margin:0 0 3px;}
.com-gg{color:var(--ink-soft);}
.com-go{width:36px;height:36px;border-radius:var(--r-pill);background:var(--accent-wash);color:var(--accent);
  display:grid;place-items:center;flex:0 0 auto;transition:background .15s,transform .15s;}
.com-go:hover{background:var(--accent-strong);color:var(--accent-ink);transform:translateX(2px);}
.com-new{border:1.5px dashed var(--line-strong);background:transparent;box-shadow:none;display:flex;}
.com-new::before{display:none;}
.com-new-btn{flex:1;display:flex;flex-direction:column;align-items:center;justify-content:center;gap:6px;
  background:none;border:0;cursor:pointer;color:var(--ink-soft);padding:20px;text-align:center;}
.com-new-btn b{font-family:var(--font-display);font-weight:600;font-size:15px;color:var(--ink-soft);}
.com-new-btn small{font-size:12px;}
.com-new-plus{width:40px;height:40px;border-radius:50%;background:var(--accent-wash);color:var(--accent);display:grid;place-items:center;}
.com-new:hover{border-color:var(--accent);}
.com-summary{display:grid;grid-template-columns:repeat(3,1fr);gap:14px;margin-top:6px;}
.cs-item{display:flex;align-items:center;gap:12px;background:var(--surface);border:1px solid var(--line);
  border-radius:var(--r-card);box-shadow:var(--shadow-sm);padding:14px 16px;}
.cs-ico{width:40px;height:40px;border-radius:11px;display:grid;place-items:center;flex:0 0 auto;background:var(--chip-bg);color:var(--ink-soft);}
.cs-ico.ok{background:var(--ok-bg);color:var(--ok);} .cs-ico.err{background:var(--crit-bg);color:var(--crit);} .cs-ico.neutral{background:var(--neu-bg);color:var(--neu);}
.cs-txt{display:flex;flex-direction:column;gap:1px;}
.cs-n{font-size:22px;font-weight:600;font-variant-numeric:tabular-nums;line-height:1.1;}

/* ══════════ Scheda (hero condiviso commessa/dipendente) + metriche + matrice ══════════ */
.dip-hero{display:flex;align-items:flex-start;gap:16px;background:var(--surface);border:1px solid var(--line);
  border-radius:var(--r-shell);box-shadow:var(--shadow);padding:20px 22px;margin:0 0 18px;flex-wrap:wrap;}
.dip-hero-av{width:56px;height:56px;font-size:18px;flex:0 0 auto;}
.dip-hero-main{flex:1;min-width:0;display:flex;flex-direction:column;gap:8px;}
.dip-head{display:flex;align-items:center;gap:10px;flex-wrap:wrap;}
.dip-head h1{margin:0;font-family:var(--font-display);font-weight:600;font-size:24px;letter-spacing:-.02em;}
.com-hero-code,.com-hero .com-code{font-size:22px;}
.com-hero-desc{margin:0;color:var(--ink-soft);font-size:13.5px;}
.dip-hero-meta{display:flex;align-items:center;gap:14px;flex-wrap:wrap;font-size:13px;}
.dip-hero-com{display:inline-flex;align-items:center;gap:6px;color:var(--accent-2);font-weight:600;}
.dip-hero-com .ic{width:15px;height:15px;}
.dip-hero-actions{display:flex;align-items:center;gap:8px;flex:0 0 auto;}
.com-metrics{display:grid;grid-template-columns:repeat(3,1fr);gap:14px;margin:0 0 18px;}
.cm-tile{background:var(--surface);border:1px solid var(--line);border-radius:var(--r-card);box-shadow:var(--shadow-sm);
  padding:14px 16px;display:flex;flex-direction:column;gap:3px;}
.cm-n{font-size:24px;font-weight:600;font-variant-numeric:tabular-nums;line-height:1.1;}
.compliance-matrix th,.compliance-matrix td{text-align:center;}
.compliance-matrix th:first-child,.compliance-matrix td:first-child{text-align:left;}
.cm-cell .ic{margin:0 auto;}
.cell-ok{color:var(--ok);} .cell-no{color:var(--crit);opacity:.7;}
.cm-legend,.bar-legend{display:flex;gap:16px;font-size:12px;color:var(--ink-soft);margin-top:8px;}
.cm-legend span,.bar-legend span{display:inline-flex;align-items:center;gap:5px;}
@media (max-width:720px){ .com-summary,.com-metrics{grid-template-columns:1fr;} }

/* ══════════ Dipendenti (lista) ══════════ */
.dip-table-wrap{overflow-x:auto;}
.dip-who{display:flex;align-items:center;gap:11px;min-width:0;}
.dip-av{width:36px;height:36px;font-size:12px;flex:0 0 auto;}
.dip-who-txt{display:flex;flex-direction:column;min-width:0;}
.dip-name{font-weight:600;font-size:13.5px;}
.dip-name:hover{color:var(--accent-2);}
.dip-role{color:var(--ink-soft);font-size:11.5px;}
.dip-scad{display:inline-flex;align-items:center;gap:8px;flex-wrap:wrap;}
.dip-comp{display:inline-flex;flex-direction:column;gap:1px;}
.paga-cell{cursor:pointer;color:var(--ink-soft);font-size:12px;font-variant-numeric:tabular-nums;}
.paga-cell.shown{color:var(--ink);cursor:default;}
.paga-num-sm{font-weight:600;}
.dip-comp .si,.paga-value .si{color:var(--ok);font-weight:600;} .dip-comp .no,.paga-value .no{color:var(--ink-soft);}
.dip-th-act,.dip-td-act{text-align:right;white-space:nowrap;}
.dip-row.s-cessato .dip-name{color:var(--ink-soft);}
/* Gruppi «Per commessa» collassabili — stesse basi di .catbox (fascicolo), fascia più ricca:
   nome, conteggi e badge di allerta su una riga sola. Il caret è l'unica cosa che ruota. */
.comm-acc{background:var(--surface);border:1px solid var(--line);border-radius:var(--r-card);box-shadow:var(--shadow-sm);margin:0 0 10px;overflow:hidden;}
.comm-acc-head{list-style:none;cursor:pointer;padding:12px 16px;display:flex;align-items:center;gap:10px;flex-wrap:wrap;}
.comm-acc-head::-webkit-details-marker{display:none;}
.comm-acc-head:hover{background:var(--accent-wash);}
.comm-acc[open]>.comm-acc-head{border-bottom:1px solid var(--line);}
.comm-acc-caret{flex:0 0 auto;color:var(--ink-soft);transition:transform .15s ease;}
.comm-acc[open]>.comm-acc-head .comm-acc-caret{transform:rotate(90deg);}
/* il nome è un <h2>: azzera i margini di `.content h2` e scende alla misura della fascia */
.comm-acc-head .comm-acc-name{margin:0;font-family:var(--font-display);font-weight:600;font-size:15px;letter-spacing:-.01em;min-width:0;}
.comm-acc-cnt{font-size:12px;margin-right:auto;}   /* i badge restano appesi a destra */
.comm-acc-body{padding:6px 16px 14px;}
.comm-acc-link{display:inline-flex;align-items:center;gap:6px;font-size:12.5px;font-weight:600;color:var(--accent-2);margin:6px 0 10px;}
@media (max-width:760px){
  /* la fascia va a capo: caret+nome sulla prima riga, conteggi e badge sotto (rientrati
     sotto il nome), così i pill restano leggibili invece di schiacciarsi in coda */
  .comm-acc-head{gap:6px 10px;}
  .comm-acc-name{flex:1 1 auto;}
  .comm-acc-cnt{flex:1 0 100%;margin-right:0;padding-left:24px;}
  .comm-acc-body{padding:6px 10px 12px;}
}
/* re-impilamento a card su schermi stretti (usa data-lbl delle celle) */
@media (max-width:760px){
  .dip-table thead{display:none;}
  .dip-table,.dip-table tbody,.dip-table tr,.dip-table td{display:block;width:100%;}
  .dip-table tr{border:1px solid var(--line);border-radius:var(--r-card);margin-bottom:12px;padding:6px 4px;background:var(--surface);box-shadow:var(--shadow-sm);}
  .dip-table td{border:0;display:flex;justify-content:space-between;align-items:center;gap:14px;padding:8px 14px;}
  .dip-table td::before{content:attr(data-lbl);color:var(--ink-soft);font-size:10.5px;font-weight:600;letter-spacing:.05em;text-transform:uppercase;flex:0 0 auto;}
  .dip-table td[data-lbl="Nome"]{flex-direction:column;align-items:flex-start;}
  .dip-table td[data-lbl="Nome"]::before{display:none;}
  .dip-td-act,.dip-table td.dip-td-act{justify-content:flex-end;}
}

/* ══════════ Scheda dipendente ══════════ */
.dip-cf{font-family:var(--font-body);font-variant-numeric:tabular-nums;color:var(--ink-soft);font-size:13px;}
.dip-cta{background:var(--accent-strong);color:var(--accent-ink);border:1px solid transparent;font-family:var(--font-body);
  font-size:13.5px;font-weight:600;cursor:pointer;border-radius:var(--r-pill);padding:9px 16px;display:inline-flex;align-items:center;gap:8px;transition:filter .15s;}
.dip-cta:hover{filter:brightness(1.06);}
/* modali con form a label impilate (dipEdit/evento*) */
.modal-box form h3{margin:0 0 14px;font-family:var(--font-display);font-weight:600;font-size:18px;}
.modal-box form label{display:flex;flex-direction:column;gap:6px;font-size:12.5px;font-weight:600;color:var(--ink-soft);margin-bottom:12px;}
.modal-box form label.evento-indet,.modal-box form label.indet-toggle{flex-direction:row;align-items:center;gap:8px;font-weight:500;}
/* .chk è la riga con casella usata fuori dalle modali (ruoli, mansioni): dentro una
   modale prendeva flex-direction:column dalla regola qui sopra e impilava la casella
   sopra il proprio testo. `white-space` torna normale perché qui la riga è lunga (nome
   del cantiere + date) e nowrap la farebbe sbordare dalla modale. */
.modal-box form label.chk{flex-direction:row;align-items:center;gap:8px;font-weight:500;
  flex-wrap:wrap;white-space:normal;}
.indet-toggle{display:flex;align-items:center;gap:8px;font-size:13px;color:var(--ink-soft);margin:0 0 16px;}
/* assegna commessa */
.assegna-card,.paga-card{background:var(--surface);border:1px solid var(--line);border-radius:var(--r-card);
  box-shadow:var(--shadow-sm);padding:15px 16px;margin:0 0 16px;display:flex;flex-direction:column;gap:10px;}
.paga-title{display:inline-flex;align-items:center;gap:7px;font-weight:600;font-size:13.5px;}
.assegna-form{display:flex;gap:8px;flex-wrap:wrap;align-items:center;}
.assegna-form select{max-width:340px;}
.paga-head{display:flex;align-items:center;justify-content:space-between;gap:10px;}
.paga-value{font-size:13.5px;line-height:1.7;}
.paga-num,.paga-num-sm{font-weight:700;font-variant-numeric:tabular-nums;} .iban{font-variant-numeric:tabular-nums;letter-spacing:.02em;}
.paga-actions{display:flex;gap:8px;flex-wrap:wrap;}
.paga-edit,.compenso-form{display:flex;flex-direction:column;gap:10px;border-top:1px solid var(--line);padding-top:12px;}
.cf-row{display:flex;align-items:center;gap:10px;flex-wrap:wrap;}
.cf-row label{font-size:12.5px;font-weight:600;color:var(--ink-soft);min-width:120px;}
.cf-row input[type=text]{max-width:180px;}
.cf-actions{display:flex;gap:8px;}
/* storico del rapporto (cicli + timeline) — Figma 86:6 «Storico - Espanso» */
.storico-actions{margin:0 0 14px;}
.cicli{display:flex;flex-direction:column;gap:16px;}
.ciclo{background:var(--surface);border:1px solid var(--line);border-radius:var(--r-card);box-shadow:var(--shadow-sm);overflow:hidden;}
.ciclo-h{display:flex;align-items:center;justify-content:space-between;gap:12px;flex-wrap:wrap;padding:14px 16px;background:var(--surface-2);cursor:pointer;list-style:none;}
.ciclo-h::-webkit-details-marker{display:none;}
.ciclo-h:hover .ciclo-n{color:var(--accent-2);}
/* Il filo sotto l'intestazione separa il ciclo dal suo contenuto: a ciclo chiuso non c'è
   contenuto da separare, quindi neanche il filo. */
.ciclo[open]>.ciclo-h{border-bottom:1px solid var(--line);}
.ciclo-t{display:flex;align-items:center;gap:10px;}
.ciclo-n{font-family:var(--font-display);font-weight:600;font-size:15px;}
/* Il pill di stato del ciclo sta su --surface-2, e lì spariva: «Cessato» usa --neu-bg, che è
   ESATTAMENTE lo stesso colore del fondo, e «in corso» non aveva nemmeno una variante, quindi
   restava testo nudo. Il design lo dà bianco con filo — l'unico fondo che si stacca da lì. */
.ciclo-h .pill{background:var(--surface);border:1px solid var(--line);font-size:12.5px;letter-spacing:0;}
.ciclo-h .pill.in_corso{color:var(--ok-text);}
.ciclo-h .pill.concluso{color:var(--ink-soft);}
.ciclo-meta{font-size:12.5px;color:var(--ink-soft);} .ciclo-meta b{color:var(--ink-soft);font-weight:600;}
.dot-sep{margin:0 4px;color:var(--line-strong);} .oggi{color:var(--ok);font-weight:600;}
.ciclo-body{padding:14px 16px;display:flex;flex-direction:column;gap:16px;}
/* Chevron della piegatura: chiuso punta a destra, aperto in giù. Lo sprite non ha il verso
   «giù» e ruotare quello a destra costa meno di un simbolo in più. */
.chev{color:var(--ink-soft);transition:transform .15s;}
.chev-xs{width:12px;height:12px;}
details[open]>summary .chev{transform:rotate(90deg);}
@media (prefers-reduced-motion:reduce){ .chev{transition:none;} }
/* .track è ANCHE la barra di avanzamento da 7px (onboarding, vedi .track>span). Nello storico
   .track è invece il contenitore a blocco della timeline (etichetta + .tl): senza questo reset
   la regola da 7px con overflow:hidden lo collasserebbe, tagliando etichette e voci. */
.ciclo-body .track{height:auto;background:none;border-radius:0;overflow:visible;max-width:none;}
.track-lbl{display:flex;align-items:center;gap:6px;font-size:10.5px;font-weight:600;letter-spacing:.08em;text-transform:uppercase;color:var(--ink-soft);margin-bottom:8px;cursor:pointer;list-style:none;}
.track-lbl::-webkit-details-marker{display:none;}
.track-lbl:hover{color:var(--ink);}
.tl{list-style:none;margin:0;padding:0;display:flex;flex-direction:column;gap:10px;}
.tl>li{display:flex;align-items:center;gap:10px;flex-wrap:wrap;font-size:13px;}
.tl-dot{width:9px;height:9px;border-radius:50%;background:var(--accent);flex:0 0 auto;}
/* ---- riga-evento del design: [pallino][etichetta] ……… [date][sorgenti][strumenti] ----
   Il pallino è ancorato in alto e non centrato: così la spina lo trova sempre a 13px dal
   bordo della riga, anche quando l'etichetta o il blocco di destra vanno a capo. 8,5 + 4,5
   di raggio = 13, cioè il centro della riga alta 26 (l'altezza dei pulsantini). */
.tl-ev>li{align-items:flex-start;position:relative;}
/* Il pallino sopra la spina: la spina è un ::before posizionato, quindi senza questo
   dipinge SOPRA il pallino e ci lascia dentro un taglio verticale. */
.tl-ev>li>.tl-dot{align-self:flex-start;margin-top:8.5px;position:relative;z-index:1;}
.tl-left{display:flex;align-items:center;gap:10px;flex-wrap:wrap;min-width:0;min-height:26px;}
.tl-ev .tl-end{gap:12px;min-height:26px;}
/* Spina della traccia CONTRATTO: dal centro del primo pallino a quello dell'ultimo. Il tratto
   sta su OGNI riga e sborda di 5px (metà del gap) così i segmenti si saldano fra loro —
   un solo pseudo-elemento sulla lista si affiderebbe a un'altezza che qui non è nota. */
.tl-tree>li::before{content:'';position:absolute;left:4px;top:-5px;bottom:-5px;width:1px;background:var(--line);}
.tl-tree>li:first-child::before{top:13px;}
.tl-tree>li:last-child::before{top:-5px;bottom:auto;height:18px;}
.tl-tree>li:first-child:last-child::before{display:none;}
/* La proroga non è un evento a sé: si stacca dalla spina dell'assunzione e rientra. */
.tl-sub{padding-left:28px;}
.tl-sub::after{content:'';position:absolute;left:4px;top:13px;width:20px;height:1px;background:var(--line);}
/* Su ~8 dipendenti veri il ciclo si apre SENZA assunzione (vedi presenza.py): lì la proroga è
   la prima voce e non ha niente da cui pendere — rientrarla lascerebbe un ramo nel vuoto. */
.tl-tree>li:first-child.tl-sub{padding-left:0;}
.tl-tree>li:first-child.tl-sub::after{display:none;}
/* Date in micro-etichetta. Il design dà l'etichetta a --muted (#98A2B0): su fondo chiaro sono
   2,8:1, sotto la soglia — qui vale --ink-soft, stesso ruolo di voce spenta ma leggibile. */
.date-micro{display:inline-flex;align-items:center;gap:12px;flex-wrap:wrap;}
.dm{display:inline-flex;align-items:baseline;gap:6px;}
.dm-lbl{font-size:11px;font-weight:500;color:var(--ink-soft);}
.dm-val{font-size:13px;font-weight:600;color:var(--ink);font-variant-numeric:tabular-nums;}
.dot-cessazione,.tl-dot.dot-cessazione{background:var(--crit);} .dot-distacco{background:var(--info);} .dot-proroga{background:var(--warn);}
.ev{font-weight:600;} .ev-distacco{color:var(--info);} .ev-cessazione{color:var(--crit);}
.tl-end{margin-left:auto;display:inline-flex;align-items:center;gap:10px;flex-wrap:wrap;}
.tl-date{font-size:12px;color:var(--ink-soft);font-variant-numeric:tabular-nums;}
.srcbtn{display:inline-flex;align-items:center;gap:5px;font-size:12px;font-weight:600;color:var(--accent-text);
  background:var(--accent-wash);border-radius:var(--r-pill);padding:3px 10px;}
.srcbtn.uni{color:var(--info);background:var(--info-bg);}
.ev-tools{display:inline-flex;gap:4px;}
.ev-tools .mini{padding:5px 7px;}
.dist-group{border-left:2px solid var(--line);padding-left:12px;margin-bottom:12px;}
.dist-group:last-child{margin-bottom:0;}
.dist-head{display:flex;align-items:center;gap:10px;margin-bottom:8px;}
/* documenti */
.upload{background:var(--surface);border:1px solid var(--line);border-radius:var(--r-card);box-shadow:var(--shadow-sm);
  padding:14px 16px;display:flex;gap:10px;flex-wrap:wrap;align-items:flex-end;margin:0 0 12px;}
.upload form{display:flex;gap:10px;flex-wrap:wrap;align-items:flex-end;}
.up-dest{display:flex;flex-direction:column;gap:4px;font-size:12px;}
.doc-mancanti{display:flex;flex-wrap:wrap;gap:8px;align-items:center;margin:0 0 12px;}
.catbox{background:var(--surface);border:1px solid var(--line);border-radius:var(--r-card);box-shadow:var(--shadow-sm);margin:0 0 10px;overflow:hidden;}
.catbox>summary{list-style:none;cursor:pointer;padding:12px 16px;font-weight:600;font-size:14px;display:flex;align-items:center;gap:8px;}
.catbox>summary::-webkit-details-marker{display:none;}
.catbox[open]>summary{border-bottom:1px solid var(--line);}
.subcat{padding:8px 16px 4px;font-size:11px;font-weight:600;letter-spacing:.05em;text-transform:uppercase;color:var(--ink-soft);}
.doclist{list-style:none;margin:0;padding:6px 16px 12px;display:flex;flex-direction:column;gap:6px;}
.doclist li{display:flex;align-items:center;gap:10px;flex-wrap:wrap;font-size:13px;}
.dl-name{font-weight:500;} .dl-det{color:var(--ink-soft);font-size:12px;}
.dl-file{display:block;font-weight:400;font-size:12px;}
.fm-fname{display:block;font-size:12px;color:var(--ink-soft);font-weight:400;}
.doclist .open,button.open{margin-left:auto;font-size:12px;font-weight:600;color:var(--accent-2);background:var(--accent-wash);border:0;border-radius:var(--r-pill);padding:4px 12px;cursor:pointer;}
.cnt,.cnt2{background:var(--chip-bg);}
/* note */
form.card{padding:16px;display:flex;flex-direction:column;gap:12px;margin:0 0 16px;}
.note-list .note-testo{flex:1;min-width:0;} .note-testo{font-size:13px;}

/* ══════════ Wizard nuovo dipendente ══════════ */
.wiz-steps{list-style:none;display:flex;flex-wrap:wrap;gap:var(--sp-4);margin:0 0 var(--sp-6);padding:0;}
.wiz-step{display:flex;align-items:center;gap:var(--sp-2);font-size:13px;color:var(--ink-soft);padding:6px 12px;border-radius:var(--r-pill);background:var(--surface-2);border:1px solid var(--line);}
.wiz-num{width:22px;height:22px;border-radius:var(--r-pill);display:grid;place-items:center;font-size:11px;font-weight:600;background:var(--chip-bg);color:var(--ink-soft);}
.wiz-step.is-attivo{background:var(--accent-wash);color:var(--accent-text);border-color:transparent;font-weight:600;}
.wiz-step.is-attivo .wiz-num{background:var(--accent-strong);color:var(--accent-ink);}
.wiz-step.is-fatto{color:var(--accent);}
.wiz-step.is-fatto .wiz-num{background:var(--accent-wash);color:var(--accent);}
.wiz-step.is-dafare .wiz-num{background:var(--surface-2);color:var(--ink-soft);}
.wiz-panel{background:var(--surface);border:1px solid var(--line);border-radius:var(--r-card);box-shadow:var(--shadow-sm);padding:20px 22px;}
.wiz-panel h2{margin:0 0 16px;}
.wiz-panel[hidden]{display:none;}
.wiz-nav{display:flex;align-items:center;justify-content:space-between;gap:10px;margin-top:18px;flex-wrap:wrap;}
.wiz-nav>span{display:inline-flex;gap:8px;}
.wiz-hint{font-size:12px;color:var(--ink-soft);}
.wiz-hint.ok{color:var(--ok);} .wiz-hint.err{color:var(--crit);}
/* dropzone (riuso file manager) */
.fm-dz{border:1.5px dashed var(--line-strong);border-radius:var(--r-card);padding:24px;display:flex;align-items:center;gap:14px;
  background:var(--surface-2);transition:border-color .15s,background .15s;}
.fm-dz.drag,.fm-dz.has-files{border-color:var(--accent);background:var(--accent-wash);}
.fm-dz-txt{display:flex;flex-direction:column;gap:2px;}
.fm-dz-txt b{font-size:14px;}
.fm-dz-pick{color:var(--accent-text);font-weight:600;cursor:pointer;text-decoration:underline;}
.fm-dz-count{font-size:12px;color:var(--ink-soft);}
.fm-bulk{margin-top:12px;}

/* ══════════ Scadenzario (toggle lista/calendario) ══════════ */
.seg-toggle button.on{background:var(--surface);color:var(--ink);box-shadow:var(--shadow-sm);}
.cal{position:relative;}
.cal.cal-loading{opacity:.5;pointer-events:none;}
.cal-head{display:flex;align-items:center;justify-content:space-between;gap:12px;flex-wrap:wrap;margin-bottom:14px;}
.cal-nav{display:flex;gap:6px;}
.cal-title{margin:0;font-family:var(--font-display);font-weight:600;font-size:18px;}
.cal-grid{display:flex;flex-direction:column;gap:6px;}
.cal-row{display:grid;grid-template-columns:repeat(7,1fr);gap:6px;}
.cal-dow-cell{font-size:10.5px;font-weight:600;letter-spacing:.06em;text-transform:uppercase;color:var(--ink-soft);text-align:center;padding:4px 0;}
.cal-cell{min-height:74px;background:var(--surface);border:1px solid var(--line);border-radius:var(--r-el);
  padding:7px 8px;display:flex;flex-direction:column;gap:5px;cursor:pointer;text-align:left;transition:border-color .15s,box-shadow .15s;}
.cal-cell:hover{border-color:var(--line-strong);box-shadow:var(--shadow-sm);}
.cal-cell.cal-today{border-color:var(--accent);box-shadow:0 0 0 2px var(--accent-wash);}
.cal-cell.has-scad{background:var(--surface-2);}
.cal-cell-empty{min-height:74px;border-radius:var(--r-el);background:transparent;}
.cal-num{font-size:12.5px;font-weight:600;font-variant-numeric:tabular-nums;}
.cal-dots{display:flex;flex-wrap:wrap;gap:3px;align-items:center;}
.cal-dot{width:8px;height:8px;border-radius:50%;background:var(--neu);}
.cal-dot.scaduto,.cal-dot.rosso{background:var(--crit);} .cal-dot.giallo{background:var(--warn);} .cal-dot.verde{background:var(--ok);} .cal-dot.ok{background:var(--neu);}
.cal-more{font-size:10px;color:var(--ink-soft);font-weight:600;}
.cal-side{margin-top:14px;background:var(--surface);border:1px solid var(--line);border-radius:var(--r-card);box-shadow:var(--shadow-sm);padding:14px 16px;}
.cal-side-head{display:flex;align-items:center;justify-content:space-between;gap:10px;margin-bottom:10px;}
.cal-side-head h3{margin:0;font-family:var(--font-display);font-weight:600;font-size:15px;}
.cal-side-list{list-style:none;margin:0;padding:0;display:flex;flex-direction:column;gap:8px;font-size:13px;}
.cal-side-list li{display:flex;align-items:center;gap:8px;flex-wrap:wrap;}
@media (max-width:640px){ .cal-cell,.cal-cell-empty{min-height:56px;} .cal-num{font-size:11px;} }

/* ══════════════════════════════════════════════════════════════════════════════
   LOGISTICA / ALLOGGI (Task 11) — aggiunte MINIME e namespaced (.logi-*): tutto il resto
   (data-table, chip, pill, card, modal/form-grid, btn/ghost/mini, summary, page-head) riusa
   le classi condivise già definite sopra. Solo ciò che non ha equivalente esistente: righe
   occupanti/canoni con azione a destra + banner di avviso capienza. ------------------------ */
.logi-list{list-style:none;margin:0;padding:0;display:flex;flex-direction:column;gap:2px;}
.logi-item{display:flex;align-items:center;justify-content:space-between;gap:10px;
  padding:8px 0;border-bottom:1px solid var(--line);font-size:13.5px;}
.logi-item:last-child{border-bottom:none;}
.logi-warn{display:flex;align-items:center;gap:8px;padding:10px 14px;border-radius:var(--r-card);
  font-size:13px;background:var(--warn-bg);color:var(--warn-text);border:1px solid var(--warn-line);margin:0 0 10px;}

/* ══════════ Drawer anteprima documenti (PDF.js) — Fase 3 ══════════ */
.doc-preview{position:fixed;inset:0;z-index:90;display:flex;justify-content:flex-end;}
.doc-preview[hidden]{display:none;}
.dp-backdrop{position:absolute;inset:0;background:rgba(10,15,13,.5);opacity:0;transition:opacity .25s;}
.doc-preview.dp-open .dp-backdrop{opacity:1;}
.dp-shell{position:relative;width:min(1100px,96vw);height:100%;background:var(--ground);box-shadow:var(--shadow-lg);
  display:flex;flex-direction:column;transform:translateX(100%);transition:transform .28s cubic-bezier(.2,.7,.3,1);}
.doc-preview.dp-open .dp-shell{transform:none;}
/* Drawer largo: solo dove il documento È il lavoro (creazione da UniLav, conferma di una
   proposta) e i campi si leggono dal PDF. L'anteprima documenti resta a 1100px. */
.dp-shell.dp-wide{width:min(1400px,96vw);}
.dp-head{display:flex;align-items:center;justify-content:space-between;gap:12px;padding:13px 20px;border-bottom:1px solid var(--line);background:var(--surface);}
.dp-title{margin:0;font-family:var(--font-display);font-weight:600;font-size:16px;letter-spacing:-.01em;white-space:nowrap;overflow:hidden;text-overflow:ellipsis;}
.dp-head-actions{display:flex;align-items:center;gap:8px;flex:0 0 auto;}
.dp-body{flex:1;display:flex;min-height:0;}
.dp-viewer{flex:1;overflow:auto;padding:20px;display:flex;flex-direction:column;align-items:center;gap:14px;background:var(--surface-2);}
.dp-page{max-width:100%;height:auto;border-radius:6px;box-shadow:var(--shadow-sm);background:#fff;}
/* Anteprima del documento nei pannelli di proposta: senza queste regole l'iframe non aveva
   dimensioni e il browser gli dava i suoi 300×150 px — l'anteprima francobollo. */
.prop-frame{width:100%;height:100%;min-height:70vh;border:0;background:var(--surface-2);}
/* Barra zoom del visore condiviso: sticky, così resta a portata scorrendo un PDF di 6 pagine. */
.dp-zoom{display:flex;gap:var(--sp-2);align-items:center;position:sticky;top:0;z-index:2;
  padding:var(--sp-2);background:var(--surface-2);width:100%;flex-wrap:wrap;}
.dp-img{max-width:100%;height:auto;border-radius:8px;box-shadow:var(--shadow-sm);}
.dp-loading{color:var(--ink-soft);font-size:13.5px;padding:24px;}
.dp-fallback,.dp-card{text-align:center;color:var(--ink-soft);padding:32px 20px;display:flex;flex-direction:column;align-items:center;gap:12px;margin:auto;}
.dp-actions{display:flex;gap:10px;flex-wrap:wrap;justify-content:center;}
.dp-side{width:320px;flex:0 0 320px;border-left:1px solid var(--line);background:var(--surface);overflow-y:auto;padding:18px 20px;display:flex;flex-direction:column;gap:18px;}
.dp-side[hidden]{display:none;}
.dp-info{margin:0;display:grid;gap:10px;}
.dp-info>div{display:flex;justify-content:space-between;gap:12px;border-bottom:1px solid var(--line);padding-bottom:8px;}
.dp-info dt{color:var(--ink-soft);font-size:12px;} .dp-info dd{margin:0;font-weight:600;font-size:13px;text-align:right;word-break:break-word;}
.dp-form{display:flex;flex-direction:column;gap:10px;padding:14px;background:var(--surface-2);border:1px solid var(--line);border-radius:var(--r-card);}
.dp-form>label{display:flex;flex-direction:column;gap:5px;font-size:12px;font-weight:600;color:var(--ink-soft);}
.dp-form-actions{display:flex;justify-content:flex-end;}
.dp-chips{display:flex;flex-wrap:wrap;gap:6px;}
@media (max-width:820px){
  .dp-body{flex-direction:column;}
  .dp-side{width:auto;flex:0 0 auto;border-left:0;border-top:1px solid var(--line);max-height:44vh;}
  .dp-shell{width:100vw;}
}
@media (prefers-reduced-motion:reduce){ .dp-shell,.dp-backdrop{transition:none;} }

/* ══════════ Attività (registro audit) ══════════ */
.filters-row{display:flex;flex-wrap:wrap;gap:12px;align-items:flex-end;margin-bottom:16px;}
.filters-row label{display:flex;flex-direction:column;gap:4px;font-size:11px;font-weight:600;letter-spacing:.04em;text-transform:uppercase;color:var(--ink-soft);}
.filters-row select,.filters-row input[type=date]{min-width:130px;}
.day-head{margin:16px 0 6px;}
.rec-card .rec-title .ic{width:15px;height:15px;color:var(--accent);vertical-align:-2px;}
.rec-title.undone{color:var(--ink-soft);text-decoration:line-through;text-decoration-color:var(--line-strong);}
.rec-title.undone .ic{color:var(--ink-soft);}

/* ══════════ Verifica archivi (coda triage + completezza) ══════════ */
.triage{margin:0 0 20px;}
.scan-list{list-style:none;margin:0;padding:0;display:flex;flex-direction:column;gap:12px;}
.scan-row{background:var(--surface);border:1px solid var(--line);border-radius:var(--r-card);box-shadow:var(--shadow-sm);padding:14px 16px;display:flex;flex-direction:column;gap:12px;}
.scan-head{display:flex;align-items:center;gap:10px;flex-wrap:wrap;}
.scan-name{flex:1;min-width:0;font-weight:600;font-size:13.5px;white-space:nowrap;overflow:hidden;text-overflow:ellipsis;}
.scan-route-form{display:flex;flex-wrap:wrap;gap:8px;align-items:center;}
.scan-route-form select{min-width:170px;flex:1;}
.cov{display:flex;align-items:center;gap:10px;margin-top:8px;}
.prog{flex:1;height:8px;border-radius:var(--r-pill);background:var(--surface-2);overflow:hidden;}
.prog-bar{display:block;height:100%;border-radius:var(--r-pill);background:linear-gradient(90deg,var(--accent),var(--accent-2));}

/* ══════════ File manager (esplorazione sorgenti) ══════════ */
.fm-import{margin:0 0 16px;}
.fm-dz-btn{align-self:center;white-space:nowrap;}
.fm-up-row{display:flex;align-items:center;gap:10px;margin-top:10px;}
.fm-up-prog{flex:1;max-width:280px;}
.fm-up-pct{font-size:12px;color:var(--ink-soft);font-variant-numeric:tabular-nums;}
.fm{background:var(--surface);border:1px solid var(--line);border-radius:var(--r-card);box-shadow:var(--shadow-sm);overflow:hidden;}
.fm-bar{padding:12px 16px;border-bottom:1px solid var(--line);display:flex;flex-wrap:wrap;gap:10px;align-items:center;justify-content:space-between;}
.fm-sources{display:flex;flex-wrap:wrap;gap:8px;}
.fm-src{font-size:12.5px;font-weight:600;color:var(--ink-soft);background:var(--surface-2);border:1px solid var(--line);border-radius:var(--r-pill);padding:6px 13px;cursor:pointer;}
.fm-src.on{background:var(--accent-wash);color:var(--accent-text);border-color:transparent;}
.fm-crumbs{display:flex;flex-wrap:wrap;align-items:center;gap:6px;padding:10px 16px;font-size:13px;color:var(--ink-soft);border-bottom:1px solid var(--line);}
.fm-crumbs a{color:var(--accent-2);display:inline-flex;align-items:center;gap:4px;}
.fm-crumbs .sep{color:var(--ink-soft);}
.fm-body{display:flex;min-height:280px;}
.fm-treepane{width:240px;flex:0 0 240px;overflow:auto;padding:8px;background:var(--surface-2);}
.fm-treepane.off{display:none;}
.fm-split{width:5px;flex:0 0 5px;cursor:col-resize;background:var(--line);}
.fm-split:hover,.fm-split:active{background:var(--accent);}
.fm-tree,.fm-tch{list-style:none;margin:0;padding:0;}
.fm-tch{padding-left:16px;}
.fm-tnode{display:flex;align-items:center;gap:6px;padding:5px 8px;border-radius:8px;cursor:pointer;font-size:13px;}
.fm-tnode:hover{background:var(--surface);}
.fm-tw{color:var(--ink-soft);width:12px;flex:0 0 auto;font-size:11px;}
.fm-main{flex:1;min-width:0;overflow:auto;}
.fm-table td .ic{vertical-align:-3px;margin-right:6px;color:var(--ink-soft);}
.fm-empty{padding:28px 16px;text-align:center;color:var(--ink-soft);font-size:13.5px;}

/* toolbar: toggle albero, filtro nella cartella, toggle vista elenco/griglia */
.fm-toolbar{display:flex;align-items:center;gap:8px;flex-wrap:wrap;}
.fm-tool{display:inline-flex;align-items:center;justify-content:center;width:30px;height:30px;border-radius:8px;border:1px solid var(--line);background:var(--surface-2);color:var(--ink-soft);cursor:pointer;}
.fm-tool:hover{border-color:var(--line-strong);}
.fm-tool.on{background:var(--accent-wash);color:var(--accent-text);border-color:transparent;}
.fm-filter{display:flex;align-items:center;gap:6px;border:1px solid var(--line);border-radius:var(--r-pill);background:var(--surface-2);padding:4px 12px;color:var(--ink-soft);}
.fm-filter input{border:0;background:transparent;font:inherit;font-size:13px;color:var(--ink);outline:none;width:180px;}
.fm-view-toggle{display:flex;gap:4px;}

/* vista griglia: card con icona grande, nome semplificato + nome reale, meta */
.fm-grid{display:grid;grid-template-columns:repeat(auto-fill,minmax(150px,1fr));gap:10px;padding:14px;}
.fm-card{border:1px solid var(--line);border-radius:var(--r-card);background:var(--surface);padding:14px 12px;display:flex;flex-direction:column;align-items:center;gap:6px;text-align:center;cursor:pointer;min-width:0;}
.fm-card:hover{border-color:var(--accent);background:var(--accent-wash);}
.fm-card-ic .ic{width:30px;height:30px;color:var(--ink-soft);}
.fm-card.dir .fm-card-ic .ic{color:var(--accent);}
.fm-card-name{font-size:13px;font-weight:600;line-height:1.3;max-width:100%;overflow:hidden;display:-webkit-box;-webkit-line-clamp:2;-webkit-box-orient:vertical;}
.fm-card-name .fm-fname{font-weight:400;-webkit-line-clamp:1;overflow:hidden;text-overflow:ellipsis;max-width:100%;}
.fm-card-meta{font-size:11.5px;color:var(--ink-soft);}

/* import racchiuso in un details: pagina più pulita, dropzone a portata quando serve */
.fm-import-details{margin:0 0 16px;border:1px solid var(--line);border-radius:var(--r-card);background:var(--surface);box-shadow:var(--shadow-sm);}
.fm-import-details>summary{padding:12px 16px;cursor:pointer;font-weight:600;font-size:13.5px;display:flex;align-items:center;gap:8px;color:var(--ink-soft);}
.fm-import-details>summary:hover{color:var(--accent-2);}
.fm-import-details .fm-import{margin:0;padding:0 16px;}
.fm-import-details .fm-bulk{padding:0 16px 14px;}

@media (max-width:760px){ .fm-body{flex-direction:column;} .fm-treepane{width:auto !important;flex:0 0 auto;border-bottom:1px solid var(--line);max-height:200px;} .fm-split{display:none;} .fm-grid{grid-template-columns:repeat(auto-fill,minmax(120px,1fr));} .fm-filter input{width:120px;} }

/* ══════════ CONSUMABILI (Task 6) — giacenza in evidenza nel frammento movimenti (l'UNICO
   swappato da Carico/Consegna, quindi resta sempre coerente) + colore semantico +/- sulle
   righe. Uniche aggiunte namespaced: il resto (card/summary/data-table/pill/logi-list) è già
   condiviso con Magazzino/Alloggi/Veicoli (Task 6/7/11). ══════════ */
.logi-giacenza{display:flex;align-items:baseline;gap:8px;margin:0 0 12px;}
.logi-giacenza .n{font-family:var(--font-display);font-size:34px;font-weight:700;
  letter-spacing:-.02em;color:var(--accent);font-variant-numeric:tabular-nums;}
.logi-giacenza .u{font-size:13px;font-weight:600;color:var(--ink-soft);}
.logi-item b.pos{color:var(--ok);} .logi-item b.neg{color:var(--crit);}

/* ═══════════════════════ Auth pubbliche (login / register) — «Sereno» ═══════════════════════
   Pagine standalone pre-sessione (shell base_sereno_auth). Due pannelli: hero brand verde a
   sinistra (tono fisso in entrambi i temi, è un'insegna) + form a destra su superfici tematizzate. */
.login-page{display:grid;grid-template-columns:1.04fr 1fr;min-height:100vh;background:var(--ground);color:var(--ink);font-family:var(--font-body);}

/* --- pannello brand (hero) --- */
.lp-panel{position:relative;overflow:hidden;background:linear-gradient(158deg,var(--accent-2) 0%,var(--accent) 55%,var(--accent-2) 100%);color:var(--accent-ink);padding:46px 54px;display:flex;flex-direction:column;}
.lp-panel::after{content:"";position:absolute;right:-170px;top:-130px;width:480px;height:480px;border-radius:50%;background:radial-gradient(circle,rgba(93,211,178,.22),transparent 62%);pointer-events:none;}
.lp-panel::before{content:"";position:absolute;left:-130px;bottom:-150px;width:430px;height:430px;border-radius:50%;background:radial-gradient(circle,rgba(255,255,255,.06),transparent 60%);pointer-events:none;}
.lp-brand{display:flex;align-items:center;gap:12px;z-index:1;}
.lp-brand img{height:40px;width:auto;}
.lp-brand b{font-family:var(--font-display);font-weight:600;font-size:20px;letter-spacing:-.01em;color:#fff;}
.lp-center{margin:auto 0;z-index:1;max-width:452px;}
.lp-center .tag{display:inline-block;font-size:11.5px;letter-spacing:.16em;text-transform:uppercase;font-weight:600;color:#8FE3CC;}
.lp-center h1{font-family:var(--font-display);font-weight:600;font-size:40px;line-height:1.08;letter-spacing:-.02em;color:#fff;margin:16px 0 18px;text-wrap:balance;}
.lp-center p{color:#CFE4DD;font-size:16px;line-height:1.62;}
.lp-points{display:flex;flex-direction:column;gap:14px;margin-top:32px;}
.lp-point{display:flex;align-items:center;gap:13px;font-size:14.5px;color:#DDECE7;}
.lp-point .b{width:32px;height:32px;border-radius:9px;background:rgba(255,255,255,.09);border:1px solid rgba(255,255,255,.14);display:grid;place-items:center;flex:0 0 32px;}
.lp-point .b .ic{width:16px;height:16px;color:#8FE3CC;}
.lp-foot{z-index:1;font-size:12px;color:#9FC2B8;letter-spacing:.03em;}

/* --- pannello form --- */
.lp-form{display:flex;align-items:center;justify-content:center;padding:40px 28px;background:var(--ground);}
.lp-card{width:100%;max-width:406px;}
.lp-mbrand{display:none;align-items:center;gap:10px;margin-bottom:28px;}
.lp-mbrand img{height:36px;}
.lp-mbrand b{font-family:var(--font-display);font-weight:600;font-size:18px;color:var(--ink);}
.lp-card h2{font-family:var(--font-display);font-weight:600;font-size:28px;letter-spacing:-.02em;color:var(--ink);margin:0 0 6px;}
.lp-sub{font-size:14.5px;color:var(--ink-soft);margin:0 0 26px;}
.lp-field{margin-bottom:16px;}
.lp-field label{display:block;font-size:13px;font-weight:600;color:var(--ink-soft);margin-bottom:7px;}
.lp-field label .muted{color:var(--ink-soft);}
.lp-iw{position:relative;}
.lp-iw>.ic{position:absolute;left:13px;top:50%;transform:translateY(-50%);width:18px;height:18px;color:var(--ink-soft);pointer-events:none;}
.lp-field input{width:100%;box-sizing:border-box;padding:11px 14px 11px 42px;border:1px solid var(--line-strong);border-radius:var(--r-el);font-family:var(--font-body);font-size:14.5px;background:var(--surface);color:var(--ink);outline:none;transition:border-color .14s,box-shadow .14s;}
.lp-field input::placeholder{color:var(--ink-soft);}
.lp-field input:focus{border-color:var(--accent);box-shadow:0 0 0 3px var(--accent-wash);}
.lp-pw{position:absolute;right:8px;top:50%;transform:translateY(-50%);background:transparent;border:none;cursor:pointer;padding:8px;color:var(--ink-soft);display:grid;place-items:center;}
.lp-pw:hover{color:var(--ink);}
.lp-pw .ic{width:18px;height:18px;}
.lp-submit{width:100%;padding:13px;background:var(--accent-strong);color:var(--accent-ink);border:1px solid var(--accent-strong);border-radius:var(--r-el);font-family:var(--font-body);font-size:15px;font-weight:600;cursor:pointer;display:flex;align-items:center;justify-content:center;gap:9px;margin-top:8px;transition:background .14s,border-color .14s;}
.lp-submit:hover{background:var(--accent-2);border-color:var(--accent-2);}
.lp-submit .ic{width:18px;height:18px;}
.lp-alt{margin-top:18px;font-size:13.5px;color:var(--ink-soft);text-align:center;}
.lp-alt a,.lp-sub a{color:var(--accent-2);font-weight:600;}
/* messaggio d'errore (login.js/register.js togglano [hidden]) */
.lp-msg{margin-top:14px;padding:11px 14px;border-radius:var(--r-el);background:var(--crit-bg);border:1px solid var(--crit-line);color:var(--crit-text);font-size:13.5px;font-weight:500;}
.lp-msg[hidden]{display:none;}

@media (max-width:820px){
  .login-page{grid-template-columns:1fr;}
  .lp-panel{display:none;}
  .lp-mbrand{display:flex;}
  .lp-form{align-items:flex-start;padding:34px 22px;}
}

/* ═══════════════════════ Admin & Configurazione (Fase 4) — «Sereno» ═══════════════════════
   Utenti/permessi, Impostazioni (2FA, SMTP, sorgenti, etichette), Configura azienda (onboarding).
   Riusa le primitive già presenti (form-grid, btn, modal, chip, wiz-steps, card-list). */

/* --- scheda impostazione / sezione --- */
.setcard{background:var(--surface);border:1px solid var(--line);border-radius:var(--r-card);padding:20px 22px;margin-bottom:18px;max-width:640px;box-shadow:var(--shadow-sm);}
.setcard-wide{max-width:940px;}
.setcard h2{font-family:var(--font-display);font-weight:600;font-size:19px;letter-spacing:-.01em;margin:0 0 10px;color:var(--ink);}
.setcard h3{font-size:15px;margin:0 0 6px;color:var(--ink);}
.setcard code{font-family:ui-monospace,SFMono-Regular,Menlo,monospace;background:var(--surface-2);border:1px solid var(--line);border-radius:6px;padding:1px 6px;font-size:12px;color:var(--accent-text);}
.sr-only{position:absolute;width:1px;height:1px;padding:0;margin:-1px;overflow:hidden;clip:rect(0,0,0,0);white-space:nowrap;border:0;}

/* --- dashboard config (checkbox verticali) --- */
.dash-cfg{display:flex;flex-direction:column;gap:9px;margin-top:4px;}
.dash-wopt{display:inline-flex;align-items:center;gap:8px;font-size:13.5px;color:var(--ink-soft);}

/* --- widget dashboard: pipeline recruiting (chip per fase) --- */
.dash-fasi{display:flex;flex-wrap:wrap;gap:8px;padding:0 20px 16px;}

/* --- widget dashboard: calendario scadenze (monta scad_calendar.js) --- */
.dash-cal{padding:0 20px 18px;}

/* --- widget dashboard: costi per commessa (barre proporzionali) --- */
.dash-costbar{height:6px;background:var(--surface-2);border-radius:var(--r-pill);overflow:hidden;margin-top:5px;}
.dash-costbar span{display:block;height:100%;background:var(--accent);}

/* --- tabelle admin (utenti / sorgenti / etichette) --- */
.users-table,.sources-table,.labels-table{width:100%;border-collapse:collapse;font-size:13.5px;}
.labels-table{min-width:680px;}
.users-table th,.sources-table th,.labels-table th{font-size:11px;text-transform:uppercase;letter-spacing:.05em;color:var(--ink-soft);font-weight:600;text-align:left;padding:8px 10px;border-bottom:1px solid var(--line-strong);}
.users-table td,.sources-table td,.labels-table td{padding:9px 10px;text-align:left;border-bottom:1px solid var(--line);vertical-align:middle;color:var(--ink-soft);}
.labels-table td.ta-c{text-align:center;}
.users-table td.row-actions,.row-actions{white-space:nowrap;}
.row-actions button{margin-right:6px;}
.labels-table input[type=text],.labels-table input[type=number]{width:100%;box-sizing:border-box;padding:6px 9px;border:1px solid var(--line-strong);border-radius:var(--r-el);background:var(--surface);color:var(--ink);font:inherit;}
.label-add{display:flex;flex-wrap:wrap;gap:8px;margin-top:12px;align-items:center;}
.label-add input{flex:1 1 220px;box-sizing:border-box;padding:8px 11px;border:1px solid var(--line-strong);border-radius:var(--r-el);background:var(--surface);color:var(--ink);font:inherit;}
.t-table-h{font-size:11px;line-height:16px;font-weight:600;text-transform:uppercase;letter-spacing:.05em;color:var(--ink-soft);}

/* --- griglia permessi (modale utente/ruolo) --- */
.perm-grid{display:grid;grid-template-columns:1fr 1fr;gap:10px 18px;margin:14px 0;max-height:48vh;overflow:auto;}
.perm-group{border:1px solid var(--line);border-radius:var(--r-el);padding:8px 14px 12px;margin:0;background:var(--surface-2);}
.perm-group legend{padding:0 6px;}
.perm-glbl{display:inline-flex;align-items:center;gap:7px;font-weight:600;font-size:13px;color:var(--ink);}
.perm-gall,.perm-all{display:inline-flex;align-items:center;gap:7px;}
.perm-allbar{display:flex;justify-content:flex-end;}
.perm-all-lbl{display:inline-flex;align-items:center;gap:7px;font-size:13px;color:var(--ink-soft);}
/* riga della griglia: checkbox + testo affiancati (regola persa nella migrazione Sereno,
   rif. storico 6bb5c0d:static/style.css — le sue dichiarazioni erano finite su .perm-flag) */
.perm-item{display:flex;align-items:flex-start;gap:9px;padding:5px 4px;border-radius:var(--r-el);cursor:pointer;}
.perm-item:hover{background:var(--surface);}
.perm-item input[type=checkbox]{margin-top:3px;flex:0 0 auto;}
.perm-txt{display:flex;flex-direction:column;gap:1px;}
.perm-lbl{font-size:13.5px;color:var(--ink);font-weight:600;}
.perm-desc{font-size:12px;color:var(--ink-soft);line-height:1.35;}
/* badge «sensibile» (pillola), NON layout di riga */
.perm-flag{font-size:9.5px;font-weight:700;text-transform:uppercase;letter-spacing:.04em;color:var(--crit);
  background:var(--crit-bg);border:1px solid var(--crit-line);border-radius:var(--r-pill);padding:1px 7px;margin-left:6px;}
.sensitive .perm-lbl{color:var(--crit);}
/* le label del picker NON ereditano l'impilamento verticale di `.modal-box form label`
   (riga generica dei modali dipEdit/evento*): schermatura con specificità maggiore,
   stesso pattern di .evento-indet/.indet-toggle. Vale per #userModal E #roleModal. */
.modal-box form label.perm-item{flex-direction:row;align-items:flex-start;gap:9px;margin-bottom:0;font-weight:400;}
.modal-box form label.perm-glbl{display:inline-flex;flex-direction:row;align-items:center;gap:7px;margin-bottom:0;}
.modal-box form label.perm-all-lbl{display:inline-flex;flex-direction:row;align-items:center;gap:7px;margin-bottom:0;}
/* nota «dal ruolo»: permesso ereditato, mostrato spuntato+disabilitato nel modale utente */
.perm-fonte{font-size:9.5px;font-weight:700;text-transform:uppercase;letter-spacing:.04em;color:var(--ink-soft);
  background:var(--surface-2);border:1px solid var(--line-strong);border-radius:var(--r-pill);padding:1px 7px;margin-left:6px;}
.perm-item.dal-ruolo{cursor:default;}
.perm-item.dal-ruolo .perm-lbl{color:var(--ink-soft);}

/* --- ruoli --- */
.roles-section{margin-top:28px;}
.role-card{border:1px solid var(--line);border-radius:var(--r-card);padding:12px 16px;background:var(--surface);box-shadow:var(--shadow-sm);}
.role-card .rec-sub{color:var(--ink-soft);}

/* --- pulsante distruttivo --- */
.danger{background:var(--crit);color:var(--crit-solid-ink);border-color:var(--crit);}
.danger:hover{filter:brightness(.95);}

/* --- 2FA --- */
.mfa-qr:not([hidden]){width:180px;height:180px;background:#fff;padding:8px;border-radius:var(--r-el);display:block;border:1px solid var(--line-strong);}

/* --- checkbox inline / fieldset --- */
.ck-inline{display:inline-flex;flex-direction:row;align-items:center;gap:8px;font-weight:400;font-size:13px;color:var(--ink-soft);}
.ck-inline input{width:auto;padding:0;}
.ck-row{display:flex;flex-wrap:wrap;gap:8px 16px;}
.fset{border:1px solid var(--line);border-radius:var(--r-el);padding:10px 12px;margin:0;}
.fset legend{font-size:11px;text-transform:uppercase;letter-spacing:.06em;color:var(--ink-soft);padding:0 4px;}

/* --- box aiuto (details) --- */
.help{margin:8px 0 12px;border:1px solid var(--line);border-radius:var(--r-el);padding:8px 12px;background:var(--surface-2);}
.help summary{cursor:pointer;color:var(--accent-text);font-weight:500;}
.help .help-body{margin-top:8px;color:var(--ink-soft);font-size:.92em;line-height:1.5;}
.help ol{margin:6px 0 12px 18px;}

/* --- connettori cloud (oauth) --- */
.oauth-cfg{display:flex;gap:14px;flex-wrap:wrap;margin-top:10px;}
.oauth-card{flex:1 1 320px;border:1px solid var(--line);border-radius:var(--r-el);padding:12px;background:var(--surface-2);}
.oauth-h{display:flex;align-items:center;gap:8px;margin-bottom:8px;font-weight:600;color:var(--ink);}
.oauth-hint{display:block;color:var(--ink-soft);margin:3px 0 2px;font-size:.85em;}
.oauth-uri{display:block;word-break:break-all;background:var(--surface);border:1px solid var(--line);padding:6px 8px;border-radius:6px;margin:4px 0 10px;font-size:12px;}
.oauth-form label{display:block;margin:6px 0 2px;color:var(--ink-soft);font-size:13px;}
.oauth-form input{width:100%;box-sizing:border-box;padding:8px 11px;border:1px solid var(--line-strong);border-radius:var(--r-el);background:var(--surface);color:var(--ink);font:inherit;}
.oauth-form button{margin-top:10px;}
.oauth-actions{margin-bottom:8px;}
.open{display:inline-flex;align-items:center;gap:6px;padding:6px 12px;font-size:12px;background:var(--accent-wash);border:1px solid var(--accent);color:var(--accent-2);border-radius:var(--r-el);text-decoration:none;}
.open:hover{background:var(--chip-bg);}

/* --- onboarding: barra avanzamento + azioni wizard --- */
.bar-stack{display:flex;height:32px;border-radius:var(--r-el);overflow:hidden;background:var(--surface-2);border:1px solid var(--line);}
.bar-stack .bar-seg.verde{background:var(--accent);}
.bar-stack .bar-seg.ok{background:transparent;}
.wiz-actions{display:flex;gap:8px;flex-wrap:wrap;margin-top:12px;}
.wiz-actions[hidden]{display:none;}
.wiz-step-lbl{font-weight:500;color:var(--ink-soft);}

/* --- modale larga (utenti/ruoli) --- */
.modal-box.wide{max-width:640px;}

/* ══════════ WIZARD UTENTE: CARD MODULO (Figma 29:26) ══════════ */
.modcards{display:grid;grid-template-columns:repeat(auto-fill,minmax(240px,1fr));gap:var(--sp-3);}
.modcard{border:1px solid var(--line);border-radius:var(--r-card);padding:var(--sp-4);background:var(--surface);}
.modcard header{display:flex;align-items:center;justify-content:space-between;gap:var(--sp-3);}
.modcard-livelli{display:flex;gap:var(--sp-3);margin-top:var(--sp-3);font-size:12px;color:var(--ink-soft);}
.modcard-livelli label{display:inline-flex;align-items:center;gap:4px;cursor:pointer;}
/* Switch toggle (Figma 26:41) — 44×24, pallina 20. */
.toggle{position:relative;display:inline-block;width:44px;height:24px;flex:0 0 auto;}
.toggle input{position:absolute;opacity:0;width:100%;height:100%;margin:0;cursor:pointer;}
.toggle span{position:absolute;inset:0;border-radius:var(--r-pill);background:var(--surface-2);
  border:1px solid var(--line);transition:background .15s,border-color .15s;}
.toggle span::after{content:"";position:absolute;top:1px;left:1px;width:20px;height:20px;
  border-radius:var(--r-pill);background:var(--muted);transition:transform .15s,background .15s;}
.toggle input:checked + span{background:var(--accent-wash);border-color:var(--accent);}
.toggle input:checked + span::after{transform:translateX(20px);background:var(--accent);}
.toggle input:focus-visible + span{outline:2px solid var(--accent);outline-offset:2px;}
.modriepilogo{margin-top:var(--sp-5);padding:var(--sp-4);border-radius:var(--r-card);
  background:var(--surface-2);font-size:12px;color:var(--ink-soft);}
.preset-ruoli{display:flex;flex-wrap:wrap;gap:var(--sp-3);margin-top:var(--sp-3);}

/* --- errore standalone --- */
.err-card{max-width:32rem;margin:12vh auto;text-align:center;background:var(--surface);border:1px solid var(--line);border-radius:var(--r-card);padding:32px 28px;box-shadow:var(--shadow);}

/* --- Recruiting / candidature (Risorse Umane) --- */
.head-actions{display:flex;gap:8px;flex-wrap:wrap;align-items:center;}
.form-row{display:flex;gap:10px;flex-wrap:wrap;}
.rec-board{display:flex;gap:12px;overflow-x:auto;padding-bottom:8px;align-items:flex-start;}
.rec-col{flex:0 0 240px;min-width:240px;background:var(--surface-2,var(--surface,#f7f8f7));border:1px solid var(--line,#e5e7eb);border-radius:var(--r-card,12px);padding:10px;}
.rec-col--over{outline:2px dashed var(--accent);outline-offset:2px;}
.rec-col-h{display:flex;align-items:center;justify-content:space-between;margin-bottom:8px;}
.rec-col-n{font-size:.8rem;color:var(--muted,#6b7280);font-weight:600;}
.rec-col-list{list-style:none;margin:0;padding:0;display:flex;flex-direction:column;gap:8px;min-height:24px;}
.rec-cand{background:var(--surface,#fff);border:1px solid var(--line,#e5e7eb);border-radius:10px;padding:8px 10px;cursor:grab;box-shadow:var(--shadow-sm,0 1px 2px rgba(0,0,0,.05));}
.rec-cand:active{cursor:grabbing;}
.rec-cand-name a{font-weight:600;color:var(--ink,#111827);text-decoration:none;}
.rec-cand-name a:hover{text-decoration:underline;}
.rec-cand-sub{font-size:.82rem;color:var(--muted,#6b7280);}
.rec-cand-meta{display:flex;gap:8px;flex-wrap:wrap;font-size:.78rem;color:var(--muted,#6b7280);margin-top:4px;}
.rec-cand-pos{margin-top:4px;}
.rec-detail{display:grid;grid-template-columns:minmax(0,1.25fr) minmax(0,1fr);gap:16px;align-items:start;}
.rec-detail .rec-col-main{display:flex;flex-direction:column;gap:16px;min-width:0;}
.rec-detail .card{display:flex;flex-direction:column;}
.card-b{padding:14px 18px 16px;}
@media(max-width:820px){.rec-detail{grid-template-columns:1fr;}}
.rec-convert{border-color:var(--accent-line,var(--ok-line));background:var(--accent-wash);}
.rec-convert h3{color:var(--accent-2);}
.rec-dl{display:grid;grid-template-columns:auto 1fr;gap:4px 12px;margin:0;}
.rec-dl dt{color:var(--muted,#6b7280);font-size:.85rem;}
.rec-dl dd{margin:0;}
.rec-actions{display:flex;gap:12px;align-items:end;flex-wrap:wrap;margin-top:12px;}
.rec-nota-form{display:flex;gap:8px;margin-bottom:12px;}
.rec-nota-form input{flex:1;}
.rec-timeline{list-style:none;margin:0;padding:0;display:flex;flex-direction:column;gap:8px;}
.rec-tl-item{display:flex;gap:8px;flex-wrap:wrap;align-items:baseline;font-size:.9rem;border-left:2px solid var(--line,#e5e7eb);padding-left:10px;}
.rec-tl-when{font-size:.78rem;}
/* Form «+ step» del profilo: campi affiancati su una riga, wrapping ordinato (A4) */
.rec-step-form{display:flex;gap:8px;flex-wrap:wrap;align-items:end;margin-top:12px;
  padding-top:12px;border-top:1px solid var(--line);}
.rec-step-form input[name=etichetta]{flex:2 1 200px;min-width:200px;}
.rec-step-form select{flex:1 1 130px;min-width:130px;}
.rec-step-form .chk{align-self:center;}
.rec-step-form button[type=submit]{flex:0 0 auto;}
.chk{display:inline-flex;align-items:center;gap:4px;font-weight:400;white-space:nowrap;}
/* Wizard di preparazione: barra + griglia di step compatti (A3) */
.rec-prep-bar{padding:14px 16px;}
.rec-prep-bar p{margin:8px 0 0;}
.rec-prep-track{height:10px;border-radius:var(--r-pill);background:var(--line);overflow:hidden;}
.rec-prep-fill{display:block;height:100%;background:var(--accent);transition:width .3s;}
.rec-prep-steps{list-style:none;margin:16px 0 0;padding:0;
  display:grid;grid-template-columns:repeat(auto-fill,minmax(340px,1fr));gap:12px;align-items:start;}
.rec-prep-step{padding:14px 16px;}
.rec-prep-step.is-done{opacity:.72;}
.rps-head{display:flex;align-items:center;justify-content:space-between;gap:8px;}
.rps-title{font-weight:600;}
.rps-meta{font-size:12px;margin:4px 0 8px;}
.rps-form{display:flex;gap:8px;flex-wrap:wrap;align-items:end;margin-top:8px;}
.rps-form input[type=file]{flex:1 1 160px;min-width:0;}
.rps-scad{display:flex;flex-direction:column;gap:4px;font-size:12px;color:var(--ink-soft);}
.rps-actions{display:flex;gap:8px;flex-wrap:wrap;}

/* --- Wizard cassette/cassoni: editor righe Materiali (griglia che riempie la card) --- */
#cassWizard{max-width:860px;}
.cass-head,.cass-row{display:grid;grid-template-columns:1fr 92px 92px 40px;gap:10px;}
.cass-head{align-items:center;padding:0 2px 6px;font-size:11px;font-weight:600;color:var(--ink-soft);
  text-transform:uppercase;letter-spacing:.03em;}
.cass-row{align-items:end;margin-bottom:8px;}
.cass-row .cass-del{align-self:end;justify-self:center;}
@media(max-width:640px){.cass-head{display:none;}.cass-row{grid-template-columns:1fr 68px 68px 36px;}}

/* --- «Verifica archivi» guidata: schermata per-dipendente + card cliccabili --- */
.vdip-meta{display:flex;gap:8px;flex-wrap:wrap;align-items:center;margin:0 0 14px;}
.rec-prep-step.is-missing{border-left:3px solid var(--crit);}
.vcard-go{display:inline-block;margin-top:8px;font-size:12.5px;font-weight:600;color:var(--accent-text);text-decoration:none;}
.vcard-go:hover{text-decoration:underline;}
/* Config requisiti documentali: 3 sezioni mappa (mansione/ruolo/commessa → profilo) */
/* Catalogo mansioni e ruoli — stesso impianto delle card requisiti. */
.man-grid{display:grid;grid-template-columns:repeat(auto-fill,minmax(360px,1fr));gap:16px;align-items:start;}
.man-form{display:flex;gap:8px;flex-wrap:wrap;align-items:end;margin-top:12px;padding-top:12px;border-top:1px solid var(--line);}
.man-form input{flex:1 1 180px;min-width:150px;}
.man-form button[type=submit]{flex:0 0 auto;}
.man-note{margin:0 0 var(--sp-2);}
.man-act{display:flex;gap:6px;flex-wrap:wrap;justify-content:flex-end;}
/* Elenco dei valori già in archivio: righe cliccabili con il conteggio a destra. */
.man-imp-lista{display:flex;flex-direction:column;gap:2px;max-height:50vh;overflow-y:auto;margin:var(--sp-2) 0;}
.man-imp-riga{display:flex;gap:10px;align-items:center;padding:var(--sp-2) 10px;border-radius:var(--r-el);cursor:pointer;}
.man-imp-riga:hover{background:var(--surface-2);}
.man-imp-riga.is-fatto{cursor:default;}
.man-imp-lab{flex:1 1 auto;}
/* Il conteggio è il dato su cui si decide, non decorazione: --ink-soft, non --muted. */
.man-imp-n,.man-imp-gia{flex:0 0 auto;color:var(--ink-soft);}
/* Pannello «dipendenti senza mansione»: una riga per persona, il selettore a destra. */
.man-senza{margin-top:var(--sp-4);}
.man-senza-n{margin:0 0 var(--sp-3);}
.man-senza-riga{display:flex;gap:10px;align-items:center;padding:var(--sp-2) 0;border-top:1px solid var(--line);}
.man-senza-nome{flex:1 1 auto;}
.man-senza-sel{flex:0 0 auto;min-width:170px;}
.man-senza-act{margin-top:var(--sp-3);padding-top:var(--sp-3);border-top:1px solid var(--line);}
/* Voce del catalogo: chiusa mostra quanti documenti richiede, aperta la sua lista. */
.man-voce{border-top:1px solid var(--line);}
.man-voce > summary{display:flex;gap:var(--sp-2);align-items:center;flex-wrap:wrap;
  padding:var(--sp-3) 0;cursor:pointer;}
.man-voce-et{font-weight:600;}
.man-voce-b{padding:0 0 var(--sp-3) var(--sp-3);}
.man-doc-lista{list-style:none;margin:0 0 var(--sp-3);padding:0;display:flex;flex-direction:column;gap:var(--sp-1);}
.man-doc{display:flex;gap:var(--sp-2);align-items:center;flex-wrap:wrap;padding:var(--sp-1) 0;}
.man-doc-et{flex:1 1 200px;}
.man-doc-sub{color:var(--ink-soft);}
.man-doc-form{display:flex;gap:var(--sp-2);flex-wrap:wrap;align-items:end;
  padding-top:var(--sp-3);border-top:1px dashed var(--line);}
.man-doc-form input[name=etichetta]{flex:1 1 200px;}
.man-doc-base{margin-bottom:var(--sp-4);}
.req-grid{display:grid;grid-template-columns:repeat(auto-fill,minmax(360px,1fr));gap:16px;align-items:start;}
.req-form{display:flex;gap:8px;flex-wrap:wrap;align-items:end;margin-top:12px;padding-top:12px;border-top:1px solid var(--line);}
.req-form input,.req-form select{flex:1 1 150px;min-width:130px;}
.req-form button[type=submit]{flex:0 0 auto;}
/* Ruoli / qualifiche sulla scheda dipendente */
.dip-ruoli{margin-top:14px;padding-top:14px;border-top:1px solid var(--line);}
.dip-ruoli-h{display:flex;gap:8px;flex-wrap:wrap;align-items:center;}
.ruoli-opts{display:flex;gap:12px;flex-wrap:wrap;margin:10px 0;}

/* ---------- VEICOLO — scheda dettaglio (UX refresh): classi che sostituiscono gli stili
   inline di templates/veicolo.html. Spaziature solo da token --sp-*; nessun colore nuovo. */
.vei-block{margin:var(--sp-5) 0;}
.vei-card-body{padding:var(--sp-3) var(--sp-4);}
.vei-dates{display:flex;gap:var(--sp-3);flex-wrap:wrap;}
.vei-dates>label{flex:1;min-width:130px;}
.vei-upper{text-transform:uppercase;}


/* ---------- DIPENDENTE — scheda (UX refresh): classi che sostituiscono gli stili
   inline di templates/dipendente.html. Colori solo da token; nessuna spaziatura nuova. */
.txt-accent{color:var(--accent);}           /* icona/tinta accento (es. titolo «Assegna commessa») */
.ic-in{display:inline-block;vertical-align:-3px;}  /* icona nel flusso del testo (didascalie) */

/* --- Nuova assunzione: anteprima della mail al consulente ------------------------------ */
.ratt-list{list-style:none;padding:0;margin:8px 0;display:flex;flex-direction:column;gap:4px}
.ratt-list li{display:flex;align-items:center;gap:8px;padding:6px 10px;
  background:var(--surface-2);border:1px solid var(--line);border-radius:8px;font-size:13px}
.ratt-manca{padding:10px 12px;border:1px solid var(--crit);border-radius:8px;
  background:color-mix(in srgb, var(--crit) 8%, transparent);margin:8px 0}
.ratt-manca p{margin:0 0 8px}
.mail-preview{white-space:pre-wrap;font-size:12px;max-height:220px;overflow:auto;
  background:var(--surface-2);border:1px solid var(--line);border-radius:8px;padding:10px}
.form-avviso{padding:8px 10px;border-radius:8px;margin:0 0 12px;font-size:13px;
  background:color-mix(in srgb, var(--warn) 12%, transparent);border:1px solid var(--warn)}
.ok-line{display:flex;align-items:center;gap:6px;color:var(--ok);margin:0 0 8px}
/* Scadenza XOR indeterminato: a esentare `data_fine` (required) dalla validazione nativa è
   `disabled`, impostato da eventoIndetSync() in sereno-dip.js quando si spunta «tempo
   indeterminato» (il gestore delegato copre anche #riassunzioneForm) — `disabled` è nell'elenco
   chiuso dei controlli esclusi dalla constraint validation dello standard WHATWG, un campo
   semplicemente non renderizzato NON lo è. Questa regola serve solo a nascondere la label
   quando il campo è disabilitato: è estetica, non la protezione. */
#riassunzioneForm:has([name="indeterminato"]:checked) .evento-scad{display:none}

/* ---------- ALLOGGIO — scheda dettaglio (UX refresh): classi che sostituiscono gli stili
   inline di templates/alloggio.html. Spaziature solo da token --sp-*; nessun colore nuovo. */
.allo-block{margin:var(--sp-5) 0;}
.allo-card-body{padding:var(--sp-3) var(--sp-4);}
.allo-addr{display:flex;gap:var(--sp-3);flex-wrap:wrap;}
.allo-addr>label{flex:1;min-width:90px;}
.allo-addr>label.allo-citta{flex:2;min-width:150px;}


/* ---------- MAGAZZINO — hub (UX refresh): classi che sostituiscono gli stili inline di
   templates/magazzino.html. Spaziature solo da token --sp-*; nessun colore nuovo. */
.mag-bar{margin-bottom:0;}                 /* toolbar dentro .tabpanel: la spaziatura è già il gap del pannello */
.mag-row{cursor:pointer;}                  /* riga tabella cliccabile (naviga alla scheda articolo) */
.mag-upper{text-transform:uppercase;}      /* input codice/taglia resi in maiuscolo */

/* ═══════════════════════════════ IMPOSTAZIONI — refresh UX (Sereno) ═══════════════════════════════
   Titoli di sezione su scala .t-section con icona sprite; spaziature solo da token --sp-*;
   sostituisce gli stili inline rimossi da templates/impostazioni.html. */
.setcard h2.t-section{display:flex;align-items:center;gap:var(--sp-2);font-size:17px;line-height:24px;}
.setcard h2.t-section .ic{color:var(--accent-2);}
.set-note{margin:var(--sp-2) 0 0;}
.set-block{margin-top:var(--sp-3);}
.set-sub{margin-top:var(--sp-4);border-top:1px solid var(--line);padding-top:var(--sp-4);}
.mfa-key{font-size:15px;user-select:all;}
.mfa-codes{margin:var(--sp-3) 0 0;user-select:all;background:var(--surface-2);padding:var(--sp-3);border-radius:var(--r-el);}


/* ═══════════════════════════ IMPOSTAZIONI — modale a due pannelli (Figma 45:5) ═══════════════════
   La pagina /impostazioni È questa modale: nav a sinistra, un pannello alla volta a destra.
   Poggia su `.modal`/`.modal-box`, così Esc, trap del Tab e clic sul backdrop di sereno.js
   valgono senza sapere nulla di qui; `.set-box` ne sostituisce solo la misura e il padding.

   Due scostamenti DELIBERATI dagli hex del Figma, entrambi per contrasto (§ DESIGN_SYSTEM):
   il pulsante primario resta `--accent-strong` e non il `#16A34A` disegnato (bianco su
   quel verde sta a 3,0:1), e la voce attiva scrive in `--accent-text`, non in `--accent`. */
.modal--set{padding:var(--sp-5);}
.set-box{max-width:900px;width:100%;height:650px;max-height:88vh;padding:0;overflow:hidden;
  display:flex;flex-direction:column;border-radius:20px;}

.set-head{display:flex;align-items:center;justify-content:space-between;gap:var(--sp-3);
  padding:var(--sp-4) var(--sp-4) var(--sp-4) var(--sp-5);border-bottom:1px solid var(--line);flex:0 0 auto;}
.set-title{margin:0;font-family:var(--font-display);font-weight:600;font-size:22px;line-height:1.2;color:var(--ink);}
.set-close{width:36px;height:36px;flex:0 0 auto;display:inline-flex;align-items:center;justify-content:center;
  border:0;border-radius:10px;background:var(--surface-2);color:var(--ink-soft);cursor:pointer;
  transition:background .15s,color .15s;}
.set-close:hover{background:var(--line);color:var(--ink);}
.set-close:focus-visible{outline:2px solid var(--accent);outline-offset:2px;}

.set-body{flex:1 1 auto;display:flex;min-height:0;}
.set-nav{flex:0 0 240px;display:flex;flex-direction:column;gap:var(--sp-1);padding:var(--sp-4);
  border-right:1px solid var(--line);overflow-y:auto;}
.set-navitem{position:relative;display:flex;align-items:center;gap:var(--sp-3);width:100%;
  padding:10px 14px;border:0;border-radius:10px;background:none;cursor:pointer;text-align:left;
  font:inherit;font-size:14px;font-weight:500;color:var(--ink-soft);transition:background .15s,color .15s;}
.set-navitem .ic{flex:0 0 auto;color:currentColor;}
.set-navitem:hover{background:var(--surface-2);color:var(--ink);}
.set-navitem.is-on{background:var(--accent-wash);color:var(--accent-text);font-weight:600;}
/* la barretta del Figma sta a DESTRA della voce, non a sinistra come nella sidebar */
.set-navitem.is-on::after{content:"";position:absolute;right:9px;top:50%;transform:translateY(-50%);
  width:3px;height:16px;border-radius:var(--r-pill);background:var(--accent);}
.set-navitem:focus-visible{outline:2px solid var(--accent);outline-offset:-2px;}

.set-main{flex:1 1 auto;min-width:0;padding:var(--sp-6);overflow-y:auto;}
.set-pane[hidden]{display:none;}
.set-pane-head{margin-bottom:var(--sp-4);}
.set-pane-head h2{margin:0 0 var(--sp-1);font-family:var(--font-display);font-weight:600;
  font-size:24px;line-height:1.25;color:var(--ink);}
.set-pane-head .t-caption{margin:0;}
.set-pane h3{margin:0 0 var(--sp-1);font-size:15px;color:var(--ink);}
.set-prose p{margin:0 0 var(--sp-3);color:var(--ink-soft);}
.set-prose p:last-child{margin-bottom:0;}
.set-pane code{font-family:ui-monospace,SFMono-Regular,Menlo,monospace;background:var(--surface-2);
  border:1px solid var(--line);border-radius:6px;padding:1px 6px;font-size:12px;color:var(--accent-text);}
/* azioni in fondo al pannello: primaria a destra, come ovunque nell'app */
.set-actions{display:flex;align-items:center;gap:var(--sp-3);flex-wrap:wrap;
  margin-top:var(--sp-4);padding-top:var(--sp-4);border-top:1px solid var(--line);}
.set-actions > .btn-primary:only-child{margin-left:auto;}
/* Un bottone dentro un contenitore flex viene «blockificato», e `.btn-primary` non dichiara
   inline-flex: icona ed etichetta finivano su due righe appena lo spazio si stringeva
   («Aggiungi cartella/mount»). Qui si ripristina la riga e si vieta la compressione. */
.set-actions > button,.set-actions > .btn-primary{flex:0 0 auto;display:inline-flex;
  align-items:center;gap:var(--sp-2);white-space:nowrap;}
.btn-pill{border-radius:var(--r-pill);}

/* La tabella etichette nasce per una card da 940px; il pannello della modale ne offre ~594.
   A larghezza fissa ci sta tutta: meglio due campi di testo stretti che il bottone «Salva»
   di ogni riga fuori dallo schermo, raggiungibile solo scorrendo in orizzontale. */
.set-pane .labels-table{min-width:0;table-layout:fixed;}
.set-pane .labels-table th:nth-child(1),.set-pane .labels-table td:nth-child(1){width:23%;}
.set-pane .labels-table th:nth-child(4),.set-pane .labels-table td:nth-child(4){width:11%;}
.set-pane .labels-table th:nth-child(5),.set-pane .labels-table td:nth-child(5){width:10%;}
.set-pane .labels-table th:nth-child(6),.set-pane .labels-table td:nth-child(6){width:15%;}
.set-pane .labels-table td:first-child code{display:inline-block;max-width:100%;overflow:hidden;
  text-overflow:ellipsis;vertical-align:bottom;}

/* Card-toggle dei widget: 2 colonne finché ci stanno, poi 1. */
.wgrid{display:grid;grid-template-columns:repeat(auto-fit,minmax(258px,1fr));gap:var(--sp-4);}
/* La specificità serve: `.modal-box form label` (riga ~1035) impila label e campo in
   colonna: è giusto per un campo di form, non per una card che è una riga
   [icona | etichetta | interruttore]. Stessa cura di `.perm-item` poco sopra. */
.modal-box form label.wcard{display:flex;flex-direction:row;align-items:center;gap:var(--sp-3);
  margin-bottom:0;font-weight:500;font-size:14px;color:var(--ink);
  padding:var(--sp-3) var(--sp-4);background:var(--surface);border:1px solid var(--line);
  border-radius:12px;box-shadow:var(--shadow-sm);cursor:pointer;transition:border-color .15s;}
.modal-box form label.wcard:hover{border-color:var(--line-strong);}
.wcard-ic{flex:0 0 auto;width:36px;height:36px;display:inline-flex;align-items:center;justify-content:center;
  border-radius:8px;background:var(--surface-2);color:var(--ink-soft);transition:background .15s,color .15s;}
.wcard-lbl{flex:1 1 auto;min-width:0;font-size:14px;font-weight:500;color:var(--ink);
  overflow:hidden;text-overflow:ellipsis;white-space:nowrap;}
/* Il chip verde a widget acceso è ridondante (lo stato lo dice l'interruttore): dove :has()
   non arriva resta neutro e non si perde nulla. */
.modal-box form label.wcard:has(input:checked) .wcard-ic{background:var(--ok-bg);color:var(--ok-text);}

@media (max-width:900px){
  /* A schermo stretto la modale prende tutto: 900px di larghezza fissa non esistono, e un
     foglio in fondo allo schermo non regge sette sezioni e una tabella. */
  .modal--set{padding:0;place-items:stretch;}
  .set-box{height:100dvh;max-height:none;max-width:none;border:0;border-radius:0;}
  .set-body{flex-direction:column;}
  /* la nav diventa una striscia orizzontale scorrevole sopra il pannello */
  .set-nav{flex:0 0 auto;flex-direction:row;gap:var(--sp-2);overflow-x:auto;overflow-y:hidden;
    border-right:0;border-bottom:1px solid var(--line);padding:var(--sp-3) var(--sp-4);
    scrollbar-width:none;}
  .set-nav::-webkit-scrollbar{display:none;}
  .set-navitem{width:auto;flex:0 0 auto;white-space:nowrap;padding:8px 14px;border-radius:var(--r-pill);}
  .set-navitem.is-on::after{display:none;}
  .set-main{padding:var(--sp-4);}
  .set-pane-head h2{font-size:20px;}
}


/* ═══════════════════════════════ SCADENZARIO — refresh UX (Sereno) ═══════════════════════════════
   Classi che sostituiscono gli stili inline rimossi da templates/scadenzario.html.
   Spaziature solo da token --sp-*; colori solo da token. */
.scad-cf{text-transform:uppercase;}        /* input codice fiscale reso in maiuscolo */


/* ---------- COMMESSE — modulo commesse/clienti/costi (UX refresh): classi che sostituiscono
   gli stili inline di templates/commesse.html e templates/commessa.html. Colori solo da token. */
.com-upper{text-transform:uppercase;}       /* input codice commessa reso in maiuscolo */
.dip-hero-com.com-hero-plain{color:var(--ink-soft);}  /* cliente senza scheda collegata: non è un link */


/* ---------- RICERCA/VERIFICA — refresh UX (Sereno): classi che sostituiscono gli stili
   inline di templates/ricerca.html, verifica.html, verifica_dipendente.html, file_manager.html.
   Spaziature solo da token --sp-*; nessun colore nuovo. */
.fm-dz-ic{width:28px;height:28px;color:var(--accent);}   /* icona dropzone import (era stile inline) */
.fm-up-prog .prog-bar{width:0;}                          /* stato iniziale barra avanzamento upload (JS la aggiorna) */


/* ═══════════════════════════════ NOTE SPESE — refresh UX (Sereno) ═══════════════════════════════
   Classi per templates/note_spese.html e note_spese_dettaglio.html.
   Spaziature solo da token --sp-*; colori solo da token esistenti. */
.ns-storico{padding:var(--sp-2) var(--sp-4);}
.ns-storico li{padding:var(--sp-2) 0;border-bottom:1px solid var(--line);font-size:13px;line-height:18px;}
.ns-storico li:last-child{border-bottom:none;}


/* ═══════════════════════════════ RECRUITING — refresh UX (Sereno) ═══════════════════════════════
   Classi che sostituiscono gli stili inline rimossi dai template recruiting_*.html.
   Spaziature solo da token --sp-*; colori solo da token. Le classi del kanban (.rec-board,
   .rec-col, .rec-cand…) e del wizard (.rps-*, .rec-prep-track/.rec-prep-fill) restano nella
   sezione storica «Recruiting / candidature»: sono un contratto per sereno-recruiting.js e
   per verifica_dipendente.html. */
.rec-upper{text-transform:uppercase;}        /* input codice fiscale reso in maiuscolo */
.req-note{margin:0 0 var(--sp-2);}           /* didascalia dentro card (era stile inline) */
button.mini.err{color:var(--crit);border-color:var(--crit-line);}
button.mini.err:hover{background:var(--crit-bg);}
/* Barra di avanzamento del wizard di preparazione come <progress> nativo (niente width inline). */
.rec-prep-prog{display:block;width:100%;height:10px;border:0;border-radius:var(--r-pill);
  overflow:hidden;appearance:none;background:var(--line);}
.rec-prep-prog::-webkit-progress-bar{background:var(--line);}
.rec-prep-prog::-webkit-progress-value{background:var(--accent);border-radius:var(--r-pill);}
.rec-prep-prog::-moz-progress-bar{background:var(--accent);border-radius:var(--r-pill);}
/* Vista Tabella: select cambio fase compatta sotto la pill (una per riga) */
.data-table .rec-stage-sel{display:block;margin-top:4px;max-width:170px;}
/* Vista «Per posizione»: titolo di fase + griglia di card NON trascinabili
   (il drag&drop vive solo nella board: qui cursor normale) */
.rec-fase-h{display:flex;align-items:center;gap:8px;margin:10px 0 6px;}
.rec-fase-list{list-style:none;margin:0;padding:0;display:grid;grid-template-columns:repeat(auto-fill,minmax(220px,1fr));gap:8px;}
.rec-fase-list .rec-cand{cursor:default;}


/* ═══════════════════════════════ MAIL — client (UX refresh) ═══════════════════════════════
   CSS estratto dal blocco <style> di templates/mail.html e riallineato ai token Sereno
   (spazi --sp-*, raggi --r-*, ombre --shadow*). Hook JS/HTMX invariati — sereno-mail.js usa:
   .mail-toolbar, .mail-read, .mail-body, .mail-row[data-mid], .unread, .mail-boxes .mail-fold,
   .mail-search input[name=q], #composeModal, #composeForm, #cmdk, #cmdk-input, #cmdk-list. */

/* ---------- layout a 3 colonne (ridimensionabili via --mail-col1/--mail-col2) ---------- */
/* Senza un messaggio aperto le colonne sono DUE e la lista si prende tutto: un riquadro di
   lettura vuoto costava un terzo di schermo per mostrare un segnaposto. Il terzo binario
   compare con `is-reading`, che il JS mette al click su un messaggio. */
.mail-workspace{display:grid;
  grid-template-columns:var(--mail-col1, 240px) 1px minmax(0, 1fr) 0 0;
  height:calc(100dvh - 184px);border:1px solid var(--line);border-radius:var(--r-shell);
  overflow:hidden;background:var(--surface);}
.mail-workspace:not(.is-reading) .mail-splitter[data-col="2"],
.mail-workspace:not(.is-reading) #mail-reading{display:none;}
.mail-workspace.is-reading{
  grid-template-columns:var(--mail-col1, 240px) 1px var(--mail-col2, 380px) 1px minmax(0, 1fr);}
/* In .content--full il padding verticale è ridotto (16+16 invece di 26+26):
   la griglia guadagna 20px di viewport. Regola DOPO .mail-workspace: i test di layout
   leggono la prima occorrenza di `.mail-workspace{`. */
.content--full .mail-workspace{height:calc(100dvh - 164px);}
/* Rail: le cartelle si riducono alle sole icone, la lettura guadagna 168px (Figma 9:2). */
.mail-workspace.is-rail{grid-template-columns:64px 1px minmax(0, 1fr) 0 0;}
/* Le due varianti si combinano: rail + lettura aperta è la griglia piena con la prima colonna
   ridotta. Serve la regola congiunta perché `is-rail` da sola, venendo dopo, vincerebbe. */
.mail-workspace.is-rail.is-reading{
  grid-template-columns:64px 1px var(--mail-col2, 380px) 1px minmax(0, 1fr);}
.mail-workspace.is-rail .mail-boxes{padding:var(--sp-2) 0;}
.mail-workspace.is-rail .mail-fold span,
.mail-workspace.is-rail .mail-grp span,
.mail-workspace.is-rail .mail-acc span{display:none;}
/* Con le icone il rail ha finalmente qualcosa da mostrare: prima nascondeva le etichette e
   lasciava una colonna di righe vuote. */
.mail-workspace.is-rail .mail-fold{justify-content:center;padding:10px 0;}
/* Senza etichette l'intestazione di gruppo diventa un filetto: separa i blocchi di icone,
   che altrimenti sarebbero una colonna sola indistinta. Il «+» delle viste sparisce con
   l'etichetta — da solo, senza la parola «Viste» accanto, non si sa cosa aggiunga. */
.mail-workspace.is-rail .mail-grp{justify-content:center;padding:var(--sp-3) 0 var(--sp-1);}
.mail-workspace.is-rail .mail-viewsave{display:none;}
.mail-workspace.is-rail .mail-grp::after{content:"";display:block;width:20px;
  border-top:1px solid var(--line);}
.mail-railbtn{width:32px;height:32px;border:0;border-radius:8px;background:transparent;
  color:var(--ink-soft);cursor:pointer;display:grid;place-items:center;}
.mail-railbtn:hover{background:var(--surface-2);color:var(--ink);}
.mail-col{overflow-y:auto;border-right:1px solid var(--line);}
.mail-col:last-child{border-right:0;}
.mail-splitter{cursor:col-resize;background:transparent;}
.mail-splitter:hover,.mail-splitter:active{background:var(--accent-wash);}

/* ---------- colonna caselle/viste ---------- */
.mail-boxes{padding:var(--sp-4) var(--sp-2);}
/* Intestazione di GRUPPO («Strumenti», «Viste», «Conversazione»): maiuscoletto spaziato, il
   grado più basso della gerarchia. Non usa --muted, che a 12px non arriva a 4.5:1. */
.mail-grp{display:flex;justify-content:space-between;align-items:center;gap:var(--sp-2);
  margin:0;padding:var(--sp-2) var(--sp-3) var(--sp-1);
  font-size:12px;font-weight:700;letter-spacing:.06em;text-transform:uppercase;color:var(--ink-soft);}
/* Header di CASELLA: l'indirizzo prende tutto lo spazio che avanza, il badge no. */
.mail-acc{display:flex;align-items:center;gap:var(--sp-2);
  font-weight:600;padding:var(--sp-2) var(--sp-3) var(--sp-1);color:var(--ink-soft);font-size:12.5px;}
.mail-fold{display:flex;align-items:center;gap:10px;
  padding:var(--sp-2) var(--sp-3);border-radius:10px;cursor:pointer;color:var(--ink);
  font-size:14px;text-decoration:none;transition:background .15s,color .15s;}
.mail-fold>span:first-of-type{flex:1;min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;}
.mail-fold .ic{color:var(--ink-soft);transition:color .15s;}
.mail-fold:hover,.mail-fold.htmx-request{background:var(--surface-2);}
.mail-fold:hover .ic{color:var(--ink);}
/* Stessa grammatica di .nav-item: la riga corrente è lavata d'accento, non solo più scura. */
.mail-fold.is-active{background:var(--accent-wash);color:var(--accent-text);font-weight:600;}
.mail-fold.is-active .ic{color:var(--accent);}
/* Il conteggio della casella è il totale e va letto per primo; quello della singola cartella
   è un dettaglio dentro un blocco già aperto e non deve gridare quanto il suo capo. */
.mail-fold .badge{background:var(--surface-2);color:var(--ink-soft);
  border-radius:var(--r-pill);font-size:11px;font-weight:700;line-height:18px;padding:0 var(--sp-2);
  min-width:20px;text-align:center;}
.mail-accbox>summary .badge{background:var(--accent-strong);color:var(--accent-ink);
  border-radius:var(--r-pill);font-size:11px;font-weight:700;line-height:18px;padding:0 var(--sp-2);
  min-width:20px;text-align:center;flex:0 0 auto;}

/* ---------- albero delle cartelle (punto 1) ----------
   Il rientro arriva dal template come --liv, così la profondità non ha bisogno di una classe
   per ogni grado. Il triangolo sostituisce il marker nativo, che cambia forma fra i browser. */
.mail-fold{padding-left:calc(var(--sp-3) + var(--liv, 0) * 14px);}
/* Un ramo: [freccia][riga che carica]. La freccia è un bottone vero e non un marker, perché
   deve essere un bersaglio a sé — è l'unica cosa che apre e chiude, mentre la riga accanto
   cambia cartella. La riga si prende lo spazio che resta e il rientro passa alla coppia. */
.mail-foldrow{display:flex;align-items:center;padding-left:calc(var(--liv, 0) * 14px);}
.mail-foldrow>.mail-fold{flex:1;min-width:0;padding-left:var(--sp-1);}
.mail-twist{flex:0 0 auto;display:grid;place-items:center;width:22px;height:28px;padding:0;
  border:0;background:transparent;color:var(--ink-soft);cursor:pointer;border-radius:6px;}
.mail-twist:hover{background:var(--surface-2);color:var(--ink);}
.mail-twist .ic{transition:transform .15s;}
.mail-foldbox.is-open>.mail-foldrow>.mail-twist .ic{transform:rotate(90deg);}
.mail-foldkids{display:none;}
.mail-foldbox.is-open>.mail-foldkids{display:block;}
/* Chiuso mostra il totale del ramo, aperto il conteggio proprio: il numero dice sempre quello
   che vedresti cliccando quella riga. */
.mail-foldbox.is-open .badge-tot,
.mail-foldbox:not(.is-open) .badge-own{display:none;}

/* ---------- caselle collassabili (<details> per casella) ----------
   Il summary porta la classe .mail-acc (l'header di casella vero e proprio); qui solo il
   comportamento disclosure: freccia ruotata ad aperto, marker nativo nascosto. */
.mail-accbox>summary{list-style:none;cursor:pointer;user-select:none;}
.mail-accbox>summary::-webkit-details-marker{display:none;}
.mail-accbox>summary::before{content:"▸";font-size:10px;color:var(--ink-soft);
  transition:transform .15s;flex:0 0 auto;}
.mail-accbox[open]>summary::before{transform:rotate(90deg);}
.mail-accbox>summary .mail-acc-name{flex:1;min-width:0;overflow:hidden;text-overflow:ellipsis;
  white-space:nowrap;}
.mail-viewsave{display:inline-flex;color:var(--accent);text-decoration:none;}
/* Le azioni della vista stanno accanto al link, non dentro: si scoprono al passaggio del mouse
   ma restano raggiungibili da tastiera, che è il motivo del :focus-within. */
.mail-viewrow{display:flex;align-items:center;}
.mail-viewrow>.mail-view{flex:1;min-width:0;}
.mail-viewact{flex:0 0 auto;display:inline-flex;align-items:center;background:0;border:0;
  color:var(--ink-soft);cursor:pointer;opacity:0;padding:var(--sp-1);border-radius:6px;}
.mail-viewrow:hover .mail-viewact,.mail-viewrow:focus-within .mail-viewact{opacity:1;}
.mail-viewact:hover{background:var(--surface-2);color:var(--ink);}
.mail-viewmine{color:var(--muted);font-weight:700;}

/* ---------- colonna lista messaggi (gerarchia a 3 linee) ---------- */
.mail-list-empty,.mail-read-empty{color:var(--ink-soft);padding:var(--sp-5);text-align:center;}
.mail-row{position:relative;display:block;padding:var(--sp-4);border-bottom:1px solid var(--line);
  cursor:pointer;text-decoration:none;color:var(--ink);}
.mail-row:hover,.mail-row.htmx-request,.mail-row:focus-visible{background:var(--accent-wash);}
/* Il messaggio aperto nel riquadro accanto resta segnato nella lista: senza, dopo due click
   non si sa più quale delle righe si sta leggendo. */
.mail-row.is-open{background:var(--ground);}
.mail-row.is-open:hover{background:var(--accent-wash);}
.mail-row.unread{font-weight:600;}
/* Pallino dei non letti dentro la riga del mittente (prima era assoluto a filo del bordo).
   Resta uno `::before` di `.who` perché è la classe `.unread` che il JS toglie alla lettura. */
.mail-row.unread .who::before{content:"";display:inline-block;width:8px;height:8px;margin-right:var(--sp-2);
  border-radius:50%;background:var(--accent);vertical-align:1px;}
.mail-row .from{display:flex;justify-content:space-between;align-items:center;gap:var(--sp-2);font-size:14px;}
.mail-row .who{min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;}
.mail-row .cluster{flex:0 0 auto;display:inline-flex;align-items:center;gap:var(--sp-2);}
.mail-row .from .ic{color:var(--ink-soft);}
.mail-row .subj{font-size:14px;margin-top:var(--sp-1);overflow:hidden;text-overflow:ellipsis;white-space:nowrap;}
.mail-row .snip{color:var(--ink-soft);font-size:13px;margin-top:var(--sp-1);font-weight:400;
  overflow:hidden;text-overflow:ellipsis;white-space:nowrap;}

/* ---------- pill di direzione (ricevuta / inviata / bozza) ----------
   Compare solo dove le due direzioni si mescolano: ricerca, viste salvate, conversazione.
   Dentro una cartella lo direbbe la cartella, e ripeterlo su ogni riga è rumore. */
.mail-dir{display:inline-flex;align-items:center;gap:var(--sp-1);margin-top:var(--sp-1);
  padding:3px var(--sp-2);border-radius:var(--r-pill);background:var(--surface-2);
  color:var(--ink-soft);font-size:12px;font-weight:600;}
.mail-dir-inviata{background:var(--accent-wash);color:var(--accent-text);}
.mail-dir-bozza{background:var(--warn-bg);color:var(--warn-text);}

/* ---------- ricerca + toolbar reading pane ---------- */
.mail-search{display:flex;align-items:center;gap:var(--sp-3);margin:0 0 var(--sp-3);
  padding:var(--sp-2) var(--sp-3) var(--sp-2) var(--sp-4);
  border:1px solid var(--line);border-radius:var(--r-el);background:var(--surface);}
.mail-search input{border:0;outline:0;background:transparent;width:100%;font:inherit;
  font-size:15px;color:var(--ink);}
.mail-search input::placeholder{color:var(--ink-soft);}
.mail-search .ic{color:var(--ink-soft);}

/* ---------- filtri a chip (punto 6) ----------
   I chip restano sotto la barra mentre si lavora: una ricerca attiva che non si vede è il
   modo di perdere il filo di quel che si sta guardando. */
.mail-chips{display:flex;flex-wrap:wrap;align-items:center;gap:var(--sp-2);
  margin:calc(var(--sp-3) * -1) 0 var(--sp-3);}
.mail-chip{display:inline-flex;align-items:center;gap:var(--sp-1);
  padding:2px var(--sp-2);border:1px solid var(--line);border-radius:var(--r-pill);
  font-size:12px;background:var(--surface);color:var(--ink);}
.mail-chip-x{border:0;background:none;cursor:pointer;font-size:15px;line-height:1;
  padding:0 2px;color:var(--ink-soft);}
.mail-chip-x:hover{color:var(--ink);}
.mail-filtri-pop{display:grid;gap:var(--sp-2);margin:0 0 var(--sp-3);
  padding:var(--sp-3);border:1px solid var(--line);border-radius:var(--r-el);
  background:var(--surface);}
.mail-filtro{display:grid;grid-template-columns:9rem 1fr;align-items:center;gap:var(--sp-2);
  font-size:13px;color:var(--ink-soft);}
.mail-filtro input,.mail-filtro select{font:inherit;color:var(--ink);}
/* Le azioni stanno in una fascia chiusa fra due filetti: separano i metadati del messaggio dal
   suo corpo, che è la lettura vera. */
.mail-toolbar{display:flex;gap:var(--sp-2);flex-wrap:wrap;margin:0 0 var(--sp-5);
  padding:var(--sp-4) 0;border-top:1px solid var(--line);border-bottom:1px solid var(--line);}
.btn-sm{padding:var(--sp-1) var(--sp-3);font-size:13px;display:inline-flex;align-items:center;gap:5px;}

/* ---------- chip etichette + picker «Etichetta»/«Collega» ---------- */
.mail-chip{display:inline-flex;align-items:center;font-size:12px;font-weight:600;padding:2px 9px;
  /* --chip è il colore scelto per l'etichetta (hex libero): il ripiego almeno regge AA. */
  border-radius:var(--r-pill);color:#fff;background:var(--chip,var(--accent-strong));white-space:nowrap;}
.mail-labels{display:flex;gap:var(--sp-2);flex-wrap:wrap;margin:var(--sp-2) 0 0;}
.mail-labelpick,.mail-linkpick{position:relative;display:inline-block;}
.mail-labelpick>summary,.mail-linkpick>summary{list-style:none;cursor:pointer;}
.mail-labelpick>summary::-webkit-details-marker,.mail-linkpick>summary::-webkit-details-marker{display:none;}
.mail-labelmenu,.mail-linkmenu{position:absolute;z-index:20;right:0;margin-top:var(--sp-2);min-width:190px;
  padding:var(--sp-2);background:var(--surface);border:1px solid var(--line);
  border-radius:var(--r-el);box-shadow:var(--shadow-lg);}
.mail-linkmenu{min-width:250px;}
.mail-labelopt{display:flex;align-items:center;gap:var(--sp-2);padding:var(--sp-1) var(--sp-2);cursor:pointer;}
.mail-labelnew{width:100%;justify-content:center;margin-top:var(--sp-2);}
.mail-linkrow{display:flex;gap:var(--sp-2);align-items:center;margin:var(--sp-1) 0;}
.mail-linkrow .input{flex:1;min-width:0;}
.mail-links{margin:var(--sp-2) 0 0;display:flex;flex-wrap:wrap;gap:var(--sp-2);}
.mail-linkchip{display:inline-flex;align-items:center;gap:var(--sp-2);font-size:12px;font-weight:600;
  padding:2px var(--sp-2) 2px var(--sp-3);border-radius:var(--r-pill);
  border:1px solid var(--line);background:var(--ground);}
.mail-linkchip-com{border-color:var(--accent);}
.mail-linkx{display:inline-flex;border:0;background:transparent;cursor:pointer;color:var(--ink-soft);padding:0 var(--sp-1);}
.mail-linkx:hover{color:var(--crit);}

/* ---------- reading pane ---------- */
.mail-read{padding:var(--sp-5);}
.mail-head{position:relative;margin-bottom:var(--sp-3);padding-right:36px;}
.mail-readclose{position:absolute;top:-4px;right:-4px;display:inline-flex;padding:var(--sp-1);
  border:0;border-radius:8px;background:transparent;color:var(--ink-soft);cursor:pointer;}
.mail-readclose:hover{background:var(--surface-2);color:var(--ink);}
.mail-read h2{font-size:20px;line-height:28px;letter-spacing:-.01em;margin:0 0 var(--sp-3);
  text-wrap:balance;}
.mail-meta{color:var(--ink-soft);font-size:13px;line-height:1.6;display:grid;gap:var(--sp-1);}
.mail-meta b{color:var(--ink);}
.mail-body{white-space:pre-wrap;word-break:break-word;line-height:24px;font-size:15px;}
.mail-atts{margin-top:var(--sp-4);border-top:1px solid var(--line);padding-top:var(--sp-3);
  display:grid;gap:var(--sp-2);}
.mail-att{display:flex;flex-wrap:wrap;align-items:center;gap:var(--sp-2);background:var(--ground);
  border:1px solid var(--line);border-radius:var(--r-el);padding:var(--sp-2) var(--sp-3);font-size:13px;}
.mail-att-name{display:inline-flex;align-items:center;gap:var(--sp-2);}
.mail-att-name .ic{color:var(--ink-soft);}
.mail-attsave{margin-left:auto;position:relative;}
.mail-attsave>summary{list-style:none;cursor:pointer;}
.mail-attsave>summary::-webkit-details-marker{display:none;}
.mail-attform{position:absolute;z-index:20;right:0;margin-top:var(--sp-2);min-width:250px;padding:var(--sp-3);
  display:grid;gap:var(--sp-2);background:var(--surface);border:1px solid var(--line);
  border-radius:var(--r-el);box-shadow:var(--shadow-lg);}
.mail-attform label{display:grid;gap:var(--sp-1);font-size:12px;color:var(--ink-soft);}
.mail-attform .input,.mail-attform select{width:100%;}
/* Esito dell'archiviazione, scritto sull'allegato: resta lì quando il toast se n'è andato,
   così chi ne archivia dieci di fila vede quali ha già fatto e dove sono andati. */
.mail-att-esito{display:block;margin-top:var(--sp-1);font-size:12px;color:var(--ink-soft);}
.mail-att-esito.ok{color:var(--accent);}
.mail-thread{margin-top:var(--sp-4);border-top:1px solid var(--line);padding-top:var(--sp-3);}
.mail-thread .mail-grp{padding-left:0;}
.mail-thread .t{padding:var(--sp-2) 0;border-bottom:1px dashed var(--line);font-size:13px;color:var(--ink-soft);}
.mail-threadmsg{display:block;text-decoration:none;padding:var(--sp-2) var(--sp-3);margin-bottom:var(--sp-1);
  border:1px solid var(--line);border-radius:var(--r-el);background:var(--surface);}
.mail-threadmsg:hover{background:var(--accent-wash);}
.mail-threadmsg.cur{border-color:var(--accent);background:var(--accent-wash);cursor:default;}
.mail-threadmsg .from{display:flex;justify-content:space-between;gap:var(--sp-2);
  font-size:13px;font-weight:600;color:var(--ink);}
.mail-threadmsg .snip{display:block;font-size:12.5px;color:var(--ink-soft);margin-top:2px;
  white-space:nowrap;overflow:hidden;text-overflow:ellipsis;}

/* ---------- corpo HTML in iframe sandbox ---------- */
.mail-htmlwrap{margin-top:var(--sp-2);}
.mail-htmlframe{width:100%;height:480px;border:1px solid var(--line);border-radius:var(--r-el);
  background:#fff;}
.mail-htmltools{display:flex;gap:var(--sp-3);align-items:center;margin-top:var(--sp-2);font-size:12.5px;}

/* ---------- autocomplete rubrica (compose A/Cc/Bcc) ---------- */
#composeModal label, #contactModal label{position:relative;}
.ac-drop{position:absolute;z-index:30;left:0;right:0;top:100%;margin-top:2px;max-height:220px;
  overflow-y:auto;background:var(--surface);border:1px solid var(--line);
  border-radius:var(--r-el);box-shadow:var(--shadow-lg);}
.ac-item{padding:var(--sp-2) var(--sp-3);font-size:13px;font-weight:400;color:var(--ink);
  cursor:pointer;white-space:nowrap;overflow:hidden;text-overflow:ellipsis;}
.ac-item.sel,.ac-item:hover{background:var(--accent-wash);}

/* ---------- compose avanzata: allegati ---------- */
.compose-atts{display:flex;flex-wrap:wrap;align-items:center;gap:var(--sp-2);margin-bottom:12px;}
.compose-attach{cursor:pointer;}
.compose-attlist{list-style:none;margin:0;padding:0;display:flex;flex-wrap:wrap;gap:var(--sp-2);}
.compose-attlist li{background:var(--ground);border:1px solid var(--line);
  border-radius:var(--r-el);padding:2px 8px;font-size:12.5px;}
.compose-attdel{border:0;background:transparent;cursor:pointer;color:var(--ink-soft);padding:0 2px;}
.compose-attdel:hover{color:var(--crit);}

/* ---------- picker «Allega da archivio» ---------- */
.mail-docs-tabs{display:flex;gap:var(--sp-2);margin-bottom:var(--sp-3);}
.mail-docs-tab{border:1px solid var(--line);background:var(--surface);border-radius:var(--r-pill);
  padding:4px 14px;font-size:13px;font-weight:600;cursor:pointer;color:var(--ink-soft);}
.mail-docs-tab.sel{background:var(--accent-strong);border-color:var(--accent-strong);color:var(--accent-ink);}
.mail-docs-form{display:flex;gap:var(--sp-2);margin-bottom:var(--sp-3);}
.mail-docs-form .input{flex:1;min-width:0;}
.mail-docs-results{max-height:320px;overflow-y:auto;display:grid;gap:2px;margin-bottom:var(--sp-3);}
.mail-docs-row{display:flex;align-items:center;gap:var(--sp-2);padding:var(--sp-1) var(--sp-2);
  border-radius:var(--r-el);font-size:13px;cursor:pointer;}
.mail-docs-row:hover{background:var(--accent-wash);}
.mail-docs-txt{display:grid;line-height:1.35;}

/* ---------- badge tipo contatto (rubrica + autocomplete) ---------- */
.mail-tipo{display:inline-block;font-size:11px;font-weight:600;padding:1px 8px;
  /* Bianco su --muted era 2.2:1: il fondo dei badge di tipo passa a --ink-soft (5.98:1). */
  border-radius:var(--r-pill);color:#fff;background:var(--ink-soft);white-space:nowrap;}
.mail-tipo-dipendente{background:var(--accent);}
.mail-tipo-cliente{background:#2f6690;}
.mail-tipo-fornitore{background:#b08902;}
.mail-tipo-ente{background:#6d4c90;}
.mail-tipo-medico{background:var(--crit);}

/* ---------- etichetta: palette colori + freshness sync + «carica altri» ---------- */
.label-colors{display:flex;gap:var(--sp-2);margin-bottom:14px;}
.label-color{width:26px;height:26px;border-radius:50%;background:var(--chip);
  border:2px solid transparent;cursor:pointer;padding:0;}
.label-color.sel{border-color:var(--ink);}
.mail-more{display:block;text-align:center;padding:var(--sp-3);font-size:13px;font-weight:600;
  color:var(--accent);text-decoration:none;border-top:1px solid var(--line);}
.mail-more:hover{background:var(--accent-wash);}

/* ---------- modale «Vista» (crea e modifica) ----------
   I campi delle condizioni riusano `.mail-filtro` del pannello «Filtri»: sono le stesse
   condizioni e devono avere lo stesso aspetto, o sembrerebbero due strumenti diversi. */
.view-scope{border:0;margin:0 0 var(--sp-3);padding:0;display:grid;gap:var(--sp-1);}
.view-scope legend{padding:0;font-size:12px;font-weight:600;color:var(--ink-soft);
  margin-bottom:var(--sp-1);}
/* Queste label NON ereditano l'impilamento verticale di `.modal-box form label` (stessa
   eccezione già fatta per .evento-indet e .perm-item): il pallino va ACCANTO al testo e la
   condizione va in due colonne, etichetta e campo. Con la colonna ereditata, e il mio
   align-items:center, finivano tutte incolonnate al centro del modale. */
.modal-box form label.view-radio{flex-direction:row;align-items:center;gap:var(--sp-2);
  margin-bottom:0;font-size:13.5px;font-weight:500;color:var(--ink);cursor:pointer;}
.view-radio small{color:var(--ink-soft);font-weight:400;}
.modal-box form label.mail-filtro{display:grid;grid-template-columns:8rem 1fr;
  align-items:center;gap:var(--sp-2);margin-bottom:0;}
.view-campi{display:grid;gap:var(--sp-2);max-height:34vh;overflow-y:auto;
  padding:var(--sp-2) var(--sp-1);border:1px solid var(--line);border-radius:var(--r-el);}
#viewModal .mail-chips{margin:var(--sp-3) 0 0;}
/* La stringa che ne esce, in chiaro: chi conosce il mini-linguaggio controlla, chi non lo
   conosce lo impara guardando. */
.view-anteprima{margin:var(--sp-2) 0 0;color:var(--ink-soft);word-break:break-word;}

/* ---------- command palette ⌘K ---------- */
.cmdk-kbd{font:600 11px/1 var(--font-body);background:var(--ground);border:1px solid var(--line);
  border-radius:var(--r-el);padding:var(--sp-1);color:var(--ink-soft);}
.cmdk{position:fixed;inset:0;z-index:80;background:rgba(0,0,0,.35);display:grid;
  justify-items:center;align-items:start;padding-top:12vh;}
.cmdk[hidden]{display:none;}
.cmdk-box{width:min(560px,92vw);background:var(--surface);border:1px solid var(--line);
  border-radius:var(--r-card);box-shadow:var(--shadow-lg);overflow:hidden;}
#cmdk-input{width:100%;border:0;border-bottom:1px solid var(--line);outline:0;padding:var(--sp-4);
  font:inherit;font-size:16px;background:transparent;color:var(--ink);}
.cmdk-list{list-style:none;margin:0;padding:var(--sp-2);max-height:44vh;overflow-y:auto;}
.cmdk-item{padding:var(--sp-3);border-radius:var(--r-el);cursor:pointer;font-size:14px;color:var(--ink);}
.cmdk-item.sel,.cmdk-item:hover{background:var(--accent-wash);}

/* ---------- compose flottante stile Gmail + barra bozze ---------- */
.modal--floating{pointer-events:none;display:block;background:transparent;}
.modal--floating .modal-box{position:fixed;right:24px;bottom:24px;margin:0;pointer-events:auto;
  max-height:82dvh;overflow-y:auto;}
.compose-titlebar{display:flex;align-items:center;gap:var(--sp-1);margin-bottom:var(--sp-3);
  cursor:move;user-select:none;touch-action:none;}
.compose-titlebar h3{flex:1;margin:0;font-size:16px;cursor:move;}
.compose-tb{border:0;background:transparent;cursor:pointer;color:var(--ink-soft);font-size:15px;
  padding:2px 7px;border-radius:var(--r-el);line-height:1;}
.compose-tb:hover{background:var(--accent-wash);color:var(--ink);}
.draft-tray{position:fixed;right:24px;bottom:0;z-index:70;display:flex;gap:var(--sp-2);}
.draft-chip{display:inline-flex;align-items:center;gap:var(--sp-2);max-width:220px;
  padding:var(--sp-2) var(--sp-3);border:1px solid var(--line);border-bottom:0;
  border-radius:var(--r-el) var(--r-el) 0 0;background:var(--surface);box-shadow:var(--shadow-lg);
  font-size:13px;font-weight:600;color:var(--ink);cursor:pointer;
  white-space:nowrap;overflow:hidden;text-overflow:ellipsis;}
.draft-x{color:var(--ink-soft);font-weight:400;padding:0 2px;}
.draft-x:hover{color:var(--crit);}
.compose-page{max-width:760px;}

/* ---------- mobile (breakpoint 900px, lo stesso della shell Sereno) ----------
   Le 3 colonne si impilano a tutta larghezza con altezze naturali: caselle e reading pane
   liberi (contenuto breve / lettura comoda), solo la lista ha un cap di scroll interno. */
@media (max-width:900px){
  .mail-workspace{grid-template-columns:1fr;height:auto;}
  .mail-splitter{display:none;}
  .mail-col{border-right:0;border-bottom:1px solid var(--line);max-height:none;}
  .mail-col:last-child{border-bottom:0;}
  #mail-list{max-height:48dvh;}
}

/* ============ SORVEGLIANZA/LAB ============
   Pagine Sorveglianza sanitaria (lato azienda) + workspace Laboratorio medico.
   Utility locali che sostituiscono gli stili inline: solo token --sp-* e colori da token. */
.sec-card{padding:var(--sp-4) var(--sp-5);}
.sec-note{margin:0;padding:var(--sp-3) var(--sp-4);border-top:1px solid var(--line);}
.card-h .t-section{margin:0;}
.kv-row{display:flex;align-items:center;gap:var(--sp-2) var(--sp-5);flex-wrap:wrap;}
.kv-item{display:flex;align-items:center;gap:var(--sp-2);}
.mono{font-family:ui-monospace,SFMono-Regular,Menlo,Consolas,monospace;font-size:13px;}
.sorv-notif-list{list-style:none;margin:0;padding:0;max-height:340px;overflow-y:auto;}
.sorv-notif-list li{display:flex;align-items:baseline;gap:var(--sp-3);padding:var(--sp-2) var(--sp-4);
  border-bottom:1px solid var(--line);font-size:13.5px;}
.sorv-notif-list li:last-child{border-bottom:0;}
.sorv-notif-list li.unread{background:var(--accent-wash);}
.sorv-notif-list .muted{margin-left:auto;flex:0 0 auto;font-size:12px;}
.code-box{margin:var(--sp-3) 0 0;padding:var(--sp-3) var(--sp-4);background:var(--surface-2);
  border:1px solid var(--line);border-radius:var(--r-el);text-align:center;}
.code-box code{font-family:ui-monospace,SFMono-Regular,Menlo,Consolas,monospace;font-size:17px;
  font-weight:700;letter-spacing:.14em;color:var(--accent-2);}
.form-part{display:flex;gap:var(--sp-2);flex-wrap:wrap;align-items:center;}
.form-part .p-cf{flex:2 1 190px;}
.form-part .p-cognome,.form-part .p-nome,.form-part .p-luogo,.form-part .p-data,.form-part .p-mansione{flex:1 1 120px;}
.sorv-stato{max-width:280px;}
.sess-parts{list-style:none;margin:0;padding:0;display:flex;flex-direction:column;gap:var(--sp-1);font-size:14px;}

/* ═══════════════════════════════ FORMAZIONE/ENTI — refresh UX (Sereno) ═══════════════════════════════
   Refresh dei template formazione.html / formazione_richiesta.html / enti_lista.html / ente_board.html /
   ente_corsi.html / ente_sessioni.html / ente_richiesta.html: dà resa alle classi strutturali usate da
   queste schermate e sostituisce gli stili inline rimossi (righe partecipante, select «aggiorna stato»).
   Spaziature solo da token --sp-*; colori solo da token; nessun colore nuovo. */

/* sezione a card con padding interno (contenitore delle schermate formazione/ente) */
.section-card{background:var(--surface);border:1px solid var(--line);border-radius:var(--r-card);box-shadow:var(--shadow-sm);padding:var(--sp-4) var(--sp-5);}
.section-card h2{margin:0 0 var(--sp-3);}

/* coppie etichetta/valore in riga (riepiloghi richiesta/sessione) */
.kv-row{display:flex;flex-wrap:wrap;align-items:center;gap:var(--sp-3) var(--sp-5);}
.kv-lbl{display:block;font-size:10.5px;font-weight:600;letter-spacing:.06em;text-transform:uppercase;color:var(--ink-soft);margin-bottom:2px;}

/* testo compatto / dati numerici in tabular (CF, conteggi) */
.small{font-size:12.5px;}
.mono{font-variant-numeric:tabular-nums;letter-spacing:.02em;}

/* contatore «non lette» nel pannello novità in pagina */
.np-badge{display:inline-grid;place-items:center;min-width:20px;padding:2px 6px;border-radius:var(--r-pill);background:var(--accent-strong);color:var(--accent-ink);font-size:11px;font-weight:700;font-variant-numeric:tabular-nums;}

/* lista novità in pagina (dentro .card > .ch; distinta dal dropdown .notif-panel della topbar) */
.fx-notif-list{list-style:none;margin:0;padding:0;}
.fx-notif-list li{padding:var(--sp-3) var(--sp-5);border-bottom:1px solid var(--line);font-size:13.5px;}
.fx-notif-list li:last-child{border-bottom:0;}
.fx-notif-list li.unread{background:var(--accent-wash);}

/* partecipanti assegnati a una sessione */
.sess-parts{list-style:none;margin:var(--sp-3) 0 0;padding:0;display:flex;flex-direction:column;gap:var(--sp-1);font-size:13.5px;}

/* codice di collegamento monouso (modale «collega azienda») */
.code-box{margin:var(--sp-3) 0 0;padding:var(--sp-3);border:1px dashed var(--line-strong);border-radius:var(--r-el);background:var(--surface-2);text-align:center;font-size:16px;font-weight:600;letter-spacing:.06em;font-variant-numeric:tabular-nums;}

/* fieldset «partecipanti» nel form richiesta formazione */
.form-fieldset{border:1px solid var(--line);border-radius:var(--r-el);padding:var(--sp-3) var(--sp-4) var(--sp-4);margin:0;display:flex;flex-direction:column;gap:var(--sp-3);}
.form-fieldset legend{font-size:12.5px;font-weight:600;color:var(--ink-soft);padding:0 var(--sp-1);}
.form-fieldset .btn-soft{align-self:flex-start;}

/* riga partecipante clonata da <template id="formPartRow"> — le classi p-* sono lette da sereno-formazione.js */
#formParts{display:flex;flex-direction:column;gap:var(--sp-2);}
.form-part .p-cf{flex:2 1 12rem;}
.form-part .p-cognome,.form-part .p-nome,.form-part .p-luogo,.form-part .p-data{flex:1 1 9rem;}

/* select «aggiorna stato» nella scheda richiesta lato ente */
.fx-stato{display:flex;flex-wrap:wrap;align-items:flex-end;gap:var(--sp-3);margin-top:var(--sp-3);}
.fx-stato label{flex:0 0 auto;min-width:220px;display:flex;flex-direction:column;gap:var(--sp-1);font-size:12.5px;font-weight:600;color:var(--ink-soft);}

/* ONBOARDING/AUTH (UX refresh) */
/* hint dentro le label dei form auth (login/register): peso normale, niente stili inline */
.lp-field label .muted{font-weight:400;}
/* pagina errore standalone (errore.html): corpo pagina + titolo + CTA, solo token */
.err-page{background:var(--ground);color:var(--ink);font-family:var(--font-body);min-height:100vh;margin:0;}
.err-card h1{font-family:var(--font-display);font-weight:600;margin:0 0 var(--sp-3);color:var(--ink);}
.err-act{margin:var(--sp-5) 0 0;}
/* onboarding: respiro della barra di avanzamento sotto l'intro */
.onb-progress{margin:var(--sp-2) 0 var(--sp-5);}
/* informativa privacy: colonna di lettura (era max-width inline) */
.legal{max-width:820px;line-height:1.55;}

/* ═══════════════════════════════ LOGISTICA — liste (UX refresh) ═══════════════════════════════
   Classi per templates/alloggi.html, veicoli.html, dipendente_nuovo.html e mail_caselle.html:
   sostituiscono gli stili inline (e il blocco <style> di mail_caselle). Spaziature solo da
   token --sp-*; colori solo da token esistenti. */
.rowlink{cursor:pointer;}                                  /* riga tabella cliccabile → scheda dettaglio */
.check-inline{display:inline-flex;align-items:center;gap:var(--sp-2);font-weight:400;}
.upper{text-transform:uppercase;}                          /* input reso in maiuscolo (es. codice fiscale) */

/* MAIL — config caselle (pagina /mail/caselle) */
.mailcfg{max-width:920px;display:flex;flex-direction:column;gap:var(--sp-5);}
.mailcfg-note{margin:0 0 var(--sp-4);}
/* Stato sync per-casella (/mail/caselle): il badge rosso rende impossibile non vedere
   una casella ferma (prima il fallimento era silenzioso). */
.mailcfg-badge{display:inline-block;border-radius:var(--r-pill);font-size:11px;font-weight:600;
  line-height:18px;padding:0 var(--sp-2);background:var(--surface-2);color:var(--ink-soft);}
.mailcfg-badge.ok{background:var(--accent-wash);color:var(--accent);}
.mailcfg-badge.err{background:var(--crit);color:#fff;}
.mailcfg-card{background:var(--surface);border:1px solid var(--line);border-radius:var(--r-card);
  padding:var(--sp-4) var(--sp-5);}
.mailcfg-card .t-section{margin:0 0 var(--sp-3);}
.mailcfg-grid{display:grid;grid-template-columns:1fr 1fr;gap:var(--sp-3);}
@media (max-width:640px){.mailcfg-grid{grid-template-columns:1fr;}}
.mailcfg-box{display:flex;justify-content:space-between;align-items:flex-start;gap:var(--sp-3);
  border-bottom:1px solid var(--line);padding:var(--sp-3) 0;}
.mailcfg-box:last-child{border-bottom:0;}
.mailcfg-users{display:flex;flex-wrap:wrap;gap:var(--sp-3);margin:var(--sp-2) 0;}


/* ═══════════════════════════════ MAGAZZINO — schede (UX refresh) ═══════════════════════════════
   Classi che sostituiscono gli stili inline rimossi da templates/mag_articolo.html,
   consumabili.html, consumabile.html, abbigliamento_capo.html, _abbigliamento_dip.html,
   cassetta_nuovo.html, _cassetta_composizione.html e _cassetta_storico.html.
   Spaziature solo da token --sp-*; nessun colore nuovo. */
.mag-block{margin:var(--sp-5) 0;}                  /* card di sezione nelle schede articolo/consumabile/capo/kit */
.mag-card-body{padding:var(--sp-3) var(--sp-4);}    /* corpo delle card di sezione */
.mag-kit-actions{margin:var(--sp-2) 0 var(--sp-4);} /* riga azioni sopra il box kit (Esporta PDF) */
.mag-chips{margin-bottom:var(--sp-4);}              /* wrap chip del riepilogo abbigliamento del dipendente */
.mag-list-pad{padding:var(--sp-2) 0;}               /* respiro verticale delle logi-list dentro card */
.mag-empty{padding:var(--sp-2) var(--sp-4);}        /* voce vuota dentro .logi-list */
.mag-inline-form{display:inline;}                   /* form HTMX (rimuovi riga kit) inline accanto al valore */

/* ═══════════════ PIATTAFORMA — console aziende (ex legacy, portata su token Sereno) ═══════════════ */
.plt-intro{max-width:76ch;margin:0 0 var(--sp-4);}
.plt-form{padding:var(--sp-4) var(--sp-5);margin-bottom:var(--sp-5);max-width:640px;}
/* banner codice di registrazione (riempito da platform.js) */
.banner-inline{padding:var(--sp-3) var(--sp-4);border-radius:var(--r-el);font-size:13px;margin:var(--sp-3) 0;
  background:var(--ok-bg);color:var(--ok);border:1px solid var(--ok-line);}
.banner-inline.warn{background:var(--warn-bg);color:var(--warn-text);border-color:var(--warn-line);}
.regcode{font-family:ui-monospace,SFMono-Regular,Menlo,monospace;font-size:13px;font-weight:600;color:var(--accent-2);
  background:var(--surface);border:1px solid var(--accent-wash);border-radius:var(--r-el);padding:2px 8px;user-select:all;}
/* picker moduli (creazione) e toggle per-azienda */
.mod-pick{grid-column:1/-1;border:1px solid var(--line);border-radius:var(--r-el);padding:var(--sp-3) var(--sp-4);margin:2px 0;}
.mod-pick legend{font-weight:600;font-size:12px;color:var(--ink-soft);padding:0 6px;}
.mod-chk{display:inline-flex;align-items:center;gap:6px;margin-right:16px;font-size:13px;}
.mod-toggle{display:flex;flex-wrap:wrap;gap:6px 12px;align-items:center;font-size:12px;margin:var(--sp-2) 0;}
.mod-toggle label{display:inline-flex;align-items:center;gap:4px;white-space:nowrap;}
/* interruttore (toggle switch): checkbox reale invisibile ma focusabile sotto la "pista";
   lo stato passa da posizione+colore della manopola, mai solo dal colore (AA). */
.switch{position:relative;display:inline-flex;flex:0 0 auto;width:34px;height:20px;vertical-align:middle;}
.switch input{position:absolute;inset:0;margin:0;opacity:0;cursor:pointer;z-index:1;}
.switch .switch-track{position:absolute;inset:0;background:var(--line-strong);border-radius:var(--r-pill);
  transition:background-color .15s ease;}
.switch .switch-track::before{content:"";position:absolute;top:2px;left:2px;width:16px;height:16px;
  border-radius:50%;background:var(--surface);box-shadow:var(--shadow-sm);transition:transform .15s ease;}
.switch input:checked+.switch-track{background:var(--ok);}
.switch input:checked+.switch-track::before{transform:translateX(14px);}
.switch input:focus-visible+.switch-track{outline:2px solid var(--accent);outline-offset:2px;}
.switch input:disabled+.switch-track{opacity:.5;cursor:not-allowed;}
.switch input:disabled:checked+.switch-track{background:var(--muted);}

/* ═══════════════ FILE MANAGER — mitigazione mobile (ex style.css T8) ═══════════════ */
@media (max-width:640px){
  /* sotto i 640px la tabella nasconde le colonne a basso valore (Dimensione, Modificato)
     così Nome/Tipo/azione restano leggibili senza scroll orizzontale */
  .fm-table th:nth-child(3),.fm-table td:nth-child(3),
  .fm-table th:nth-child(4),.fm-table td:nth-child(4){display:none;}
}

/* ═══════════════ PIATTAFORMA — scheda dettaglio azienda + filtri lista (console operatore) ═══════════════ */
.plt-card-body{padding:var(--sp-3) var(--sp-4);}     /* corpo card anagrafica (come .vei-card-body) */
.plt-filters{display:flex;gap:var(--sp-3);align-items:center;flex-wrap:wrap;margin:var(--sp-4) 0 var(--sp-3);}
.plt-filters input[type=search]{min-width:220px;}
.plt-filters .seg-toggle{margin:0;}

/* ═══════════════ RETE — codice di connessione monouso (mostrato una tantum) ═══════════════ */
.rete-codice-out{display:block;margin-top:var(--sp-3);padding:var(--sp-3) var(--sp-4);border:1px dashed var(--line-strong);border-radius:var(--r-el);background:var(--accent-wash);font-family:ui-monospace,monospace;font-size:13px;word-break:break-all;user-select:all;}
.rete-doc-pick{display:block;width:100%;text-align:left;}

/* ============ PAGINE DI ERRORE (Figma 5:524) ============ */
.errore-pagina{max-width:420px;margin:0 auto;padding:var(--sp-8) var(--sp-5);text-align:center;}
.errore-codice{font-family:var(--font-display);font-size:64px;line-height:1;
  margin:0 0 var(--sp-4);color:var(--ink-soft);}
.errore-pagina h1{font-family:var(--font-display);font-size:24px;margin:0 0 var(--sp-3);}
.errore-testo{color:var(--ink-soft);margin:0 0 var(--sp-5);}
.errore-azioni .btn{display:inline-flex;}

/* ============ HOME DA CANTIERE (Figma 14:2) ============ */
.home-cantiere{display:none;}
@media (max-width:480px){
  .home-cantiere{display:flex;flex-direction:column;gap:var(--sp-3);margin:0 0 var(--sp-5);}
  .cantiere-cta{display:flex;flex-direction:column;align-items:center;gap:var(--sp-2);
    padding:var(--sp-5);text-align:center;background:var(--accent-wash);
    border:1px solid var(--accent);border-radius:var(--r-card);}
  .cantiere-cta .ic{color:var(--accent);width:28px;height:28px;}
  .cantiere-cta b{font-family:var(--font-display);font-size:17px;}
  .cantiere-cta small{color:var(--ink-soft);}
  .cantiere-azioni{display:flex;gap:var(--sp-2);}
  .cantiere-azione{flex:1;min-height:44px;display:grid;place-items:center;
    background:var(--surface);border:1px solid var(--line);border-radius:var(--r-el);
    font-size:13px;font-weight:500;color:var(--ink);}

/* ═══════════════════════════════ SCHEDA CLIENTE ARRICCHITA (Fase 3) ═══════════════════════════════ */
.cli-grid{display:grid;grid-template-columns:340px 1fr;gap:var(--sp-5);align-items:start;}
.cli-col{display:flex;flex-direction:column;gap:var(--sp-5);}
.cli-box{background:var(--surface);border:1px solid var(--line);border-radius:var(--r-card);padding:var(--sp-4) var(--sp-5);box-shadow:var(--shadow-sm);}
.cli-sez-title{font-family:var(--font-display);font-size:17px;font-weight:600;margin:0 0 var(--sp-3);color:var(--ink-soft);}
.cli-sez-title .muted{font-weight:500;}
.ref-list{display:flex;flex-direction:column;gap:var(--sp-2);}
.ref-row{display:flex;flex-wrap:wrap;align-items:center;justify-content:space-between;gap:var(--sp-2);padding:var(--sp-2) 0;border-bottom:1px solid var(--line);}
.ref-row:last-child{border-bottom:0;}
.ref-main{display:flex;flex-direction:column;gap:2px;flex:1;min-width:0;}
.ref-main b{font-weight:600;color:var(--ink);}
.ref-ruolo{font-size:12px;color:var(--ink-soft);}
.ref-contatti{display:flex;flex-wrap:wrap;gap:var(--sp-2) var(--sp-3);font-size:12.5px;color:var(--ink-soft);}
.fatturato-box{display:flex;flex-direction:column;gap:2px;}
.fatturato-num{font-family:var(--font-display);font-size:28px;font-weight:700;color:var(--ink);font-variant-numeric:tabular-nums;}
.fatturato-lbl{font-size:12px;color:var(--ink-soft);}
.timeline-list{display:flex;flex-direction:column;gap:var(--sp-3);padding-left:var(--sp-3);border-left:2px solid var(--line);}
.timeline-item{display:flex;gap:var(--sp-3);align-items:flex-start;}
.timeline-dot{width:8px;height:8px;border-radius:50%;background:var(--accent);margin-top:6px;flex:0 0 auto;}
.timeline-body{display:flex;flex-direction:column;gap:2px;}
.timeline-meta{font-size:11.5px;color:var(--ink-soft);}
.timeline-desc{font-size:13px;color:var(--ink-soft);}
@media (max-width:920px){
  .cli-grid{grid-template-columns:1fr;}
}
}

/* W1-3 — wizard: dropzone, progresso e checklist documenti */
.wiz-dropzone{display:flex;flex-direction:column;align-items:center;gap:var(--sp-3);padding:var(--sp-6) var(--sp-5);border:2px dashed var(--line-strong);border-radius:var(--r-card);background:var(--surface);transition:border-color .15s ease,background-color .15s ease;cursor:pointer;}
.wiz-dropzone.drag{border-color:var(--accent);background:var(--accent-wash);}
.wiz-dropzone.has-files{border-color:var(--ok);background:var(--ok-bg);}
.wiz-dropzone .ic{width:40px;height:40px;color:var(--ink-soft);}
.wiz-dropzone b{display:block;text-align:center;}
.wiz-dz-txt{display:flex;flex-direction:column;align-items:center;gap:var(--sp-1);text-align:center;color:var(--ink-soft);}
.wiz-dz-pick{cursor:pointer;color:var(--accent);text-decoration:underline;}
.wiz-dz-count{font-size:12px;color:var(--ink-soft);min-height:18px;}
.wiz-prog{width:100%;max-width:280px;height:6px;background:var(--line);border-radius:var(--r-pill);overflow:hidden;margin-top:var(--sp-2);}
.wiz-prog-bar{height:100%;width:0%;background:var(--accent);transition:width .1s linear;}
.wiz-checklist{list-style:none;margin:var(--sp-4) 0 0;padding:0;display:flex;flex-direction:column;gap:var(--sp-2);}
.wiz-checkitem{display:flex;align-items:center;gap:var(--sp-3);padding:var(--sp-2) var(--sp-3);border-radius:var(--r-el);background:var(--surface);border:1px solid var(--line);font-size:14px;}
.wiz-checkitem.wiz-mancante{border-left:4px solid var(--warn);background:var(--warn-bg);}
.wiz-checkitem.muted{border-style:dashed;color:var(--ink-soft);}
.wiz-checkmark{flex:0 0 auto;width:18px;height:18px;border-radius:50%;border:2px solid var(--line-strong);display:grid;place-items:center;}
.wiz-checkitem.wiz-mancante .wiz-checkmark{border-color:var(--warn);}
.wiz-checklabel{flex:1;}
.wiz-checklabel .req{color:var(--warn);font-weight:600;}

/* W1-4 — riepilogo per sezioni con «Modifica» e avviso mancanti */
.wiz-riep-sezione{border:1px solid var(--line);border-radius:var(--r-card);padding:var(--sp-4);margin:0 0 var(--sp-3);background:var(--surface);}
.wiz-riep-sezione header{display:flex;align-items:center;justify-content:space-between;gap:var(--sp-3);margin:0 0 var(--sp-3);}
.wiz-riep-sezione h3{margin:0;font-family:var(--font-display);font-size:16px;color:var(--ink);}
.wiz-riep-modifica{border:0;background:transparent;color:var(--accent);cursor:pointer;font-family:var(--font-body);font-size:13px;font-weight:500;padding:0;text-decoration:underline;}
.wiz-riep-riga{display:flex;justify-content:space-between;gap:var(--sp-4);padding:var(--sp-1) 0;font-size:13px;border-bottom:1px solid var(--line);}
.wiz-riep-riga:last-child{border-bottom:0;}
.wiz-riep-riga span{color:var(--ink-soft);text-transform:capitalize;}
.wiz-riep-vuoto{color:var(--ink-soft);font-weight:400;font-style:italic;}
.wiz-avviso{display:flex;gap:var(--sp-3);padding:var(--sp-4);border-radius:var(--r-card);background:var(--warn-bg);border:1px solid var(--warn-line);margin:var(--sp-4) 0;}
.wiz-avviso .ic{color:var(--warn);flex:0 0 auto;width:22px;height:22px;}
.wiz-avviso b{display:block;margin:0 0 var(--sp-1);}
.wiz-avviso label{display:inline-flex;align-items:center;gap:var(--sp-2);margin:var(--sp-2) var(--sp-3) 0 0;}

/* ---- Suggeritore del codice fiscale (sereno-cf.js) --------------------------------------- */
/* Il guscio dà il riferimento di posizionamento all'elenco: senza, si ancorerebbe alla pagina. */
.cf-wrap { position: relative; display: block; }
.cf-sugg { position: absolute; z-index: 40; left: 0; top: 100%; min-width: 16rem; max-width: 26rem;
           max-height: 15rem; overflow-y: auto; background: var(--surface);
           border: 1px solid var(--line); border-radius: var(--r-el); box-shadow: var(--shadow); }
.cf-voce { display: flex; flex-direction: column; gap: 2px; width: 100%;
           padding: var(--sp-2) var(--sp-3); text-align: left; background: none; border: 0;
           color: var(--ink); cursor: pointer; font: inherit; }
.cf-voce:hover, .cf-voce:focus { background: var(--surface-2); outline: none; }
.cf-scelto { display: block; margin-top: var(--sp-1); color: var(--ink-soft); }

/* ============================ Riconoscimento documenti ============================
   Una riga per file caricato, che si riempie mentre l'OCR legge. Il bordo a sinistra dice
   l'esito a colpo d'occhio: verde archiviato, giallo da confermare, rosso fermato. */
.docrecog-lista { display: grid; gap: var(--sp-2); margin-top: var(--sp-3); }
.docrecog-riga {
  border: 1px solid var(--line); border-left: 4px solid var(--line-strong);
  border-radius: var(--r-el); padding: var(--sp-2) var(--sp-3);
}
.docrecog-testa { display: flex; align-items: baseline; gap: var(--sp-1); flex-wrap: wrap; }
.docrecog-corpo { margin-top: var(--sp-1); display: grid; gap: var(--sp-1); justify-items: start; }
.docrecog-ok { border-left-color: var(--ok); }
.docrecog-warn { border-left-color: var(--warn); }
.docrecog-err { border-left-color: var(--crit); }
.docrecog-scad { display: flex; align-items: center; gap: var(--sp-2); flex-wrap: wrap; }

/* Validità degli attestati (Impostazioni): griglia di campi numerici, uno per tipo di corso. */
.durate-griglia { display: grid; grid-template-columns: repeat(auto-fill, minmax(16rem, 1fr)); gap: var(--sp-2) var(--sp-3); }
.durata-riga { display: flex; align-items: center; justify-content: space-between; gap: var(--sp-2); }
.durata-riga span { text-transform: capitalize; }
.durata-riga input { width: 4.5rem; }

/* ============================ Alloggi — soggiorni e import ============================
   Un «soggiorno» è una persona in un appartamento da una data a un'altra. La timeline della
   scheda alloggio mescola periodi aperti e chiusi di proposito: erano due elenchi separati e
   metà della storia restava nascosta. */
.logi-item.logi-in-corso { border-left: 3px solid var(--ok); padding-left: var(--sp-2); }
.logi-azioni { display: inline-flex; gap: var(--sp-1); flex-shrink: 0; }

/* Modale «Registra soggiorno»: righe persona ripetibili. Quattro operai che dividono un
   appartamento sono un gesto solo, non quattro. */
.allo-persone { border: 1px solid var(--line); border-radius: var(--r-el); padding: var(--sp-2); }
.allo-persone legend { padding: 0 var(--sp-1); font-size: .85em; color: var(--muted); }
.allo-persona { display: flex; align-items: center; gap: var(--sp-1); margin-bottom: var(--sp-1); }
.allo-persona .cf-wrap, .allo-persona > input { flex: 1 1 auto; }

/* Import alloggi: appartamenti in cima, i loro periodi annidati sotto, così si vede che lo
   stesso indirizzo ripetuto nel file resta un appartamento solo. */
.allo-imp-foglio > header { display: flex; align-items: center; gap: var(--sp-2); flex-wrap: wrap; }
.allo-imp-alloggio { margin: var(--sp-3) 0; }
.allo-imp-alloggio > header { display: flex; gap: var(--sp-2); flex-wrap: wrap; align-items: flex-end; }
.allo-imp-alloggio > header label { flex: 1 1 14rem; }
.allo-imp-alloggio table { margin-top: var(--sp-2); }
/* la riga senza dipendente abbinato è quella che tiene spento il pulsante Importa: si vede */
.allo-imp-sog.allo-imp-manca > td { background: color-mix(in srgb, var(--warn) 12%, transparent); }
.allo-imp-avviso > td { padding-top: 0; }
.allo-imp-mappa { margin-top: var(--sp-2); }
.allo-imp-mappa select { min-width: 8rem; }
.allo-imp-canoni { display: block; margin: var(--sp-3) 0; }
/* Il motivo del blocco e il pulsante viaggiano insieme, appiccicati in fondo alla finestra:
   l'anteprima di un file vero è alta centinaia di schermate e l'operatore non deve tornare
   in fondo alla pagina per sapere perché «Importa» è spento. */
.allo-imp-barra { position: sticky; bottom: 0; z-index: 5; margin-top: var(--sp-3);
  padding: var(--sp-3) 0; background: var(--ground); border-top: 1px solid var(--line); }
/* Su mobile la `.bottomnav` è fissa in fondo con z-index 45: senza questo scostamento la
   barra ci finirebbe DIETRO e si tornerebbe al punto di partenza, un pulsante spento e
   nessuna spiegazione. Lo scostamento è quello che `.content` già riserva alla nav. */
@media (max-width: 820px) { .allo-imp-barra { bottom: 72px; } }
.allo-imp-barra .wiz-nav { margin-top: var(--sp-2); }
#alloBlocco { display: flex; flex-wrap: wrap; align-items: center; gap: var(--sp-2);
  margin-top: 0; }
#alloBlocco #alloBloccoTxt { flex: 1 1 18rem; }

/* Tab «Alloggi» della scheda dipendente: dove ha dormito, dal più recente. */
.allo-dip-item { display: flex; justify-content: space-between; gap: var(--sp-2); flex-wrap: wrap; }
.allo-dip-item .muted { font-variant-numeric: tabular-nums; }

/* ---------- Soggiorni figurativi (elenco «da collegare») ---------- */
.fig-gruppo > header { display: flex; align-items: center; gap: var(--sp-2); flex-wrap: wrap; }
.fig-azioni { display: flex; gap: var(--sp-2); align-items: center; flex-wrap: wrap;
  margin-top: var(--sp-2); }
.fig-azioni [data-cf] { flex: 1 1 18rem; }

/* ══════════ MAGAZZINO — restyle (Figma 107:17087 · 112:9106) ══════════
   Il Figma è disegnato con la tavolozza Tailwind (#e4e7ec, #0a7752, …): qui si traduce
   nei token di Sereno, non si copia. Le classi riusano quello che il foglio ha già —
   .kpi, .tabbar, .data-table, .tl — e aggiungono soltanto ciò che l'hub non aveva:
   quattro colonne di KPI, la tabella che diventa card, il pager e la FAB.            */

/* Il Figma mostra QUATTRO kpi; `.kpis` è cablata a cinque (riga 503).
   ⚠️ La regola comune a due colonne sotto i 480px (riga 624) NON basta: `.kpis--4` ha la
   stessa specificità e viene dopo nel foglio, quindi vince anche dentro la media query.
   Il primo commento qui diceva il contrario, e su un telefono da 390px la quarta card
   finiva fuori: 441px di contenuto sulle cassette, 509px sulle attrezzature (dove il
   valore è una cifra in euro). Il collasso va dichiarato sul modificatore.
   Il frame 112:9106 tiene le quattro in riga, ma la sua quarta KPI è un conteggio a una
   cifra («MANUTENZ. 2»); la nostra è «€ 4.200,00» e in 83px non ci sta in nessun corpo. */
.kpis--4{grid-template-columns:repeat(4,1fr);}
@media (max-width:719px){ .kpis--4{grid-template-columns:repeat(2,1fr);} }

/* La ricerca dell'hub occupa tutta la riga: `.searchbar input` è tagliata a 420px. */
.searchbar--wide input{max-width:none;}

/* Scheda articolo a due colonne (Figma 107:17321): contenuto a sinistra, «chi ce l'ha e
   quanto vale» a destra. Il rail è a larghezza fissa come nel frame — `.rec-detail`, che
   fa lo stesso mestiere nel recruiting, usa una proporzione e darebbe un rail molto più
   largo. Stesso breakpoint di quello, però: sotto gli 820px una colonna sola. */
.mag-scheda{display:grid;grid-template-columns:minmax(0,1fr) 360px;gap:var(--sp-5);align-items:start;}
.mag-scheda-main,.mag-scheda-rail{display:flex;flex-direction:column;gap:var(--sp-4);min-width:0;}
.mag-scheda-main > h2{margin:0;}
@media (max-width:820px){ .mag-scheda{grid-template-columns:1fr;} }

/* Delta di quantità nello storico materiali: il segno è già nel testo, il colore serve a
   distinguerli con la coda dell'occhio scorrendo l'elenco. Erano usate dal partial dello
   storico da prima di questo lavoro, e non erano mai state definite. */
.pos{color:var(--ok-text);}
.neg{color:var(--crit-text);}

/* Assegnatario in tabella: iniziali e nome sulla stessa riga. L'avatar è più piccolo di
   quello di scheda — in una riga densa 36px alzerebbero l'altezza di tutta la tabella. */
.row-persona{display:inline-flex;align-items:center;gap:var(--sp-2);min-width:0;}
.row-persona .avatar{width:28px;height:28px;font-size:11px;flex:0 0 auto;}

/* Il bottone «Filtri» dice da solo se un filtro è attivo: senza, un elenco corto per
   via di un filtro dimenticato sembra un elenco vuoto. */
.btn-soft.is-on{background:var(--accent-wash);color:var(--accent-text);border-color:var(--accent);}

/* Pager: il conteggio a sinistra, i due passi a destra. Lo stato spento dei bottoni
   è già coperto dalla regola globale `:disabled` (riga 684) e non si ridichiara. */
.mag-pager{display:flex;align-items:center;justify-content:space-between;
  gap:var(--sp-3);margin-top:var(--sp-4);flex-wrap:wrap;}
.mag-pager-conta{font-size:13px;color:var(--ink-soft);}
.mag-pager-passi{display:inline-flex;gap:var(--sp-2);}

/* Storico materiali: riusa .tl/.tl-dot dello storico rapporto (riga 1084). I movimenti
   registrati sono due — aggiunta e rimozione. Il terzo tono del Figma («Modificato»)
   non ha un tipo corrispondente in `cassetta_movimenti`, quindi non esiste. */
.tl-dot.is-add{background:var(--accent);}
.tl-dot.is-del{background:var(--crit);}

/* Le tab dell'hub sono <a>: ricerca, filtro e pagina stanno nella query string, quindi
   ogni tab È un indirizzo. `.tabbar-tab` era nata per <button> e da sola lascerebbe
   la sottolineatura del link e il contatore fuori asse. */
a.tabbar-tab{display:inline-flex;align-items:center;gap:var(--sp-2);text-decoration:none;}

@media (max-width:920px){
  /* FAB con l'azione primaria della tab. `.content` riserva 90px in fondo (riga 608) e
     la bottomnav ci somma la safe-area (riga 610): senza tenerne conto la FAB copre
     l'ultima card della lista, come nel frame 112:9106. Sotto la barra per z-index:
     la navigazione non si nasconde mai dietro una scorciatoia. */
  .mag-fab{position:fixed;right:var(--sp-4);bottom:calc(90px + env(safe-area-inset-bottom));
    z-index:44;width:56px;height:56px;border:0;border-radius:var(--r-pill);
    display:grid;place-items:center;cursor:pointer;
    background:var(--accent-strong);color:var(--accent-ink);box-shadow:var(--shadow-lg);}
  .mag-fab .ic{width:24px;height:24px;}
  /* Stare sopra la bottomnav non basta: la FAB è alta 56px e occupa i 90-146px dal fondo,
     cioè esattamente dove finisce l'ultimo contenuto scorribile. Misurato con
     `elementFromPoint` sotto il centro della FAB: «Successivo» del pager. Questo è il
     difetto H del frame 112:9106, che si era solo nascosto finché la pagina sfondava in
     larghezza. Il pager si tiene fuori dalla sua zona d'atterraggio. */
  .mag-pager{margin-bottom:calc(56px + var(--sp-4));}
}

@media (max-width:760px){
  /* La tabella diventa la card del frame 112:9106. Il pattern di `.dip-table` (riga 1014)
     dà una tabella IMPILATA — un'etichetta maiuscola a sinistra per ogni campo — mentre
     il frame disegna una card vera: codice e stato sulla stessa riga, descrizione in
     evidenza, e l'assegnatario staccato in fondo da un filetto. La griglia a due colonne
     ottiene quel capo senza toccare il markup (e quindi senza toccare i contratti che
     asseriscono `data-lbl` su ogni cella). */
  .mag-table thead{display:none;}
  .mag-table,.mag-table tbody,.mag-table td{display:block;width:100%;}
  .mag-table tr{display:grid;grid-template-columns:minmax(0,1fr) auto;
    border:1px solid var(--line);border-radius:var(--r-card);
    margin-bottom:var(--sp-3);padding:var(--sp-3) var(--sp-4);background:var(--surface);
    box-shadow:var(--shadow-sm);}
  .mag-table td{border:0;display:flex;justify-content:space-between;align-items:center;
    gap:var(--sp-4);padding:var(--sp-2) 0;grid-column:1 / -1;}
  .mag-table td::before{content:attr(data-lbl);color:var(--ink-soft);font-size:10.5px;
    font-weight:600;letter-spacing:.05em;text-transform:uppercase;flex:0 0 auto;}
  /* Capo della card: il codice è il titolo, lo stato gli sta a destra sulla stessa riga. */
  .mag-table td[data-lbl="Codice"]{grid-column:1;grid-row:1;justify-content:flex-start;
    font-size:15px;font-weight:600;}
  .mag-table td[data-lbl="Codice"]::before{display:none;}
  .mag-table td[data-lbl="Stato"]{grid-column:2;grid-row:1;justify-content:flex-end;}
  .mag-table td[data-lbl="Stato"]::before{display:none;}
  /* La descrizione è il sottotitolo della card, non una coppia etichetta-valore. */
  .mag-table td[data-lbl="Descrizione"]{display:block;font-weight:600;padding-top:0;}
  .mag-table td[data-lbl="Descrizione"]::before{display:none;}
  /* Chi ce l'ha chiude la card, sotto un filetto: nel frame è l'ultima informazione. */
  .mag-table td[data-lbl="Assegnatario"]{border-top:1px solid var(--line);
    margin-top:var(--sp-1);padding-top:var(--sp-3);}
}
/* ══════════ fine MAGAZZINO — restyle ══════════ */

/* ══════════ MAGAZZINO — wizard (Figma 107:17664 · 18053 · 18251) ══════════ */
/* Stepper quantità: due pulsanti al posto di mirare un campo numerico col pollice.
   Il campo resta per chi deve scrivere 12 invece di premere undici volte. */
.cass-qta{display:inline-flex;align-items:center;gap:var(--sp-1);}
.cass-qta input{width:56px;text-align:center;}
.cass-qta button{min-width:28px;}

/* Sotto i 640px `.cass-row` (riga 1614) dà alla quantità una colonna da 68px, mentre lo
   stepper ne chiede ~120: il «+» veniva spinto fuori dalla card, cioè spariva proprio il
   pulsante per cui lo stepper esiste. Qui la colonna si adatta al contenuto e i comandi
   si stringono; l'unità perde larghezza, che è il campo che si tocca meno. */
@media (max-width:640px){
  .cass-row{grid-template-columns:minmax(0,1fr) auto 44px 28px;gap:6px;}
  .cass-qta{gap:2px;}
  .cass-qta input{width:38px;}
  .cass-qta button{min-width:26px;padding-left:4px;padding-right:4px;}
}

/* Le azioni del wizard restano raggiungibili col pollice mentre si scorre un elenco
   lungo di materiali. Sopra la bottomnav, come la FAB dell'hub. */
@media (max-width:920px){
  /* `position:sticky` era la scelta sbagliata: la barra risale SOPRA ciò che la precede
     di quanto serve per restare in fondo, e nessuna spaziatura la ferma — copriva
     «Aggiungi materiale», l'ultimo comando del passo 2. I frame 112:9533/9608/9698 la
     disegnano ancorata al fondo dello SCHERMO, a tutta larghezza: quindi `fixed`, fuori
     dal flusso, e il pannello si riserva il posto con un padding. Sotto la bottomnav
     per z-index (quella sta a 45): la navigazione non si nasconde mai. */
  .wiz-nav--sticky{position:fixed;left:0;right:0;
    bottom:calc(72px + env(safe-area-inset-bottom));
    background:var(--surface);border-top:1px solid var(--line);
    padding:var(--sp-3) var(--sp-4);margin:0;z-index:20;}
  .wiz-panel{padding-bottom:calc(56px + var(--sp-6));}
}
/* ══════════ fine MAGAZZINO — wizard ══════════ */

/* Barra «In risposta a» della finestra di composizione: il contesto resta visibile anche se si
   cancella la citazione dal corpo. */
.compose-replyto { display: flex; flex-wrap: wrap; gap: .4rem; align-items: baseline;
  padding: .5rem .6rem; margin-bottom: .6rem; border-left: 3px solid var(--accent);
  background: var(--surface-2); border-radius: var(--r-sm); font-size: .85rem; }
.compose-replyto-lab { color: var(--muted); }
.compose-replyto-sub { font-weight: 600; }
.compose-replyto-who { color: var(--muted); }

/* Anteprima della firma: iframe sandbox, altezza contenuta, fondo chiaro come la casella di
   posta di chi riceve. */
.sig-preview { width: 100%; min-height: 7rem; border: 1px solid var(--line);
  border-radius: var(--r-sm); background: #fff; }
.compose-sigbox { display: flex; flex-direction: column; gap: .25rem; margin: .4rem 0 .6rem; }
/* ══════════ Cartella rilasciata (scheda dipendente + verifica archivi) ══════════
   Bordo tratteggiato = «qui ci si può lasciar cadere qualcosa». Senza un segno visibile la zona
   è indistinguibile dal resto della pagina e nessuno prova a trascinarci sopra.
   Token scelti fra quelli DEFINITI: `--border`, `--r-2` e `--accent-weak` sono usati altrove in
   questo foglio ma non sono mai stati definiti, quindi non tingono niente. */
.dip-drop,
.cart-drop{
  border:2px dashed var(--line);
  border-radius:var(--r-card);
  padding:var(--sp-5);
  text-align:center;
  transition:border-color .12s ease, background .12s ease;
}
.dip-drop p{margin:0 0 var(--sp-2);}
.dip-drop .t-caption{display:block;margin-bottom:var(--sp-3);}
/* Lo stato «ci sei sopra»: senza, chi trascina non sa se il rilascio andrà a segno. */
.dip-drop.is-sopra,
.cart-drop.is-sopra{border-color:var(--accent);background:var(--accent-wash);}
/* Durante il caricamento la zona non accetta un secondo rilascio: le code si accavallerebbero. */
.dip-drop[aria-busy="true"]{opacity:.6;pointer-events:none;}
.dip-drop-scegli{display:inline-block;cursor:pointer;text-decoration:underline;}
.dip-drop-incerti{margin:var(--sp-2) 0 var(--sp-3);padding-left:var(--sp-5);text-align:left;}

