/* ==========================================================================
   STYLE.CSS — foglio di stile unico del sito

   REGOLA D'ORO
   Nelle pagine HTML non scrivere mai un colore, una dimensione o un margine.
   Usa solo le classi definite qui sotto. Se ti serve qualcosa che non esiste,
   aggiungilo in questo file una volta sola, poi riusalo ovunque.

   Vedi /stile/ per il catalogo visivo di tutte le classi disponibili.

   INDICE
   1. Token          — colori, tipografia, spaziature
   2. Reset          — normalizzazione di base
   3. Layout         — contenitore e struttura pagina
   4. Testata        — masthead, nav, selettore di lingua, interruttore tema
   5. Tipografia     — titoli, prose, eyebrow
   6. Indice         — righe titolo/destinazione (elemento firma del sito)
   7. Blocchi        — card, note, tag
   8. Voci CV        — esperienze e formazione
   9. Form           — campi, bottoni, risultati (per i tool)
   10. Tool grandi   — pannelli, tabelle, barre, liste con spunta
   11. Footer
   12. Utility
   13. Stampa
   ========================================================================== */


/* ==========================================================================
   1. TOKEN
   L'unico posto dove si definiscono i valori grezzi.
   Cambia un token qui e cambia tutto il sito.
   ========================================================================== */

/* Il tema predefinito è quello scuro: i suoi colori stanno qui, in :root,
   perché sono quelli che valgono se nessuno tocca niente. Il tema chiaro è
   la variante, e si attiva con l'attributo data-tema sul tag <html> — lo
   scrive tema.js leggendo la scelta salvata, prima che il <body> venga
   disegnato.

   Il resto dei token (tipografia, spaziature, forma) non cambia con il
   tema: sta qui una volta sola. */

:root {
  /* Dice al browser di che colore è il fondo su cui disegnare i controlli
     di sistema: barre di scorrimento, menu a tendina aperti, campi.
     Senza questa riga il tema lo sceglierebbe il sistema operativo, e su un
     Mac impostato in chiaro avremmo widget chiari su una pagina scura. */
  color-scheme: dark;

  /* --- Colori: scuro (tema predefinito) ---------------------------------- */
  --paper:        #131612;   /* sfondo pagina */
  --surface:      #1B1F1A;   /* sfondo di card e campi */
  --ink:          #E9ECE7;   /* testo principale */
  --ink-2:        #A2A99E;   /* testo secondario */
  --ink-3:        #767D72;   /* metadati, testo tenue */
  --accent:       #7CC49B;   /* verde pino: link, stati attivi */
  --accent-deep:  #A3DCBB;   /* accento su hover */
  --accent-soft:  #22301F;   /* fondo tenue dell'accento */
  --rule:         #2C3229;   /* filetti e bordi */

  /* --- Tipografia -------------------------------------------------------- */
  --font-ui:   "Space Grotesk", ui-sans-serif, system-ui, sans-serif;
  --font-mono: "IBM Plex Mono", ui-monospace, "SFMono-Regular", Menlo, monospace;

  --t-xs:   0.75rem;    /* 12px — metadati, eyebrow */
  --t-sm:   0.875rem;   /* 14px — didascalie, nav */
  --t-base: 1rem;       /* 16px — corpo */
  --t-lg:   1.125rem;   /* 18px — corpo grande, intro */
  --t-xl:   1.375rem;   /* 22px — titoli di sezione */
  --t-2xl:  1.875rem;   /* 30px — titolo pagina */
  --t-3xl:  2.5rem;     /* 40px — titolo home */

  --leading-tight: 1.2;
  --leading-body:  1.65;

  /* --- Spaziature: scala a passo 4px ------------------------------------- */
  --s-1:  0.25rem;
  --s-2:  0.5rem;
  --s-3:  0.75rem;
  --s-4:  1rem;
  --s-5:  1.5rem;
  --s-6:  2rem;
  --s-7:  2.5rem;
  --s-8:  3rem;
  --s-10: 4rem;
  --s-12: 6rem;

  /* --- Forma ------------------------------------------------------------- */
  --radius:    4px;
  --radius-lg: 8px;
  --width:     43rem;    /* larghezza massima della colonna di lettura */

  /* Colonna larga: la usano solo i tool con tabelle, dove 43rem obbligherebbe
     a scorrere in orizzontale qualunque cosa. Vedi .wrap--wide. */
  --width-wide: 62rem;
  --speed:     0.18s;
}

/* --- Colori: chiaro ------------------------------------------------------

   Si accende solo quando <html> porta data-tema="chiaro", cioè quando il
   visitatore lo ha chiesto con l'interruttore nella testata. Ridefinisce i
   colori e nient'altro: le altre variabili restano quelle di :root.

   Non c'è nessuna @media (prefers-color-scheme): il sito parte scuro per
   tutti, e la preferenza di sistema non entra nella decisione. Se un giorno
   si volesse seguirla, il posto è tema.js — non questo file, perché la
   scelta salvata deve comunque poterla scavalcare. */

:root[data-tema="chiaro"] {
  color-scheme: light;

  --paper:        #F5F6F4;
  --surface:      #FFFFFF;
  --ink:          #191C18;
  --ink-2:        #5C6259;
  --ink-3:        #8A9086;
  --accent:       #2C6A4A;
  --accent-deep:  #1E4D35;
  --accent-soft:  #E4EDE6;
  --rule:         #DEE1DA;
}


/* ==========================================================================
   2. RESET
   ========================================================================== */

*, *::before, *::after { box-sizing: border-box; }

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

body {
  margin: 0;
  background: var(--paper);
  color: var(--ink);
  font-family: var(--font-ui);
  font-size: var(--t-base);
  line-height: var(--leading-body);
  font-weight: 400;
  -webkit-font-smoothing: antialiased;
  text-rendering: optimizeLegibility;
}

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

/* L'attributo hidden deve vincere anche su un display impostato da una
   classe (una riga di tabella, una griglia): i tool nascondono e mostrano
   pezzi di pagina con questo, e senza !important una regola qualsiasi di
   questo foglio se lo mangerebbe. */
[hidden] { display: none !important; }

a { color: var(--accent); text-decoration-thickness: 1px; text-underline-offset: 2px; }
a:hover { color: var(--accent-deep); }

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

@media (prefers-reduced-motion: reduce) {
  *, *::before, *::after {
    animation-duration: 0.01ms !important;
    transition-duration: 0.01ms !important;
  }
}


/* ==========================================================================
   3. LAYOUT
   ========================================================================== */

.wrap {
  width: 100%;
  max-width: var(--width);
  margin-inline: auto;
  padding-inline: var(--s-5);
}

.page { padding-block: var(--s-8) var(--s-12); }

/* Solo per le pagine con tabelle larghe. Il resto del sito resta stretto. */
.wrap--wide { max-width: var(--width-wide); }

/* Salto rapido al contenuto per chi naviga da tastiera */
.skip {
  position: absolute;
  left: -9999px;
  top: var(--s-2);
  background: var(--surface);
  color: var(--ink);
  padding: var(--s-2) var(--s-4);
  border: 1px solid var(--rule);
  border-radius: var(--radius);
  z-index: 10;
}
.skip:focus { left: var(--s-4); }


/* ==========================================================================
   4. TESTATA
   ========================================================================== */

.masthead {
  border-bottom: 1px solid var(--rule);
  background: var(--paper);
}

.masthead__inner {
  display: flex;
  flex-wrap: wrap;
  align-items: baseline;
  justify-content: space-between;
  gap: var(--s-3) var(--s-5);
  padding-block: var(--s-4);
}

.masthead__name {
  font-size: var(--t-base);
  font-weight: 700;
  letter-spacing: -0.01em;
  color: var(--ink);
  text-decoration: none;
}
.masthead__name:hover { color: var(--accent); }

.nav {
  display: flex;
  gap: var(--s-5);
  font-size: var(--t-sm);
}

.nav__link {
  color: var(--ink-2);
  text-decoration: none;
  padding-bottom: 2px;
  border-bottom: 1.5px solid transparent;
  transition: color var(--speed) ease, border-color var(--speed) ease;
}
.nav__link:hover { color: var(--ink); }
.nav__link.is-active {
  color: var(--ink);
  border-bottom-color: var(--accent);
}

/* Gruppo di destra della testata: le sezioni e, dopo, il selettore di lingua.
   Esiste per tenerli uniti quando la testata va a capo sugli schermi
   stretti: senza, il selettore finirebbe da solo su una riga tutta sua. */
.masthead__end {
  display: flex;
  flex-wrap: wrap;
  align-items: baseline;
  gap: var(--s-3) var(--s-5);
}

/* --- Selettore di lingua -------------------------------------------------

   È un <select> nativo. Un menu costruito a mano avrebbe richiesto gestione
   del focus, tasti freccia, chiusura al clic fuori e annunci per i lettori
   di schermo: il controllo di sistema fa tutto questo da solo, e sul
   telefono usa il selettore nativo del sistema operativo.

   L'aspetto predefinito si toglie con appearance:none. La freccia la
   disegna il contenitore con ::after invece di un'immagine di sfondo, così
   eredita il colore del testo e resta giusta anche in tema scuro — una
   freccia dentro un data URI sarebbe un colore fisso, cioè la cosa che i
   token servono a evitare. */

.langswitch {
  position: relative;
  display: inline-flex;
  align-items: baseline;
  color: var(--ink-2);
  transition: color var(--speed) ease;
}
.langswitch:hover { color: var(--ink); }

.langswitch::after {
  content: "▾";
  position: absolute;
  right: var(--s-2);
  top: 50%;
  transform: translateY(-50%);
  font-size: var(--t-xs);
  line-height: 1;
  pointer-events: none;   /* il clic deve arrivare al <select> sotto */
}

.langswitch__select {
  appearance: none;
  -webkit-appearance: none;
  font-family: var(--font-mono);
  font-size: var(--t-xs);
  font-weight: 500;
  letter-spacing: 0.08em;
  color: inherit;
  background: transparent;
  border: 1px solid var(--rule);
  border-radius: var(--radius);
  padding: var(--s-1) var(--s-6) var(--s-1) var(--s-3);
  cursor: pointer;
  transition: border-color var(--speed) ease;
}
.langswitch__select:hover { border-color: var(--ink-3); }

/* Il menu aperto è disegnato dal sistema operativo e non eredita lo sfondo
   trasparente del controllo: senza questa riga, in tema scuro si vedrebbe
   testo chiaro su fondo chiaro. */
.langswitch__select option {
  background: var(--surface);
  color: var(--ink);
}

/* --- Interruttore del tema ------------------------------------------------

   Un <button> con role="switch": è acceso o spento, e il browser lo annuncia
   già così ai lettori di schermo. Un <select> con due voci, come quello della
   lingua, qui sarebbe stato di troppo — due stati si cambiano con un clic, non
   aprendo un menu.

   Lo stato vive in un solo posto, l'attributo aria-checked, che serve sia
   all'accessibilità sia al CSS qui sotto per spostare il pallino. Nessuna
   classe "is-on" da tenere in sincrono con l'attributo.

   Il sole e la luna sono due caratteri, non due immagini, per lo stesso motivo
   della freccina del selettore di lingua: prendono il colore dal testo e
   restano giusti in tutti e due i temi. Li scrive layout.js, che dopo il sole
   aggiunge U+FE0E, il carattere invisibile che impone il disegno testuale:
   senza, alcuni sistemi lo trasformano in un'emoji a colori. */

.temaswitch {
  position: relative;
  flex: none;
  align-self: center;   /* la testata allinea alla linea di base, il pallino no */

  display: inline-flex;
  align-items: center;
  justify-content: space-between;
  width: 46px;
  height: 24px;
  padding-inline: var(--s-1);

  appearance: none;
  background: transparent;
  border: 1px solid var(--rule);
  border-radius: 999px;   /* pillola: raggio più alto dell'altezza */
  cursor: pointer;
  transition: border-color var(--speed) ease;
}
.temaswitch:hover { border-color: var(--ink-3); }

.temaswitch__icona {
  font-size: var(--t-xs);
  line-height: 1;
  color: var(--ink-3);
}

/* Il pallino copre l'icona del tema attivo. Le misure sono legate fra loro:
   18 di pallino + 2 di margine sopra e sotto riempiono i 22 interni, e la
   corsa di 22 lo porta dall'altra parte con lo stesso margine. */
.temaswitch__pallino {
  position: absolute;
  top: 2px;
  left: 2px;
  width: 18px;
  height: 18px;
  border-radius: 50%;
  background: var(--accent);
  transition: transform var(--speed) ease;
}
.temaswitch[aria-checked="true"] .temaswitch__pallino { transform: translateX(22px); }

/* Sugli schermi stretti la testata è la riga più affollata del sito:
   si stringono le distanze prima di lasciarla andare a capo. */
@media (max-width: 34rem) {
  .nav { gap: var(--s-4); }
  .masthead__end { gap: var(--s-2) var(--s-4); }
}


/* ==========================================================================
   5. TIPOGRAFIA
   ========================================================================== */

.title {
  font-size: var(--t-3xl);
  font-weight: 700;
  line-height: var(--leading-tight);
  letter-spacing: -0.025em;
  margin: 0 0 var(--s-4);
}

.title--page {
  font-size: var(--t-2xl);
  margin-bottom: var(--s-3);
}

.lede {
  font-size: var(--t-lg);
  color: var(--ink-2);
  margin: 0 0 var(--s-6);
  max-width: 34rem;
}

/* Etichetta di sezione con filetto che prosegue fino a bordo colonna */
.eyebrow {
  display: flex;
  align-items: center;
  gap: var(--s-4);
  margin: var(--s-10) 0 var(--s-4);
  font-family: var(--font-mono);
  font-size: var(--t-xs);
  font-weight: 500;
  letter-spacing: 0.14em;
  text-transform: uppercase;
  color: var(--ink-3);
}
.eyebrow::after {
  content: "";
  flex: 1;
  height: 1px;
  background: var(--rule);
}

/* Per le etichette che si ripetono dentro un elenco — una per categoria in
   una lista della spesa — dove lo stacco pieno sarebbe tutto spazio bianco. */
.eyebrow--tight { margin-top: var(--s-5); }

/* Blocco di testo discorsivo.
   Attenzione alla specificità: azzerare i margini con un selettore di tipo
   (.prose p) batterebbe la regola di spaziatura automatica. Si azzera tutto
   con .prose > * e si riapplica lo spazio con la stessa specificità. */
.prose { max-width: 34rem; }
.prose > *     { margin: 0; }
.prose > * + * { margin-top: var(--s-4); }

.prose p { color: var(--ink-2); }
.prose h2 {
  font-size: var(--t-xl);
  font-weight: 700;
  letter-spacing: -0.015em;
  color: var(--ink);
}
.prose > * + h2 { margin-top: var(--s-7); }
.prose ul { padding-left: var(--s-5); color: var(--ink-2); }
.prose li + li { margin-top: var(--s-2); }


/* ==========================================================================
   6. INDICE — l'elemento firma del sito
   Ogni riga mostra il titolo e, in monospace, dove porta:
   il dominio esterno per gli articoli, il percorso interno per i tool.
   ========================================================================== */

.index { border-top: 1px solid var(--rule); }

.index__row {
  position: relative;
  display: flex;
  align-items: baseline;
  justify-content: space-between;
  gap: var(--s-2) var(--s-5);
  padding: var(--s-4) 0 var(--s-4) var(--s-4);
  border-bottom: 1px solid var(--rule);
  color: inherit;
  text-decoration: none;
}

/* Barretta d'accento che scorre dall'alto al passaggio del mouse */
.index__row::before {
  content: "";
  position: absolute;
  left: 0;
  top: -1px;
  bottom: -1px;
  width: 2px;
  background: var(--accent);
  transform: scaleY(0);
  transform-origin: top;
  transition: transform var(--speed) ease;
}
.index__row:hover::before,
.index__row:focus-visible::before { transform: scaleY(1); }

.index__main { min-width: 0; }

.index__label {
  font-weight: 500;
  color: var(--ink);
  transition: color var(--speed) ease;
}
.index__row:hover .index__label { color: var(--accent); }

.index__note {
  display: block;
  font-size: var(--t-sm);
  color: var(--ink-2);
  margin-top: var(--s-1);
}

.index__meta {
  flex-shrink: 0;
  font-family: var(--font-mono);
  font-size: var(--t-xs);
  color: var(--ink-3);
  white-space: nowrap;
  transition: color var(--speed) ease;
}
.index__row:hover .index__meta { color: var(--accent); }

/* Link "vedi tutti" sotto a un indice parziale */
.index__more {
  margin: var(--s-4) 0 0;
  font-family: var(--font-mono);
  font-size: var(--t-sm);
}
.index__more a { text-decoration: none; }
.index__more a:hover { text-decoration: underline; }

@media (max-width: 34rem) {
  .index__row { flex-direction: column; align-items: flex-start; }
}


/* ==========================================================================
   7. BLOCCHI
   ========================================================================== */

/* Ritratto dell'autore, in home sotto il titolo.
   Larghezza fissa e aspect-ratio quadrato: lo spazio è già occupato prima
   che il file arrivi, quindi il testo sotto non salta quando la foto si
   carica. È per questo che qui non servono gli attributi width/height nel
   markup. object-fit ritaglia invece di deformare, se un giorno la foto
   non fosse più quadrata. */
.portrait {
  display: block;
  width: 7.5rem;
  aspect-ratio: 1;
  object-fit: cover;
  border-radius: var(--radius-lg);
  border: 1px solid var(--rule);
  margin: 0 0 var(--s-5);
}

.card {
  background: var(--surface);
  border: 1px solid var(--rule);
  border-radius: var(--radius-lg);
  padding: var(--s-5);
}

.note {
  border-left: 2px solid var(--accent);
  background: var(--accent-soft);
  border-radius: 0 var(--radius) var(--radius) 0;
  padding: var(--s-3) var(--s-4);
  font-size: var(--t-sm);
  color: var(--ink-2);
}
.note p { margin: 0; }
.note p + p { margin-top: var(--s-2); }

.code {
  font-family: var(--font-mono);
  font-size: var(--t-xs);
  line-height: 1.6;
  color: var(--ink-2);
  background: var(--surface);
  border: 1px solid var(--rule);
  border-radius: var(--radius);
  padding: var(--s-3) var(--s-4);
  margin: var(--s-3) 0 0;
  overflow-x: auto;
  white-space: pre;
}

.tags { display: flex; flex-wrap: wrap; gap: var(--s-2); }

.tag {
  font-family: var(--font-mono);
  font-size: var(--t-xs);
  color: var(--ink-2);
  background: var(--surface);
  border: 1px solid var(--rule);
  border-radius: 999px;
  padding: var(--s-1) var(--s-3);
}


/* ==========================================================================
   8. VOCI CV
   ========================================================================== */

.entry { padding-block: var(--s-5); border-bottom: 1px solid var(--rule); }
.entry:first-of-type { border-top: 1px solid var(--rule); }

.entry__head {
  display: flex;
  flex-wrap: wrap;
  align-items: baseline;
  justify-content: space-between;
  gap: var(--s-2) var(--s-4);
}

.entry__role { font-weight: 700; color: var(--ink); }
.entry__org { color: var(--ink-2); }

.entry__dates {
  font-family: var(--font-mono);
  font-size: var(--t-xs);
  color: var(--ink-3);
  white-space: nowrap;
}

.entry__body { margin-top: var(--s-3); }
.entry__body ul { margin: 0; padding-left: var(--s-5); color: var(--ink-2); }
.entry__body li + li { margin-top: var(--s-2); }


/* ==========================================================================
   9. FORM — usati dai tool
   ========================================================================== */

.form { display: grid; gap: var(--s-4); max-width: 26rem; }

.field { display: grid; gap: var(--s-2); }

.field__label {
  font-size: var(--t-sm);
  font-weight: 500;
  color: var(--ink);
}

.field__hint {
  font-size: var(--t-xs);
  color: var(--ink-3);
}

.field__input,
.field__select {
  font-family: var(--font-ui);
  font-size: var(--t-base);
  color: var(--ink);
  background: var(--surface);
  border: 1px solid var(--rule);
  border-radius: var(--radius);
  padding: var(--s-3);
  width: 100%;
}
.field__input:focus, .field__select:focus { border-color: var(--accent); }

.btn {
  font-family: var(--font-ui);
  font-size: var(--t-sm);
  font-weight: 500;
  color: var(--paper);
  background: var(--accent);
  border: 1px solid var(--accent);
  border-radius: var(--radius);
  padding: var(--s-3) var(--s-5);
  cursor: pointer;
  justify-self: start;
  transition: background var(--speed) ease, border-color var(--speed) ease;
}
.btn:hover { background: var(--accent-deep); border-color: var(--accent-deep); }

.btn--ghost {
  color: var(--ink-2);
  background: transparent;
  border-color: var(--rule);
}
.btn--ghost:hover {
  color: var(--ink);
  background: var(--surface);
  border-color: var(--ink-3);
}

/* Tabellina dei risultati di un tool */
.result { border-top: 1px solid var(--rule); }

.result__row {
  display: flex;
  align-items: baseline;
  justify-content: space-between;
  gap: var(--s-4);
  padding: var(--s-3) 0;
  border-bottom: 1px solid var(--rule);
}

.result__key { color: var(--ink-2); font-size: var(--t-sm); }

.result__value {
  font-family: var(--font-mono);
  font-variant-numeric: tabular-nums;
  color: var(--ink);
}

.result__row--total .result__key { color: var(--ink); font-weight: 500; font-size: var(--t-base); }
.result__row--total .result__value { color: var(--accent); font-size: var(--t-lg); font-weight: 500; }


/* ==========================================================================
   10. TOOL GRANDI — pannelli, tabelle, barre, liste con spunta

   La sezione 9 basta per un tool con quattro campi e un risultato. Questi
   componenti servono a un tool che è una tabella da compilare: righe che si
   aggiungono e si tolgono, celle con dentro un campo, totali in fondo.

   Sono più pesanti degli altri e vanno usati solo dove servono davvero.
   Una pagina che li usa vuole anche .wrap--wide sul <main>, altrimenti le
   tabelle scorrono in orizzontale su qualsiasi schermo.
   ========================================================================== */


/* --- Sommario in cifre ----------------------------------------------------
   Le poche cifre che rispondono alla domanda della pagina, in cima, prima
   di tutti i dettagli. Due o tre in evidenza con --hero, non di più. */

.stats {
  display: grid;
  grid-template-columns: repeat(auto-fit, minmax(9rem, 1fr));
  gap: var(--s-3);
}

.stat {
  background: var(--surface);
  border: 1px solid var(--rule);
  border-radius: var(--radius-lg);
  padding: var(--s-3) var(--s-4);
}

.stat__key {
  display: block;
  font-family: var(--font-mono);
  font-size: var(--t-xs);
  letter-spacing: 0.08em;
  text-transform: uppercase;
  color: var(--ink-3);
}

.stat__value {
  display: block;
  margin-top: var(--s-1);
  font-family: var(--font-mono);
  font-variant-numeric: tabular-nums;
  font-size: var(--t-lg);
  line-height: var(--leading-tight);
  color: var(--ink);
}

.stat--hero { background: var(--accent-soft); border-color: var(--accent); }
.stat--hero .stat__value { color: var(--accent-deep); }


/* --- Pannello richiudibile ------------------------------------------------

   Un <details> con dentro un pezzo di modulo. Serve a tenere corta una
   pagina lunga: i dati di partenza si aprono, si compilano e si richiudono.

   Il triangolo di sistema viene tolto perché su <summary> in display:flex
   Safari lo disegna fuori posto; al suo posto c'è il +/− di ::after, che
   segue il colore del testo e quindi funziona anche in tema scuro. */

.panel {
  background: var(--surface);
  border: 1px solid var(--rule);
  border-radius: var(--radius-lg);
  margin-top: var(--s-3);
}

.panel__head {
  display: flex;
  flex-wrap: wrap;
  align-items: baseline;
  gap: var(--s-2) var(--s-3);
  padding: var(--s-3) var(--s-4);
  cursor: pointer;
  list-style: none;
}
.panel__head::-webkit-details-marker { display: none; }

.panel__head::after {
  content: "+";
  margin-left: auto;
  font-family: var(--font-mono);
  color: var(--ink-3);
}
.panel[open] .panel__head::after { content: "−"; }

.panel[open] .panel__head { border-bottom: 1px solid var(--rule); }

.panel__step {
  font-family: var(--font-mono);
  font-size: var(--t-xs);
  color: var(--ink-3);
}

.panel__title { font-weight: 500; color: var(--ink); }

.panel__hint {
  flex: 1 1 14rem;
  font-size: var(--t-sm);
  color: var(--ink-3);
}

.panel__body { padding: var(--s-4); }
.panel__body > * + * { margin-top: var(--s-4); }


/* --- Tabelle di dati ------------------------------------------------------
   .table-wrap fa scorrere la tabella dentro di sé invece di allargare la
   pagina: senza, su un telefono scorrerebbe tutto il documento. */

.table-wrap { overflow-x: auto; }

.table {
  width: 100%;
  min-width: 34rem;
  border-collapse: collapse;
  font-size: var(--t-sm);
}

.table th,
.table td {
  text-align: left;
  padding: var(--s-2);
  border-bottom: 1px solid var(--rule);
}

.table thead th {
  font-family: var(--font-mono);
  font-size: var(--t-xs);
  font-weight: 500;
  letter-spacing: 0.06em;
  text-transform: uppercase;
  color: var(--ink-3);
  white-space: nowrap;
  vertical-align: bottom;
}

/* Numeri: a destra e in monospace, così le colonne si leggono in verticale */
.table__num { text-align: right; }
.table td.table__num {
  font-family: var(--font-mono);
  font-variant-numeric: tabular-nums;
}

.table__name { color: var(--ink); }

/* Riga di intestazione di un gruppo di righe (una categoria) */
.table__group th {
  font-family: var(--font-mono);
  font-size: var(--t-xs);
  font-weight: 500;
  letter-spacing: 0.08em;
  text-transform: uppercase;
  color: var(--accent);
  background: var(--paper);
}

.table__row--total td {
  font-weight: 500;
  color: var(--ink);
  border-bottom: none;
  border-top: 1px solid var(--rule);
}
.table__row--sub td { color: var(--ink-2); }

/* Riga che non entra nel totale perché le manca un dato */
.table__row--warn { background: var(--accent-soft); }

/* Unità di misura accanto a un campo o a un numero */
.table__unit {
  font-family: var(--font-mono);
  font-size: var(--t-xs);
  color: var(--ink-3);
}


/* --- Campi dentro una tabella --------------------------------------------
   Varianti compatte di .field__input e .field__select: stessa cosa, ma
   dimensionate per stare in una cella senza farla crescere. */

.field__input--compact,
.field__select--compact {
  font-size: var(--t-sm);
  padding: var(--s-1) var(--s-2);
}

.field__input--num {
  text-align: right;
  font-family: var(--font-mono);
  font-variant-numeric: tabular-nums;
}

.field__input--xs { width: 4.5rem; }
.field__input--sm { width: 6.5rem; }
.field__select--auto { width: auto; }

.field__check {
  width: 1rem;
  height: 1rem;
  accent-color: var(--accent);
  cursor: pointer;
}

/* Modulo su una riga sola: per aggiungere una voce a una tabella */
.form--inline {
  display: flex;
  flex-wrap: wrap;
  align-items: flex-end;
  gap: var(--s-3);
  max-width: none;
}
.form--inline .field { flex: 1 1 9rem; }


/* --- Riga di bottoni ------------------------------------------------------ */

.actions {
  display: flex;
  flex-wrap: wrap;
  align-items: center;
  gap: var(--s-3);
}

/* Spinge a destra i bottoni che vengono dopo */
.actions__gap { flex: 1 1 auto; }

/* Bottone minimo, per un'azione ripetuta su ogni riga di una tabella */
.btn--icon {
  padding: var(--s-1) var(--s-2);
  color: var(--ink-3);
  background: transparent;
  border-color: transparent;
  font-family: var(--font-mono);
}
.btn--icon:hover {
  color: var(--accent);
  background: var(--surface);
  border-color: var(--rule);
}


/* --- Cursore con valore --------------------------------------------------- */

.range {
  display: flex;
  flex-wrap: wrap;
  align-items: center;
  gap: var(--s-3) var(--s-4);
}

.range__slider {
  flex: 1 1 12rem;
  accent-color: var(--accent);
}

.range__value {
  font-family: var(--font-mono);
  font-variant-numeric: tabular-nums;
  color: var(--accent);
}


/* --- Barre di confronto ---------------------------------------------------
   La lunghezza della barra è un dato, non uno stile: arriva dal JavaScript
   nella proprietà --quota. È l'unico modo di far entrare un numero calcolato
   in un foglio di stile senza scrivere style="" nella pagina. */

.bars { display: grid; gap: var(--s-2); }

.bar {
  display: grid;
  grid-template-columns: minmax(7rem, 1fr) 2fr auto;
  align-items: center;
  gap: var(--s-3);
  font-size: var(--t-sm);
}

.bar__track {
  height: var(--s-2);
  background: var(--surface);
  border: 1px solid var(--rule);
  border-radius: 999px;
  overflow: hidden;
}

.bar__fill {
  width: var(--quota, 0%);
  height: 100%;
  background: var(--accent);
}

.bar__value {
  font-family: var(--font-mono);
  font-size: var(--t-xs);
  color: var(--ink-2);
  white-space: nowrap;
  text-align: right;
}


/* --- Lista con spunta ----------------------------------------------------- */

.checklist { list-style: none; margin: 0; padding: 0; }

.checklist__item {
  display: flex;
  align-items: baseline;
  gap: var(--s-3);
  padding: var(--s-2) 0;
  border-bottom: 1px solid var(--rule);
  cursor: pointer;
}

.checklist__text { flex: 1 1 auto; }
.checklist__qty { color: var(--ink-2); }

.checklist__meta {
  font-family: var(--font-mono);
  font-size: var(--t-xs);
  font-variant-numeric: tabular-nums;
  color: var(--ink-3);
  white-space: nowrap;
}

.checklist__item.is-done .checklist__text {
  text-decoration: line-through;
  color: var(--ink-3);
}


/* --- Messaggio temporaneo -------------------------------------------------
   Conferma un'azione senza spostare niente nella pagina. Ha role="status"
   nell'HTML, così anche chi non lo vede se lo sente annunciare. */

.toast {
  position: fixed;
  left: 50%;
  bottom: var(--s-5);
  z-index: 20;
  transform: translate(-50%, var(--s-8));
  background: var(--ink);
  color: var(--paper);
  font-size: var(--t-sm);
  padding: var(--s-2) var(--s-5);
  border-radius: 999px;
  opacity: 0;
  pointer-events: none;
  transition: opacity var(--speed) ease, transform var(--speed) ease;
}
.toast.is-on { opacity: 1; transform: translate(-50%, 0); }


/* ==========================================================================
   11. FOOTER
   ========================================================================== */

.footer {
  border-top: 1px solid var(--rule);
  margin-top: var(--s-12);
  padding-block: var(--s-5);
}

.footer__inner {
  display: flex;
  flex-wrap: wrap;
  align-items: baseline;
  justify-content: space-between;
  gap: var(--s-3);
  font-family: var(--font-mono);
  font-size: var(--t-xs);
  color: var(--ink-3);
}

.footer a { color: var(--ink-3); text-decoration: none; }
.footer a:hover { color: var(--accent); }


/* ==========================================================================
   12. UTILITY — poche e mirate
   ========================================================================== */

.stack-sm > * + * { margin-top: var(--s-3); }
.stack    > * + * { margin-top: var(--s-5); }
.mono     { font-family: var(--font-mono); font-size: var(--t-sm); }
.muted    { color: var(--ink-2); }
.visually-hidden {
  position: absolute; width: 1px; height: 1px;
  padding: 0; margin: -1px; overflow: hidden;
  clip: rect(0 0 0 0); white-space: nowrap; border: 0;
}


/* ==========================================================================
   13. STAMPA
   Quello che si stampa è il contenuto: testata, footer e comandi restano
   fuori. Un tool marca con .no-print i suoi moduli e i suoi bottoni, e con
   .print-only le righe che hanno senso solo sul foglio (un'intestazione con
   data e totale, che a schermo sarebbe una ripetizione).
   ========================================================================== */

.print-only { display: none; }

/* La carta è bianca, e il tema scuro è quello predefinito: senza questo
   blocco chi stampa una lista della spesa dal tool ottiene un foglio quasi
   vuoto, perché il browser stampa il colore del testo ma non gli sfondi.

   Non sono i colori del tema chiaro: quelli servono a leggere su uno
   schermo, questi a non sprecare toner. Nero su bianco, grigi al posto del
   verde, filetti più tenui. È il terzo posto in cui i token dei colori sono
   definiti, ed è l'ultimo — se ne aggiungi uno, ricordati anche qui.

   I due selettori non sono una ripetizione. Il solo :root vale 0,1,0 e
   perderebbe contro :root[data-tema="chiaro"], che vale 0,2,0: chi stampa
   dal tema chiaro si porterebbe dietro i suoi colori invece di questi.
   Ripetuto con l'attributo pareggia la specificità e vince perché viene
   dopo. Serve anche il :root nudo, per chi ha JavaScript disattivato e
   quindi non ha nessun attributo sul tag <html>. */
@media print {
  :root,
  :root[data-tema="chiaro"] {
    color-scheme: light;

    --paper:        #FFFFFF;
    --surface:      #FFFFFF;
    --ink:          #000000;
    --ink-2:        #333333;
    --ink-3:        #555555;
    --accent:       #000000;
    --accent-deep:  #000000;
    --accent-soft:  #F0F0F0;
    --rule:         #AAAAAA;
  }

  .masthead, .footer, .skip, .toast, .no-print { display: none !important; }
  .print-only { display: block; }

  .page { padding-block: 0; }
  .wrap { max-width: none; padding-inline: 0; }
  .table { min-width: 0; }

  a { color: var(--ink); text-decoration: none; }
}
