/* Social The Rope · token, reset, base, shell, utility, stampa.
 *
 * Contratto: docs/ui.md §3 (token), §4 (tema per cliente), §6.2 (ordine di questo file).
 * I nomi delle variabili sono quelli di Inside: un token che esiste li' non si rinomina.
 * I componenti NON stanno qui: stanno in components.css, uno per blocco commentato.
 *
 * Ordine del file, e non si cambia:
 *   1  @font-face
 *   2  :root, tema scuro (il default)
 *   3  :root[data-theme="light"]
 *   4  prefers-color-scheme: light per chi non ha scelto
 *   5  :root[data-area="client"], innesto del tema per cliente
 *   6  reset
 *   7  elementi di base
 *   8  shell (sc-shell, sc-sidebar, sc-topbar)
 *   9  utility, poche e nominate per intenzione
 *  10  stampa
 *
 * Tre deviazioni consapevoli dagli standard ereditati, tutte per contrasto (ui.md §3):
 *   --muted chiaro da #6d6d76 a #63636c (4.21:1 non passava AA su --bg-3)
 *   --faint non e' mai testo, in nessuno dei due temi
 *   la scala tipografica accorcia i clamp: --fs-h1 arriva a 34px, non a 42px
 */

/* 1 · Caratteri ------------------------------------------------------------
 * Helvetica Now e VCR OSD Mono vivono in Inside come woff2 locali. Finche' i file non
 * sono in questo repository non si dichiara nessun @font-face: una @font-face che punta
 * a un file assente costa due richieste fallite e un lampo di testo invisibile. Lo stack
 * di fallback qui sotto e' quello vero, e regge da solo.
 */

/* 2 · Token, tema scuro ---------------------------------------------------- */
:root {
  color-scheme: dark;

  /* 3.1 Superfici e testo */
  --bg: #060608;
  --bg-2: #0d0d11;
  --bg-3: #131319;
  --bg-4: #1a1a21;              /* da Nexus: il quarto piano, che Inside non ha */

  --text: #d8d8d6;
  --muted: #8f8f98;
  --faint: #5c5c66;             /* mai testo: solo bordi e decorazione */

  --line: rgba(255,255,255,.09);
  --line-soft: rgba(255,255,255,.05);
  --line-2: var(--line-soft);   /* alias Nexus */
  --shade: rgba(255,255,255,.025);

  --white: #f4f4f2;             /* fondo dei bottoni primari, si inverte in chiaro */
  --on-strong: #060608;
  --backdrop: rgba(6,6,8,.66);

  /* 3.2 Semantici */
  --ok: #2fbf71;
  --ok-fill: #2fbf71;           /* riempimento non testuale: barre, pallini */
  --ok-bg: rgba(47,191,113,.13);
  --warn: #e8b931;
  --warn-fill: #e8b931;
  --warn-bg: rgba(232,185,49,.13);
  --err: #e85555;
  --err-bg: rgba(232,85,85,.13);
  --focus: #5b7cfa;             /* anello di focus */
  --blue: var(--focus);         /* alias Nexus */
  --blue-bg: rgba(91,124,250,.15);
  --violet: #9a86ff;
  --violet-bg: rgba(154,134,255,.15);

  /* 3.3 Status della legenda (spec §2.4). Colore pieno e tinta di fondo, per ognuno.
     Il pallino e il colore pieno coincidono: un valore solo per status per tema, che
     passa sia i 4.5:1 del testo sia i 3:1 dei controlli. */
  --st-bozza: #9aa0ab;        --st-bozza-bg: #212227;
  --st-review: #e8b931;       --st-review-bg: #2c2515;
  --st-modifiche: #f0883c;    --st-modifiche-bg: #2d1e17;
  --st-approvato: #2fbf71;    --st-approvato-bg: #12261e;
  --st-richiesta: #9a86ff;    --st-richiesta-bg: #211e32;
  --unread: #ff6b6b;          --unread-bg: #2f1a1e;

  /* 3.4 Tipografia */
  --sans: "Helvetica Now", -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Helvetica, Arial, sans-serif;
  --mono: "VCR OSD Mono", ui-monospace, SFMono-Regular, Menlo, monospace;

  --fs-h1: clamp(26px, 3.2vw, 34px);
  --fs-h2: clamp(19px, 2.2vw, 23px);
  --fs-h3: 17px;
  --fs-body: 15px;
  --fs-small: 13px;
  --fs-label: 12px;

  --lh-tight: 1.15;
  --lh-snug: 1.35;
  --lh-body: 1.55;

  --fw-regular: 400;
  --fw-medium: 500;
  --fw-bold: 700;

  --tracking-h1: -0.02em;
  --measure: 68ch;

  /* 3.5 Spaziature, griglia 4 px */
  --s-1: 4px;
  --s-2: 8px;
  --s-3: 12px;
  --s-4: 16px;
  --s-5: 20px;
  --s-6: 24px;
  --s-8: 32px;
  --s-10: 40px;
  --s-12: 48px;
  --s-16: 64px;
  --s-20: 80px;

  /* 3.6 Raggi, ombre, tratti. Gli spigoli vivi sono identita' ereditata da Inside:
     le uniche eccezioni sono pallini e avatar, che sono cerchi per natura. */
  --r: 0;
  --r-sm: 0;
  --r-xs: 0;
  --r-pill: 999px;
  --bw: 1px;
  --bw-2: 2px;
  --e1: 0 1px 2px rgba(0,0,0,.28);
  --e2: 0 8px 24px rgba(0,0,0,.34);
  --e3: 0 16px 48px rgba(0,0,0,.40);
  --stroke: 1.6;
  --icon: 24px;

  /* 3.7 Larghezze */
  --side-w: 232px;
  --drawer-w: min(560px, 92vw);
  --modal-w: min(480px, 92vw);
  --modal-w-lg: min(880px, 94vw);
  --content-max: 1360px;
  --chat-w: 320px;
  --tap: 44px;

  /* 3.7 Breakpoint. In CSS non si possono usare dentro una media query: restano
     dichiarati perche' il JS e la kitchen sink li leggano da un posto solo. */
  --bp-xs: 400px;
  --bp-sm: 640px;
  --bp-md: 900px;
  --bp-lg: 1200px;
  --bp-xl: 1440px;

  /* 3.8 Motion */
  --dur-1: 120ms;
  --dur-2: 180ms;
  --dur-3: 240ms;
  --ease-out: cubic-bezier(.22,1,.36,1);
  --ease-in: cubic-bezier(.55,0,1,.45);

  /* 3.9 Z-index, scala semantica: nessun valore arbitrario */
  --z-base: 0;
  --z-sticky: 10;
  --z-dropdown: 20;
  --z-backdrop: 30;
  --z-drawer: 40;
  --z-modal: 50;
  --z-toast: 60;
  --z-tooltip: 70;

  /* 4 · Tema per cliente: i valori di serie sono quelli di Inside, cosi' i componenti
     leggono sempre --c-* e l'area agenzia non ha bisogno di nessuna variante. Il layout
     dell'area cliente sovrascrive solo questi, dentro :root[data-area="client"]. */
  --c-primary: var(--white);
  --c-on-primary: var(--on-strong);
  --c-primary-soft: var(--bg-3);
  --c-primary-text: var(--text);
  --c-secondary: var(--violet);
  --c-on-secondary: var(--on-strong);
  --c-font-display: var(--sans);
  --c-font-body: var(--sans);
}

/* 3 · Tema chiaro, scelto a mano ------------------------------------------- */
:root[data-theme="light"] {
  color-scheme: light;

  --bg: #f2f2ef;
  --bg-2: #ffffff;
  --bg-3: #e9e9e5;
  --bg-4: #e0e0db;

  --text: #26262a;
  --muted: #63636c;
  --faint: #9c9ca4;

  --line: rgba(0,0,0,.13);
  --line-soft: rgba(0,0,0,.06);
  --shade: rgba(0,0,0,.04);

  --white: #0d0d11;
  --on-strong: #f4f4f2;
  --backdrop: rgba(13,13,17,.44);

  --ok: #0f6d3d;
  --ok-fill: #1e9d5a;
  --ok-bg: rgba(15,109,61,.1);
  --warn: #7a5900;
  --warn-fill: #b58a10;
  --warn-bg: rgba(122,89,0,.1);
  --err: #b82b2b;
  --err-bg: rgba(184,43,43,.1);
  --focus: #2f4fd0;
  --blue-bg: rgba(47,79,208,.1);
  --violet: #5334c9;
  --violet-bg: rgba(83,52,201,.1);

  --st-bozza: #565c66;        --st-bozza-bg: #ebebed;
  --st-review: #7a5900;       --st-review-bg: #efebe0;
  --st-modifiche: #a34405;    --st-modifiche-bg: #f4e9e1;
  --st-approvato: #0f6d3d;    --st-approvato-bg: #e2ede8;
  --st-richiesta: #5334c9;    --st-richiesta-bg: #eae7f9;
  --unread: #b82b2b;          --unread-bg: #f6e6e6;

  --e1: 0 1px 2px rgba(0,0,0,.12);
  --e2: 0 8px 24px rgba(0,0,0,.14);
  --e3: 0 16px 48px rgba(0,0,0,.18);
}

/* 4 · Chi non ha scelto segue il sistema. Stessi valori del blocco qui sopra: nessun
 *     colore ha la sua unica definizione dentro una media query, e chi ha scelto vince
 *     in tutte e due le direzioni.
 */
@media (prefers-color-scheme: light) {
  :root:not([data-theme="dark"]) {
    color-scheme: light;

    --bg: #f2f2ef;
    --bg-2: #ffffff;
    --bg-3: #e9e9e5;
    --bg-4: #e0e0db;

    --text: #26262a;
    --muted: #63636c;
    --faint: #9c9ca4;

    --line: rgba(0,0,0,.13);
    --line-soft: rgba(0,0,0,.06);
    --shade: rgba(0,0,0,.04);

    --white: #0d0d11;
    --on-strong: #f4f4f2;
    --backdrop: rgba(13,13,17,.44);

    --ok: #0f6d3d;
    --ok-fill: #1e9d5a;
    --ok-bg: rgba(15,109,61,.1);
    --warn: #7a5900;
    --warn-fill: #b58a10;
    --warn-bg: rgba(122,89,0,.1);
    --err: #b82b2b;
    --err-bg: rgba(184,43,43,.1);
    --focus: #2f4fd0;
    --blue-bg: rgba(47,79,208,.1);
    --violet: #5334c9;
    --violet-bg: rgba(83,52,201,.1);

    --st-bozza: #565c66;        --st-bozza-bg: #ebebed;
    --st-review: #7a5900;       --st-review-bg: #efebe0;
    --st-modifiche: #a34405;    --st-modifiche-bg: #f4e9e1;
    --st-approvato: #0f6d3d;    --st-approvato-bg: #e2ede8;
    --st-richiesta: #5334c9;    --st-richiesta-bg: #eae7f9;
    --unread: #b82b2b;          --unread-bg: #f6e6e6;

    --e1: 0 1px 2px rgba(0,0,0,.12);
    --e2: 0 8px 24px rgba(0,0,0,.14);
    --e3: 0 16px 48px rgba(0,0,0,.18);
  }
}

/* 5 · Innesto del tema per cliente (ui.md §4).
 *     Il foglio statico non porta nessun valore: li scrive il layout dell'area cliente,
 *     in un blocco <style> generato dal record Cliente, con le sole variabili
 *     sovrascritte. I sei token di status non sono sovrascrivibili, mai: la legenda deve
 *     significare la stessa cosa su tutti i clienti.
 */
:root[data-area="client"] {
  /* riempito a runtime: --c-primary, --c-on-primary, --c-primary-soft,
     --c-primary-text, --c-secondary, --c-on-secondary, --c-font-display, --c-font-body */
  --c-area: client;
}

/* Il pavimento dei 15 px dell'area cliente (ui.md §2.7 e §3.4: "--fs-body a 15px e' il
   pavimento nell'area cliente"). Sotto --bp-md i due gradini piu' bassi della scala si
   fermano li': un metadato a 13 px e un'etichetta a 12 px sul telefono non si leggono, e
   quella scala nasce per uno schermo grande. La gerarchia sotto i 15 px la portano gia'
   il colore --muted, il maiuscoletto e il peso, non la dimensione. */
@media (max-width: 899px) {
  :root[data-area="client"] {
    --fs-small: 15px;
    --fs-label: 15px;
  }
}

/* 6 · Reset ---------------------------------------------------------------- */
*, *::before, *::after { box-sizing: border-box; }
* { margin: 0; padding: 0; }

html { -webkit-text-size-adjust: 100%; }

body {
  min-height: 100dvh;
  background: var(--bg);
  color: var(--text);
  font: var(--fw-regular) var(--fs-body)/var(--lh-body) var(--c-font-body, var(--sans));
  -webkit-font-smoothing: antialiased;
}

img, svg, video, canvas { max-width: 100%; display: block; }
img, video { height: auto; }

button, input, select, textarea { font: inherit; color: inherit; background: none; border: 0; }
button { cursor: pointer; }

ul, ol { list-style: none; }

/* Il focus e' visibile ovunque e non si rimuove mai, nemmeno sui controlli custom.
   L'anello passa il 3:1 su fondo chiaro e su fondo scuro (6.67 e 5.27). */
:focus-visible {
  outline: 2px solid var(--focus);
  outline-offset: 2px;
}
:focus:not(:focus-visible) { outline: none; }

[hidden] { display: none !important; }

/* Sotto prefers-reduced-motion ogni transizione diventa una dissolvenza di 60 ms o un
   cambio istantaneo, e lo skeleton smette di pulsare. Non e' opzionale. */
@media (prefers-reduced-motion: reduce) {
  *, *::before, *::after {
    animation-duration: .01ms !important;
    animation-iteration-count: 1 !important;
    transition-duration: 60ms !important;
    scroll-behavior: auto !important;
  }
}

/* 7 · Elementi di base ----------------------------------------------------- */
h1, h2, h3, h4 {
  font-family: var(--c-font-display, var(--sans));
  font-weight: var(--fw-bold);
  text-wrap: balance;
}
h1 { font-size: var(--fs-h1); line-height: var(--lh-tight); letter-spacing: var(--tracking-h1); }
h2 { font-size: var(--fs-h2); line-height: var(--lh-tight); letter-spacing: var(--tracking-h1); }
h3 { font-size: var(--fs-h3); line-height: var(--lh-snug); font-weight: var(--fw-medium); }
h4 { font-size: var(--fs-body); line-height: var(--lh-snug); font-weight: var(--fw-medium); }

p { text-wrap: pretty; }

a { color: inherit; text-decoration: none; }
a:hover { text-decoration: underline; }

code, kbd, samp, pre { font-family: var(--mono); font-size: .92em; }

table { border-collapse: collapse; width: 100%; }
th { text-align: left; font-weight: var(--fw-medium); }

hr { border: 0; border-top: var(--bw) solid var(--line-soft); }

::placeholder { color: var(--muted); opacity: 1; }

::selection { background: var(--focus); color: var(--white); }

/* 8 · Shell ---------------------------------------------------------------- */
.sc-shell {
  display: grid;
  grid-template-columns: var(--side-w) minmax(0, 1fr);
  min-height: 100dvh;
}
/* La variante bare: login, invito, reset, password dimenticata. Nessuna sidebar, marchio
   in alto a sinistra, lingua in alto a destra, credits in basso (ui.md §5.1, spec §6.1).
   Tre righe: testa, corpo centrato, piede; il corpo prende quello che avanza. */
.sc-shell--bare {
  grid-template-columns: minmax(0, 1fr);
  grid-template-rows: auto 1fr auto;
}
.sc-shell__bar {
  display: flex;
  align-items: center;
  justify-content: space-between;
  gap: var(--s-4);
  padding: var(--s-5) var(--s-6);
}
.sc-shell__logo { display: inline-flex; color: var(--text); }
.sc-shell__logo:hover { text-decoration: none; }
.sc-shell__logo svg { height: 20px; width: auto; }
.sc-shell__lang { display: inline-flex; gap: 2px; }
.sc-shell__lang a {
  display: inline-flex;
  align-items: center;
  min-height: 32px;
  padding: 0 var(--s-2);
  border: var(--bw) solid transparent;
  color: var(--muted);
  font-size: var(--fs-label);
  text-transform: uppercase;
  letter-spacing: .08em;
}
.sc-shell__lang a:hover { color: var(--text); text-decoration: none; }
.sc-shell__lang a.is-active { color: var(--text); border-color: var(--line); }
.sc-shell__center {
  display: flex;
  align-items: center;
  justify-content: center;
  padding: var(--s-6) var(--s-4);
}
.sc-shell__card { display: flex; flex-direction: column; gap: var(--s-5); width: 100%; max-width: 380px; }
.sc-shell__credits { padding: var(--s-5) var(--s-6); color: var(--muted); font-size: var(--fs-label); letter-spacing: .04em; }

.sc-shell__main {
  min-width: 0;
  padding: var(--s-8) var(--s-6) var(--s-16);
}
.sc-shell__inner { max-width: var(--content-max); margin-inline: auto; }

.sc-sidebar {
  display: flex;
  flex-direction: column;
  gap: var(--s-4);
  position: sticky;
  top: 0;
  height: 100dvh;
  padding: var(--s-5) var(--s-3);
  background: var(--bg-2);
  border-right: var(--bw) solid var(--line);
}

.sc-sidebar__brand {
  display: block;
  padding: var(--s-2) var(--s-3) var(--s-4);
  line-height: var(--lh-snug);
}
.sc-sidebar__brand:hover { text-decoration: none; }
.sc-sidebar__brand b { display: block; font-weight: var(--fw-medium); }
.sc-sidebar__brand span { display: block; color: var(--muted); font-size: var(--fs-small); }

.sc-sidebar__nav { display: flex; flex-direction: column; gap: 2px; }
.sc-sidebar__spacer { flex: 1 1 auto; }

.sc-nav-item {
  display: flex;
  align-items: center;
  gap: var(--s-3);
  min-height: var(--tap);
  padding: var(--s-2) var(--s-3);
  border-left: 3px solid transparent;
  color: var(--muted);
  font-size: var(--fs-body);
  transition: background var(--dur-1) var(--ease-out), color var(--dur-1) var(--ease-out);
}
.sc-nav-item:hover { background: var(--shade); color: var(--text); text-decoration: none; }
.sc-nav-item.is-active,
.sc-nav-item[aria-current="page"] {
  background: var(--shade);
  border-left-color: var(--c-primary);
  color: var(--text);
  font-weight: var(--fw-medium);
}
.sc-nav-item.is-disabled,
.sc-nav-item[aria-disabled="true"] { color: var(--faint); pointer-events: none; }
.sc-nav-item__icon { flex: 0 0 auto; width: 20px; height: 20px; color: var(--muted); }
.sc-nav-item__badge { margin-left: auto; }

.sc-sidebar__user {
  display: flex;
  align-items: center;
  gap: var(--s-3);
  padding: var(--s-3);
  border-top: var(--bw) solid var(--line);
}
.sc-sidebar__user-name { min-width: 0; font-size: var(--fs-small); }
.sc-sidebar__user-name b { display: block; font-weight: var(--fw-medium); }
.sc-sidebar__user-name span { display: block; color: var(--muted); }
.sc-sidebar__prefs { display: flex; flex-wrap: wrap; gap: var(--s-2); padding: 0 var(--s-3) var(--s-2); }

/* La topbar esiste solo sotto --bp-md, ed e' alta 56 px. */
.sc-topbar { display: none; }

@media (max-width: 899px) {
  .sc-shell { grid-template-columns: minmax(0, 1fr); }
  .sc-shell__main { padding: var(--s-5) var(--s-4) var(--s-16); }

  .sc-topbar {
    display: flex;
    position: sticky;
    top: 0;
    z-index: var(--z-sticky);
    align-items: center;
    gap: var(--s-3);
    height: 56px;
    padding-inline: var(--s-3);
    background: var(--bg-2);
    border-bottom: var(--bw) solid var(--line);
  }
  .sc-topbar__title {
    flex: 1 1 auto;
    min-width: 0;
    font-size: var(--fs-body);
    font-weight: var(--fw-medium);
    overflow: hidden;
    text-overflow: ellipsis;
    white-space: nowrap;
  }
  .sc-topbar__toggle,
  .sc-topbar__notify { flex: 0 0 auto; }

  /* La sidebar diventa un drawer che entra da sinistra. */
  .sc-sidebar {
    position: fixed;
    inset: 0 auto 0 0;
    z-index: var(--z-drawer);
    width: min(300px, 86vw);
    transform: translateX(-100%);
    transition: transform var(--dur-3) var(--ease-in);
    box-shadow: var(--e2);
  }
  .sc-sidebar[data-drawer-open] { transform: none; transition-timing-function: var(--ease-out); }

  .sc-shell__scrim {
    position: fixed;
    inset: 0;
    z-index: var(--z-backdrop);
    background: var(--backdrop);
    opacity: 0;
    visibility: hidden;
    transition: opacity var(--dur-3) var(--ease-in), visibility var(--dur-3);
  }
  .sc-shell__scrim[data-drawer-open] { opacity: 1; visibility: visible; }
}

/* Lo scrim del drawer esiste nel markup di ogni pagina: sopra il breakpoint non deve
   occupare una colonna della shell. Dentro la media query torna visibile come velo. */
.sc-shell__scrim { display: none; }
@media (max-width: 899.98px) { .sc-shell__scrim { display: block; } }

/* 9 · Utility, poche e nominate per intenzione ----------------------------- */
.u-visually-hidden {
  position: absolute !important;
  width: 1px; height: 1px;
  margin: -1px; padding: 0;
  overflow: hidden;
  clip-path: inset(50%);
  white-space: nowrap;
  border: 0;
}
.u-truncate { min-width: 0; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
.u-tabular { font-variant-numeric: tabular-nums; }
.u-measure { max-width: var(--measure); }
.u-muted { color: var(--muted); }
.u-small { font-size: var(--fs-small); }
.u-mono { font-family: var(--mono); }
.u-stack-2 { display: flex; flex-direction: column; gap: var(--s-2); }
.u-stack-3 { display: flex; flex-direction: column; gap: var(--s-3); }
.u-stack-4 { display: flex; flex-direction: column; gap: var(--s-4); }
.u-stack-6 { display: flex; flex-direction: column; gap: var(--s-6); }
.u-stack-10 { display: flex; flex-direction: column; gap: var(--s-10); }
.u-row { display: flex; align-items: center; gap: var(--s-3); flex-wrap: wrap; }
.u-scroll-x { overflow-x: auto; overscroll-behavior-x: contain; }

/* La regione degli annunci: una sola per pagina, la riempie scLive(). */
.sc-live { position: absolute; width: 1px; height: 1px; overflow: hidden; clip-path: inset(50%); }

/* Il corpo bloccato quando un overlay e' aperto, con la scrollbar compensata cosi' la
   pagina non salta di lato. La misura la scrive il JS. */
body.is-locked { overflow: hidden; padding-right: var(--sc-scrollbar, 0px); }

/* 10 · Stampa --------------------------------------------------------------
 * Un piano editoriale si stampa e si porta in riunione: il fondo nero non si mette su
 * carta. Palette bianca dedicata, e tutto quello che e' navigazione o azione sparisce.
 */
@media print {
  :root {
    color-scheme: light;
    --bg: #ffffff; --bg-2: #ffffff; --bg-3: #ffffff; --bg-4: #ffffff;
    --text: #000000; --muted: #3a3a3a; --faint: #767676;
    --line: rgba(0,0,0,.3); --line-soft: rgba(0,0,0,.15); --shade: transparent;
    --white: #000000; --on-strong: #ffffff;
    --backdrop: transparent;
    --e1: none; --e2: none; --e3: none;
    --st-bozza-bg: transparent; --st-review-bg: transparent; --st-modifiche-bg: transparent;
    --st-approvato-bg: transparent; --st-richiesta-bg: transparent; --unread-bg: transparent;
  }

  body { background: #ffffff; }

  .sc-shell { display: block; }
  .sc-sidebar,
  .sc-topbar,
  .sc-shell__scrim,
  .sc-toasts,
  .sc-sheet,
  .sc-modal,
  .sc-actions,
  .sc-btn,
  .sc-notify__filters,
  .sc-skeleton { display: none !important; }

  .sc-shell__main { padding: 0; }

  /* Le tabelle del piano e dei report si stampano con le intestazioni ripetute. */
  thead { display: table-header-group; }
  tr, .sc-table__row, .sc-cal-cell { break-inside: avoid; }
  .sc-table__year { break-after: avoid; }

  a[href^="http"]::after { content: " (" attr(href) ")"; font-size: var(--fs-label); color: #3a3a3a; }
}
