/* =========================================================================
   VALERIO PORTFOLIO — minimal editorial developer portfolio
   Foglio unico. Nomenclatura italiana, BEM leggero: blocco / blocco__elemento
   / .is-stato.

   Ordine: 1 font · 2 token · 3 reset · 4 griglia · 5 tipografia
           6 componenti · 7 testa · 8 home · 9 pagine · 10 piede
           11 breakpoint · 12 motion

   Regole del sistema, valide ovunque:
   - raggio uguale ovunque (--r 16px, --r-s 8px sui dettagli): lo spigolo si
     smussa, il blocco resta duro. A tenere il registro sono il contorno pieno
     e l'ombra a blur zero, non l'angolo vivo;
   - un solo gesto per quello che si puo' premere: l'oggetto scende NELLA sua
     ombra (--premi*), non si solleva. Quello che non e' cliccabile non ha
     gesto;
   - contorno pieno di 3px in --line, e ombra netta a blur zero. Nessuna
     ombra morbida, nessun bagliore, nessun gradiente;
   - il colore non fa da fondo alle sezioni. Le sezioni stanno su --bg, e i
     colori della palette servono a numeri, marcatori, badge e stati;
   - ogni oggetto colorato si porta dietro il proprio contrasto: fondo della
     palette, contorno nero e testo #111. Vale identico nei due temi, perche'
     le tinte non cambiano fra chiaro e scuro;
   - asimmetria in grande (sfalsamenti, rotazioni minime), allineamento
     meccanico in piccolo: etichette, campi e bottoni non ballano mai.
   ========================================================================= */

/* ---------- 1. FONT --------------------------------------------------- */
/* Satoshi porta la voce editoriale dei titoli; IBM Plex Sans mantiene
   leggibili testi e interfaccia. Entrambe sono variabili e self-hosted. */
@font-face {
  font-family: "Satoshi";
  src: url("../fonts/Satoshi-Variable.woff2") format("woff2");
  font-weight: 300 900;
  font-style: normal;
  font-display: swap;
}
@font-face {
  font-family: "IBM Plex Sans";
  src: url("../fonts/IBMPlexSans-Variable.woff2") format("woff2");
  font-weight: 100 700;
  font-style: normal;
  font-display: swap;
}

/* ---------- 2. TOKEN -------------------------------------------------- */
:root {
  color-scheme: light;

  /* --- sistema editoriale, tema chiaro --- */
  --color-bg: #F3F0E8;
  --color-surface: #FCFBF7;
  --color-text: #1B1B1B;
  --color-muted: #67645F;
  --color-border: #2E2E30;
  --color-blue: #79CFE6;
  --color-yellow: #FFD756;
  --color-mint: #BFE8D8;
  --color-lilac: #C9B8F4;
  --color-coral: #F29B83;

  /* Alias temporanei: i componenti storici migrano senza perdere struttura. */
  --bg: var(--color-bg);
  --surface: var(--color-surface);
  --text: var(--color-text);
  --text-muted: var(--color-muted);
  --line: var(--color-border);
  --ombra-colore: var(--color-border);

  /* PALETTE — tre accenti principali e due tinte di supporto. Il colore
     resta confinato a marcatori, stati e piccoli accenti: non diventa il
     fondo generico delle sezioni.

       lime      evidenza
       rosa      stato / UI
       viola     comando / sviluppo
       giallo    accessibilita' nel Metodo
       azzurro   performance e SEO

     Tutte e cinque reggono #111111 come testo normale. Sul viola il nero
     arriva a 5.07:1, mentre il bianco si ferma a 3.72:1: anche bottoni e CTA
     usano quindi l'inchiostro scuro. */
  --lime: var(--color-mint);
  --rosa: var(--color-blue);
  --viola: var(--color-blue);
  --giallo: var(--color-yellow);
  --azzurro: var(--color-blue);

  /* VELI — gli accenti principali a bassa opacita', per stati che devono
     colorare senza pesare.
     Sono rgba e non colori pieni apposta: sopra la carta danno una tinta
     tenue, sopra il fondo notturno si scuriscono da soli e restano tenui
     anche li', senza bisogno di una seconda serie di valori. */
  --velo-lime:  rgba(183, 239,  57, .42);
  --velo-viola: rgba(143, 108, 246, .30);
  --velo-rosa:  rgba(242, 121, 147, .34);

  /* Misurati, non stimati: ogni tinta si porta il testo che regge. */
  --on-lime:    #111111;           /* 13.86:1 */
  --on-rosa:    #111111;           /*  7.13:1 */
  --on-viola:   #111111;           /*  5.07:1 */
  --on-giallo:  #111111;           /* 16.53:1 */
  --on-azzurro: #111111;           /* 10.97:1 */

  --accento: var(--color-yellow);  /* evidenza */
  --on-accento: var(--on-lime);
  --comando: var(--color-blue);    /* azione */
  --on-comando: var(--on-viola);
  --stato: var(--color-mint);      /* in corso, conferme */
  --on-stato: var(--on-rosa);
  /* Il focus e' un ANELLO fuori dall'oggetto, mentre lo stato attivo e' una
     CAMPITURA dentro: forma diversa, quindi non si confondono anche a
     parita' di tinta. */
  --focus: #16718B;

  /* Il viola come INCHIOSTRO, non come campitura. #7B52F6 e' tarato per
     stare DIETRO a un testo, non per esserlo: scritto sul fondo si ferma a
     4.36:1, sotto la soglia. Per scrivere serve la versione scura in chiaro
     (6.55:1) e quella chiara al buio (6.85:1). Stessa tinta, due valori, un
     ruolo solo. */
  --viola-testo: #12667D;

  --velo: rgba(0, 0, 0, .05);
  --griglia: rgba(0, 0, 0, .055);

  /* --- tipografia --- */
  --font-display: "Satoshi", "Helvetica Neue", Arial, sans-serif;
  --font-body: "IBM Plex Sans", "Helvetica Neue", Arial, sans-serif;
  --f-display: var(--font-display);
  --f-corpo: var(--font-body);
  /* Il carattere dei dati: stessa famiglia del display, altro trattamento. */
  --f-dato: var(--f-display);
  /* L'unico monospace del sito, e vive in un posto solo: la finestrella di
     codice della hero. Font di sistema, nessun file da scaricare — dentro a
     una scatola da 250px conta la forma della riga, non la personalita' del
     carattere. */
  --f-mono: ui-monospace, SFMono-Regular, "SF Mono", Menlo, Consolas, monospace;

  /* Tarato sulla colonna vera, non a occhio. In minuscolo "Frontend,
     WordPress" misura 11.21em (in maiuscolo erano 14.06: togliere il
     maiuscolo ha liberato un quarto della riga, e il corpo e' salito di
     conseguenza). La colonna di copy vale 0.574 del contenitore, cioe'
     0.574 x (100vw - 60px): da qui il corpo massimo, 0.574 / 9.98 = 0.0575
     per pixel di finestra, meno un margine di sicurezza. */
  /* Gli estremi BASSI di queste curve sono saliti: sono quelli che valgono
     sul telefono, dove il testo era tarato sul minimo di leggibilita' e non
     su quanto si legge comodo a un braccio di distanza. Sopra i 700px circa
     le curve incrociano i valori di prima, quindi il desktop non cambia. */
  --t-h1: clamp(2.125rem, 5.6vw - 3.4px, 6rem);
  --t-h2: clamp(1.875rem, 1rem + 2.4vw, 3.25rem);
  --t-h3: clamp(1.1875rem, 1rem + .45vw, 1.375rem);
  --t-lead: clamp(1.125rem, 1rem + .35vw, 1.25rem);
  --t-corpo: clamp(1.0625rem, .96rem + .22vw, 1.0625rem);
  --t-ui: 0.875rem;
  --t-label: 0.75rem;
  --t-micro: 0.6875rem;

  --lh-display: 1;
  --lh-corpo: 1.55;

  /* CURVE
     Le easing native del browser sono deboli: `ease` parte e finisce quasi
     lineare, e su un gesto da 120ms non si sente. Due curve sole, forti, e
     una regola per sceglierle: quello che ENTRA o si SOLLEVA usa --ease-out
     (parte veloce, cioe' risponde subito); quello che cambia colore o si
     scambia sul posto usa --ease-mite. Niente ease-in: comincia piano
     proprio nell'istante in cui si sta guardando. */
  --ease-out: cubic-bezier(.22, 1, .36, 1);
  --ease-mite: cubic-bezier(.4, 0, .2, 1);

  /* --- misure --- */
  --b: 1px;
  /* Le superfici editoriali grandi (skills, progetti, card blog) usano un
     filo piu' leggero del resto dell'interfaccia. Il brutalismo resta sui
     controlli piccoli; le card grandi respirano e non sembrano pulsanti. */
  --b-card: 1px;
  --ombra-card-hover: 2px 2px 0 0 var(--ombra-colore);

  /* Raggio delle scatole, e va solo sugli OGGETTI: schede, immagini,
     bottoni. Le sezioni editoriali non hanno raggio, perche' non hanno
     campitura ne' contorno — quello che le separa e' un filo, non una
     scatola.
     A 6px il contorno da 3px faceva ancora angolo vivo; a 16px la scheda
     cominciava a somigliare a un UI kit. 12px e' il punto in cui lo spigolo
     e' smussato ma la scatola resta dura: a tenerla su sono il contorno
     pieno e l'ombra a blur zero, non l'angolo. Il raggio piccolo serve a
     badge e targhette, che piu' grandi diventano pastiglie. */
  --r: 8px;
  --r-s: 4px;

  /* OMBRE
     Offset netto, blur zero, stessa tinta del contorno. Quattro gradini:
     dettagli, standard, hover/pannelli, eroe. */
  --ombra-s: 2px 2px 0 0 var(--ombra-colore);
  --ombra: 3px 3px 0 0 var(--ombra-colore);
  --ombra-l: 4px 4px 0 0 var(--ombra-colore);
  --ombra-xl: 6px 6px 0 0 var(--ombra-colore);

  /* PRESSIONE
     Un oggetto premuto scende NELLA sua ombra: trasla esattamente
     dell'offset e l'ombra sparisce. Se i due numeri non coincidono
     l'oggetto scivola invece di schiacciarsi, ed e' il dettaglio che fa la
     differenza fra un bottone neubrutalista e un bottone con un'ombra. */
  --premi-xs: translate(2px, 2px);
  --premi-s: translate(3px, 3px);
  --premi: translate(5px, 5px);

  /* Ombra sempre nera, per gli oggetti che stanno su una campitura della
     palette: li' il bianco caldo della notturna sparirebbe. Sono token e non
     valori scritti a mano perche' devono accorciarsi con gli altri sotto i
     900px, altrimenti la pressione non copre piu' l'ombra. */
  --ombra-n: 5px 5px 0 0 #000;
  --ombra-n-s: 3px 3px 0 0 #000;

  /* Contenitore unico del sito: calc(100% - 60px), max 2200px. */
  --gutter: 30px;
  --max: 2200px;
  --colonna: clamp(20px, 2.2vw, 40px);
  --sezione: clamp(72px, 8vw, 128px);
  --h-testa: 72px;
}

/* TEMA SCURO
   Il contorno e l'ombra si ribaltano: da nero a bianco caldo. E' l'unico modo
   onesto di portare il brutalismo al buio, perche' senza il contorno gli
   oggetti smettono di esistere. Le tinte della palette restano identiche: sono
   oggetti che si portano dietro il proprio contrasto. */
[data-theme="dark"] {
  color-scheme: dark;

  --color-bg: #111111;
  --color-surface: #191919;
  --color-text: #F3F0E8;
  --color-muted: #B8B4AA;
  --color-border: #383838;
  --bg: var(--color-bg);
  --surface: var(--color-surface);
  --text: var(--color-text);
  --text-muted: var(--color-muted);
  --line: var(--color-border);
  --ombra-colore: var(--color-border);

  /* Al buio il viola pieno si ferma a 3.89:1: per scrivere serve schiarirlo. */
  --viola-testo: #79CFE6;

  --velo: rgba(245, 244, 240, .07);
  --griglia: rgba(245, 244, 240, .065);
}

/* ---------- 3. RESET -------------------------------------------------- */
*, *::before, *::after { box-sizing: border-box; }

html {
  -webkit-text-size-adjust: 100%;
  scroll-padding-top: calc(var(--h-testa) + 24px);
}
body.admin-bar { scroll-padding-top: calc(var(--h-testa) + 56px); }

body {
  min-width: 320px;
  margin: 0;
  overflow-x: clip;
  background: var(--bg);
  color: var(--text);
  font-family: var(--f-corpo);
  font-size: var(--t-corpo);
  font-weight: 400;
  line-height: var(--lh-corpo);
  -webkit-font-smoothing: antialiased;
  -moz-osx-font-smoothing: grayscale;
  font-synthesis-weight: none;
}

/* Il cambio di tema si accompagna: tutto quello che cambia campitura o
   contorno lo fa nello stesso tempo, altrimenti la pagina si ricolora a
   scatti diversi. */
body, .testa, .nav-mobile, section, footer, .tool, .nota__link,
.tema-btn, .scheda-lavoro__media, .vicini a {
  transition: background-color .2s ease, color .2s ease, border-color .2s ease;
}
/* Il raggio sta sugli oggetti, non sui contenitori di sezione. Prima la
   stessa regola lo dava anche a body, section e footer: non si vedeva —
   quelle non hanno campitura — ma era un raggio ereditato da mezza pagina,
   e bastava una sezione con un fondo per vederselo comparire. */
/* .nota__link e' fuori di proposito: in forma di ELENCO il suo hover e' una
   campitura a tutta riga, e con il raggio gli angoli tondi andavano a
   sfiorare il filo nero del divisore — due geometrie diverse a due pixel
   l'una dall'altra. Da riga la campitura e' un rettangolo a filo; il raggio
   ce l'ha solo la versione a scheda, che lo dichiara per conto suo. */
.tool, .tema-btn, .scheda-lavoro__media, .vicini a {
  border-radius: var(--r);
}

img, video, canvas, svg { display: block; max-width: 100%; }
img { height: auto; }
a { color: inherit; text-decoration: none; }
button, input, textarea, select { font: inherit; color: inherit; }
button { cursor: pointer; background: none; border: 0; padding: 0; }
h1, h2, h3, h4, p, figure, blockquote { margin: 0; }
ul, ol { margin: 0; padding: 0; list-style: none; }
address { font-style: normal; }
::selection { background: var(--accento); color: var(--on-accento); }

/* Focus: contorno viola a 3px, sempre lo stesso, mai il colore del
   componente. Cosi' "ho il focus" e "sono attivo" non si confondono mai. */
:focus-visible {
  outline: var(--b) solid var(--focus);
  outline-offset: 3px;
}

/* Foglio a quadretti: lo porta ogni sezione, non il corpo della pagina.
   Attaccato al corpo e fissato al viewport scorreva sotto al contenuto come
   una texture staccata; qui ogni sezione ha il suo foglio, che parte dal suo
   bordo alto e finisce dove finisce lei. Le superfici (--surface) sono opache
   e ci si appoggiano sopra. */
main > section,
.piede,
.pagina-testa,
.archivio {
  background-image:
    linear-gradient(var(--griglia) 1px, transparent 1px),
    linear-gradient(90deg, var(--griglia) 1px, transparent 1px);
  background-size: 22px 22px;
}

/* ---------- 4. GRIGLIA ------------------------------------------------ */
.vv-contenitore {
  width: calc(100% - var(--gutter) * 2);
  max-width: var(--max);
  margin-inline: auto;
}

.griglia {
  display: grid;
  grid-template-columns: repeat(12, minmax(0, 1fr));
  column-gap: var(--colonna);
  row-gap: clamp(32px, 4vw, 64px);
}

.contenuto { display: block; }

.screen-reader-text {
  position: absolute; width: 1px; height: 1px; padding: 0;
  overflow: hidden; clip: rect(0, 0, 0, 0); white-space: nowrap; border: 0;
}

.salta {
  position: fixed; z-index: 999; top: -100px; left: 16px;
  padding: 12px 18px;
  background: var(--accento); color: var(--on-accento);
  border: var(--b) solid #000;
  box-shadow: var(--ombra-s);
  font-family: var(--f-dato); font-size: var(--t-label); font-weight: 700;
  text-transform: uppercase; letter-spacing: .06em;
  border-radius: var(--r);
}
.salta:focus { top: 12px; }

/* ---------- 5. TIPOGRAFIA --------------------------------------------- */
/* Satoshi costruisce la gerarchia con scala e pesi controllati. */
.display {
  font-size: var(--t-h2);
  font-family: var(--f-display);
  font-weight: 700;
  line-height: 1.04;
  letter-spacing: -.02em;
  text-wrap: balance;
}
.display--xl {
  font-size: var(--t-h1);
  font-family: var(--f-display);
  font-weight: 700;
  line-height: var(--lh-display);
  letter-spacing: -.025em;
  /* Due righe sul desktop, mai tre. La riga lunga ("Frontend, WordPress")
     misura 9.98em: sotto quella soglia la parola va a capo e il titolo
     diventa di tre righe. 10.6em lasciano il margine che serve senza
     permettere a una terza parola di salire (servirebbero 11.2em). */
  max-width: 10.6em;
}
.display--m {
  font-size: clamp(1.5rem, 1rem + 1.7vw, 2.25rem);
  font-family: var(--f-display);
  font-weight: 700;
  line-height: 1.04;
  letter-spacing: -.02em;
  text-wrap: balance;
  max-width: 20ch;
}
/* L'H1 di una PAGINA e' il titolo di quella pagina, non un sottotitolo di
   qualcos'altro: deve stare sulla stessa scala di quello della hero. A
   .display--m "Progetti" usciva a 36px, cioe' piu' piccolo dell'h2 di una
   sezione della home, e la gerarchia si leggeva al contrario.
   Non e' --t-h1 secco ma un filo sotto: la hero ha una colonna da sette
   dodicesimi e una riga sola, queste pagine hanno tutta la larghezza e a
   96px un titolo corto come "Contatti" diventa un cartellone. */
.display--pagina {
  font-size: clamp(2.5rem, 1.4rem + 4.4vw, 5rem);
  font-family: var(--f-display);
  font-weight: 700;
  line-height: var(--lh-display);
  letter-spacing: -.03em;
  text-wrap: balance;
  max-width: 14ch;
}

/* Etichetta tecnica: stessa famiglia del titolo, altro trattamento.
   Piccola, maiuscola e molto spaziata: senza il monospazio a dire "questo e'
   un dato", il lavoro lo deve fare la spaziatura. */
.etichetta {
  display: flex;
  align-items: center;
  gap: .7em;
  font-family: var(--f-dato);
  font-size: var(--t-label);
  font-weight: 700;
  letter-spacing: .12em;
  line-height: 1.3;
  text-transform: uppercase;
  color: var(--text-muted);
}
.etichetta--testo { color: var(--text); }
.etichetta a { text-decoration: underline; text-underline-offset: 3px; }

/* Il numero di sezione e' un blocchetto di colore, non un testo colorato:
   fondo dalla palette, testo nero, contorno nero, ombra corta. */
.etichetta__n {
  padding: 3px 8px;
  background: var(--accento);
  color: var(--on-accento);
  border: 2px solid #000;
  box-shadow: 2px 2px 0 0 #000;
  font-variant-numeric: tabular-nums;
  letter-spacing: .02em;
  border-radius: var(--r-s);
}
.etichetta__punto {
  width: 10px; height: 10px;
  flex: none;
  background: var(--stato);
  border: 2px solid #000;
  border-radius: var(--r-s);
}

.testo-lead {
  font-size: var(--t-lead);
  line-height: 1.5;
  max-width: 52ch;
  text-wrap: pretty;
  min-height: 3em;
  display: -webkit-box;
  -webkit-line-clamp: 2;
  -webkit-box-orient: vertical;
  overflow: hidden;
}
p { text-wrap: pretty; }

/* Sottolineatura a pennarello: il modo in cui la palette entra nel testo
   corrente senza toccare il contrasto del testo stesso. E' una barra SOTTO
   la riga, non dietro: per questo puo' usare anche il viola, che come
   campitura di un testo nero non passerebbe. Lime di default (evidenza),
   viola dove il ruolo e' "questo e' il punto". */
.segno--comando { --accento: var(--comando); }

/* Marcatore pieno: un blocco di colore dietro alla frase, non una riga
   sotto. Serve dove il testo e' lungo e va scremato a colpo d'occhio. */
.marcato {
  padding: .1em .35em;
  background: var(--accento);
  color: var(--on-accento);
  border-radius: var(--r-s);
  /* Il filo nero e l'ombra netta sono la firma della hero: le tessere
     accanto al modello sono fatte cosi'. Il marcatore le aveva perse ed
     era l'unico oggetto colorato del sito senza contorno — una campitura
     piatta in mezzo a un sistema di blocchi bordati. Sono due ombre e non
     un border perche' box-shadow non occupa spazio: il filo puo' comparire
     senza spostare di un pixel la riga in cui il marcatore vive. */
  box-shadow: 0 0 0 2px var(--line), 3px 3px 0 0 var(--line);
  /* Il filo e l'ombra escono dal riquadro del testo e si mangiano lo spazio
     prima e dopo la parola: senza questi due margini il marcatore finisce
     appiccicato alla parola che segue. Sono esattamente quanto sporgono le
     due ombre, 2px a sinistra e 2+3 a destra. */
  margin-inline: 2px 5px;
  box-decoration-break: clone;
  -webkit-box-decoration-break: clone;
  font-weight: 700;
}
/* Due soli marcatori: lime e rosa tengono il testo scuro nettamente leggibile
   e restano gli accenti editoriali principali del Manifesto. */
.marcato--lime { background: var(--lime); color: var(--on-lime); }
.marcato--rosa { background: var(--rosa); color: var(--on-rosa); }
.segno {
  background-image: linear-gradient(var(--accento), var(--accento));
  background-repeat: no-repeat;
  background-position: 0 88%;
  background-size: 100% .34em;
  padding-inline: .06em;
}

/* --- Icone ---------------------------------------------------------------
   Una famiglia sola per tutto il sito (Phosphor Bold, inline). La misura e'
   in em e non in pixel: l'icona segue il corpo del testo che accompagna,
   quindi la stessa freccia sta bene dentro a un bottone da 12px e dentro a
   una riga di elenco da 21 senza una regola per ciascuno.
   flex:none perche' quasi sempre sta accanto a del testo dentro a un flex,
   e senza si schiaccerebbe quando il testo va a capo. */
.icona {
  width: 1em;
  height: 1em;
  flex: none;
  /* Allineata alla riga di base del testo, non al fondo della scatola. */
  vertical-align: -.14em;
}

/* ---------- 6. COMPONENTI --------------------------------------------- */
/* Il gesto del sistema, uno solo: l'oggetto premuto scende NELLA sua ombra.
   Trasla esattamente dell'offset e l'ombra sparisce. */
.bottone {
  display: inline-flex;
  align-items: center;
  gap: .6em;
  min-height: 52px;
  padding: 13px 24px;
  background: var(--comando);
  color: var(--on-comando);
  border: var(--b) solid #000;
  box-shadow: var(--ombra-n);
  font-family: var(--f-dato);
  font-size: var(--t-label);
  font-weight: 700;
  letter-spacing: .12em;
  text-transform: uppercase;
  transition: transform .12s ease, box-shadow .12s ease, background-color .12s ease;
  border-radius: var(--r);
}
/* Premuto, non sollevato: l'oggetto scende nella sua ombra. Era il contrario
   — saliva di 2px e l'ombra cresceva — e il gesto raccontava una cosa che
   nel resto del sistema non succede mai. */
.bottone:hover, .bottone:focus-visible, .bottone:active { transform: var(--premi); box-shadow: 0 0 0 0 #000; }
/* Il comando che APRE la pagina e' lime, quello che la CHIUDE resta viola:
   il blocco della CTA in fondo e' viola pieno, e un bottone viola dentro a
   una hero che punta a quel blocco diceva la stessa cosa due volte. Il lime
   e' gia' l'evidenza del sistema (numeri di sezione, marcatori, tab attiva)
   e regge il nero a 15.94:1, quindi non serve una tinta nuova: serve usare
   quella giusta. Resta un solo bottone lime in tutto il sito. */
.bottone--evidenza {
  background: var(--accento);
  color: var(--on-accento);
}
.bottone--vuoto {
  background: var(--surface);
  color: var(--text);
  border-color: var(--line);
  box-shadow: var(--ombra);
}
.bottone--vuoto:hover, .bottone--vuoto:focus-visible {
  background: var(--comando);
  color: var(--on-comando);
  border-color: #000;
  box-shadow: 0 0 0 0 #000;
}
.bottoni { display: flex; flex-wrap: wrap; gap: 14px; }

.targhetta {
  display: inline-block;
  padding: 5px 10px;
  background: var(--surface);
  border: 2px solid var(--line);
  box-shadow: 2px 2px 0 0 var(--ombra-colore);
  font-family: var(--f-dato);
  font-size: var(--t-micro);
  font-weight: 700;
  letter-spacing: .12em;
  line-height: 1.4;
  text-transform: uppercase;
  white-space: nowrap;
  border-radius: var(--r-s);
}
.targhetta--attiva { background: var(--accento); color: var(--on-accento); border-color: #000; box-shadow: 2px 2px 0 0 #000; }

/* Testata di sezione: sempre lo stesso impianto, sempre sulle stesse linee
   di griglia. E' quello che tiene insieme una pagina fatta di blocchi duri. */
.sezione__testa {
  display: grid;
  grid-template-columns: repeat(12, minmax(0, 1fr));
  column-gap: var(--colonna);
  row-gap: clamp(16px, 2vw, 28px);
  align-items: end;
  padding-block: var(--sezione) clamp(32px, 3.6vw, 60px);
}
.sezione__titolo { grid-column: span 7; }
.sezione__titolo .etichetta { margin-bottom: clamp(16px, 1.8vw, 26px); }
.sezione__lato { grid-column: 9 / -1; justify-self: start; align-self: end; }
.sezione__lato--azione { justify-self: end; }
.sezione__nota {
  margin-top: clamp(14px, 1.6vw, 22px);
  max-width: 46ch;
  /* Filo viola: accompagna ogni testata di sezione e da' al viola un
     ruolo anche fuori dai comandi. */
  padding-left: clamp(14px, 1.4vw, 20px);
  border-left: 5px solid var(--comando);
  font-size: var(--t-lead);
  line-height: 1.5;
}

.avviso {
  padding: 20px 22px;
  background: var(--accento);
  color: var(--on-accento);
  border: var(--b) solid #000;
  box-shadow: var(--ombra-s);
  font-size: 1rem;
  border-radius: var(--r);
}
.vuoto { padding-block: clamp(40px, 6vw, 80px); color: var(--text-muted); font-size: var(--t-lead); }

/* ---------- 7. TESTA -------------------------------------------------- */
/* Niente vetro smerigliato: fondo pieno e una trave nera sotto. */
/* La testata si ritira mentre si scende e torna appena si risale: mentre
   leggi non ruba la riga in cima, e quando serve e' gia' li'. La classe la
   mette site.js; senza JavaScript resta semplicemente sempre visibile. */
.testa {
  position: sticky;
  top: 0;
  z-index: 50;
  background: var(--bg);
  border-bottom: var(--b) solid var(--line);
  transition: transform .28s cubic-bezier(.4, 0, .2, 1);
}
.testa--nascosta { transform: translateY(-100%); }
body.admin-bar .testa--nascosta { transform: translateY(calc(-100% - 32px)); }
body.admin-bar .testa { top: 32px; }

.testa__interno {
  display: flex;
  align-items: center;
  gap: clamp(8px, 1.4vw, 20px);
  min-height: var(--h-testa);
}

.marchio { display: inline-flex; align-items: center; gap: 12px; margin-right: auto; }
.marchio__sigla {
  display: grid;
  place-items: center;
  width: 38px; height: 38px;
  background: var(--text);
  color: var(--bg);
  border: var(--b) solid var(--line);
  box-shadow: var(--ombra-s);
  font-family: var(--f-dato);
  font-size: .8125rem;
  font-weight: 700;
  letter-spacing: 0;
  transition: transform .12s ease, box-shadow .12s ease, background-color .12s ease, color .12s ease;
  /* Quadrato smussato, non pastiglia: a 16px su 44px il marchio diventava
     un cerchio, e un cerchio in mezzo a scatole squadrate e' un altro
     sistema. */
  border-radius: var(--r-s);
}
.marchio:hover .marchio__sigla {
  background: var(--accento);
  color: var(--on-accento);
  transform: var(--premi-s);
  box-shadow: 0 0 0 0 transparent;
}
.marchio__nome {
  font-family: var(--f-display);
  font-size: .9375rem;
  font-weight: 700;
  letter-spacing: -.01em;
}

.nav__lista { display: flex; align-items: center; gap: clamp(4px, .8vw, 12px); }
.nav__lista a {
  display: block;
  padding: 8px 12px;
  border: 2px solid transparent;
  font-family: var(--f-dato);
  font-size: var(--t-label);
  font-weight: 700;
  letter-spacing: .12em;
  text-transform: uppercase;
  transition: background-color .12s ease, color .12s ease, border-color .12s ease, box-shadow .12s ease, transform .12s ease;
  border-radius: var(--r-s);
}
.nav__lista a:hover, .nav__lista a:focus-visible,
.nav__lista .current-menu-item > a, .nav__lista [aria-current="page"] {
  background: var(--comando);
  color: var(--on-comando);
  border-color: #000;
}

/* Avanzamento di lettura: animazione scroll-driven nativa, zero JavaScript. */
/* Niente bordo proprio: la trave sotto all'intestazione e' gia' quella di
   .testa, e sommandole veniva una doppia riga non voluta. */
.avanzamento { display: none; height: 6px; background: var(--bg); }
.avanzamento span {
  display: block;
  height: 100%;
  background: var(--accento);
  transform: scaleX(0);
  transform-origin: 0 50%;
}
@supports (animation-timeline: scroll()) {
  .avanzamento { display: block; }
  .avanzamento span { animation: avanza linear both; animation-timeline: scroll(root block); }
}
@keyframes avanza { to { transform: scaleX(1); } }

.tema-btn, .nav-btn {
  display: grid;
  place-items: center;
  flex: none;
  width: 44px; height: 44px;
  color: var(--text);
  background: var(--surface);
  border: var(--b) solid var(--line);
  box-shadow: var(--ombra-s);
  transition: transform .12s ease, box-shadow .12s ease, background-color .12s ease, color .12s ease;
  border-radius: var(--r);
}
.tema-btn svg { width: 18px; height: 18px; }
.tema-btn:hover, .nav-btn:hover, .tema-btn:active, .nav-btn:active {
  background: var(--comando);
  color: var(--on-comando);
  border-color: #000;
  transform: var(--premi-s);
  box-shadow: 0 0 0 0 #000;
}

.nav-btn { display: none; }
.nav-btn__icona { display: grid; gap: 4px; width: 18px; }
.nav-btn__icona i { display: block; height: 3px; background: currentColor; transition: transform .16s ease; }
.nav-btn[aria-expanded="true"] { background: var(--comando); color: var(--on-comando); border-color: #000; }
.nav-btn[aria-expanded="true"] .nav-btn__icona i:first-child { transform: translateY(3.5px) rotate(45deg); }
.nav-btn[aria-expanded="true"] .nav-btn__icona i:last-child { transform: translateY(-3.5px) rotate(-45deg); }

.nav-mobile {
  background: var(--bg);
  border-top: var(--b) solid var(--line);
  animation: pannello .16s ease-out;
}
.nav-mobile[hidden] { display: none; }
.nav-mobile__lista a {
  display: flex;
  align-items: center;
  min-height: 64px;
  padding: 10px 12px;
  border-bottom: var(--b) solid var(--line);
  font-family: var(--f-display);
  font-size: 1.5rem;
  font-weight: 700;
  letter-spacing: -.02em;
}
.nav-mobile__lista a:hover { background: var(--comando); color: var(--on-comando); }
.nav-mobile__email {
  display: inline-block;
  padding: 20px 0 24px;
  color: var(--text-muted);
  font-family: var(--f-dato);
  font-size: var(--t-label);
  text-decoration: underline;
  text-underline-offset: 4px;
}
@keyframes pannello { from { opacity: 0; transform: translateY(-6px); } }

/* ---------- 8. HOME --------------------------------------------------- */


/* --- Hero: 7 colonne di copy, 5 di visuale --- */
.hero {
  padding-block: clamp(48px, 6.5vw, 112px) clamp(56px, 7vw, 124px);
}
.hero__griglia { align-items: center; row-gap: clamp(40px, 5vw, 64px); }
.hero__copy { grid-column: span 7; }
.hero__visuale { position: relative; grid-column: 8 / -1; }

/* Una tessera sola, appoggiata sopra alla cella del modello. Ce n'erano
   quattro: con la barra WebGL, l'adesivo "Trascinami" e il riquadro delle
   iniziali facevano sette oggetti bordati in una schermata sola, e la hero
   non respirava piu'. Resta questa, che porta il colore dove il resto della
   colonna e' nero su crema. Sotto i 640px sparisce: su schermo stretto non
   c'e' margine in cui sporgere. */
.deco {
  position: absolute;
  z-index: 2;
  display: grid;
  place-items: center;
  padding: 10px 14px;
  border: var(--b) solid #000;
  box-shadow: 5px 5px 0 0 #000;
  border-radius: var(--r);
  font-family: var(--f-dato);
  font-size: clamp(.9rem, .8rem + .4vw, 1.15rem);
  font-weight: 700;
  letter-spacing: .02em;
  color: var(--on-accento);
  pointer-events: none;
}
/* Il badge sta a DESTRA, agganciato al filo con uno sporgere misurato e non
   con un -28px scelto a occhio: la colonna del modello arriva al filo del
   contenitore, e sporgere di meta' (28px) piu' i 5px d'ombra faceva
   scrollare la pagina di lato a 1440 e a 1280. Cosi' sporge sempre 12px
   meno del margine di pagina, ombra compresa.
   Prima qui c'era il terminale >_ e il badge stava a sinistra: due glifi di
   codice affiancati dicevano la stessa cosa due volte, e a sinistra ora c'e'
   una finestrella che quella cosa la mostra invece di alluderci. */
.deco--codice {
  top: 15%;
  right: calc(12px - var(--gutter));
  background: var(--accento);
  color: var(--on-accento);
  /* La spaziatura estesa serviva alla parola in maiuscoletto: su tre segni
     di codice allarga solo le fessure. */
  letter-spacing: 0;
  rotate: 5deg;
}

/* --- La finestrella di codice --------------------------------------------
   Costruita con i pezzi del sistema e non con pezzi nuovi: contorno nero,
   raggio --r, ombra netta, e in cima gli stessi tre quadretti della cornice
   del modello. Il fondo viola e' l'unica superficie piena della hero, come
   il blocco della CTA e' l'unica in fondo alla pagina.
   Sporge dal fianco SINISTRO della colonna: li' c'e' la gronda fra le due
   colonne, quindi puo' uscire senza rischiare l'overflow.
   Il testo dentro usa l'inchiostro #111, che sul nuovo viola arriva a
   5.07:1; la sintassi resta monocromatica e il commento si distingue in
   corsivo, che e' come lo si e' sempre distinto prima che esistessero gli
   editor a colori.
   Lime, rosa e giallo restano dentro alla finestrella, ma nei tre
   quadretti della barra, dove il fondo e' chiaro e reggono benissimo. */
.editor {
  position: absolute;
  z-index: 3;
  /* Quanto sporge a sinistra non e' un valore a occhio: la figura dentro
     alla finestra e' stata misurata sullo screenshot del sito vero, e dal
     busto ai piedi occupa il 39-58% della larghezza della cornice. La
     finestrella deve chiudere PRIMA di quel 39%, o le finisce sulla gamba.
     Con questo scarto il suo filo destro si ferma intorno al 36-37% a ogni
     larghezza da 1024 in su. Sporge verso l'interno della pagina, nella
     gronda fra le due colonne, quindi non puo' causare overflow. */
  left: clamp(-84px, -6.2vw, -34px);
  bottom: 9%;
  width: clamp(196px, 19vw, 286px);
  overflow: hidden;
  background: var(--comando);
  color: var(--on-comando);
  border: var(--b) solid #000;
  box-shadow: 5px 5px 0 0 #000;
  border-radius: var(--r);
  rotate: -2deg;
  pointer-events: none;
}
/* La barra e' carta FISSA, non var(--bg): la finestrella e' un oggetto a
   campitura piena come le tessere e i bottoni, e quelli non si ribaltano
   col tema — hanno gia' il contorno in #000 per la stessa ragione. Con
   var(--bg) al buio la barra diventava quasi il colore della pagina e la
   scheda sembrava bucata in cima. */
.editor__barra {
  display: flex;
  align-items: center;
  gap: 6px;
  height: 28px;
  padding-inline: 11px;
  background: #F3F0E8;
  border-bottom: var(--b) solid #000;
}
.editor__barra i { width: 8px; height: 8px; border: 2px solid #000; border-radius: 2px; }
.editor__barra i:nth-child(1) { background: var(--lime); }
.editor__barra i:nth-child(2) { background: var(--rosa); }
.editor__barra i:nth-child(3) { background: var(--giallo); }
.editor__codice {
  margin: 0;
  padding: 14px 15px 16px;
  font-family: var(--f-mono);
  /* Non e' testo da leggere ma da riconoscere: sotto gli 11px diventa una
     texture, sopra i 13 la scatola cresce e copre il modello. */
  font-size: clamp(11px, .78vw, 13px);
  font-weight: 600;
  line-height: 1.6;
  white-space: pre;
}
.editor__nota   { font-style: italic; }
.editor__chiave { font-weight: 700; }
.hero__saluto {
  display: flex;
  align-items: center;
  gap: 14px;
  margin-bottom: clamp(24px, 2.6vw, 36px);
}
/* Il nome in viola: distingue il saluto dal titolo senza metterci intorno
   una cornice. Prima accanto c'era un riquadro con le iniziali, cioe'
   un altro blocco bordato sopra a un titolo gia' grosso. */
.hero__saluto-testo { color: var(--viola-testo); }

/* La manina del saluto: l'unico emoji del sito, e saluta davvero. Grande
   quanto una riga di testo, non quanto l'etichetta accanto: in em ereditava
   dal paragrafo e a 41px diventava lui il primo elemento della hero.
   Saluta TRE volte e si ferma. Era in loop infinito: un elemento che si
   muove per sempre tiene sveglio il compositore per tutta la sessione e,
   dopo il terzo giro, non e' piu' personalita' — e' un tic. */
.saluto {
  display: inline-block;
  line-height: 1;
  font-size: clamp(1.5rem, 1.3rem + .6vw, 2rem);
  transform-origin: 70% 80%;
  animation: saluta 3.2s ease-in-out 1s 3;
}
@keyframes saluta {
  0%, 60%, 100% { transform: rotate(0deg); }
  65% { transform: rotate(14deg); }
  70% { transform: rotate(-8deg); }
  75% { transform: rotate(14deg); }
  80% { transform: rotate(-4deg); }
  85% { transform: rotate(10deg); }
}

.hero__intro { margin-top: clamp(22px, 2.4vw, 32px); max-width: 50ch; }
.hero__azioni {
  display: flex;
  flex-wrap: wrap;
  align-items: center;
  gap: 14px clamp(14px, 1.6vw, 20px);
  margin-top: clamp(28px, 3vw, 40px);
}

.hero__social { display: flex; align-items: center; gap: 10px; }
.hero__social a {
  display: grid;
  place-items: center;
  width: 46px; height: 46px;
  color: var(--text);
  background: var(--surface);
  border: var(--b) solid var(--line);
  box-shadow: var(--ombra-s);
  transition: transform .12s ease, box-shadow .12s ease, background-color .12s ease, color .12s ease;
  border-radius: var(--r);
}
.hero__social svg { width: 19px; height: 19px; }
.hero__social a:hover, .hero__social a:focus-visible {
  background: var(--comando);
  color: var(--on-comando);
  border-color: #000;
  transform: var(--premi-s);
  box-shadow: 0 0 0 0 #000;
}

/* --- Modello 3D --- */
.modello {
  position: relative;
  display: flex;
  flex-direction: column;
  background: var(--surface);
  border: var(--b) solid var(--line);
  box-shadow: var(--ombra-xl);
  border-radius: var(--r);
}
/* Tre quadretti al posto di tre etichette: la cornice resta una cornice, ma
   smette di descrivere a parole quello che il modello fa da solo. E' anche
   piu' bassa, e quei quindici pixel vanno al modello. */
.modello__barra {
  display: flex;
  align-items: center;
  gap: 8px;
  padding: 10px 14px;
  border-bottom: var(--b) solid var(--line);
}
.modello__barra i { width: 11px; height: 11px; border: 2px solid var(--line); border-radius: 3px; }
.modello__barra i:nth-child(1) { background: var(--lime); }
.modello__barra i:nth-child(2) { background: var(--stato); }
.modello__barra i:nth-child(3) { background: var(--comando); }

/* Il raggio interno e' quello esterno meno il contorno. Senza, gli spigoli
   vivi di questo riquadro pieno spuntavano sopra alla curva nera del
   riquadro che lo contiene: si vedeva a 16px, non si vedeva a 6px. */
.modello3d {
  position: relative;
  /* Il modello e' il protagonista della meta' destra: il riquadro si allunga
     e prende piu' schermo in verticale. Era 60svh e la figura galleggiava in
     mezzo a un terzo di vuoto. */
  aspect-ratio: 5 / 6.4;
  max-height: 74svh;
  overflow: hidden;
  background: var(--surface);
  border-radius: 0 0 calc(var(--r) - var(--b)) calc(var(--r) - var(--b));
}
.modello3d canvas { width: 100%; height: 100%; touch-action: pan-y; }
.modello3d__stato {
  position: absolute;
  inset: 0;
  display: grid;
  place-items: center;
  padding: 20px;
  color: var(--text-muted);
  font-family: var(--f-dato);
  font-size: var(--t-micro);
  font-weight: 700;
  letter-spacing: .12em;
  text-align: center;
  text-transform: uppercase;
}
.modello3d.is-caricato .modello3d__stato { display: none; }


/* --- Stack: tre tab da quattro voci --- */
/* Dodici schede tutte aperte erano leggibili una per una, ma come blocco
   unico chiedevano una schermata di scorrimento per dire una cosa sola. Con
   tre gruppi da quattro il pannello e' sempre una riga. */
/* Il distacco fra sezioni appartiene alla testata che segue. Queste sezioni
   non aggiungono una seconda coda uguale, altrimenti due token consecutivi
   raddoppiano il vuoto fra contenuto e titolo successivo. */
.tools, .metodo, .percorso { padding-bottom: 0; }

.tools__barra {
  display: flex;
  gap: clamp(8px, 1vw, 14px);
  margin-bottom: clamp(24px, 2.8vw, 40px);
  padding-bottom: 6px;
  overflow-x: auto;
  scrollbar-width: none;
}
.tools__barra::-webkit-scrollbar { display: none; }
.tools__tab {
  flex: none;
  padding: 13px clamp(16px, 1.6vw, 22px);
  background: var(--surface);
  color: var(--text);
  border: var(--b) solid var(--line);
  box-shadow: var(--ombra-s);
  border-radius: var(--r);
  font-family: var(--f-dato);
  font-size: var(--t-ui);
  font-weight: 700;
  letter-spacing: .12em;
  text-transform: uppercase;
  white-space: nowrap;
  transition: transform .12s ease, box-shadow .12s ease, background-color .12s ease, color .12s ease, border-color .12s ease;
}
.tools__tab:hover, .tools__tab:focus-visible { transform: var(--premi-s); box-shadow: 0 0 0 0 transparent; }
/* La tab scelta e' campitura piena e ombra assente. Non la sposto di 3px
   come gli altri elementi premuti: e' il primo elemento della colonna, e
   traslata usciva dalla linea di griglia. */
.tools__tab[aria-selected="true"] {
  background: var(--accento);
  color: var(--on-accento);
  border-color: #000;
  box-shadow: 0 0 0 0 transparent;
}
/* La tab scelta e' gia' premuta: passarci sopra non la sposta di altri 3px,
   o esce dalla linea di griglia. */
.tools__tab[aria-selected="true"]:hover { transform: none; }

/* Senza JavaScript la barra non compare e i tre gruppi restano impilati,
   ognuno col proprio titolo. Con .js succede l'opposto. */
.tools__barra { display: none; }
.js .tools__barra { display: flex; }
.tools__pannello + .tools__pannello { margin-top: clamp(32px, 3.6vw, 52px); }
.js .tools__pannello + .tools__pannello { margin-top: 0; }
.tools__pannello[hidden] { display: none; }
.tools__pannello:focus-visible { outline-offset: 6px; }
.tools__titolo {
  margin-bottom: clamp(16px, 1.8vw, 24px);
  font-family: var(--f-display);
  font-size: var(--t-h3);
  font-weight: 700;
  letter-spacing: -.02em;
}
.js .tools__titolo {
  position: absolute;
  width: 1px; height: 1px;
  margin: 0;
  overflow: hidden;
  clip: rect(0, 0, 0, 0);
  white-space: nowrap;
}
/* Corta e su una proprieta' sola: uno scostamento faceva ballare la griglia
   mentre l'opacita' saliva. */
.js .tools__pannello.is-entra { animation: toolsEntra .14s ease-out both; }
@keyframes toolsEntra { from { opacity: 0; } to { opacity: 1; } }

.tools__griglia {
  display: grid;
  grid-template-columns: repeat(4, minmax(0, 1fr));
  gap: clamp(14px, 1.5vw, 20px);
}
/* Piu' respiro e meno densita': il nome sale, la descrizione scende.
   Le card grandi hanno un solo bordo leggero e nessuna ombra a riposo:
   il carattere neo-brutalist entra solo nell'hover. */
.tool {
  display: grid;
  align-content: start;
  gap: clamp(12px, 1.1vw, 16px);
  min-height: 152px;
  padding: clamp(24px, 2.1vw, 32px) clamp(22px, 1.9vw, 30px);
  background: var(--surface);
  border: var(--b-card) solid var(--line);
  box-shadow: none;
  border-radius: var(--r);
  transition: transform .22s var(--ease-out), box-shadow .22s var(--ease-out), border-color .22s var(--ease-out);
}
/* Loghi a colore di marchio e alla loro misura vera. La variante scura entra
   solo dove il colore originale sparirebbe sul fondo notturno. */
.tool__logo { width: 36px; height: 36px; flex: none; color: var(--logo, currentColor); }
[data-theme="dark"] .tool__logo { color: var(--logo-scuro, var(--logo, currentColor)); }
/* Marchi fatti di piu' forme: si stampano interi, coi colori loro. */
.tool__logo--intero { color: inherit; }
/* Chi un logo non ce l'ha porta una sigla, ma senza campitura: contorno e
   basta, cosi' sta sulla stessa riga visiva dei loghi. */
.tool__sigla {
  display: grid;
  place-items: center;
  min-width: 40px; height: 36px;
  padding-inline: 6px;
  flex: none;
  background: transparent;
  color: var(--text);
  border: 2px solid var(--line);
  border-radius: var(--r-s);
  font-family: var(--f-dato);
  font-size: 11px;
  font-weight: 700;
}
.tool__testa { display: flex; align-items: center; gap: 14px; }
.tool__nome { font-size: clamp(1.125rem, 1.05rem + .25vw, 1.3125rem); font-weight: 700; letter-spacing: -.02em; }
/* 18px pieni da 933px in su, cioe' su tutto il desktop: a 15 la descrizione
   era una didascalia sotto al nome, non una riga da leggere. Sul telefono
   scende a 16, dove la colonna e' una sola e 18 porterebbe ogni scheda a
   quattro righe. La curva e' tarata per arrivare a 18 PRIMA dei 1024, non
   dopo: a 1024 la griglia e' gia' a quattro colonne. */
.tool__testo { color: var(--text-muted); font-size: clamp(1rem, .95rem + .3vw, 1.125rem); line-height: 1.5; text-wrap: pretty; }
/* Al passaggio la scheda si solleva di pochi pixel e compare una sola
   ombra netta, piccola. NON e' il gesto di pressione del sistema — quello dice
   "questo si preme", e una scheda di strumento non si preme: dice solo
   "sei qui sopra". Niente scala e niente cambio di colore, o la griglia
   comincia a respirare mentre ci passi in mezzo.
   Solo dove c'e' un puntatore vero: sul touch il tap lascerebbe la scheda
   sollevata dopo il dito. */
@media (hover: hover) {
  .tool:hover {
    transform: translateY(-3px);
    box-shadow: var(--ombra-card-hover);
  }
}

/* --- Selected work: pista orizzontale -------------------------------
   Non una fila di "card" chiuse: ogni progetto e' composto da una cornice
   immagine identica e da un blocco editoriale sotto. Il bordo sta sulla
   preview — l'oggetto visuale — non intorno a immagine + testo. Cosi' titoli
   e descrizioni di lunghezza diversa non producono scatole di altezze diverse. */
.lavori { overflow: hidden; }
.lavori__controlli { display: flex; align-items: center; gap: clamp(14px, 1.8vw, 24px); }
.lavori__frecce { display: flex; gap: 8px; }
.freccia {
  display: grid;
  place-items: center;
  width: 48px; height: 48px;
  color: var(--text);
  background: var(--surface);
  border: var(--b) solid var(--line);
  box-shadow: var(--ombra-s);
  transition: transform .12s ease, box-shadow .12s ease, background-color .12s ease, color .12s ease, opacity .12s ease;
  border-radius: var(--r);
}
.freccia svg { width: 18px; height: 18px; }
.freccia:hover, .freccia:focus-visible, .freccia:active {
  background: var(--comando);
  color: var(--on-comando);
  border-color: #000;
  transform: var(--premi-s);
  box-shadow: 0 0 0 0 #000;
}
.freccia[disabled] { opacity: .35; pointer-events: none; box-shadow: none; }

.lavori__vuoto { padding-bottom: var(--sezione); }
.lavori__vista {
  overflow-x: auto;
  overflow-y: hidden;
  scroll-snap-type: x mandatory;
  scrollbar-width: none;
  padding-bottom: 0;
}
.lavori__vista::-webkit-scrollbar { display: none; }
.lavori__pista {
  --lavori-gap: clamp(14px, 1.15vw, 20px);
  display: flex;
  gap: var(--lavori-gap);
  align-items: stretch;
  width: max-content;
  padding-inline: max(var(--gutter), (100% - var(--max)) / 2);
  padding-block: 8px 26px;
  scroll-padding-inline: max(var(--gutter), (100% - var(--max)) / 2);
}
/* La pista e' volutamente piu' larga del viewport: due card abbondanti + la
   terza ben visibile danno piu' peso alle immagini e rendono evidente che la
   sezione e' scorrevole. Il gap resta contenuto: massimo 20px, sufficiente a separare le card senza spezzare il ritmo della pista. */
.lavori__pista > li {
  flex: 0 0 clamp(560px, 35vw, 720px);
  min-width: 0;
  scroll-snap-align: start;
}
.scheda-lavoro {
  --scheda-accento: var(--viola);
  position: relative;
  display: grid;
  gap: 0;
  width: 100%;
  min-width: 0;
  height: 100%;
  background: var(--surface);
  border: var(--b-card) solid var(--line);
  border-radius: var(--r);
  box-shadow: none;
  overflow: hidden;
  transition: transform .22s var(--ease-out), box-shadow .22s var(--ease-out), border-color .22s var(--ease-out);
}
.scheda-lavoro--accento-lime { --scheda-accento: var(--lime); }
.scheda-lavoro--accento-rosa { --scheda-accento: var(--rosa); }
.scheda-lavoro--accento-viola { --scheda-accento: var(--viola); }
.scheda-lavoro--accento-azzurro { --scheda-accento: var(--azzurro); }
@media (hover: hover) {
  .scheda-lavoro:hover {
    transform: translateY(-3px);
    box-shadow: 5px 5px 0 #000;
    border-color: var(--scheda-accento);
  }
}
.scheda-lavoro:focus-within { border-color: var(--scheda-accento); }
.scheda-lavoro__media {
  position: relative;
  width: 100%;
  aspect-ratio: 16 / 9;
  overflow: hidden;
  display: grid;
  place-items: center;
  padding: 0;
  background: #fff;
  color: inherit;
  border: 0;
  border-bottom: var(--b-card) solid var(--line);
  border-radius: 0;
  box-shadow: none;
  cursor: pointer;
  appearance: none;
}
.scheda-lavoro__vuoto { color: #1B1B1B; }
.scheda-lavoro__media img {
  width: 100%;
  height: 100%;
  object-fit: cover;
  object-position: center top;
  display: block;
  transition: transform .35s cubic-bezier(.22,1,.36,1);
}
@media (hover: hover) {
  .scheda-lavoro:hover .scheda-lavoro__media img { transform: scale(1.012); }
}
.scheda-lavoro__media:focus-visible {
  outline: var(--b) solid var(--focus);
  outline-offset: -3px;
}
.scheda-lavoro__vuoto {
  display: grid;
  place-items: center;
  width: 100%;
  height: 100%;
  color: var(--text);
  font-family: var(--f-display);
  font-size: clamp(2.5rem, 6vw, 4.5rem);
  font-weight: 700;
  letter-spacing: -.03em;
  text-transform: uppercase;
}
.scheda-lavoro__corpo {
  display: grid;
  grid-template-columns: auto minmax(0, 1fr);
  column-gap: 14px;
  row-gap: 8px;
  align-content: start;
  padding: clamp(18px, 1.7vw, 22px);
}
.scheda-lavoro__numero {
  grid-row: 1 / span 3;
  align-self: start;
  margin-top: 1px;
  padding: 3px 8px;
  background: var(--text);
  color: var(--bg);
  font-family: var(--f-dato);
  font-size: var(--t-label);
  font-weight: 700;
  font-variant-numeric: tabular-nums;
  border-radius: var(--r-s);
}
.scheda-lavoro__categoria {
  grid-column: 2;
  justify-self: start;
  padding: 3px 8px;
  background: var(--scheda-accento);
  color: #111111;
  border: 1px solid #000;
  border-radius: 4px;
  font-family: var(--f-dato);
  font-size: var(--t-ui);
  font-weight: 700;
  letter-spacing: .06em;
  line-height: 1.3;
  text-transform: uppercase;
}
.scheda-lavoro__titolo {
  grid-column: 2;
  min-width: 0;
  margin: 0;
  font-size: clamp(1.35rem, 1.04rem + .75vw, 1.72rem);
  font-family: var(--f-display);
  font-weight: 700;
  letter-spacing: -.03em;
  line-height: 1.04;
}
.scheda-lavoro__apri {
  max-width: 100%;
  display: inline-flex;
  align-items: center;
  gap: .48em;
  padding: 0;
  background: none;
  border: 0;
  color: inherit;
  font: inherit;
  letter-spacing: inherit;
  text-align: left;
  cursor: pointer;
}
.scheda-lavoro__apri:focus-visible {
  outline: 2px solid var(--focus);
  outline-offset: 4px;
  border-radius: 4px;
}
.scheda-lavoro__nome { min-width: 0; }
.scheda-lavoro__freccia {
  flex: none;
  display: inline-grid;
  place-items: center;
  width: 22px;
  height: 22px;
  transform: translateY(.04em);
  transition: transform .18s var(--ease-out);
}
.scheda-lavoro__freccia svg { width: 18px; height: 18px; }
.scheda-lavoro__apri:hover .scheda-lavoro__freccia,
.scheda-lavoro__apri:focus-visible .scheda-lavoro__freccia { transform: translate(4px, .04em); }
.scheda-lavoro__breve {
  grid-column: 2;
  margin: 0;
  max-width: 34ch;
  min-height: 3em;
  color: var(--text-muted);
  font-size: clamp(1rem, .97rem + .14vw, 1.0625rem);
  line-height: 1.5;
  text-wrap: pretty;
  display: -webkit-box;
  -webkit-line-clamp: 2;
  -webkit-box-orient: vertical;
  overflow: hidden;
}

/* --- Archivio progetti ------------------------------------------------
   L'archivio pubblico e' disabilitato: queste regole restano solo come rete
   di sicurezza se il componente viene riusato in una preview editoriale. */
.archivio-lavori { padding-bottom: var(--sezione); }
.lavori__griglia {
  display: grid;
  grid-template-columns: repeat(2, minmax(0, 1fr));
  gap: clamp(24px, 3vw, 48px);
  margin-top: clamp(28px, 3.2vw, 48px);
}
.lavori__griglia > li { min-width: 0; }

.paginazione {
  display: flex;
  flex-wrap: wrap;
  gap: 8px;
  margin-top: clamp(32px, 4vw, 56px);
  font-family: var(--f-dato);
  font-size: var(--t-label);
  font-weight: 700;
  letter-spacing: .1em;
  text-transform: uppercase;
}
.paginazione .page-numbers {
  display: grid;
  place-items: center;
  min-width: 46px;
  min-height: 46px;
  padding-inline: 12px;
  background: var(--surface);
  color: var(--text);
  border: var(--b) solid var(--line);
  box-shadow: var(--ombra-s);
  border-radius: var(--r-s);
  text-decoration: none;
  transition: transform .12s var(--ease-out), box-shadow .12s var(--ease-out);
}
.paginazione .page-numbers:hover,
.paginazione .page-numbers:focus-visible { transform: var(--premi-s); box-shadow: 0 0 0 0 var(--ombra-colore); }
.paginazione .current {
  background: var(--accento);
  color: var(--on-accento);
  border-color: #000;
  box-shadow: 0 0 0 0 transparent;
}

/* --- Finestra di dettaglio ---------------------------------------------
   Desktop: immagine ferma a sinistra, contenuto che scorre a destra.
   Mobile: immagine in alto e una sola area di contenuto scrollabile. Il
   pulsante di chiusura resta sempre raggiungibile perche' il pannello non e'
   l'elemento che scorre. */
.dett {
  width: min(1320px, calc(100vw - var(--gutter) * 2));
  max-width: none;
  height: min(90svh, 900px);
  max-height: 90svh;
  padding: 0;
  background: transparent;
  border: 0;
  overflow: visible;
}
.dett::backdrop { background: rgba(10, 10, 14, .74); }
.dett__pannello {
  position: relative;
  display: grid;
  grid-template-columns: minmax(0, .92fr) minmax(0, 1.08fr);
  width: 100%;
  height: 100%;
  max-height: inherit;
  overflow: hidden;
  background: var(--surface);
  color: var(--text);
  border: var(--b) solid var(--line);
  box-shadow: var(--ombra-xl);
  border-radius: var(--r);
}
.dett__pannello:focus { outline: none; }
.dett__chiudi {
  position: absolute;
  z-index: 6;
  top: 14px;
  right: 14px;
  display: grid;
  place-items: center;
  width: 44px;
  height: 44px;
  background: var(--bg);
  color: var(--text);
  border: var(--b) solid var(--line);
  box-shadow: var(--ombra-s);
  border-radius: var(--r-s);
  cursor: pointer;
  transition: transform .12s var(--ease-out), box-shadow .12s var(--ease-out), background-color .12s var(--ease-mite), color .12s var(--ease-mite);
}
.dett__chiudi svg { width: 20px; height: 20px; }
.dett__chiudi:hover, .dett__chiudi:focus-visible {
  background: var(--text);
  color: var(--bg);
  transform: var(--premi-s);
  box-shadow: 0 0 0 0 var(--ombra-colore);
}
.dett__media {
  min-width: 0;
  height: 100%;
  overflow: auto;
  display: grid;
  align-content: start;
  gap: 18px;
  padding: clamp(22px, 2vw, 28px);
  background: #fff;
  border-right: var(--b) solid var(--line);
}
.dett__mockup {
  margin: 0;
  display: grid;
  gap: 0;
  background: var(--surface);
  border: 2px solid var(--line);
  border-radius: var(--r-s);
  overflow: hidden;
}
.dett__mockup--desktop { min-height: 0; }
.dett__mockup--mobile {
  width: min(100%, 280px);
  justify-self: end;
  border-radius: 26px;
}
.dett__mockup-barra {
  display: flex;
  gap: 8px;
  align-items: center;
  padding: 12px 14px;
  background: var(--bg);
  border-bottom: 2px solid var(--line);
}
.dett__mockup-barra span {
  width: 10px;
  height: 10px;
  border-radius: 999px;
  border: 2px solid var(--line);
}
.dett__mockup-barra span:nth-child(1) { background: var(--lime); }
.dett__mockup-barra span:nth-child(2) { background: var(--rosa); }
.dett__mockup-barra span:nth-child(3) { background: var(--viola); }
.dett__mockup-schermo {
  display: grid;
  place-items: center;
  text-align: center;
  gap: 10px;
  padding: clamp(18px, 3vw, 26px);
  background-image: linear-gradient(rgba(0,0,0,.05) 1px, transparent 1px), linear-gradient(90deg, rgba(0,0,0,.05) 1px, transparent 1px);
  background-size: 22px 22px;
}
.dett__mockup-schermo--desktop { aspect-ratio: 4 / 5; }
.dett__mockup-schermo--mobile { aspect-ratio: 9 / 16; }
.dett__mockup-kicker {
  display: inline-flex;
  align-items: center;
  justify-content: center;
  padding: 6px 10px;
  background: var(--lime);
  color: var(--on-lime);
  border: 2px solid var(--line);
  border-radius: 999px;
  font-family: var(--f-dato);
  font-size: .78rem;
  font-weight: 700;
  letter-spacing: .08em;
  text-transform: uppercase;
}
.dett__mockup strong {
  display: block;
  max-width: 14ch;
  font-family: var(--f-display);
  font-size: clamp(1.2rem, 1rem + .8vw, 1.8rem);
  line-height: 1.04;
  letter-spacing: -.03em;
}
.dett__mockup small {
  display: block;
  max-width: 28ch;
  color: var(--text-muted);
  font-size: .98rem;
  line-height: 1.45;
 }
.dett__corpo {
  min-width: 0;
  min-height: 0;
  overflow-y: auto;
  overscroll-behavior: contain;
  scrollbar-gutter: stable;
  scrollbar-width: thin;
  display: grid;
  align-content: start;
  gap: clamp(16px, 1.6vw, 22px);
  padding: clamp(30px, 3vw, 46px) clamp(24px, 3vw, 44px) clamp(34px, 3.4vw, 54px);
}
.dett__categoria { color: var(--text-muted); padding-right: 60px; }
.dett__titolo {
  margin: 0;
  padding-right: 56px;
  font-family: var(--f-display);
  font-size: clamp(2rem, 1.25rem + 1.8vw, 3.1rem);
  font-weight: 700;
  line-height: 1.02;
  letter-spacing: -.04em;
  text-wrap: balance;
}
.dett__occhiello {
  margin: 0;
  max-width: 50ch;
  font-size: var(--t-lead);
  line-height: 1.48;
  text-wrap: pretty;
}
.dett__sezione {
  display: grid;
  gap: 12px;
  padding-top: clamp(8px, 1vw, 14px);
  border-top: 2px solid var(--line);
}
.dett__testo {
  max-width: 64ch;
  color: var(--text-muted);
  font-size: var(--t-corpo);
  line-height: 1.72;
  text-wrap: pretty;
}
.dett__testo p { margin: 0 0 1em; }
.dett__testo > :first-child { margin-top: 0; }
.dett__testo > :last-child { margin-bottom: 0; }
.dett__sottotitolo {
  margin: 0 0 10px;
  font-family: var(--f-display);
  font-size: var(--t-h3);
  font-weight: 700;
  letter-spacing: -.02em;
}
.dett__punti { display: grid; gap: 0; }
.dett__punti ul {
  display: grid;
  grid-template-columns: repeat(2, minmax(0, 1fr));
  gap: 8px;
  margin: 0;
  padding: 0;
  list-style: none;
}
.dett__punti li {
  display: grid;
  grid-template-columns: auto minmax(0, 1fr);
  gap: 10px;
  align-items: start;
  padding: 10px 12px;
  background: var(--bg);
  border: 2px solid var(--line);
  border-radius: var(--r-s);
  font-size: var(--t-corpo);
  line-height: 1.4;
  text-wrap: pretty;
}
.dett__punti svg { width: 16px; height: 16px; margin-top: .16em; color: var(--viola-testo); }
.dett__dati {
  display: grid;
  grid-template-columns: repeat(auto-fit, minmax(120px, 1fr));
  gap: 14px 20px;
  margin: 2px 0 0;
  padding-top: clamp(14px, 1.5vw, 20px);
  border-top: 2px solid var(--line);
}
.dett__dati dt { margin-bottom: 4px; color: var(--text-muted); }
.dett__dati dd { margin: 0; font-weight: 700; letter-spacing: -.01em; }
.dett__stack { display: grid; gap: 10px; }
.dett__stack .etichetta { color: var(--text-muted); }
.dett__azione { margin: 4px 0 0; }
.dett__galleria {
  display: grid;
  grid-template-columns: repeat(2, minmax(0, 1fr));
  gap: 10px;
  margin-top: 4px;
  padding: 0;
  list-style: none;
}
.dett__galleria li {
  overflow: hidden;
  display: grid;
  background: #fff;
  border: 2px solid var(--line);
  border-radius: var(--r-s);
}
.dett__galleria img {
  width: 100%;
  height: 100%;
  aspect-ratio: 16 / 10;
  object-fit: contain;
  object-position: center top;
  display: block;
  background: #fff;
}

/* Il corpo non scorre dietro alla finestra. showModal() rende inerte il
   resto della pagina ma non ferma lo scorrimento, e su iOS il fondo
   scivolerebbe sotto al pannello. */
html.is-bloccato { overflow: hidden; }

/* --- Percorso --- */
/* Tre colonne: quando / chi-dove / cosa. Prima era due, e il testo finiva
   tutto a sinistra lasciando mezza riga vuota a destra. */
.tappa {
  position: relative;
  display: grid;
  grid-template-columns: minmax(150px, 1.6fr) minmax(0, 3fr) minmax(0, 4.4fr);
  column-gap: clamp(20px, 2.6vw, 48px);
  padding: clamp(32px, 3.4vw, 52px) 0;
  border-top: var(--b) solid var(--line);
}
/* Il primo elemento non porta un filo in cima: la testata e il suo spazio
   inferiore separano gia' titolo ed elenco senza una linea decorativa. */
.tappa:first-child { border-top: 0; }
/* Il padding della riga sta FRA due righe. In fondo all'elenco non c'e' piu'
   niente da separare, e sommandosi a quello della sezione portava la coda del
   Percorso a 137px contro i 97px di ogni altra sezione. */
.tappa:last-child { padding-bottom: 0; }
.tappa__quando {
  display: flex;
  align-items: center;
  gap: 10px;
  align-self: start;
  font-family: var(--f-dato);
  font-size: var(--t-ui);
  font-weight: 700;
  letter-spacing: .02em;
  font-variant-numeric: tabular-nums;
  text-transform: uppercase;
}
/* La tappa in corso porta il quadrato rosa, la stessa lingua dello stato
   nella hero e del blocco "In questo periodo". */
.tappa--ora .tappa__quando::before {
  content: "";
  width: 11px; height: 11px;
  flex: none;
  background: var(--stato);
  border: 2px solid #000;
  border-radius: 3px;
}
.tappa__corpo { display: grid; gap: 8px; align-content: start; }
.tappa__testi { display: grid; gap: clamp(14px, 1.4vw, 20px); align-content: start; }
.tappa__ruolo {
  display: flex;
  align-items: baseline;
  flex-wrap: wrap;
  gap: 6px 14px;
  font-size: clamp(1.25rem, 1.05rem + .8vw, 1.75rem);
  font-family: var(--f-display);
  font-weight: 700;
  letter-spacing: -.02em;
  line-height: 1.12;
}
/* L'azienda era un badge a campitura piena: pesava piu' del ruolo, e il
   ruolo e' l'informazione. Ora e' testo, secondario per colore e corpo. */
.tappa__dove {
  justify-self: start;
  color: var(--text-muted);
  font-family: var(--f-dato);
  font-size: var(--t-ui);
  font-weight: 700;
  letter-spacing: .1em;
  text-transform: uppercase;
}
.tappa__testo { max-width: 56ch; line-height: 1.55; color: var(--text-muted); text-wrap: pretty; }
/* --- Stack: i marchi, non le parole ------------------------------------
   Prima erano pastiglie di testo in maiuscoletto con un velo di colore
   dietro. Dicevano "WORDPRESS": una parola da leggere per un'informazione
   che il marchio da' in un colpo d'occhio, e su quattro voci facevano una
   riga di rumore sotto al titolo. Ora sono i loghi veri, ai colori loro,
   senza campitura e senza contorno — non sono pulsanti, sono un elenco.

   Chi un logo non ce l'ha (WP-CLI, REST API, un webhook) resta testo, e si
   distingue proprio per questo: e' una parola in mezzo a dei segni. */
.stack-loghi {
  display: flex;
  flex-wrap: wrap;
  align-items: center;
  gap: 8px 16px;
  margin-top: 6px;
}
.stack-loghi__logo { display: grid; place-items: center; }
/* 32px. Provate tre misure affiancate: a 26 i marchi piu' disegnati — la
   mascotte GSAP, la sigla ACF — diventano una macchia e si riconoscono
   solo quelli con una lettera dentro; a 40 comandano la riga piu' del
   titolo del progetto. */
.stack-loghi__logo .tool__logo { width: 32px; height: 32px; }
.stack-loghi__testo {
  color: var(--text-muted);
  font-family: var(--f-dato);
  font-size: var(--t-micro);
  font-weight: 700;
  letter-spacing: .1em;
  text-transform: uppercase;
}

/* --- Manifesto --- */
/* Un poster tipografico, non una sezione con titolo e paragrafo. Niente
   eyebrow, niente titolo di sezione, niente etichette a margine: quello che
   c'e' e' la frase, e la frase e' la sezione.
   Il peso 600 resta editoriale senza diventare il secondo hero. */
/* Il respiro del manifesto se lo porta il manifesto: sommare anche il
   padding di sezione faceva due volte lo stesso vuoto in fondo. */
.manifesto {
  display: grid;
  justify-items: center;
  text-align: center;
  padding-block: clamp(64px, 9vw, 168px);
}
.manifesto__frase {
  /* Piu' largo e leggermente piu' piccolo del giro precedente: la frase e'
     cresciuta da otto a diciotto parole, e a 72px su 1100 sarebbero state
     cinque righe. Cosi' ne restano tre, che e' il ritmo giusto per un
     manifesto: abbastanza da essere una frase, non tante da essere un
     paragrafo. */
  /* A 1920px il font raggiunge il massimo: fermare la misura a 1200px lo
     riportava a quattro righe, una in piu' che a 1440px. I 1320px tengono
     tre righe anche sul monitor largo senza cambiare i breakpoint minori. */
  max-width: 1320px;
  font-family: var(--f-display);
  /* La curva parte piu' bassa e sale piu' in fretta: con il minimo a 32px
     la frase andava a SETTE righe su un telefono, e l'ultima restava una
     parola sola. A 26px ne fa cinque e text-wrap: balance torna a lavorare
     (oltre una certa quantita' di righe il browser lo abbandona). */
  font-size: clamp(1.625rem, 1rem + 2.6vw, 3.75rem);
  font-weight: 600;
  line-height: 1.22;
  letter-spacing: -.03em;
  text-wrap: balance;
}
/* Nel Manifesto sono evidenziatori editoriali: nessun bordo o ombra da
   controllo, solo una campitura stretta dietro alle parole. */
.manifesto__frase .marcato {
  padding: .02em .12em;
  margin-inline: .04em;
  border-radius: 2px;
  box-shadow: none;
}

/* --- Metodo: accordion a colore pieno ---------------------------------
   La sezione cambia mestiere: dove Strumenti e' neutra e tecnica — schede
   bianche, loghi, contorni — qui la pagina prende colore, e poi i Progetti
   tornano alle immagini. E' un'alternanza voluta: tre sezioni di fila
   costruite allo stesso modo si leggono come una sola.

   Una scatola sola, con UN raggio esterno e cinque bande dentro. Le righe non
   hanno raggio proprio: se ce l'avessero, la scatola smetterebbe di essere
   una scatola e diventerebbe una pila di schede, che e' esattamente la
   forma che sta sopra. */
/* La testata e' centrata, ed e' l'unico blocco della pagina che lo e'. Sotto
   c'e' una campitura a tutta larghezza divisa in bande: un titolo allineato
   a sinistra ci sarebbe caduto sopra di sbieco. */
.metodo__testa {
  max-width: 62ch;
  margin-inline: auto;
  padding-block: var(--sezione) clamp(28px, 3.2vw, 46px);
  text-align: center;
}
.metodo__testa .etichetta { justify-content: center; }
.metodo__intro {
  max-width: 54ch;
  margin: clamp(16px, 1.8vw, 24px) auto 0;
  font-size: var(--t-lead);
  line-height: 1.5;
  text-wrap: pretty;
}

.metodo__elenco {
  overflow: hidden;
  border: var(--b) solid #000;
  border-radius: var(--r);
  box-shadow: none;
}
/* Il contorno e' #000 e non --line perche' le cinque bande NON si ribaltano
   col tema: sono le stesse al chiaro e al buio, come i bottoni e le
   tessere della hero. Un filo crema fra due bande colorate sarebbe un
   terzo colore che non c'entra niente. */
.passo {
  --riga: var(--surface);
  --su-riga: var(--text);
  border-bottom: var(--b) solid #000;
}
.passo:last-child { border-bottom: 0; }

/* Ogni banda corrisponde alla sua area: accessibilita', UX, performance,
   design su misura e SEO. Il testo resta #111 su tutte le tinte: e' la
   combinazione con contrasto migliore anche sul viola. */
.passo:nth-child(5n+1) { --riga: var(--giallo);  --su-riga: var(--on-giallo); }
.passo:nth-child(5n+2) { --riga: var(--rosa);    --su-riga: var(--on-rosa); }
.passo:nth-child(5n+3) { --riga: var(--lime);    --su-riga: var(--on-lime); }
.passo:nth-child(5n+4) { --riga: var(--viola);   --su-riga: var(--on-viola); }
.passo:nth-child(5n+5) { --riga: var(--azzurro); --su-riga: var(--on-azzurro); }

.passo__rubrica { margin: 0; font-size: inherit; font-weight: inherit; }

.passo__testa {
  width: 100%;
  min-height: 92px;
  display: grid;
  grid-template-columns: 68px minmax(240px, 380px) minmax(0, 1fr) 46px;
  gap: clamp(14px, 1.8vw, 26px);
  align-items: center;
  padding: 16px clamp(18px, 2vw, 28px);
  background: var(--riga);
  color: var(--su-riga);
  border: 0;
  text-align: left;
  cursor: pointer;
  /* Solo il colore, e solo per l'hover: la riga non si muove e non cambia
     misura, o cinque bande affiancate ballerebbero al passaggio del mouse. */
  transition: filter .2s var(--ease-out);
}
@media (hover: hover) {
  .passo__testa:hover { filter: brightness(1.06); }
}
/* Il focus resta nero e inset: funziona sia sulla banda chiara sia sui
   colori sociali e non dipende dal solo colore per essere percepito. */
.passo__testa:focus-visible {
  outline: var(--b) solid #000;
  outline-offset: calc(var(--b) * -2);
}

.passo__n {
  font-family: var(--f-dato);
  font-size: var(--t-label);
  font-weight: 700;
  letter-spacing: .08em;
  font-variant-numeric: tabular-nums;
}
.passo__titolo {
  font-family: var(--f-display);
  font-size: clamp(1.375rem, 1rem + 1.1vw, 2.125rem);
  font-weight: 700;
  line-height: 1.05;
  letter-spacing: -.03em;
}
/* Niente opacita': la micro-frase e' piu' piccola, non piu' sbiadita. */
.passo__sintesi {
  font-size: var(--t-corpo);
  line-height: 1.35;
  text-wrap: pretty;
}
/* Il titolo della riga aperta prende la sottolineatura: lo stato non e'
   affidato al solo simbolo in fondo alla riga. */
.passo__testa[aria-expanded="true"] .passo__titolo {
  text-decoration: underline;
  text-decoration-thickness: 3px;
  text-underline-offset: 6px;
}

/* Il + e il − sono due linee disegnate, non il carattere tipografico: il
   glifo "+" di una variabile grottesca non e' mai centrato otticamente nel
   suo quadratello, e a fianco di cinque righe si vede. Quando la riga si apre
   la linea verticale non ruota: si chiude su se' stessa dal centro, e
   resta il meno. */
.passo__piu {
  position: relative;
  width: 40px;
  height: 40px;
  justify-self: end;
  border: 2px solid currentColor;
  border-radius: 50%;
}
.passo__piu::before,
.passo__piu::after {
  content: "";
  position: absolute;
  left: 50%;
  top: 50%;
  width: 14px;
  height: 2px;
  margin: -1px 0 0 -7px;
  background: currentColor;
  border-radius: 2px;
  transition: transform .32s var(--ease-out), opacity .2s var(--ease-out);
}
.passo__piu::after { transform: rotate(90deg); }
.passo__testa[aria-expanded="true"] .passo__piu::after {
  opacity: 0;
  transform: rotate(90deg) scaleX(0);
}

/* L'apertura: 0fr → 1fr su una riga di griglia. E' l'unico modo di animare
   "da zero all'altezza del contenuto" senza misurare niente in JavaScript e
   senza il salto di height:auto. visibility toglie il pannello chiuso
   anche dall'albero di accessibilita', e cambia SENZA transizione in
   apertura e a fine transizione in chiusura, o il contenuto resterebbe
   leggibile da tastiera mentre si richiude. */
.passo__pannello {
  display: grid;
  grid-template-rows: 1fr;
  background: var(--riga);
  color: var(--su-riga);
  visibility: visible;
  transition: grid-template-rows .52s var(--ease-out), visibility 0s;
}
.passo__pannello[data-chiuso] {
  grid-template-rows: 0fr;
  visibility: hidden;
  transition: grid-template-rows .42s var(--ease-out), visibility 0s linear .42s;
}
.passo__clip { min-height: 0; overflow: hidden; }
.passo__dentro {
  display: grid;
  grid-template-columns: minmax(0, 1fr) minmax(220px, 30%);
  gap: clamp(24px, 3vw, 56px);
  /* Allineato al titolo, non al numero: la colonna del numero e' larga 54px
     piu' la gronda, e il testo che riparte da li' sembrerebbe una nota. */
  padding-inline: clamp(18px, 2vw, 28px);
  padding-left: calc(68px + clamp(18px, 2vw, 28px) + clamp(14px, 1.8vw, 26px));
  padding-block: clamp(18px, 2vw, 26px) clamp(24px, 2.8vw, 38px);
  /* Solo opacita' e spostamento. Il padding NON entra qui: la riga di
     griglia a 0fr porta gia' il contenitore a zero e .passo__clip lo
     ritaglia, quindi animare anche il padding sarebbe una seconda
     proprieta' di layout sullo stesso elemento per un effetto che non si
     vede. */
  transition: opacity .3s var(--ease-out), transform .3s var(--ease-out);
}
.passo__pannello[data-chiuso] .passo__dentro {
  opacity: 0;
  transform: translateY(-8px);
}
.passo__testo {
  margin: 0;
  max-width: 62ch;
  font-size: var(--t-lead);
  line-height: 1.55;
  text-wrap: pretty;
}
.passo__concreto { border-left: 4px solid currentColor; padding-left: 16px; }
/* L'occhiello nasce grigio (--text-muted): su una banda corallo o viola
   quel grigio non e' piu' un secondario, e' un colore che non c'entra. Qui
   prende il testo della riga, che e' gia' quello misurato per quella
   tinta. */
.passo__concreto .etichetta { margin-bottom: 8px; color: inherit; }
.passo__concreto ul {
  margin: 0;
  padding-left: 18px;
  font-size: var(--t-corpo);
  line-height: 1.7;
}


/* --- Appunti: indice editoriale --- */
.note { padding-bottom: var(--sezione); }
.note__elenco { border-top: 0; }
/* Nell'archivio del blog non c'e' una testata di sezione sopra: li' il filo
   in cima serve ad aprire l'elenco. */
.archivio .note__elenco { border-top: var(--b) solid var(--line); }
.note__elenco > li { border-bottom: var(--b) solid var(--line); }
.nota__link {
  display: grid;
  grid-template-columns: auto minmax(0, 1fr) auto;
  align-items: center;
  gap: 10px clamp(16px, 2.4vw, 40px);
  --nota-bleed: clamp(10px, 1.2vw, 18px);
  padding: clamp(20px, 2.1vw, 30px) var(--nota-bleed);
  margin-inline: calc(var(--nota-bleed) * -1);
  transition: background-color .14s ease, color .14s ease;
}
/* Miniatura sempre presente: con l'immagine in evidenza quando c'e',
   altrimenti con l'illustrazione di riserva del tema. Un elenco che alterna
   righe con e senza immagine perde il ritmo. */
.nota__media {
  grid-row: 1 / span 2;
  display: grid;
  place-items: center;
  width: clamp(92px, 11vw, 132px);
  aspect-ratio: 3 / 2;
  overflow: hidden;
  background: var(--surface);
  border: var(--b-card) solid var(--line);
  box-shadow: none;
  border-radius: var(--r-s);
}
.nota__media img { width: 100%; height: 100%; object-fit: cover; }
.nota__media .nota__riserva { padding: 8px; object-fit: contain; }

.nota__meta {
  display: flex;
  flex-wrap: wrap;
  align-items: center;
  gap: 8px 14px;
  font-family: var(--f-dato);
  font-size: var(--t-micro);
  font-weight: 700;
  letter-spacing: .12em;
  text-transform: uppercase;
}
.nota__meta > * + *::before { content: "/"; margin-right: 14px; opacity: .5; }
.nota__titolo {
  font-size: clamp(1.0625rem, .9rem + .7vw, 1.5rem);
  font-family: var(--f-display);
  font-weight: 700;
  letter-spacing: -.02em;
  line-height: 1.14;
  text-wrap: balance;
  transition: transform .16s ease;
}
.nota__freccia {
  grid-column: 3;
  grid-row: 1 / span 2;
  align-self: center;
  display: grid;
  place-items: center;
  font-size: 1.35rem;
  transition: transform .16s var(--ease-out);
}
/* Riga intera in viola: lo stesso gesto del bottone, alla scala di un elenco. */
.nota__link:hover, .nota__link:focus-visible { background: var(--comando); color: var(--on-comando); }
.nota__link:hover .nota__titolo, .nota__link:focus-visible .nota__titolo { transform: translateX(8px); }
.nota__link:hover .nota__freccia, .nota__link:focus-visible .nota__freccia { transform: translate(5px, -5px); }

/* --- Appunti in home: schede, non righe --------------------------------
   Stesso markup dell'elenco, altra composizione. Serve a rompere una
   sequenza: Metodo, Percorso e Appunti erano tre elenchi di righe uno sotto
   l'altro, e tre sezioni costruite allo stesso modo si leggono come una
   sola. Nel blog e negli archivi le righe restano, perche' li' l'elenco e'
   la pagina.
   Le regole stanno tutte su due classi (0,2,0) apposta: devono vincere sugli
   assestamenti di .nota__link che vivono dentro alle media query, senza
   doverli riscrivere breakpoint per breakpoint. */
.note__elenco--schede {
  display: grid;
  grid-template-columns: repeat(3, minmax(0, 1fr));
  gap: clamp(14px, 1.15vw, 20px);
  border-top: 0;
}
.note__elenco--schede > li { border-bottom: 0; }
.note__elenco--schede .nota { height: 100%; }
.note__elenco--schede .nota__link {
  grid-template-columns: minmax(0, 1fr) auto;
  align-content: start;
  height: 100%;
  margin-inline: 0;
  padding: 0;
  overflow: hidden;
  background: transparent;
  border: 0;
  box-shadow: none;
  border-radius: 0;
  transition: transform .18s var(--ease-out), border-color .18s var(--ease-out), background-color .18s var(--ease-out);
}
/* La copertina diventa la fascia alta della scheda: perde contorno, ombra e
   raggio propri, perche' dentro a una scatola bordata sarebbero un secondo
   contorno a pochi pixel dal primo. */
.note__elenco--schede .nota__media {
  grid-column: 1 / -1;
  grid-row: 1;
  width: auto;
  aspect-ratio: 16 / 9;
  border: 0;
  border-bottom: var(--b-card) solid var(--line);
  box-shadow: none;
  border-radius: 0;
}
.note__elenco--schede .nota__meta {
  grid-column: 1 / -1;
  grid-row: 2;
  padding: clamp(18px, 1.9vw, 28px) clamp(18px, 1.9vw, 28px) 0;
}
/* Il titolo spinge in basso la freccia: cosi' le tre schede chiudono alla
   stessa altezza anche con titoli di due o tre righe. */
.note__elenco--schede .nota__titolo {
  grid-column: 1;
  grid-row: 3;
  align-self: start;
  padding: 10px 0 clamp(18px, 1.9vw, 28px) clamp(18px, 1.9vw, 28px);
}
.note__elenco--schede > li { display: grid; }
.note__elenco--schede .nota__freccia {
  grid-column: 2;
  grid-row: 3;
  align-self: end;
  padding: 0 clamp(18px, 1.9vw, 28px) clamp(18px, 1.9vw, 28px) 10px;
}
/* La riga del titolo si prende lo spazio che avanza: le schede finiscono
   tutte sullo stesso filo. */
.note__elenco--schede .nota__link { grid-template-rows: auto auto 1fr; }
/* Le card editoriali non si "premono" come i bottoni: al passaggio si
   sollevano appena. Niente ombra permanente e niente offset marcato, cosi'
   l'illustrazione e la tipografia restano protagoniste. */
.note__elenco--schede .nota__link:hover,
.note__elenco--schede .nota__link:focus-visible {
  background: var(--surface);
  color: var(--text);
  transform: translateY(-2px);
  box-shadow: none;
}
.note__elenco--schede .nota__link:hover .nota__titolo,
.note__elenco--schede .nota__link:focus-visible .nota__titolo { transform: none; }
.note__elenco--schede .nota__link:hover .nota__freccia,
.note__elenco--schede .nota__link:focus-visible .nota__freccia { transform: translate(3px, -3px); }

/* --- Pagina contatti ---------------------------------------------------
   Una colonna sola, centrata. Era a due — testo a sinistra, modulo a
   destra — e su una pagina che ha UNA cosa da far fare due colonne
   dividono l'attenzione fra le due meta' senza che nessuna vinca. In
   colonna l'ordine e' quello in cui si legge: chi sono, come mi trovi, e
   qui sotto il modulo. */
.contatta { padding-bottom: var(--sezione); }
.contatta__griglia {
  display: grid;
  justify-items: center;
  gap: clamp(36px, 4.5vw, 64px);
}
.contatta__lato {
  display: grid;
  justify-items: center;
  gap: clamp(20px, 2.4vw, 30px);
  max-width: 56ch;
  text-align: center;
}
.contatta__intro {
  margin: 0;
  font-size: var(--t-lead);
  line-height: 1.55;
  text-wrap: pretty;
}
.contatta__recapiti {
  display: flex;
  flex-wrap: wrap;
  align-items: center;
  justify-content: center;
  gap: 12px;
  font-style: normal;
}
.contatta__email {
  display: inline-flex;
  align-items: center;
  min-height: 60px;
  padding: 14px 22px;
  background: var(--surface);
  color: var(--text);
  border: var(--b) solid var(--line);
  box-shadow: var(--ombra);
  border-radius: var(--r);
  font-size: var(--t-lead);
  font-weight: 700;
  letter-spacing: -.01em;
  text-decoration: none;
  overflow-wrap: anywhere;
  transition: transform .12s var(--ease-out), box-shadow .12s var(--ease-out), background-color .12s var(--ease-mite), color .12s var(--ease-mite);
}
.contatta__email:hover, .contatta__email:focus-visible {
  background: var(--text);
  color: var(--bg);
  transform: var(--premi);
  box-shadow: 0 0 0 0 var(--ombra-colore);
}
.contatta__profili { display: flex; gap: 12px; }
.contatta__profili a {
  display: grid;
  place-items: center;
  width: 60px; height: 60px;
  background: var(--surface);
  color: var(--text);
  border: var(--b) solid var(--line);
  box-shadow: var(--ombra-s);
  border-radius: var(--r);
  transition: transform .12s var(--ease-out), box-shadow .12s var(--ease-out), background-color .12s var(--ease-mite), color .12s var(--ease-mite);
}
.contatta__profili svg { width: 24px; height: 24px; }
.contatta__profili a:hover, .contatta__profili a:focus-visible {
  background: var(--text);
  color: var(--bg);
  transform: var(--premi-s);
  box-shadow: 0 0 0 0 var(--ombra-colore);
}
.contatta__stato {
  display: flex;
  align-items: center;
  gap: 10px;
  margin: 0;
  font-family: var(--f-dato);
  font-size: var(--t-label);
  font-weight: 700;
  letter-spacing: .1em;
  text-transform: uppercase;
}
.contatta__testo { line-height: 1.6; color: var(--text-muted); }

/* La testata sta nella stessa colonna centrata del resto. */
.contatta .pagina-testa { text-align: center; }
.contatta .pagina-testa .etichetta { justify-content: center; }
.contatta .pagina-testa .display--pagina { margin-inline: auto; }

.contatta__modulo {
  /* Il riquadro non prende tutta la larghezza: un campo lungo 1300px si
     attraversa con gli occhi due volte per capire dove finisce. 720 e' la
     misura oltre la quale un modulo smette di sembrare un modulo. */
  width: 100%;
  max-width: 720px;
  text-align: left;
  padding: clamp(26px, 3.4vw, 48px);
  background: var(--surface);
  border: var(--b) solid var(--line);
  box-shadow: var(--ombra-l);
  border-radius: var(--r);
}
.contatta__modulo-titolo {
  margin: 0 0 clamp(24px, 2.8vw, 34px);
  font-family: var(--f-display);
  font-size: var(--t-h3);
  font-weight: 700;
  letter-spacing: -.02em;
}

/* --- Contact Form 7 ----------------------------------------------------
   CF7 non porta CSS proprio salvo qualche regola sui messaggi: quello che
   si vede e' il foglio del tema applicato ai suoi campi. Niente reset di
   stili altrui, niente !important — si scrive sugli elementi veri.
   I selettori restano sui TAG dentro al modulo invece che sulle classi di
   CF7: le classi cambiano tra versioni del plugin, <input> e <textarea>
   no. */
/* Le regole qui sotto valgono per QUALUNQUE modulo CF7 dentro al riquadro,
   non solo per quello del tema: chi incolla un modulo suo — anche quello
   predefinito del plugin, fatto di <p> e <br> — deve trovarlo gia' vestito.
   La griglia esterna mette i primi due paragrafi (Nome ed Email nel modello
   predefinito) in due colonne e lascia tutto il resto a riga intera. Il
   markup vv-modulo porta la propria griglia interna e occupa entrambe. */
.contatta__modulo .wpcf7-form { display: grid; grid-template-columns: repeat(2, minmax(0, 1fr)); column-gap: 18px; row-gap: 18px; }
.contatta__modulo .wpcf7-form > .vv-modulo,
.contatta__modulo .wpcf7-form > fieldset,
.contatta__modulo .wpcf7-form > .wpcf7-response-output { grid-column: 1 / -1; }
.contatta__modulo label { display: block; }
/* CF7 mette un <br> fra l'etichetta e il campo nel suo modello predefinito:
   con il campo gia' a blocco quel <br> e' una riga vuota in piu'. */
.contatta__modulo .wpcf7-form label br { display: none; }
.contatta__modulo .wpcf7-form-control-wrap { display: block; margin-top: 10px; }
.contatta__modulo .wpcf7-form > p { grid-column: 1 / -1; margin: 0; }
.contatta__modulo .wpcf7-form > p:nth-of-type(-n+2) { grid-column: auto; }

.vv-modulo { display: grid; gap: 18px; }
/* Due campi affiancati per impostazione predefinita, uno sotto l'altro solo
   sul telefono: la soglia e' quella che il foglio usa gia', non una nuova. */
.vv-modulo__riga { display: grid; column-gap: 18px; row-gap: 16px; }
.vv-modulo__riga--due { grid-template-columns: repeat(2, minmax(0, 1fr)); }
/* L'etichetta sta in uno <span> quando porta dentro un "(facoltativo)":
   serve a tenerlo sulla stessa riga del testo. */
.vv-modulo__etichetta { display: block; }
/* Il trattamento dell'etichetta e' sul modulo, non sulla nostra classe:
   cosi' lo prende anche un modulo scritto da zero in bacheca. */
.contatta__modulo label,
.contatta__modulo legend {
  font-family: var(--f-dato);
  font-size: var(--t-label);
  font-weight: 700;
  letter-spacing: .1em;
  line-height: 1.4;
  text-transform: uppercase;
}
.vv-modulo__facolt {
  margin-left: .6em;
  color: var(--text-muted);
  font-weight: 700;
  letter-spacing: .06em;
  text-transform: none;
}

.contatta__modulo input[type="text"],
.contatta__modulo input[type="email"],
.contatta__modulo input[type="tel"],
.contatta__modulo input[type="url"],
.contatta__modulo select,
.contatta__modulo textarea {
  width: 100%;
  min-height: 56px;
  /* Un campo si tocca, quindi va toccato comodo: quattordici pixel dentro
     a un riquadro alto 48 lasciavano il cursore appiccicato al contorno. */
  padding: 15px 18px;
  background: var(--bg);
  color: var(--text);
  border: 2px solid var(--line);
  border-radius: var(--r-s);
  font-family: var(--f-corpo);
  font-size: var(--t-corpo);
  line-height: 1.5;
  /* Niente aspetto di sistema: su iOS gli input arrivano con angoli e
     ombre interne proprie che non c'entrano con questo foglio. */
  appearance: none;
  transition: border-color .14s var(--ease-mite), box-shadow .14s var(--ease-mite), background-color .14s var(--ease-mite);
}
.contatta__modulo textarea { min-height: 190px; resize: vertical; }
.contatta__modulo select {
  /* La freccia e' disegnata qui perche' appearance:none la toglie. Due
     linee in un gradiente: nessun file, nessun font di icone. */
  padding-right: 42px;
  background-image:
    linear-gradient(45deg, transparent 50%, currentColor 50%),
    linear-gradient(135deg, currentColor 50%, transparent 50%);
  background-position: calc(100% - 22px) calc(50% + 2px), calc(100% - 16px) calc(50% + 2px);
  background-size: 6px 6px, 6px 6px;
  background-repeat: no-repeat;
}
.contatta__modulo ::placeholder { color: var(--text-muted); opacity: 1; }

/* Il fuoco non e' un colore in piu': il contorno si ingrossa E compare
   l'anello viola fuori dal campo. Due segnali, uno dei quali e' una forma,
   perche' il solo cambio di tinta non basta a chi non la distingue. */
.contatta__modulo input:focus-visible,
.contatta__modulo select:focus-visible,
.contatta__modulo textarea:focus-visible {
  outline: none;
  background: var(--surface);
  border-color: var(--focus);
  box-shadow: 0 0 0 3px var(--velo-viola);
}

/* Scelta singola: pastiglie premibili, non radio di sistema. Il pallino
   nativo resta, invisibile ma presente, cosi' tastiera e lettori di
   schermo continuano ad averci a che fare. */
/* Le sei scelte stanno in un <fieldset>: e' l'unico modo perche' un lettore
   di schermo legga la domanda prima di ogni opzione invece di sei pastiglie
   senza contesto. Il fieldset perde il suo riquadro di sistema, che qui
   sarebbe un secondo contorno dentro a una scatola gia' bordata. */
.vv-modulo__scelte-gruppo { min-width: 0; margin: 0; padding: 0; border: 0; }
.vv-modulo__scelte-gruppo legend { padding: 0; margin-bottom: 12px; }
.vv-modulo__scelte { display: flex; flex-wrap: wrap; gap: 8px; }
.vv-modulo__scelte .wpcf7-list-item { margin: 0; }
.vv-modulo__scelte .wpcf7-list-item label {
  display: inline-flex;
  align-items: center;
  gap: 9px;
  padding: 11px 16px;
  background: var(--bg);
  border: 2px solid var(--line);
  border-radius: var(--r-s);
  font-size: var(--t-micro);
  cursor: pointer;
  transition: background-color .14s var(--ease-mite), color .14s var(--ease-mite);
}
/* Il pallino a 18px invece dei 13 di sistema: dentro a una pastiglia da
   40px di altezza un puntino da 13 sparisce, e il colore da solo non basta
   a dire quale voce e' scelta. Il bersaglio da toccare resta comunque la
   pastiglia intera, che e' la <label>. */
.vv-modulo__scelte input[type="radio"],
.vv-modulo__scelte input[type="checkbox"] {
  width: 18px;
  height: 18px;
  margin: 0;
  flex: none;
  accent-color: var(--comando);
}
.vv-modulo__scelte .wpcf7-list-item label:has(input:checked) {
  background: var(--accento);
  color: var(--on-accento);
  border-color: #000;
}
.vv-modulo__scelte .wpcf7-list-item label:has(input:focus-visible) {
  outline: var(--b) solid var(--focus);
  outline-offset: 3px;
}

/* Consenso: casella vera accanto a una riga di testo normale, non in
   maiuscoletto — e' una frase da leggere, non un'etichetta. */
.vv-modulo__consenso { margin-top: 2px; }
.vv-modulo__consenso label {
  display: grid;
  grid-template-columns: auto minmax(0, 1fr);
  gap: 12px;
  align-items: start;
  font-family: var(--f-corpo);
  font-size: var(--t-corpo);
  font-weight: 400;
  letter-spacing: normal;
  line-height: 1.5;
  text-transform: none;
}
.vv-modulo__consenso input[type="checkbox"] {
  width: 22px; height: 22px;
  margin: 2px 0 0;
  accent-color: var(--comando);
}
.vv-modulo__consenso .wpcf7-list-item { margin: 0; }

.vv-modulo__invio { margin-top: 6px; }
.contatta__modulo .wpcf7-submit {
  display: inline-flex;
  align-items: center;
  gap: .6em;
  min-height: 56px;
  padding: 14px 28px;
  background: var(--accento);
  color: var(--on-accento);
  border: var(--b) solid #000;
  box-shadow: var(--ombra-n);
  border-radius: var(--r);
  font-family: var(--f-dato);
  font-size: var(--t-label);
  font-weight: 700;
  letter-spacing: .12em;
  text-transform: uppercase;
  cursor: pointer;
  transition: transform .12s var(--ease-out), box-shadow .12s var(--ease-out);
}
.contatta__modulo .wpcf7-submit:hover,
.contatta__modulo .wpcf7-submit:focus-visible,
.contatta__modulo .wpcf7-submit:active { transform: var(--premi); box-shadow: 0 0 0 0 #000; }

/* Errori: non solo rossi. Il campo sbagliato prende il contorno rosa E il
   messaggio scritto sotto, cosi' l'errore resta visibile a chi il rosa non
   lo distingue dal nero. */
.contatta__modulo .wpcf7-not-valid { border-color: var(--stato); background: var(--velo-rosa); }
.contatta__modulo .wpcf7-not-valid-tip {
  display: flex;
  align-items: center;
  gap: 8px;
  margin-top: 8px;
  color: var(--text);
  font-family: var(--f-corpo);
  font-size: var(--t-corpo);
  font-weight: 700;
  letter-spacing: normal;
  text-transform: none;
}
.contatta__modulo .wpcf7-not-valid-tip::before {
  content: "";
  flex: none;
  width: 14px; height: 14px;
  background: var(--stato);
  border: 2px solid var(--line);
  border-radius: 50%;
}

/* I riquadri di esito di CF7 sono un bordo colorato di default: qui
   diventano un blocco del sistema — contorno pieno, ombra netta, e la
   tinta che porta il significato. */
.contatta__modulo .wpcf7-response-output {
  margin: 0;
  padding: 16px 20px;
  border: var(--b) solid var(--line);
  box-shadow: var(--ombra-s);
  border-radius: var(--r);
  font-size: var(--t-corpo);
  line-height: 1.5;
}
.contatta__modulo form.sent .wpcf7-response-output {
  background: var(--accento);
  color: var(--on-accento);
  border-color: #000;
  font-weight: 700;
}
.contatta__modulo form.invalid .wpcf7-response-output,
.contatta__modulo form.unaccepted .wpcf7-response-output,
.contatta__modulo form.payment-required .wpcf7-response-output {
  background: var(--velo-rosa);
  color: var(--text);
}
.contatta__modulo form.failed .wpcf7-response-output,
.contatta__modulo form.aborted .wpcf7-response-output {
  background: var(--velo-rosa);
  color: var(--text);
}
.contatta__modulo .wpcf7-spinner { margin-left: 14px; }

/* ---------- 9. PAGINE ------------------------------------------------- */
.pagina-testa {
  position: relative;
  padding-block: clamp(56px, 6vw, 104px) clamp(36px, 4vw, 64px);
}
/* La testata di pagina non porta un filo sotto. Nell'articolo cadeva a un
   filo di distanza dal contorno della copertina, nei contatti dal contorno
   del primo blocco: due righe nere parallele a pochi pixel l'una dall'altra,
   e nessuna delle due separava niente che il vuoto non separasse gia'.
   Dove un filo serve davvero — l'elenco dell'archivio dopo i filtri — ce l'ha
   l'elemento, non la testata. */
.pagina-testa .etichetta { margin-bottom: clamp(16px, 1.8vw, 24px); }
.pagina-testa__testo { max-width: 54ch; margin-top: clamp(18px, 2vw, 28px); font-size: var(--t-lead); line-height: 1.5; }

.archivio { padding-block: clamp(32px, 4vw, 60px) var(--sezione); }
/* Subito dopo la testata i filtri non ricominciano da capo: la testata ha
   gia' il suo respiro sotto, e sommandoci il padding dell'archivio fra il
   titolo e la prima targhetta restavano centoventi pixel di niente. I
   filtri appartengono al titolo, non all'elenco. */
.pagina-testa + .archivio { padding-top: 0; }
.filtri { display: flex; flex-wrap: wrap; gap: 10px; margin-bottom: clamp(28px, 3vw, 44px); }
.filtri .targhetta { padding: 9px 15px; font-size: var(--t-label); transition: transform .12s ease, box-shadow .12s ease, background-color .12s ease, color .12s ease; }
.filtri .targhetta:hover, .filtri .targhetta:focus-visible { background: var(--comando); color: var(--on-comando); border-color: #000; transform: var(--premi-xs); box-shadow: 0 0 0 0 #000; }

.navigation.pagination { margin-top: clamp(32px, 4vw, 56px); }
.navigation.pagination .nav-links { display: flex; flex-wrap: wrap; gap: 10px; }
.page-numbers {
  display: grid;
  place-items: center;
  min-width: 48px;
  min-height: 48px;
  padding: 0 12px;
  background: var(--surface);
  border: var(--b) solid var(--line);
  box-shadow: var(--ombra-s);
  font-family: var(--f-dato);
  font-size: var(--t-label);
  font-weight: 700;
  transition: transform .12s ease, box-shadow .12s ease, background-color .12s ease, color .12s ease;
  border-radius: var(--r);
}
.page-numbers:hover, .page-numbers:focus-visible { transform: var(--premi-s); box-shadow: 0 0 0 0 transparent; }
.page-numbers.current { background: var(--accento); color: var(--on-accento); border-color: #000; transform: var(--premi-s); box-shadow: none; }

/* --- Articolo --- */
.articolo__meta {
  display: flex;
  flex-wrap: wrap;
  gap: 10px;
  margin-top: clamp(18px, 2vw, 28px);
  font-family: var(--f-dato);
  font-size: var(--t-label);
  font-weight: 700;
  letter-spacing: .12em;
  text-transform: uppercase;
}
.articolo__cover {
  display: grid;
  place-items: center;
  aspect-ratio: 3 / 2;
  overflow: hidden;
  margin-top: clamp(28px, 3vw, 40px);
  width: 100%; border: var(--b) solid var(--line); box-shadow: var(--ombra);
  border-radius: var(--r);
}
.articolo__cover img { width: 100%; height: 100%; object-fit: cover; }
/* L'illustrazione di riserva non va tagliata: respira dentro al riquadro. */
.articolo__cover--riserva { background: var(--surface); }
.articolo__cover--riserva img { height: auto; max-height: 100%; width: auto; max-width: 70%; object-fit: contain; }

/* Impaginazione editoriale: testata centrata, colonna di lettura al centro
   della pagina. Il corpo del testo resta allineato a sinistra — un paragrafo
   lungo centrato non si legge. */
.articolo .pagina-testa { padding-bottom: 0; text-align: center; }
.articolo .pagina-testa .etichetta,
.articolo .articolo__meta { justify-content: center; }
/* Il titolo dell'articolo e' il titolo della PAGINA, non un sottotitolo:
   corpo suo e misura larga. A 20ch un titolo da sessanta battute andava a
   quattro righe strette. */
.articolo .pagina-testa .display--m {
  max-width: 22em;
  margin-inline: auto;
  font-size: clamp(1.75rem, 1.1rem + 2.2vw, 3rem);
}
.articolo .pagina-testa__testo { margin-inline: auto; }
.articolo__cover, .vicini { max-width: 74ch; margin-inline: auto; }

.articolo__contenuto {
  max-width: 62ch;
  margin-inline: auto;
  margin-block: clamp(36px, 4.5vw, 72px);
  font-size: var(--t-lead);
  line-height: 1.65;
}
.articolo__contenuto > * + * { margin-top: 1.1em; }
.articolo__contenuto h2 {
  margin-top: 1.9em;
  font-size: clamp(1.25rem, 1rem + .9vw, 1.75rem);
  font-family: var(--f-display);
  font-weight: 700;
  letter-spacing: -.02em;
  line-height: 1.14;
}
.articolo__contenuto h3 {
  margin-top: 1.6em;
  font-size: clamp(1.0625rem, .95rem + .5vw, 1.3125rem);
  font-family: var(--f-display);
  font-weight: 700;
  letter-spacing: -.015em;
}
.articolo__contenuto a {
  color: inherit;
  background-image: linear-gradient(var(--accento), var(--accento));
  background-repeat: no-repeat;
  background-position: 0 88%;
  background-size: 100% .3em;
  text-decoration: none;
}
.articolo__contenuto a:hover { background-size: 100% 100%; }
.articolo__contenuto ul, .articolo__contenuto ol { padding-left: 1.3em; }
.articolo__contenuto ul { list-style: square; }
.articolo__contenuto ol { list-style: decimal; }
.articolo__contenuto li + li { margin-top: .4em; }
.articolo__contenuto blockquote {
  padding: clamp(18px, 2vw, 28px);
  background: var(--accento);
  color: var(--on-accento);
  border: var(--b) solid #000;
  box-shadow: var(--ombra);
  font-size: 1.05em;
  border-radius: var(--r);
}
.articolo__contenuto pre {
  overflow-x: auto;
  padding: clamp(18px, 2vw, 26px);
  background: var(--text);
  color: var(--bg);
  border: var(--b) solid var(--line);
  box-shadow: var(--ombra);
  font-family: var(--f-dato);
  font-size: .8125rem;
  line-height: 1.7;
  border-radius: var(--r);
}
.articolo__contenuto :not(pre) > code {
  padding: 2px 6px;
  background: var(--surface);
  border: 2px solid var(--line);
  border-radius: var(--r-s);
  font-family: var(--f-dato);
  font-size: .82em;
}
.articolo__contenuto img { border: var(--b) solid var(--line); box-shadow: var(--ombra);
  border-radius: var(--r);
}

.vicini {
  display: grid;
  grid-template-columns: repeat(2, minmax(0, 1fr));
  gap: clamp(14px, 1.6vw, 22px);
  margin-bottom: var(--sezione);
}
.vicini a {
  display: grid;
  gap: 10px;
  padding: clamp(20px, 2vw, 30px);
  background: var(--surface);
  border: var(--b) solid var(--line);
  box-shadow: var(--ombra-s);
  transition: transform .12s ease, box-shadow .12s ease, background-color .12s ease, color .12s ease;
}
.vicini a:hover, .vicini a:focus-visible { background: var(--comando); color: var(--on-comando); border-color: #000; transform: var(--premi-s); box-shadow: 0 0 0 0 #000; }
.vicini strong { font-family: var(--f-display); font-size: 1.0625rem; font-weight: 700; letter-spacing: -.015em; line-height: 1.2; }
.vicini__succ { text-align: right; }
.vicini__succ .etichetta { justify-content: flex-end; }
.vicini a:hover .etichetta { color: inherit; }
.vicini a:only-child { grid-column: 1 / -1; }

/* --- Contatti e 404 --- */
.contatti { display: grid; gap: clamp(14px, 1.6vw, 20px); margin-block: clamp(36px, 4vw, 64px) var(--sezione); }
.contatti__voce {
  display: flex;
  align-items: center;
  justify-content: space-between;
  gap: 16px;
  min-height: 84px;
  padding: 18px 22px;
  background: var(--surface);
  border: var(--b) solid var(--line);
  box-shadow: var(--ombra);
  font-size: clamp(1.0625rem, .9rem + .9vw, 1.5rem);
  font-family: var(--f-display);
  font-weight: 700;
  letter-spacing: -.02em;
  overflow-wrap: anywhere;
  transition: transform .12s ease, box-shadow .12s ease, background-color .12s ease, color .12s ease;
  border-radius: var(--r);
}
.contatti__voce:hover, .contatti__voce:focus-visible { background: var(--comando); color: var(--on-comando); border-color: #000; transform: var(--premi); box-shadow: 0 0 0 0 transparent; }

.non-trovato { padding-block: clamp(80px, 10vw, 160px); }
.non-trovato .bottoni { margin-top: clamp(28px, 3vw, 40px); }

/* ---------- 10. PIEDE ------------------------------------------------- */
/* Quieto. La versione a campitura gialla piena con il nome a tutta pagina
   era un secondo eroe in fondo al sito: rubava attenzione all'ultima cosa
   che uno legge, cioe' come contattarti. Qui il piede fa il piede: sta sul
   fondo normale, il colore resta nei dettagli. */
.piede {
  background: transparent;
  color: var(--text);
}
.piede__interno { padding-block: clamp(48px, 5.5vw, 88px) clamp(20px, 2vw, 30px); }

/* CTA: l'unica campitura piena della pagina. Una sola tinta — con due
   diventa un banner. Il testo usa l'inchiostro scuro misurato sul viola. */
.piede__cta {
  position: relative;
  overflow: hidden;
  padding: clamp(36px, 4.6vw, 84px) clamp(24px, 3.4vw, 64px);
  background: var(--comando);
  color: var(--on-comando);
  border: var(--b) solid #000;
  box-shadow: var(--ombra-l);
  border-radius: var(--r);
  margin-bottom: clamp(28px, 3.2vw, 48px);
}
/* Dentro alla campitura l'etichetta usa lo stesso inchiostro, senza opacita'
   che farebbe perdere contrasto al testo piccolo. */
.piede__cta .etichetta { color: var(--on-comando); margin-bottom: clamp(18px, 2vw, 28px); }
.piede__cta .etichetta,
.piede__titolo,
.piede__invito,
.piede__riga { position: relative; z-index: 1; }
.piede__titolo {
  max-width: 16ch;
  font-size: clamp(2.25rem, 1.4rem + 3.4vw, 4.5rem);
  font-family: var(--f-display);
  font-weight: 700;
  line-height: 1;
  letter-spacing: -.035em;
  text-wrap: balance;
}
.piede__invito {
  max-width: 44ch;
  margin-top: clamp(16px, 1.8vw, 24px);
  font-size: var(--t-lead);
  line-height: 1.5;
}
/* Email e profili in un gruppo solo, a sinistra. Erano agli estremi opposti
   della riga: con tre quadrati da 56 la composizione reggeva, con due da 64
   i pulsanti finivano nell'angolo in basso a destra, cioe' esattamente
   sopra al blocco lime — due oggetti bordati sovrapposti. Ora il lato
   destro e' della forma e il lato sinistro e' dei contatti: sono tre modi
   di scrivermi, e stanno insieme perche' sono la stessa cosa. */
.piede__riga {
  display: flex;
  flex-wrap: wrap;
  align-items: center;
  gap: clamp(14px, 1.6vw, 20px);
  margin-top: clamp(28px, 3.2vw, 44px);
}
.piede__contatti { display: flex; flex-wrap: wrap; gap: clamp(10px, 1.2vw, 14px); }
.piede__profili { display: flex; gap: clamp(10px, 1.2vw, 14px); }
/* Da tre quadrati a due, e piu' grandi: a 56 erano una filetta di icone,
   a 64 stanno alla stessa altezza della voce email e le fanno da contrappeso
   invece di starle sotto. */
.piede__profili a {
  display: grid;
  place-items: center;
  width: 64px; height: 64px;
  color: var(--text);
  background: var(--surface);
  border: var(--b) solid var(--line);
  box-shadow: var(--ombra);
  border-radius: var(--r);
  transition: transform .12s var(--ease-out), box-shadow .12s var(--ease-out), background-color .12s var(--ease-mite), color .12s var(--ease-mite);
}
.piede__profili svg { width: 26px; height: 26px; }
/* Come i blocchi contatto: sul viola l'hover si inverte sull'inchiostro,
   perche' portarlo a viola lo farebbe sparire nel fondo. */
.piede__profili a:hover, .piede__profili a:focus-visible {
  background: var(--text);
  color: var(--bg);
  border-color: #000;
  transform: var(--premi);
  box-shadow: 0 0 0 0 #000;
}

/* UN elemento grafico solo, nella meta' destra. Prima era un blocco lime
   tagliato dall'angolo: una forma astratta che riempiva un vuoto. Questa
   invece dice di che mestiere si parla, ed e' fatta con gli stessi segni
   del sito — finestra bordata, tre puntini, cursore, campiture piatte.
   Non e' appoggiata sopra: e' ruotata di poco e ancorata all'angolo, cosi'
   la composizione la contiene invece di ospitarla.

   Sta SOTTO al testo (z-index) e il testo occupa solo la meta' sinistra
   (.piede__titolo max 16ch, .piede__invito max 44ch, la riga dei contatti
   raggruppata a sinistra): le due meta' non si incontrano mai.
   pointer-events none: non deve rubare il click ai pulsanti sotto. */
.piede__grafica {
  position: absolute;
  z-index: 0;
  /* Ancorata al CENTRO verticale, non al fondo. Agganciata in basso
     scendeva sotto al filo del riquadro e si vedeva mezza finestra tagliata:
     con l'ancora al centro la grafica sta dentro alla campitura e la
     composizione la contiene invece di lasciarla scivolare fuori.
     Il translate la scosta di poco verso il basso, quel tanto che basta a
     non allinearla al millimetro col titolo. */
  right: clamp(8px, 1.6vw, 34px);
  top: 50%;
  translate: 0 -46%;
  width: clamp(220px, 22vw, 380px);
  height: auto;
  rotate: -3deg;
  pointer-events: none;
}

.piede__stato {
  position: relative;
  z-index: 1;
  display: flex;
  align-items: center;
  gap: 10px;
  margin-top: clamp(24px, 2.8vw, 38px);
  font-family: var(--f-dato);
  font-size: var(--t-micro);
  font-weight: 700;
  letter-spacing: .12em;
  text-transform: uppercase;
}

/* Contatti come riga di blocchi, non come tre fasce a tutta larghezza. */
.piede__contatti {
  display: flex;
  flex-wrap: wrap;
  gap: clamp(10px, 1.2vw, 14px);
}
/* Il blocco sta DENTRO alla CTA viola, ma porta una campitura --surface:
   dichiara quindi il testo della pagina invece di ereditarlo dalla CTA. E'
   la stessa regola di ogni altro oggetto colorato del sistema. */
.piede__voce {
  display: inline-flex;
  align-items: center;
  gap: 12px;
  min-height: 56px;
  /* Rimasta sola al posto di quattro elementi, la voce puo' prendersi lo
     spazio che occupavano: era una pastiglia fra altre tre, ora e' il
     comando della sezione. */
  min-height: 64px;
  padding: 16px 24px;
  background: var(--surface);
  color: var(--text);
  border: var(--b) solid var(--line);
  box-shadow: var(--ombra);
  border-radius: var(--r);
  font-size: var(--t-lead);
  font-weight: 700;
  letter-spacing: -.01em;
  overflow-wrap: anywhere;
  transition: transform .12s var(--ease-out), box-shadow .12s var(--ease-out), background-color .12s var(--ease-mite), color .12s var(--ease-mite);
}
/* Il blocco sta SOPRA al viola: portarlo a viola in hover lo farebbe
   sparire nel fondo. Si inverte sull'inchiostro — nessuna seconda tinta
   dentro alla CTA, e funziona identico nei due temi. */
.piede__voce:hover, .piede__voce:focus-visible {
  background: var(--text);
  color: var(--bg);
  border-color: #000;
  transform: var(--premi);
  box-shadow: 0 0 0 0 #000;
}

.piede__basso {
  display: flex;
  flex-wrap: wrap;
  align-items: center;
  justify-content: space-between;
  gap: 14px 24px;
  margin-top: clamp(36px, 4vw, 60px);
  padding-top: clamp(18px, 2vw, 26px);
  border-top: var(--b) solid var(--line);
  color: var(--text-muted);
  font-family: var(--f-dato);
  font-size: var(--t-micro);
  font-weight: 700;
  letter-spacing: .12em;
  text-transform: uppercase;
}
.torna-su {
  display: inline-flex;
  align-items: center;
  gap: 10px;
  min-height: 44px;
  padding: 10px 16px;
  color: var(--text);
  background: var(--surface);
  border: var(--b) solid var(--line);
  box-shadow: var(--ombra-s);
  border-radius: var(--r);
  font-family: var(--f-dato);
  font-size: var(--t-micro);
  font-weight: 700;
  letter-spacing: .12em;
  text-transform: uppercase;
  transition: transform .12s ease, box-shadow .12s ease, background-color .12s ease, color .12s ease;
}
.torna-su:hover, .torna-su:focus-visible {
  background: var(--comando);
  color: var(--on-comando);
  border-color: #000;
  transform: var(--premi-s);
  box-shadow: 0 0 0 0 #000;
}

/* ---------- 11. BREAKPOINT -------------------------------------------- */
/* Le composizioni non si rimpiccioliscono: si ricompongono. */

/* Sopra il tablet la colonna destra del "Come lavoro" scende: asimmetria in
   grande, allineamento meccanico dentro a ogni blocco. */
/* ---------- 11. BREAKPOINT --------------------------------------------
   Sei soglie, una volta ciascuna. Prima erano otto blocchi con due 899
   separati, un 1000 e un 1024 che dicevano la stessa cosa e .tools__griglia
   dichiarata identica due volte: un valore cambiato in uno dei due posti e
   non nell'altro sarebbe passato inosservato.

   1024  desktop: la pista si pinna, l'indice appunti va a quattro colonne
   1279  la griglia strumenti scende a due
   1023  tablet: tutto in colonna singola
    899  il contorno passa a 2px, la nav diventa un menu, l'accordion del
         metodo perde la colonna della micro-frase
    767  gli indici perdono la colonna della data
    640  telefono
   -------------------------------------------------------------------- */
@media (min-width: 1024px) {
  /* GSAP pinna l'altezza reale della sezione. Forzare 100svh e centrare il
     contenuto aggiungeva una fascia vuota che poi entrava anche nel
     pin-spacer. Testata e pista mantengono quindi le misure condivise. */
  .lavori--pinnata .lavori__vista { overflow: hidden; scroll-snap-type: none; }

  /* La larghezza della card deve coincidere ESATTAMENTE con quella del suo
     <li>. Prima questo width min(52vw, 62svh) restringeva la card dentro a
     un item molto piu' largo: il flex-gap era 20px, ma visivamente restavano
     oltre 150px di vuoto. Ora il gap percepito coincide con il gap reale. */
  .scheda-lavoro { width: 100%; max-width: none; }

  /* Era un @media a 1000px a se' stante: 24px di differenza da 1024, nessuna
     ragione perche' l'indice cambiasse forma prima del resto. */
  .nota__link { grid-template-columns: auto minmax(180px, 19%) minmax(0, 1fr) auto; }
  .nota__media { grid-row: 1; }
  .nota__meta { grid-row: 1; }
  .nota__freccia { grid-column: 4; grid-row: 1; }
}

@media (max-width: 1279px) {
  .tools__griglia { grid-template-columns: repeat(2, minmax(0, 1fr)); }
}

/* Tablet orizzontale e sotto: una colonna sola, contenuti impilati. */
@media (max-width: 1023px) {
  :root { --gutter: 24px; --h-testa: 64px; }

  .tappa { grid-template-columns: minmax(130px, 1fr) minmax(0, 3fr); }
  .tappa__testi { grid-column: 2; }


  .hero { padding-block: clamp(36px, 5vw, 56px) clamp(48px, 6vw, 72px); }
  .hero__copy, .hero__visuale { grid-column: 1 / -1; }
  /* Sul desktop la tessera del codice sporge nella gronda FRA le colonne e
     puo' uscire quanto vuole. Qui le colonne si impilano e quella gronda
     diventa il margine di pagina: con -34px la tessera finiva incollata al
     filo dello schermo. Stessa regola della gemella rosa — sporge sempre
     12px meno del margine, ombra compresa. */
  .deco--codice { left: calc(12px - var(--gutter)); }
  .hero__visuale { max-width: 460px; }
  .modello3d { aspect-ratio: 4 / 3; }

  /* La pagina contatti impila: il modulo ha bisogno di tutta la larghezza,
     e a meta' schermo i due campi affiancati arrivano a venti battute. */
  .contatta__griglia { grid-template-columns: minmax(0, 1fr); }

  .sezione__testa { align-items: start; }
  .sezione__titolo { grid-column: 1 / -1; }
  .sezione__lato { grid-column: 1 / -1; justify-self: start; }
  /* Sopra i 1024 la nota sta in una colonna sua e il margine la stacca da
     quello che ha sopra. Qui scende sotto al titolo e diventa una riga
     della griglia: il row-gap la stacca gia', e il margine si sommava —
     due volte lo stesso vuoto, cinque volte in una pagina. */
  .sezione__nota { margin-top: 0; }

  /* Il manifesto perde un po' di respiro verticale: su tablet l'aria di
     un poster a tutta pagina diventa solo vuoto da scorrere. */
  .manifesto { padding-block: clamp(56px, 8vw, 96px); }

  /* Le schede degli appunti diventano una pista orizzontale — la stessa dei
     progetti: stesso gesto, stesso aggancio, nessun meccanismo nuovo e
     nessuna riga di JavaScript in piu'.
     La soglia e' 1023 e non 640 per una ragione misurata: la griglia e'
     auto-fit su colonne da 260px, quindi da 1024 in su tiene tre schede in
     fila, e sotto ne tiene due — con la terza da sola e mezza riga vuota
     accanto. Sul telefono erano invece tre schede impilate, mille pixel di
     scorrimento per tre titoli, nella sezione che chiude la pagina.
     Niente tabindex sul contenitore: ogni scheda e' un link, e portando il
     fuoco sul secondo link il browser scorre la pista da solo. Aggiungerlo
     avrebbe messo in tabulazione un elemento che non fa niente. */
  .note__elenco--schede {
    display: flex;
    gap: 16px;
    overflow-x: auto;
    scroll-snap-type: x mandatory;
    scrollbar-width: none;
    /* L'ombra netta della scheda vive fuori dal suo riquadro: senza questo
       spazio l'overflow la taglierebbe su tre lati. Sei pixel sono l'ombra
       piu' lunga che la scheda puo' avere in questa fascia; il margine
       negativo li restituisce, cosi' la prima scheda resta sul filo della
       colonna e la pista sconfina solo nel gutter. */
    padding: 6px 6px 18px;
    margin-inline: -6px;
    scroll-padding-inline: 6px;
  }
  .note__elenco--schede::-webkit-scrollbar { display: none; }
  /* La scheda dopo sporge oltre il filo del contenitore, ed e' quello a dire
     che ce n'e' un'altra: un indicatore disegnato direbbe la stessa cosa
     occupando altro spazio. Il tetto a 420px serve al tablet, dove il 78%
     della finestra darebbe una scheda larga mezzo schermo. */
  .note__elenco--schede > li { flex: none; width: min(84vw, 520px); scroll-snap-align: start; }
}

/* Sotto i 900 il contorno passa a 2px: tre pixel di nero su uno schermo
   stretto mangiano la scheda. Le ombre e la pressione si accorciano con lui,
   altrimenti l'oggetto premuto non copre piu' la sua ombra. */

/* La pista ha tre preview a desktop. Sotto 1200 conserva dimensione leggibile
   e lascia intravedere la successiva; su touch lo scroll-snap fa il resto. */
@media (max-width: 1199px) {
  .lavori__pista { --lavori-gap: clamp(14px, 1.8vw, 20px); }
  .lavori__pista > li { flex-basis: min(72vw, 620px); }
}

@media (max-width: 899px) {
  :root {
    --b: 2px;
    --ombra-s: 2px 2px 0 0 var(--ombra-colore);
    --ombra: 4px 4px 0 0 var(--ombra-colore);
    --ombra-l: 6px 6px 0 0 var(--ombra-colore);
    --ombra-xl: 8px 8px 0 0 var(--ombra-colore);
    --ombra-n: 4px 4px 0 0 #000;
    --ombra-n-s: 2px 2px 0 0 #000;
    --premi-s: translate(2px, 2px);
    --premi: translate(4px, 4px);
  }

  .nav { display: none; }
  .nav-btn { display: grid; }

  /* L'accordion perde la colonna della micro-frase: a meta' larghezza
     stava su tre righe e spingeva la banda a 130px di altezza. Restano
     numero, titolo e simbolo, che sono quello che serve per scegliere. */
  .metodo__testa { text-align: left; max-width: none; margin-inline: 0; }
  .metodo__testa .etichetta { justify-content: flex-start; }
  .metodo__intro { margin-inline: 0; }
  /* Modale mobile/tablet: immagine fissa in alto e contenuto scrollabile
     sotto. Il close resta fuori dall'area che scorre, quindi e' sempre
     raggiungibile anche in descrizioni lunghe. */
  .dett { height: min(92svh, 880px); max-height: 92svh; }
  .dett__pannello { grid-template-columns: minmax(0, 1fr); grid-template-rows: auto minmax(0, 1fr); }
  .dett__media { height: auto; max-height: 34svh; aspect-ratio: 16 / 9; border-right: 0; border-bottom: var(--b) solid var(--line); }
  .dett__corpo { min-height: 0; overflow-y: auto; }
  .dett__chiudi { top: 12px; right: 12px; }
  .dett__punti ul { grid-template-columns: minmax(0, 1fr); }
  .dett__media { grid-template-columns: minmax(0, 1fr) minmax(120px, 34vw); align-items: start; }
  .dett__mockup--mobile { width: auto; justify-self: stretch; }
  .dett__mockup-schermo--desktop { aspect-ratio: 16 / 10; }
  .dett__mockup-schermo--mobile { aspect-ratio: 9 / 15; }

  .passo__testa {
    min-height: 74px;
    grid-template-columns: 34px minmax(0, 1fr) 36px;
    gap: 14px;
    padding-inline: clamp(14px, 2vw, 20px);
  }
  .passo__sintesi { display: none; }
  .passo__piu { width: 36px; height: 36px; }
  .passo__piu::before, .passo__piu::after { width: 12px; margin-left: -6px; }
  /* Il contenuto aperto diventa una colonna sola, e riparte dal filo del
     titolo come sul desktop. */
  .passo__dentro {
    grid-template-columns: minmax(0, 1fr);
    gap: 22px;
    padding-left: calc(34px + clamp(14px, 2vw, 20px) + 14px);
    padding-right: clamp(14px, 2vw, 20px);
  }
}

@media (max-width: 767px) {
  .vicini { grid-template-columns: minmax(0, 1fr); }
  .vicini__succ, .vicini__succ .etichetta { text-align: left; justify-content: flex-start; }
  .nota__link { grid-template-columns: auto minmax(0, 1fr) auto; }
  /* La colonna delle date passa sopra al ruolo invece di stringersi. */
  .tappa { grid-template-columns: minmax(0, 1fr); row-gap: 14px; }
  /* E deve tornarci anche il blocco dei testi. Sopra i 768 sta in colonna 2
     insieme al ruolo; qui la griglia ha una colonna sola, e un figlio
     mandato alla 2 se la faceva creare implicita — larga quanto il testo,
     con la colonna vera schiacciata a zero e la data che le usciva addosso
     al ruolo. Sul telefono le tre date si sovrapponevano ai tre titoli. */
  .tappa__testi { grid-column: 1; }
}

@media (max-width: 640px) {
  /* Il respiro fra le sezioni era tarato sul desktop e portato giu' per
     proporzione: 52px sotto a ogni sezione piu' 52 sopra alla testata di
     quella dopo facevano 104px di vuoto, sei volte in una pagina, su uno
     schermo alto 844. Su carta e' ritmo; su un telefono e' un pollice di
     scorrimento che non mostra niente. */
  :root { --gutter: 20px; --sezione: clamp(52px, 12vw, 80px); }

  .marchio__nome { display: none; }
  .hero__intro { max-width: none; }
  .hero__azioni .bottone { flex: 1; justify-content: center; min-width: 160px; }
  .hero__visuale { max-width: none; }
  /* Badge e finestrella sporgono dai lati della cella del modello: su
     schermo stretto non c'e' margine in cui sporgere, e spingevano fuori la
     pagina. La finestrella per giunta coprirebbe il modello. */
  .deco, .editor { display: none; }

  /* La coda della testata: 32px fra il titolo e il primo contenuto sono la
     misura di una colonna larga, non di una stretta. */
  .sezione__testa { padding-bottom: 24px; }
  /* Il poster si tiene il suo respiro, ma meno: qui non c'e' una pagina
     intorno da cui staccarsi, c'e' solo quello che viene prima e dopo. */
  .manifesto { padding-block: clamp(44px, 11vw, 96px); }
  /* L'altezza minima serve a far chiudere le schede sulla stessa riga
     quando sono quattro in fila. In colonna singola non c'e' nessuna riga
     da pareggiare: e' aria e basta, quattro volte. */
  .tool { min-height: 0; padding: 20px; }
  .tappa { padding: clamp(24px, 7vw, 32px) 0; }

  /* La grafica sparisce, per la stessa ragione delle tessere della hero: su
     schermo stretto non c'e' margine in cui sporgere. Il blocco della CTA
     qui dentro e' largo 302px, e qualunque cosa nella meta' destra finisce
     sotto alla riga di disponibilita' — con il blocco lime erano fino a
     100px di maiuscoletto bianco su campitura chiara, cioe' 1.8:1.
     Nascondere costa niente: l'immagine e' decorativa e non viene
     nemmeno scaricata, perche' display:none su un <img> lazy impedisce il
     fetch. */
  .piede__grafica { display: none; }

  .piede__basso { flex-direction: column; align-items: flex-start; gap: 18px; }

  .vv-modulo__riga--due { grid-template-columns: minmax(0, 1fr); }
  .contatta__modulo .wpcf7-form { grid-template-columns: minmax(0, 1fr); }
  .contatta__modulo .wpcf7-form > p:nth-of-type(-n+2) { grid-column: 1 / -1; }
  .contatta__modulo { padding: clamp(20px, 5vw, 28px); }

  .articolo__cover { margin-top: clamp(24px, 7vw, 32px); }

  .lavori__pista { --lavori-gap: 16px; }
  .lavori__pista > li { flex-basis: 88vw; }
  .scheda-lavoro__breve { min-height: 0; }
  .lavori__griglia .scheda-lavoro { width: auto; }
  .tools__griglia { grid-template-columns: minmax(0, 1fr); }

  /* La finestra arriva quasi a filo schermo: con i margini di sistema il
     pannello scendeva sotto i 300px di larghezza utile. */
  .dett { width: calc(100vw - 20px); height: 94svh; max-height: 94svh; }
  .dett__media { max-height: 29svh; }
  .dett__corpo { padding: 24px 18px 34px; gap: 18px; }
  .dett__titolo { padding-right: 50px; font-size: clamp(1.8rem, 8vw, 2.45rem); }
  .dett__categoria { padding-right: 50px; }
  .dett__galleria { grid-template-columns: minmax(0, 1fr); }
  .dett__media { grid-template-columns: minmax(0, 1fr); }
  .dett__mockup--mobile { width: min(100%, 220px); justify-self: start; }
}

/* ---------- 12. MOTION ------------------------------------------------ */
/* Stato iniziale solo quando il JS conferma di poter animare: senza script il
   contenuto e' visibile da subito. */
.js [data-rivela], .js [data-rivela-card] { opacity: 0; transform: translateY(18px); }

/* Le parole dei titoli. Inline-block per poterle spostare singolarmente;
   gli spazi fra loro restano nodi di testo veri, quindi il titolo si spezza
   dove si spezzava prima e la taratura delle due righe regge. overflow
   clip sul titolo taglia le parole mentre salgono, senza toccare il layout. */
/* Niente will-change qui: erano decine di layer di composizione — una per
   ogni parola di ogni titolo — tenuti vivi per tutta la vita della pagina,
   anche a entrata finita. GSAP promuove da solo il layer per la durata del
   tween e lo lascia andare dopo. */
.parola { display: inline-block; }
.js .display[data-diviso], .js .display--xl[data-diviso], .js .display--m[data-diviso],
.js .display--pagina[data-diviso], .js .piede__titolo[data-diviso] {
  overflow: clip;
  /* Spazio per i discendenti: senza, la clip taglia la coda di g, p e q. */
  padding-bottom: .12em;
  margin-bottom: -.12em;
}

/* Rivelazione a maschera per le immagini: il riquadro e' gia' quello
   definitivo, quindi la clip non provoca reflow. */
.js [data-maschera] { clip-path: inset(0 0 100% 0); }

@media (prefers-reduced-motion: reduce) {
  *, *::before, *::after {
    animation-duration: .01ms !important;
    animation-iteration-count: 1 !important;
    transition-duration: .01ms !important;
    scroll-behavior: auto !important;
  }
  .js [data-rivela], .js [data-rivela-card] { opacity: 1; transform: none; }
  .parola { transform: none !important; opacity: 1 !important; }
  /* La manina e le tessere sono le uniche cose che si muovono da sole. */
  .saluto { animation: none !important; }
  .js [data-maschera] { clip-path: none; }
  /* La regola globale qui sopra azzera le DURATE, non i ritardi: il
     pannello che si chiude aspetterebbe comunque 460ms prima di sparire
     dall'albero di accessibilita', con l'altezza gia' a zero. Qui il
     ritardo va a zero e il cambio e' immediato, che e' quello che chiede
     chi ha ridotto il movimento. */
  .passo__pannello, .passo__pannello[data-chiuso] { transition: none; }
  /* Il quadrato di stato e' l'unica cosa che si muove da sola: va fermata
     accesa, non lasciata a meta' ciclo. */
}

/* =========================================================================
   13. HOMEPAGE 10 — MINIMAL EDITORIAL LAYER
   Questo strato finale mantiene i contratti PHP/JS del tema e sostituisce
   la precedente enfasi neo-brutalist con gerarchie aperte e bordi sottili.
   ========================================================================= */

body {
  background: var(--color-bg);
  color: var(--color-text);
}

main > section,
.piede {
  background-image: none;
}

/* CONTINUOUS NEUTRAL CANVAS
   La pagina e' una sola tela: il ritmo nasce da composizioni, tipografia e
   accenti locali. Nessuna sezione prende un colore pieno diverso dal body. */
main > section {
  background-color: transparent;
  color: var(--color-text);
}

.hero {
  background-image:
    linear-gradient(var(--griglia) 1px, transparent 1px),
    linear-gradient(90deg, var(--griglia) 1px, transparent 1px);
  background-size: 28px 28px;
}

.display,
.piede__titolo,
.manifesto__frase {
  font-family: var(--font-display);
  font-weight: 600;
  letter-spacing: -.045em;
}

.display { line-height: .98; }
.display--xl { font-size: clamp(3rem, 5.5vw, 5.5rem); }
.sezione__titolo .display { max-width: 15ch; }

.etichetta {
  color: var(--color-muted);
  font-family: var(--font-body);
  font-weight: 600;
  letter-spacing: .1em;
}

.etichetta__n {
  background: transparent;
  color: inherit;
  border: 0;
  box-shadow: none;
  padding: 0;
}

.bottone,
.tema-btn,
.nav-btn,
.freccia {
  border-width: 1.5px;
  border-radius: 6px;
  box-shadow: 3px 3px 0 var(--color-border);
}

.bottone {
  min-height: 48px;
  padding: 12px 20px;
  background: var(--color-yellow);
  color: #1B1B1B;
  font-family: var(--font-body);
  letter-spacing: .08em;
}

.bottone:hover,
.bottone:focus-visible,
.bottone:active {
  transform: translate(2px, 2px);
}

.bottone--vuoto {
  background: transparent;
  color: var(--color-text);
  box-shadow: none;
}

/* Header */
.testa {
  background: color-mix(in srgb, var(--color-bg) 94%, transparent);
  border-bottom: 1px solid var(--color-border);
  backdrop-filter: blur(10px);
}

.marchio__sigla {
  width: 36px;
  height: 36px;
  border: 1px solid var(--color-border);
  border-radius: 4px;
  box-shadow: none;
}

.marchio__nome,
.nav__lista a,
.nav-mobile__lista a { font-weight: 600; }

.nav__lista a {
  border: 0;
  border-bottom: 1px solid transparent;
  border-radius: 0;
}

.nav__lista a:hover,
.nav__lista a:focus-visible,
.nav__lista .current-menu-item > a,
.nav__lista [aria-current="page"] {
  background: transparent;
  color: var(--color-text);
  border-color: currentColor;
}

/* Hero */
.hero {
  overflow: clip;
  padding-block: clamp(64px, 8vw, 132px);
  background-image:
    linear-gradient(var(--griglia) 1px, transparent 1px),
    linear-gradient(90deg, var(--griglia) 1px, transparent 1px);
  background-size: 28px 28px;
}
.hero__griglia { align-items: center; }
.hero__copy { gap: clamp(22px, 2.6vw, 38px); }
.hero__saluto-testo { color: var(--color-text); }
.hero__intro {
  display: block;
  max-width: 58ch;
  min-height: 0;
  overflow: visible;
  color: var(--color-muted);
  -webkit-line-clamp: unset;
}
.hero__social a { box-shadow: none; border-width: 1px; }
.modello {
  isolation: isolate;
  overflow: visible;
  background: var(--color-blue);
  border: 1px solid var(--color-border);
  border-radius: 48% 48% 18px 18px;
  box-shadow: none;
}
.modello::before {
  content: "";
  position: absolute;
  z-index: -1;
  width: clamp(84px, 10vw, 150px);
  aspect-ratio: 1;
  right: -7%;
  top: 12%;
  background: var(--color-yellow);
  border: 1px solid #1B1B1B;
  border-radius: 50%;
}
.modello__barra { display: none; }
.modello3d {
  aspect-ratio: 5 / 6.2;
  max-height: 76svh;
  background: transparent;
  border-radius: inherit;
}
.editor {
  background: var(--color-surface);
  color: var(--color-text);
  border: 1px solid var(--color-border);
  border-radius: 6px;
  box-shadow: 4px 4px 0 var(--color-yellow);
}
.deco--codice { background: var(--color-mint); box-shadow: none; border-width: 1px; }

/* Manifesto */
.manifesto-sezione {
  position: relative;
  overflow: hidden;
  padding-block: clamp(96px, 12vw, 190px);
  background: transparent;
  color: var(--color-text);
  border-top: 1px solid var(--color-border);
}
.manifesto {
  position: relative;
  max-width: 1260px;
  margin-inline: 0 auto;
  text-align: left;
}
.manifesto::after {
  content: "";
  position: absolute;
  z-index: -1;
  width: clamp(180px, 25vw, 390px);
  aspect-ratio: 1;
  right: -8%;
  top: 50%;
  transform: translateY(-50%);
  background: var(--color-blue);
  border-radius: 50% 42% 48% 38%;
  opacity: .55;
}
.manifesto__frase {
  max-width: 19ch;
  font-size: clamp(2.3rem, 5vw, 5.25rem);
  line-height: 1.04;
  text-wrap: balance;
}
.marcato--giallo {
  background: linear-gradient(transparent 62%, var(--color-yellow) 62%);
  color: inherit;
  padding: 0 .05em;
  margin: 0;
  border-radius: 0;
  box-shadow: none;
}

/* Shared section heads */
.filo { border-top: 1px solid var(--color-border); }
.sezione__testa { padding-block: clamp(88px, 9vw, 150px) clamp(42px, 5vw, 76px); }
.sezione__nota {
  border-left: 1px solid var(--color-border);
  color: var(--color-muted);
}

/* Tools */
.tools { padding-bottom: clamp(88px, 10vw, 160px); }
.tools__barra { margin-bottom: clamp(36px, 4vw, 64px); }
.tools__tab {
  min-height: 44px;
  padding: 10px 16px;
  border: 1px solid var(--color-border);
  border-radius: 4px;
  box-shadow: none;
  font-weight: 600;
}
.tools__tab:hover,
.tools__tab:focus-visible { transform: none; background: var(--color-surface); }
.tools__tab[aria-selected="true"] {
  background: var(--tab-accent, var(--color-yellow));
  color: #1B1B1B;
  border-color: #1B1B1B;
}
.tools__tab:nth-child(5n+1) { --tab-accent: var(--color-yellow); }
.tools__tab:nth-child(5n+2) { --tab-accent: var(--color-blue); }
.tools__tab:nth-child(5n+3) { --tab-accent: var(--color-mint); }
.tools__tab:nth-child(5n+4) { --tab-accent: var(--color-lilac); }
.tools__tab:nth-child(5n+5) { --tab-accent: var(--color-coral); }
.tools__griglia { grid-template-columns: repeat(4, minmax(0, 1fr)); gap: 0 clamp(22px, 3vw, 52px); }
.tool {
  min-height: 0;
  padding: clamp(20px, 2.2vw, 32px) 0;
  background: transparent;
  border: 0;
  border-top: 1px solid var(--color-border);
  border-radius: 0;
  box-shadow: none;
}
.tool:last-child { border-bottom: 1px solid var(--color-border); }
.tool__nome { font-weight: 600; }
.tool__testo { color: var(--color-muted); font-size: 1rem; }
@media (hover: hover) {
  .tool:hover { transform: none; box-shadow: none; }
}

/* EDITORIAL ACCORDION
   La sezione resta interattiva, ma appare come un indice editoriale: fondo
   neutro, righe aperte e colore soltanto su numeri, stato e dettagli. */
.metodo {
  padding-block: clamp(80px, 9vw, 146px);
  background: transparent;
  color: var(--color-text);
  border-top: 1px solid var(--color-border);
}
.metodo > .vv-contenitore {
  display: grid;
  grid-template-columns: minmax(0, 38%) minmax(0, 62%);
  gap: clamp(48px, 7vw, 120px);
  align-items: start;
}
.metodo__testa {
  position: sticky;
  top: calc(var(--h-testa) + 32px);
  margin: 0;
  padding: 0;
  text-align: left;
}
.metodo__testa .display { max-width: 10ch; }
.metodo__intro { max-width: 34ch; color: var(--color-muted); }
.metodo__elenco {
  border: 0;
  border-top: 1px solid var(--color-border);
  border-radius: 0;
  box-shadow: none;
}
.passo {
  --riga: transparent;
  --su-riga: var(--color-text);
  --passo-accent: var(--color-yellow);
  border-bottom: 1px solid var(--color-border);
}
.passo:nth-child(5n+1) { --passo-accent: var(--color-yellow); }
.passo:nth-child(5n+2) { --passo-accent: var(--color-blue); }
.passo:nth-child(5n+3) { --passo-accent: var(--color-mint); }
.passo:nth-child(5n+4) { --passo-accent: var(--color-lilac); }
.passo:nth-child(5n+5) { --passo-accent: var(--color-coral); }
.passo:last-child { border-bottom: 1px solid var(--color-border); }
.passo__testa,
.passo__pannello {
  background: transparent;
  color: var(--color-text);
}
.passo__testa {
  grid-template-columns: 52px minmax(0, .8fr) minmax(0, 1fr) 44px;
  padding: 18px 12px;
  transition: background-color .22s var(--ease-mite);
}
.passo__testa:hover,
.passo__testa:focus-visible,
.passo__testa[aria-expanded="true"] {
  background: color-mix(in srgb, var(--passo-accent) 18%, transparent);
  filter: none;
}
.passo__n {
  display: grid;
  place-items: center;
  width: 36px;
  aspect-ratio: 1;
  background: var(--passo-accent);
  color: #1B1B1B;
  border: 1px solid #1B1B1B;
  border-radius: 4px;
}
.passo__titolo { font-weight: 600; }
.passo__testa[aria-expanded="true"] .passo__titolo {
  text-decoration-color: var(--passo-accent);
}
.passo__piu { border-color: var(--passo-accent); }
.passo__pannello { background: color-mix(in srgb, var(--passo-accent) 8%, transparent); }
.passo__dentro { padding-right: 12px; }
.passo__concreto { border-color: var(--passo-accent); }

/* Projects */
.lavori { padding-bottom: clamp(90px, 10vw, 160px); }
.lavori__pista { gap: clamp(24px, 3vw, 52px); }
.lavori__pista > li { flex: 0 0 clamp(380px, 38vw, 620px); }
.scheda-lavoro {
  width: 100%;
  background: transparent;
  border: 0;
  border-radius: 0;
  box-shadow: none;
}
.scheda-lavoro:hover { transform: none; box-shadow: none; }
.scheda-lavoro__media {
  border: 1px solid var(--color-border);
  border-radius: 6px;
  box-shadow: none;
}
.scheda-lavoro__corpo {
  display: grid;
  grid-template-columns: minmax(0, 1fr);
  gap: 12px;
  padding: 20px 0 0;
}
.scheda-lavoro__categoria {
  width: auto;
  padding: 0;
  background: transparent;
  color: var(--color-muted);
  border: 0;
  border-radius: 0;
  font-weight: 600;
}
.scheda-lavoro__titolo { font-weight: 600; }
.scheda-lavoro__breve { color: var(--color-muted); }
.scheda-lavoro__freccia { background: transparent; border: 0; }

/* About + experience */
.about { padding-block: clamp(96px, 11vw, 180px); }
.about__griglia {
  display: grid;
  grid-template-columns: minmax(300px, .82fr) minmax(0, 1.18fr);
  gap: clamp(52px, 9vw, 154px);
  align-items: center;
}
.about__media {
  position: relative;
  width: min(100%, 520px);
  min-height: 0;
  aspect-ratio: 4 / 5;
}
.about__forma {
  position: absolute;
  inset: 2% 0 0 4%;
  background: var(--color-lilac);
  border-radius: 50% 46% 44% 48%;
}
.about__forma::after {
  content: "";
  position: absolute;
  right: -22px;
  top: 16%;
  width: clamp(52px, 6vw, 82px);
  aspect-ratio: 1;
  background: var(--color-yellow);
  border: 1px solid #1B1B1B;
  border-radius: 50%;
}
.about__ritratto,
.about__fallback {
  position: absolute;
  z-index: 1;
  inset: 7% 8% 5% 7%;
  width: auto;
  height: auto;
  margin: 0;
  object-fit: cover;
  object-position: center top;
  border: 0;
  border-radius: 48% 48% 18px 18px;
}
.about__fallback {
  display: flex;
  align-items: flex-end;
  padding: clamp(22px, 4vw, 42px);
  background:
    radial-gradient(circle at 50% 31%, color-mix(in srgb, var(--color-blue) 84%, white) 0 15%, transparent 15.5%),
    radial-gradient(ellipse at 50% 112%, color-mix(in srgb, var(--color-mint) 88%, white) 0 48%, transparent 48.5%),
    var(--color-surface);
  color: var(--color-muted);
}
.about__fallback-label {
  padding: 7px 10px;
  background: var(--color-bg);
  border: 1px solid var(--color-border);
  border-radius: 4px;
  font-family: var(--font-body);
  font-size: var(--t-micro);
  font-weight: 600;
  letter-spacing: .1em;
  text-transform: uppercase;
}
.about__copy { display: grid; gap: clamp(18px, 2vw, 30px); }
.about__copy .display { max-width: 13ch; }
.about__lead { font-size: clamp(1.35rem, 1.05rem + 1vw, 2rem); line-height: 1.35; }
.about__testo { max-width: 54ch; color: var(--color-muted); font-size: clamp(1.05rem, 1rem + .25vw, 1.2rem); }
.about__esperienza {
  display: grid;
  grid-template-columns: minmax(180px, .36fr) minmax(0, .64fr);
  gap: clamp(36px, 7vw, 110px);
  margin-top: clamp(78px, 9vw, 136px);
  padding-top: clamp(28px, 4vw, 52px);
  border-top: 1px solid var(--color-border);
}
.about__esperienza > .etichetta { align-self: start; }
.esperienza__elenco {
  position: relative;
  margin: 0;
}
.esperienza__elenco::before {
  content: "";
  position: absolute;
  left: 8px;
  top: 12px;
  bottom: 22px;
  width: 1px;
  background: var(--color-border);
}
.esperienza__voce {
  position: relative;
  display: grid;
  grid-template-columns: minmax(120px, .48fr) minmax(0, 1fr);
  gap: 8px clamp(20px, 3vw, 46px);
  padding: 0 0 clamp(36px, 4vw, 58px) 42px;
}
.esperienza__voce:last-child { padding-bottom: 0; }
.esperienza__punto {
  position: absolute;
  z-index: 1;
  left: 0;
  top: .42em;
  width: 17px;
  aspect-ratio: 1;
  background: var(--color-yellow);
  border: 1px solid #1B1B1B;
  border-radius: 50%;
}
.esperienza__voce:nth-child(2n) .esperienza__punto { background: var(--color-blue); }
.esperienza__quando { color: var(--color-muted); font-variant-numeric: tabular-nums; }
.esperienza__ruolo { font-family: var(--font-display); font-size: clamp(1.2rem, 1rem + .55vw, 1.55rem); font-weight: 600; }
.esperienza__dettaglio { grid-column: 2; color: var(--color-muted); }

/* Magazine */
.note { padding-bottom: clamp(100px, 11vw, 180px); }
.note__elenco--schede { gap: clamp(24px, 3vw, 52px); }
.note__elenco--schede .nota__link {
  display: grid;
  height: auto;
  overflow: visible;
  background: transparent;
  border: 0;
  border-radius: 0;
  box-shadow: none;
}
.note__elenco--schede .nota__media {
  aspect-ratio: 4 / 3;
  border: 1px solid var(--color-border);
  border-radius: 6px;
}
.note__elenco--schede .nota__meta { padding: 18px 0 0; color: var(--color-muted); }
.note__elenco--schede .nota__titolo { padding: 10px 0 0; font-weight: 600; }
.note__elenco--schede .nota__freccia { align-self: start; padding: 14px 0 0 12px; }
.note__elenco--schede .nota__link:hover,
.note__elenco--schede .nota__link:focus-visible { transform: none; background: transparent; }
.nota__link:hover .nota__media img,
.nota__link:focus-visible .nota__media img { transform: scale(1.025); }
.nota__media img { transition: transform .26s var(--ease-out); }

/* Email-first footer */
.piede { border-top: 1px solid var(--color-border); }
.piede__interno { padding-top: clamp(90px, 12vw, 190px); }
.piede__cta {
  display: grid;
  justify-items: center;
  padding: 0;
  margin-bottom: clamp(80px, 10vw, 150px);
  overflow: visible;
  background: transparent;
  color: var(--color-text);
  border: 0;
  border-radius: 0;
  box-shadow: none;
  text-align: center;
}
.piede__cta .etichetta { color: var(--color-muted); }
.piede__titolo { max-width: 13ch; font-size: clamp(3rem, 7vw, 7.5rem); font-weight: 600; }
.piede__invito { color: var(--color-muted); }
.piede__riga { display: grid; justify-items: center; margin-top: clamp(40px, 5vw, 72px); }
.piede__email {
  display: inline-block;
  color: var(--color-text);
  font-family: var(--font-display);
  font-size: clamp(2rem, 5vw, 5.75rem);
  font-weight: 500;
  line-height: 1.05;
  letter-spacing: -.055em;
  overflow-wrap: anywhere;
  text-decoration: underline;
  text-decoration-color: var(--color-blue);
  text-decoration-thickness: .12em;
  text-underline-offset: .14em;
}
.piede__email:hover,
.piede__email:focus-visible { text-decoration-color: var(--color-yellow); }
.piede__profili { margin-top: 28px; gap: 24px; }
.piede__profili a {
  display: inline-flex;
  width: auto;
  height: auto;
  gap: 8px;
  padding: 7px 0;
  background: transparent;
  color: var(--color-muted);
  border: 0;
  border-bottom: 1px solid currentColor;
  border-radius: 0;
  box-shadow: none;
}
.piede__profili a:hover,
.piede__profili a:focus-visible { transform: none; background: transparent; color: var(--color-text); border-color: currentColor; box-shadow: none; }
.piede__profili svg { width: 1em; height: 1em; }
.piede__stato { color: var(--color-muted); }
.piede__basso { border-top-width: 1px; }

@media (max-width: 1023px) {
  .hero__copy,
  .hero__visuale { grid-column: 1 / -1; }
  .hero__copy { max-width: 780px; }
  .hero__visuale { width: min(720px, 100%); margin-inline: auto; }
  .tools__griglia { grid-template-columns: repeat(2, minmax(0, 1fr)); }
  .metodo > .vv-contenitore { grid-template-columns: 1fr; }
  .metodo__testa { position: static; }
  .metodo__testa .display { max-width: 13ch; }
  .about__griglia { gap: clamp(32px, 5vw, 64px); }
  .about__media { width: min(100%, 440px); }
  .note__elenco--schede { grid-template-columns: repeat(2, minmax(0, 1fr)); }
}

@media (max-width: 767px) {
  :root { --gutter: 20px; --sezione: 80px; }
  .display--xl { font-size: clamp(2.75rem, 13vw, 4.75rem); }
  .sezione__testa { grid-template-columns: 1fr; align-items: start; }
  .sezione__titolo,
  .sezione__lato { grid-column: 1; justify-self: start; }
  .manifesto-sezione { padding-block: 90px; }
  .manifesto__frase { font-size: clamp(2rem, 9vw, 3.5rem); }
  .tools__griglia { grid-template-columns: repeat(2, minmax(0, 1fr)); column-gap: 20px; }
  .tool__testo { font-size: .95rem; }
  .passo__testa { grid-template-columns: 38px minmax(0, 1fr) 42px; }
  .passo__sintesi { display: none; }
  .passo__dentro { grid-template-columns: 1fr; padding-left: 38px; }
  .lavori__pista > li { flex-basis: 86vw; }
  .about__griglia { grid-template-columns: 1fr; }
  .about__media { width: min(88vw, 430px); }
  .about__copy .display { max-width: 13ch; }
  .about__esperienza { grid-template-columns: 1fr; gap: 28px; }
  .esperienza__voce { grid-template-columns: 1fr; gap: 7px; }
  .esperienza__dettaglio { grid-column: 1; }
  .note__elenco--schede { grid-template-columns: 1fr; }
  .piede__email { font-size: clamp(1.65rem, 9vw, 3.5rem); }
  .piede__basso { justify-content: center; text-align: center; }
}

@media (max-width: 420px) {
  .tools__griglia { grid-template-columns: 1fr; }
}

/* NO DECORATIVE CIRCLES
   Il colore resta nella tipografia e nei piccoli stati UI; la composizione
   non ha piu' bolle o cornici tonde attorno a modello, manifesto e ritratto. */
.modello::before, .manifesto::after, .about__forma, .about__forma::after { display: none; }

.about__ritratto,
.about__fallback {
  inset: 0;
  border-radius: 8px;
}

.about__fallback {
  background:
    linear-gradient(135deg, transparent 0 47%, color-mix(in srgb, var(--color-blue) 42%, transparent) 47% 48%, transparent 48% 100%),
    var(--color-surface);
  border: 1px solid var(--color-border);
}

/* CENTERED ACCORDION HEADING
   Il titolo fa da pausa editoriale sopra l'indice: non compete piu' con le
   righe e resta leggibile anche quando l'accordion si apre. */
.metodo > .vv-contenitore { display: block; }
.metodo__testa {
  position: static;
  max-width: 60ch;
  margin: 0 auto;
  padding: 0 0 clamp(36px, 5vw, 72px);
  text-align: center;
}
.metodo__testa .etichetta { justify-content: center; }
.metodo__testa .display { max-width: none; }
.metodo__intro { max-width: 54ch; margin-inline: auto; }
.metodo__elenco { max-width: 1280px; margin-inline: auto; }

/* COMPACT THREE-ACCENT MANIFESTO
   Non e' un poster a tutta altezza: tra hero e competenze deve essere una
   pausa leggibile. La misura piu' larga evita le righe troppo spezzate;
   la sola sottolineatura, in tre colori, porta ritmo senza creare box. */
.manifesto-sezione { padding-block: clamp(64px, 7vw, 104px); }
.manifesto { max-width: 1320px; }
.manifesto__frase {
  max-width: 22ch;
  font-size: clamp(2.15rem, 4.55vw, 4.85rem);
  line-height: 1.12;
  letter-spacing: -.052em;
}
.manifesto__frase .marcato {
  padding-inline: .035em;
  background-repeat: no-repeat;
  background-position: 0 92%;
  background-size: 100% .16em;
}
.marcato--giallo { background-image: linear-gradient(var(--color-yellow), var(--color-yellow)); }
.marcato--azzurro { background-image: linear-gradient(var(--color-blue), var(--color-blue)); }
.marcato--lilla { background-image: linear-gradient(var(--color-lilac), var(--color-lilac)); }

@media (max-width: 767px) {
  .manifesto-sezione { padding-block: clamp(48px, 11vw, 64px); }
  .manifesto__frase {
    max-width: 20ch;
    font-size: clamp(2rem, 9.3vw, 3.2rem);
    line-height: 1.13;
  }
}

[data-theme="dark"] .about__fallback {
  background:
    linear-gradient(135deg, transparent 0 47%, color-mix(in srgb, var(--color-blue) 34%, transparent) 47% 48%, transparent 48% 100%),
    var(--color-surface);
}

@media (prefers-reduced-motion: reduce) {
  .nota__media img { transition: none; }
  .metodo__testa { position: static; }
}

/* =========================================================================
   13. REDESIGN V3
   Ultimo strato, vince sugli override precedenti. Quattro interventi:
   manifesto a chip, stack a indice di tessere, about compatto, interruttore
   del tema. Il sistema non cambia: fili da 1px, ombre nette a blur zero,
   colore negli OGGETTI e mai nel fondo delle sezioni, quindi tutto regge
   uguale in chiaro e al buio.
   ========================================================================= */

/* --- Manifesto ------------------------------------------------------------
   Le parole chiave non sono piu' sottolineate: diventano chip, oggetti della
   palette con icona, contorno e ombra netta come i bottoni. E' il colore che
   mancava alla sezione, portato da tre oggetti piccoli invece che da un
   fondo — un fondo colorato al buio andrebbe ricalibrato, una chip no. */
.manifesto-sezione { padding-block: clamp(72px, 8vw, 128px) clamp(64px, 7vw, 112px); }
.manifesto {
  display: grid;
  gap: clamp(48px, 6vw, 88px);
  justify-items: center;
  max-width: none;
  padding: 0;
  text-align: center;
}
/* Centrato e largo: 30ch tengono la frase su tre righe da desktop (quattro
   a 23ch erano troppe), senza arrivare alla riga lunga da paragrafo.
   balance distribuisce le parole in modo che le righe abbiano la stessa
   lunghezza, che in un blocco centrato e' quello che si vede di piu'. */
.manifesto__frase {
  max-width: 30ch;
  font-size: clamp(2rem, 1rem + 3.1vw, 4.5rem);
  line-height: 1.2;
  letter-spacing: -.045em;
  text-wrap: balance;
}
.manifesto__frase .chip {
  --chip: var(--color-yellow);
  display: inline-flex;
  align-items: center;
  gap: .2em;
  margin: 0 .03em 0 .08em;
  padding: .02em .3em .06em .18em;
  background: var(--chip);
  color: #111111;
  border: max(1.5px, .028em) solid #1B1B1B;
  border-radius: .26em;
  box-shadow: .06em .06em 0 #1B1B1B;
  font-weight: inherit;
  line-height: 1.04;
  white-space: nowrap;
  transform: rotate(-2deg);
}
.manifesto__frase .chip-gruppo { white-space: nowrap; }
.manifesto__frase .chip--azzurro { --chip: var(--color-blue); transform: rotate(1.5deg); }
.manifesto__frase .chip--lilla { --chip: var(--color-lilac); transform: rotate(-1.5deg); }
.manifesto__frase .chip svg {
  flex: none;
  width: .7em;
  height: .7em;
  color: #111111;
}
.dato__valore,
.manifesto__dati { font-variant-numeric: tabular-nums; }
.manifesto__dati {
  display: grid;
  grid-template-columns: repeat(3, minmax(0, 1fr));
  gap: clamp(20px, 3vw, 56px);
  width: 100%;
  max-width: 1080px;
  text-align: center;
}
.dato {
  --dato: var(--color-yellow);
  position: relative;
  display: grid;
  gap: 8px;
  align-content: start;
  padding-top: clamp(16px, 1.6vw, 22px);
  border-top: 1px solid var(--color-border);
}
.dato:nth-child(2) { --dato: var(--color-blue); }
.dato:nth-child(3) { --dato: var(--color-lilac); }
/* La tacca colorata sul filo lega ogni dato alla chip dello stesso colore. */
.dato::before {
  content: "";
  position: absolute;
  top: -3px;
  left: calc(50% - 24px);
  width: 48px;
  height: 5px;
  background: var(--dato);
  border: 1px solid #1B1B1B;
  border-radius: 2px;
}
.dato__valore {
  font-family: var(--font-display);
  font-size: clamp(2rem, 1.4rem + 1.9vw, 3.25rem);
  font-weight: 600;
  line-height: 1;
  letter-spacing: -.04em;
}
.dato__testo { max-width: 30ch; margin-inline: auto; color: var(--color-muted); font-size: 1rem; line-height: 1.45; }

/* --- Stack ----------------------------------------------------------------
   Deve distinguersi dall'accordion del Metodo, che e' una colonna di righe
   con fili e numeri. Qui niente fili: un indice a due colonne di tessere,
   ognuna con il logo dentro a un riquadro tinto del colore del marchio. La
   tinta e' un color-mix con la superficie, quindi si scurisce da sola al
   buio senza una seconda serie di valori. */
.js .tools__barra {
  display: inline-flex;
  gap: 4px;
  max-width: 100%;
  padding: 4px;
  overflow-x: auto;
  background: var(--color-surface);
  border: 1px solid var(--color-border);
  border-radius: var(--r);
}
.tools__tab {
  flex: none;
  min-height: 40px;
  padding: 8px 16px;
  color: var(--color-muted);
  background: transparent;
  border: 0;
  border-radius: 6px;
  box-shadow: none;
  transition: background-color .25s var(--ease-mite), color .25s var(--ease-mite);
}
.tools__tab:hover,
.tools__tab:focus-visible { color: var(--color-text); background: var(--velo); }
.tools__tab[aria-selected="true"],
.tools__tab[aria-selected="true"]:hover {
  color: #1B1B1B;
  background: var(--tab-accent, var(--color-yellow));
  box-shadow: inset 0 0 0 1px #1B1B1B;
}
.tools__griglia {
  grid-template-columns: repeat(2, minmax(0, 1fr));
  gap: clamp(8px, 1vw, 16px) clamp(16px, 2.4vw, 40px);
}
.tool {
  --c: var(--tool-colore, var(--color-lilac));
  display: grid;
  grid-template-columns: auto minmax(0, 1fr);
  column-gap: clamp(18px, 1.8vw, 28px);
  row-gap: 6px;
  align-items: center;
  padding: clamp(14px, 1.4vw, 20px);
  background: transparent;
  border: 0;
  border-radius: var(--r);
  transition: background-color .3s var(--ease-mite);
}
[data-theme="dark"] .tool { --c: var(--tool-colore-scuro, var(--tool-colore, var(--color-lilac))); }
.tool:last-child { border-bottom: 0; }
.tool__testa { display: contents; }
.tool .tool__logo,
.tool .tool__sigla {
  grid-row: 1 / span 2;
  width: clamp(64px, 5.2vw, 80px);
  height: clamp(64px, 5.2vw, 80px);
  min-width: 0;
  padding: clamp(16px, 1.3vw, 20px);
  background: color-mix(in srgb, var(--c) 14%, var(--color-surface));
  border: 0;
  border-radius: var(--r);
  box-shadow: inset 0 0 0 1px color-mix(in srgb, var(--c) 40%, transparent);
  font-size: 13px;
  transition: transform .5s cubic-bezier(.32, .72, 0, 1);
}
.tool__nome {
  align-self: end;
  font-family: var(--font-display);
  font-size: clamp(1.375rem, 1.05rem + .8vw, 2rem);
  font-weight: 600;
  letter-spacing: -.035em;
  line-height: 1.05;
}
.tool__testo { align-self: start; max-width: 44ch; color: var(--color-muted); font-size: clamp(1rem, .95rem + .15vw, 1.0625rem); line-height: 1.45; }
@media (hover: hover) {
  .tool:hover { background: color-mix(in srgb, var(--c) 9%, transparent); }
  .tool:hover .tool__logo,
  .tool:hover .tool__sigla { transform: rotate(-6deg) scale(1.06); }
}
/* Le tessere entrano a cascata quando si cambia tab. */
.js .tools__pannello.is-entra { animation: none; }
.js .tools__pannello.is-entra .tool { animation: toolEntra .5s var(--ease-out) both; }
.js .tools__pannello.is-entra .tool:nth-child(2) { animation-delay: .05s; }
.js .tools__pannello.is-entra .tool:nth-child(3) { animation-delay: .1s; }
.js .tools__pannello.is-entra .tool:nth-child(4) { animation-delay: .15s; }
@keyframes toolEntra { from { opacity: 0; transform: translateY(10px); } to { opacity: 1; transform: none; } }

/* La nota dei tool sta sotto al titolo, non in un angolo a destra. */
.sezione__nota--sotto {
  max-width: 46ch;
  margin-top: clamp(14px, 1.4vw, 20px);
  padding: 0;
  border: 0;
  color: var(--color-muted);
  font-size: var(--t-lead);
}

/* --- Progetti -------------------------------------------------------------
   Il testo sotto l'immagine era decentrato: la griglia del corpo era stata
   ridotta a una colonna, ma categoria, titolo e testo restavano forzati su
   grid-column: 2. Il browser creava una seconda colonna implicita e ci
   spingeva dentro tutto il testo. Ora c'e' una colonna sola, a filo
   dell'immagine. Niente numero progressivo: la pista si conta da sola. */
.scheda-lavoro__corpo {
  grid-template-columns: minmax(0, 1fr);
  gap: 10px;
  padding: 20px 0 0;
}
.scheda-lavoro__meta,
.scheda-lavoro__titolo,
.scheda-lavoro__breve { grid-column: 1; }
.scheda-lavoro__meta {
  display: flex;
  align-items: center;
  gap: 12px;
  margin: 0;
  color: var(--color-muted);
  font-size: var(--t-label);
  font-weight: 600;
  letter-spacing: .1em;
  text-transform: uppercase;
}
.scheda-lavoro__categoria {
  grid-column: auto;
  font-family: var(--font-body);
  font-size: inherit;
  letter-spacing: inherit;
}
.scheda-lavoro__titolo { font-size: clamp(1.4rem, 1.1rem + .8vw, 1.9rem); line-height: 1.1; }
.scheda-lavoro__breve { max-width: 48ch; min-height: 0; }

/* --- About ----------------------------------------------------------------
   Un blocco solo: ritratto a sinistra, testo ed esperienza a destra. La
   timeline verticale e' sparita; l'esperienza e' una scheda compatta con le
   date in piccole etichette della palette. Niente targhette sopra
   all'immagine: l'illustrazione parla da sola. */
.about { padding-block: clamp(88px, 10vw, 160px); }
.about__griglia {
  grid-template-columns: minmax(280px, .8fr) minmax(0, 1.2fr);
  gap: clamp(40px, 7vw, 120px);
  align-items: center;
}
.about__media {
  position: relative;
  width: 100%;
  max-width: 500px;
  margin: 0;
  aspect-ratio: 4 / 5;
  background: var(--color-mint);
  border: 1px solid #1B1B1B;
  border-radius: var(--r);
  box-shadow: 6px 6px 0 #1B1B1B;
}
[data-theme="dark"] .about__media { box-shadow: 6px 6px 0 #0B0B0B; }
.about__ritratto {
  position: absolute;
  inset: 0;
  width: 100%;
  height: 100%;
  object-fit: cover;
  border-radius: calc(var(--r) - 1px);
}
.about__illustrazione {
  position: absolute;
  left: 6%;
  bottom: 0;
  width: 88%;
  height: 94%;
  object-fit: contain;
  object-position: center bottom;
}
.about__copy { gap: clamp(16px, 1.8vw, 24px); }
.about__esperienza {
  display: block;
  margin-top: clamp(8px, 1.4vw, 20px);
  padding: 4px clamp(18px, 2vw, 26px);
  background: var(--color-surface);
  border: 1px solid var(--color-border);
  border-radius: var(--r);
}
.about__esperienza > .etichetta { padding: 16px 0 10px; }
.esperienza__elenco::before { display: none; }
.esperienza__voce {
  display: grid;
  grid-template-columns: minmax(110px, 150px) minmax(0, 1fr);
  gap: 6px clamp(16px, 2vw, 32px);
  padding: 16px 0;
  border-top: 1px solid color-mix(in srgb, var(--color-text) 14%, transparent);
}
.esperienza__voce:last-child { padding-bottom: 18px; }
.esperienza__quando {
  justify-self: start;
  align-self: start;
  padding: 2px 8px;
  background: var(--color-yellow);
  color: #111111;
  border: 1px solid #1B1B1B;
  border-radius: 4px;
  font-size: var(--t-ui);
  font-weight: 600;
  white-space: nowrap;
}
.esperienza__voce:nth-child(2n) .esperienza__quando { background: var(--color-blue); }
.esperienza__voce:nth-child(3n) .esperienza__quando { background: var(--color-lilac); }
.esperienza__corpo { display: grid; gap: 2px; }
.esperienza__ruolo { font-family: var(--font-display); font-size: clamp(1.125rem, 1rem + .4vw, 1.375rem); font-weight: 600; letter-spacing: -.02em; }
.esperienza__dove,
.esperienza__testo { color: var(--color-muted); font-size: 1rem; }

/* --- Interruttore del tema ------------------------------------------------
   Pillola con pomello: in chiaro il pomello e' nero a sinistra, al buio
   diventa chiaro e scorre a destra. Contorno e ombra netta come i bottoni. */
.tema-btn {
  position: relative;
  display: inline-flex;
  align-items: center;
  justify-content: flex-start;
  width: 64px;
  height: 36px;
  padding: 3px;
  background: var(--color-surface);
  color: var(--color-text);
  border: 1.5px solid var(--color-text);
  border-radius: 999px;
  box-shadow: 2px 2px 0 var(--color-text);
  transition: background-color .3s var(--ease-mite), transform .2s var(--ease-out), box-shadow .2s var(--ease-out);
}
[data-theme="dark"] .tema-btn { background: #242424; }
.tema-btn:hover,
.tema-btn:focus-visible {
  background: var(--color-surface);
  color: var(--color-text);
  border-color: var(--color-text);
  transform: translate(1px, 1px);
  box-shadow: 1px 1px 0 var(--color-text);
}
[data-theme="dark"] .tema-btn:hover,
[data-theme="dark"] .tema-btn:focus-visible { background: #242424; }
.tema-btn:active { transform: translate(2px, 2px); box-shadow: 0 0 0 var(--color-text); }
.tema-btn__pomello {
  display: grid;
  place-items: center;
  width: 27px;
  height: 27px;
  background: #1B1B1B;
  color: var(--color-yellow);
  border-radius: 999px;
  transition: transform .5s cubic-bezier(.32, .72, 0, 1), width .25s var(--ease-out), background-color .3s var(--ease-mite), color .3s var(--ease-mite);
}
.tema-btn .tema-btn__pomello svg {
  grid-area: 1 / 1;
  width: 15px;
  height: 15px;
  transition: opacity .3s var(--ease-mite), transform .5s cubic-bezier(.32, .72, 0, 1);
}
.tema-btn__luna { opacity: 0; transform: rotate(-70deg) scale(.5); }
[data-theme="dark"] .tema-btn__pomello { transform: translateX(28px); background: #F3F0E8; color: #111111; }
[data-theme="dark"] .tema-btn__sole { opacity: 0; transform: rotate(70deg) scale(.5); }
[data-theme="dark"] .tema-btn__luna { opacity: 1; transform: none; }
/* Premendo, il pomello si allunga verso la direzione in cui andra'. */
.tema-btn:active .tema-btn__pomello { width: 31px; }
[data-theme="dark"] .tema-btn:active .tema-btn__pomello { transform: translateX(24px); }

/* --- Breakpoint del redesign ---------------------------------------------- */
@media (max-width: 1023px) {
  .about__griglia { grid-template-columns: minmax(0, .9fr) minmax(0, 1.1fr); gap: clamp(32px, 5vw, 56px); }
}
@media (max-width: 767px) {
  .manifesto-sezione { padding-block: 64px 56px; }
  .manifesto { gap: 44px; }
  .manifesto__frase { max-width: none; font-size: clamp(1.9rem, 8.4vw, 3rem); line-height: 1.22; }
  .manifesto__dati { grid-template-columns: 1fr; gap: 28px; }
  .tools__griglia { grid-template-columns: 1fr; gap: 4px; }
  .tool { padding: 12px; }
  .tool .tool__logo,
  .tool .tool__sigla { width: 52px; height: 52px; padding: 13px; }
  .about__griglia { grid-template-columns: 1fr; }
  .about__media { width: min(100%, 420px); }
  .esperienza__voce { grid-template-columns: 1fr; gap: 8px; }
}
@media (prefers-reduced-motion: reduce) {
  .tema-btn__pomello,
  .tema-btn .tema-btn__pomello svg,
  .tool .tool__logo,
  .tool .tool__sigla { transition: none; }
  .js .tools__pannello.is-entra .tool { animation: none; }
}

/* =========================================================================
   14. RITMO
   Una sola misura verticale per tutte le sezioni, e niente fili fra una e
   l'altra. Prima ogni sezione sommava il proprio fondo al margine alto della
   successiva (anche 300px di vuoto) e un filo a tutta larghezza ribadiva un
   confine che lo spazio diceva gia'. Restano solo i fili che organizzano un
   contenuto: la testa dell'accordion, i dati del manifesto, il piede.
   ========================================================================= */
:root { --ritmo: clamp(56px, 5.6vw, 96px); }

/* I quadretti passano dalla sezione alla pagina: senza filo a chiudere ogni
   sezione, la griglia che ricominciava da capo a ogni bordo alto si vedeva
   come una cucitura. Un foglio solo, continuo, stessa maglia anche in hero. */
body {
  background-image:
    linear-gradient(var(--griglia) 1px, transparent 1px),
    linear-gradient(90deg, var(--griglia) 1px, transparent 1px);
  background-size: 24px 24px;
}
main > section,
.hero,
.piede,
.pagina-testa,
.archivio { background-image: none; }

.filo,
.manifesto-sezione,
.metodo,
.piede { border-top: 0; }

.hero { padding-bottom: var(--ritmo); }
.manifesto-sezione { padding-block: var(--ritmo); }
.sezione__testa { padding-block: var(--ritmo) clamp(32px, 3.6vw, 56px); }
.tools,
.lavori,
.note { padding-bottom: var(--ritmo); }
.metodo,
.about { padding-block: var(--ritmo); }
.metodo__testa { padding-bottom: clamp(32px, 3.6vw, 56px); }
.piede__interno { padding-top: calc(var(--ritmo) * 1.25); }
.piede__cta { margin-bottom: var(--ritmo); }

/* =========================================================================
   15. RITRATTO DELLA HERO
   Cornice a contorno pieno con l'ombra netta del sistema, l'avatar tagliato
   dal fondo come un busto, e un solo oggetto intorno: la tessera del
   codice, in menta perche' sull'azzurro della cornice un'altra tessera
   azzurra spariva.
   La colonna del ritratto parte una colonna prima della fine del copy e il
   ritratto sta al centro di quella colonna: piu' vicino al testo, piu'
   lontano dal bordo dello schermo.
   ========================================================================= */
.hero { padding-top: clamp(32px, 4vw, 72px); }
.hero__copy { grid-column: 1 / span 7; grid-row: 1; position: relative; z-index: 1; }
.hero__visuale { grid-column: 7 / -1; grid-row: 1; display: flex; justify-content: center; }

.ritratto {
  position: relative;
  /* Legata anche all'altezza della finestra: la cornice e' alta 1,3 volte
     la base, e senza questo limite usciva dal primo schermo. */
  width: min(100%, 600px, 60svh);
  margin-inline: auto;
  padding: 26px 8px 8px 26px;
}
.ritratto__cornice {
  position: relative;
  overflow: hidden;
  aspect-ratio: 1 / 1.3;
  background-color: var(--color-blue);
  /* Puntinato a tre trame sovrapposte, con passi primi fra loro (37, 23,
     17): le griglie non si allineano mai, e i puntini sembrano sparsi a
     mano invece che stampati su una maglia regolare. */
  background-image:
    radial-gradient(circle, #4FA9CB 2.4px, transparent 2.9px),
    radial-gradient(circle, #5DB6D6 1.5px, transparent 2px),
    radial-gradient(circle, rgba(255, 255, 255, .5) 1.2px, transparent 1.7px);
  background-size: 37px 41px, 23px 29px, 17px 19px;
  background-position: 3px 5px, 14px 9px, 6px 15px;
  border: 1.5px solid #1B1B1B;
  border-radius: var(--r);
  box-shadow: 8px 8px 0 #1B1B1B;
}
[data-theme="dark"] .ritratto__cornice { box-shadow: 8px 8px 0 #0B0B0B; border-color: #0B0B0B; }

/* Stesse proporzioni dell'illustrazione (1440 x 1792): il canvas la disegna
   a tutta area, e un riquadro di altra forma la stirerebbe. A tutta
   larghezza e appoggiato sul fondo: le spalle escono dai lati e dal basso
   come un busto tagliato dalla cornice, senza aria fra maglia e bordo. */
.avatar2d {
  position: absolute;
  left: -1px;
  right: -1px;
  bottom: -1px;
  aspect-ratio: 1440 / 1792;
}
.avatar2d__statica,
.avatar2d canvas {
  position: absolute;
  inset: 0;
  width: 100%;
  height: 100%;
}
.avatar2d canvas { opacity: 0; transition: opacity .4s var(--ease-mite); }
.avatar2d.is-vivo canvas { opacity: 1; }
.avatar2d.is-vivo .avatar2d__statica { opacity: 0; transition: opacity .4s var(--ease-mite) .1s; }

.tessera {
  position: absolute;
  z-index: 3;
  top: 0;
  left: 0;
  display: grid;
  place-items: center;
  width: clamp(68px, 7vw, 96px);
  aspect-ratio: 1;
  background: var(--color-mint);
  color: #111111;
  border: 1.5px solid #1B1B1B;
  border-radius: var(--r);
  box-shadow: 5px 5px 0 #1B1B1B;
  font-family: var(--f-mono);
  font-size: clamp(1.2rem, .9rem + 1vw, 1.8rem);
  font-weight: 700;
  rotate: -6deg;
  pointer-events: none;
}

@media (max-width: 1023px) {
  .hero__copy, .hero__visuale { grid-column: 1 / -1; grid-row: auto; }
  .ritratto { width: min(100%, 520px); }
}
@media (max-width: 640px) {
  .ritratto { padding: 20px 6px 6px 18px; }
  .tessera { width: 58px; box-shadow: 4px 4px 0 #1B1B1B; }
}

/* --- About senza immagine ------------------------------------------------
   Titolo e presentazione a sinistra, racconto ed esperienza a destra: lo
   stesso schema delle altre testate, ma con il contenuto accanto invece che
   sotto, cosi' la sezione resta compatta. */
.about__griglia--testo {
  grid-template-columns: minmax(0, .9fr) minmax(0, 1.1fr);
  gap: clamp(36px, 7vw, 120px);
  align-items: start;
}
.about__intro { display: grid; gap: clamp(18px, 2vw, 28px); }
.about__intro .display { max-width: 12ch; }
.about__intro .about__lead { max-width: 26ch; }
.about__griglia--testo .about__copy { padding-top: clamp(4px, 1vw, 14px); }
.about__griglia--testo .about__testo { max-width: 60ch; }
@media (max-width: 899px) {
  .about__griglia--testo { grid-template-columns: 1fr; gap: 28px; }
}

/* =========================================================================
   16. DETTAGLIO PROGETTO: SCHERMATE VERE
   La schermata caricata in bacheca prende il posto del segnaposto. Una
   pagina intera e' molto piu' alta del riquadro: scorre dentro, cosi' si
   vede tutto il sito senza ritagliarlo. Senza versione mobile (per esempio
   un'automazione) la schermata desktop occupa tutta la colonna.
   ========================================================================= */
.dett__mockup-schermo--foto {
  display: block;
  padding: 0;
  overflow-y: auto;
  overscroll-behavior: contain;
  background: var(--surface);
  scrollbar-width: thin;
}
.dett__mockup-schermo--foto img {
  display: block;
  width: 100%;
  height: auto;
}
.dett__media--solo-desktop { grid-template-columns: minmax(0, 1fr); }
.dett__media--solo-desktop .dett__mockup-schermo--desktop { aspect-ratio: 4 / 4.6; }
@media (max-width: 1023px) {
  .dett__media--solo-desktop { grid-template-columns: minmax(0, 1fr); }
  .dett__media--solo-desktop .dett__mockup-schermo--desktop { aspect-ratio: 16 / 9; }
}

/* =========================================================================
   17. MASCHERE DELLE PAROLE
   Ogni parola animata e' una finestra: il testo sale da sotto il bordo e
   la finestra lo taglia. Il margine in basso fa spazio alle discendenti
   (g, p, q) senza spostare la riga: padding e margine negativo si
   compensano. Le chip del manifesto sono blocchi interi della sequenza.
   ========================================================================= */
.parola {
  display: inline-block;
  overflow: clip;
  overflow-clip-margin: .08em;
  vertical-align: top;
  padding-bottom: .12em;
  margin-bottom: -.12em;
}
.parola__dentro { display: inline-block; will-change: transform; }
.manifesto__frase .chip-gruppo { display: inline-block; }

/* =========================================================================
   18. MANIFESTO: EVIDENZA SOLO TESTUALE
   Le chip erano box con bordo, ombra e una rotazione di due gradi: quando la
   frase andava a capo, i box di due righe vicine si toccavano. Ora la parola
   resta testo, con una fascia di colore tenue sotto la meta' bassa (come un
   evidenziatore) e l'icona davanti nel colore pieno. Niente bordo, niente
   ombra, niente rotazione: a capo le righe non si scontrano piu'.
   L'interlinea sale a 1,3 per lasciare aria alla fascia.
   ========================================================================= */
.manifesto__frase { line-height: 1.3; }
.manifesto__frase .chip {
  display: inline;
  margin: 0;
  padding: 0 .08em;
  color: inherit;
  background-color: transparent;
  background-image: linear-gradient(color-mix(in srgb, var(--chip) 62%, transparent), color-mix(in srgb, var(--chip) 62%, transparent));
  background-repeat: no-repeat;
  background-position: 0 86%;
  background-size: 100% .42em;
  border: 0;
  border-radius: .1em;
  box-shadow: none;
  transform: none;
  white-space: nowrap;
  -webkit-box-decoration-break: clone;
  box-decoration-break: clone;
}
.manifesto__frase .chip--azzurro,
.manifesto__frase .chip--lilla { transform: none; }
.manifesto__frase .chip svg {
  display: inline-block;
  width: .62em;
  height: .62em;
  margin-right: .14em;
  vertical-align: -.02em;
  /* L'icona porta il colore pieno, scurito in chiaro perche' il giallo sulla
     carta non si leggerebbe. */
  color: color-mix(in srgb, var(--chip) 55%, #1B1B1B);
}
[data-theme="dark"] .manifesto__frase .chip svg { color: var(--chip); }
[data-theme="dark"] .manifesto__frase .chip {
  background-image: linear-gradient(color-mix(in srgb, var(--chip) 38%, transparent), color-mix(in srgb, var(--chip) 38%, transparent));
}
.manifesto__frase .chip-gruppo { display: inline; white-space: nowrap; }
@media (max-width: 767px) {
  .manifesto__frase { line-height: 1.28; }
}

/* =========================================================================
   19. STATO INIZIALE DELLE ANIMAZIONI DI TESTO
   Tutto quello che app.js anima parte nascosto gia' dal primo paint: lo
   script e' differito, e senza questa riga etichette e manifesto
   comparivano e poi sparivano per rientrare animati. Se GSAP non arriva,
   app.js rimette tutto visibile (mostraSenzaMotion); con movimento ridotto
   lo fa il CSS qui sotto.
   ========================================================================= */
.js .hero__saluto,
.js .metodo__testa > .etichetta,
.js .sezione__titolo > .etichetta,
.js .about__esperienza > .etichetta,
.js [data-manifesto],
.js .manifesto__dati .dato { opacity: 0; }
@media (prefers-reduced-motion: reduce) {
  .js .hero__saluto,
  .js .metodo__testa > .etichetta,
  .js .sezione__titolo > .etichetta,
  .js .about__esperienza > .etichetta,
  .js [data-manifesto],
  .js .manifesto__dati .dato { opacity: 1; }
}
