/* =============================================================
   Nicola Notarnicola, portfolio
   Token e stili ricostruiti dal prototipo Claude Design
   (Portfolio Prototype.dc.html, export 2026-08-02)
   Tipografia sostituita il 2026-08-02: F37 Bolton + Suisse Int'l Mono
   Testo passato da Schibsted Grotesk a Geist il 2026-08-18 (serviva un Light)
   ============================================================= */

/* ---------- Caratteri ---------- */

/* Due famiglie, entrambe con licenza SIL Open Font 1.1, entrambe ospitate
   qui dentro: nessuna chiamata a Google, nessun canone da pagare, nessun
   dato dei visitatori che esce verso terzi.
   I testi delle licenze stanno in assets/fonts/, vanno tenuti li'. */

/* GEIST, la voce.
   Grotesca neutra disegnata da Vercel con Basement Studio, aperta in OFL nel
   2023. Sostituisce Schibsted Grotesk il 2026-08-18 per una ragione precisa:
   Schibsted parte dal 400, non ha un Light, e il sottotitolo del caso lo
   chiede. Geist copre l'asse dei pesi da 100 a 900 in un solo file, quindi
   il Light c'e' davvero e non e' un finto assottigliamento del browser.
   Il disegno resta della stessa famiglia di forme: grotesca a contrasto
   basso, terminali orizzontali, cifre tabellari. Il sito non cambia voce,
   guadagna un registro in piu' verso l'alto.
   Un solo file per tutti i pesi: meno richieste al server e meno peso
   rispetto a quattro file separati. */

@font-face {
  font-family: 'Geist';
  src: url('../fonts/geist-var.woff2') format('woff2');
  font-weight: 100 900;
  font-style: normal;
  font-display: swap;
}

/* Il corsivo serve alla domanda che apre il caso. Geist lo ha come file
   variabile a se', stesso intervallo di pesi. */
@font-face {
  font-family: 'Geist';
  src: url('../fonts/geist-var-italic.woff2') format('woff2');
  font-weight: 100 900;
  font-style: italic;
  font-display: swap;
}

/* DM MONO, la struttura.
   Monospaziata di Colophon Foundry, OFL. Scelta al posto delle solite
   mono da programmatore perche' non ha vezzi da terminale: a corpo
   piccolo e tutto maiuscolo resta sobria, che e' quello che serve a
   date, ruoli ed etichette. */

@font-face {
  font-family: 'DM Mono';
  src: url('../fonts/dm-mono-400.woff2') format('woff2');
  font-weight: 400;
  font-style: normal;
  font-display: swap;
}

@font-face {
  font-family: 'DM Mono';
  src: url('../fonts/dm-mono-500.woff2') format('woff2');
  font-weight: 500;
  font-style: normal;
  font-display: swap;
}

:root {
  /* Inchiostri */
  --ink:          #0d0d0d;
  --ink-2:        #3d3d3d;
  --ink-3:        #5c5c5c;
  --muted:        #737373;
  --muted-2:      #a0a0a0;
  --muted-3:      #8a8a8a;
  --hairline:     #b8b4ae;
  /* Il nero di base steso sottile. Non sono grigi: sono trasparenze, quindi
     prendono il colore di quello che hanno sotto. Servono dove il fondo non e'
     sempre lo stesso (una campitura sopra la mappa, un'ombra sopra la pagina). */
  --ink-wash:     rgba(13, 13, 13, .045);
  --ink-shadow:   rgba(13, 13, 13, .18);

  /* Superfici */
  --surface:      #ffffff;
  --surface-2:    #f7f6f4;
  --surface-3:    #f2f0ec;
  --line:         #e6e4e0;

  /* ---------- Accenti ----------

     L'ARANCIONE E LE SUE DERIVATE. Le quattro righe sotto --accent non sono
     colori indipendenti: sono lo stesso arancione scurito, schiarito e steso
     trasparente. Se un giorno l'accento cambia, vanno ricalcolate tutte e
     quattro, e stanno qui attaccate proprio per non farle dimenticare.

     E' gia' successo. Il 19/09/2026 l'accento e' passato da blu ad arancione,
     e quattro posti sono rimasti indietro fino al 20/09: la riga del piede, il
     pallino davanti alla mail, e due velature del navigatore dell'Atlante che
     erano scritte come rgba(51,85,238), cioe' il vecchio blu in cifre, dove
     nessuna ricerca di "--accent" poteva trovarle.

     --accent-soft e' anche il valore che i sei file di Claude Design usano in
     tutti i piedi: il design tiene apposta due dosi dello stesso colore, pieno
     sul pallino della nav che dice "sei qui", piu' chiaro sul piede che e'
     arredo. Su --surface-2 sta a 3,4:1, sopra il 3:1 che serve a un segno
     grafico e sotto il 4,5:1 che servirebbe a un testo: infatti non e' un
     testo. */
  --accent:        #e8551f;                  /* la sorgente. 3,65:1 su bianco */
  --accent-hover:  #ba4419;                  /* scurito, per il passaggio del mouse. 5,35:1 */
  --accent-soft:   #f0a882;                  /* schiarito, per i segni d'arredo. 1,98:1 */
  --accent-wash:   rgba(232, 85, 31, .07);   /* steso al 7%, da mettere sotto un testo */
  --accent-wash-2: rgba(232, 85, 31, .12);   /* steso al 12%, per la casella corrente */

  /* Il lilla delle cose ancora da fare, e un verde acido mai entrato in pagina.
     Non sono accenti di marca: il lilla e' un attrezzo di lavoro (vedi
     --text-todo), il verde e' un avanzo della prima tavolozza. */
  --accent-2:     #a99bf0;
  --accent-3:     #d9f24e;

  /* Accento di pagina.
     I tre comandi di navigazione (Back in alto a sinistra, Resume in alto a
     destra, il rimando in fondo) cambiano colore da pagina a pagina: ogni
     progetto porta il suo. Chi non dichiara niente resta sul blu del sito.
     Vedi la regola [data-page] piu' sotto. */
  --page-accent:       var(--accent);
  --page-accent-hover: var(--accent-hover);

  /* La tinta del progetto. Serve a due cose: il nome nel titolo del caso
     ("Evvu | ...") e i passaggi di testo evidenziati dentro la pagina. E' un
     colore a se' rispetto all'accento di navigazione: possono coincidere o no.
     Chi non dichiara niente resta nero e la pagina non cambia aspetto. */
  --page-tint:         var(--ink);
}

/* Perche' il pannello qui sotto sta su "body" e non su ":root" insieme al
   resto. Una variabile CSS viene risolta sull'elemento dove e' scritta, non
   dove viene usata. Se qui dicessimo --text-command: var(--page-accent) dentro
   :root, cioe' su <html>, il browser lo risolverebbe subito col blu di sito,
   perche' l'arancione di Evvu <html> non ce l'ha: arriva dopo, sul <body>, con
   [data-page="evvu"]. I comandi resterebbero blu su tutte le pagine progetto.
   Scritto sul body, invece, il pannello si risolve sullo stesso elemento su cui
   atterra il colore di pagina, e ogni progetto porta il suo.
   E' un errore che avevo gia' fatto e visto in faccia il 20/08/2026: se un
   giorno qualcuno riportasse questo blocco dentro :root, tornerebbe. */
body {

  /* ===========================================================
     PANNELLO DEI COLORI DI TESTO       (introdotto il 20/08/2026)

     Per cambiare il colore di un testo del sito si viene qui, si
     cambia una riga, e si e' finito. Sotto ogni token c'e'
     scritto dove quel testo si vede.

     I colori qui sopra sono la tavolozza: dicono QUALI colori il
     sito possiede. I token qui sotto dicono A COSA servono. La
     distinzione non e' pedanteria, risolve due guai concreti:

     - prima un token solo serviva testi diversi. --ink-3 era il
       sottotitolo del caso ma anche il testo delle card e i
       paragrafi dell'impatto: non si poteva toccarne uno senza
       toccare gli altri tre;
     - prima gli stessi token servivano testo E grafica. --ink e'
       il nero dei titoli ma anche il filetto sopra le sezioni;
       --hairline e' il pallino degli elenchi ma anche il bordo
       dei segnaposto. Ora bordi e sfondi continuano a citare la
       tavolozza per conto loro, e i testi passano solo di qui.

     Regola della casa: ogni colore che finisce su un testo passa
     da un token --text-*. Nessuna eccezione, cosi' non c'e' nulla
     da ricordare.

     Ogni pagina progetto puo' sovrascrivere i token che vuole nel
     proprio blocco [data-page], piu' sotto.

     Per vedere tutti i ruoli affiancati, con il rapporto di
     contrasto di ognuno: aprire _tools/colori.html.
     =========================================================== */

  /* I titoli grandi. Statement della home, titolo di caso, frasi
     in evidenza (.pull), titoli dei blocchi di impatto, testo
     delle citazioni, titoli delle card, nome del progetto nel
     carosello, righe del piede.
     E' separato da --text-strong qui sotto benche' oggi valgano
     lo stesso nero: serve a poter schiarire i titoloni tenendo
     nero il resto, che senza questa distinzione non si puo' fare. */
  --text-display:        var(--ink);

  /* Il nero di base, quello che tutti ereditano dal body senza
     dichiararlo: ruoli della timeline, valori delle schede,
     elenchi, domanda delle card, numerazione dell'impatto,
     frecce della striscia, voce attiva del menu. */
  --text-strong:         var(--ink);

  /* La prosa lunga: paragrafi ed elenchi delle sezioni di testo,
     paragrafi della riflessione finale. */
  --text-body:           var(--ink-2);

  /* Il testo di supporto, un gradino sotto la prosa: la domanda
     che apre il caso, il testo delle card, i paragrafi dei
     blocchi di impatto. */
  --text-secondary:      var(--ink-3);

  /* Barra e soggetto nel titolo di caso ("Evvu | soggetto"). */
  --text-subject:        var(--muted-3);

  /* Etichette e voci di servizio: menu, occhielli maiuscoli
     (.eyebrow), azienda nella timeline, descrizione del
     carosello, contatore della striscia, testo dei segnaposto. */
  --text-label:          var(--muted);

  /* Un gradino piu' tenue delle etichette: voci di menu non
     ancora attive, anni della timeline, meta del carosello,
     fonte delle citazioni. */
  --text-faint:          var(--muted-2);

  /* Il pallino degli elenchi puntati. */
  --text-marker:         var(--hairline);

  /* Testi nell'accento di sito, uguali su ogni pagina: LinkedIn
     nel piede, anno corrente della timeline, marchio e nome del
     progetto al passaggio del mouse. */
  --text-link:           var(--accent);
  --text-link-hover:     var(--accent-hover);

  /* Annotazioni pubblicate: il "case study coming" accanto alla
     data, sulle card del carosello che non hanno ancora una
     pagina. E' testo che legge chi visita il sito, e dice una
     cosa utile: quel caso esiste ma non e' ancora scritto.
     Arancione dal 20/09/2026, scelto con Nicola: prima era il
     lilla qui sotto, che su bianco sta a 2,44:1 e si faticava a
     leggere. L'arancione pieno sta a 3,65:1. Sotto il 4,5:1 che
     un testo di 11px vorrebbe, quindi resta un punto aperto:
     l'unico dei tre arancioni che passa la soglia e'
     --accent-hover, a 5,35:1, ed e' li' se un giorno si decide
     che la leggibilita' viene prima del colore. */
  --text-note:           var(--accent);

  /* Il lilla dei segni di lavorazione: la sottolineatura dei
     testi non ancora scritti (.ph) e l'etichetta "Immagine da
     inserire" dentro un segnaposto vuoto (.slot__hint). Oggi non
     se ne vede nessuno in pagina, sono tutti e due dormienti, ma
     le regole restano pronte per la prossima pagina che nasce.
     Separato da --text-note dal 20/09/2026: prima era un token
     solo, e portare le annotazioni all'arancione avrebbe tinto
     di arancione anche questi, facendo sparire la differenza fra
     "non l'ho ancora scritto" e "non e' ancora pubblicato". */
  --text-todo:           var(--accent-2);

  /* I comandi che portano il colore del progetto: Back, Resume,
     link delle card, rimando in fondo. Seguono l'accento di
     pagina, ma passando da qui si potranno scurire per il
     contrasto senza spegnere anche il filetto della citazione,
     che l'accento lo prende per conto suo. */
  --text-command:        var(--page-accent);
  --text-command-hover:  var(--page-accent-hover);

  /* Testi nella tinta del progetto: nome nel titolo di caso,
     etichetta del pattern nelle card, passaggi evidenziati. */
  --text-tint:           var(--page-tint);


  /* ===========================================================
     PANNELLO DELLE SUPERFICI E DEI SEGNI (20/09/2026)

     Il gemello del pannello qui sopra, per tutto quello che un
     colore ce l'ha ma testo non e': fondi, filetti, pallini,
     barre, anelli di fuoco, velature.

     PERCHE' E' NATO. Il pannello dei testi copriva i testi, e
     basta. Per tutto il resto ogni regola citava la tavolozza
     per conto suo, e nessuno teneva il conto di chi citava
     cosa. Quando l'accento e' passato da blu ad arancione,
     quattro posti sono rimasti indietro, e due di questi erano
     il vecchio blu scritto in cifre, rgba(51,85,238), dove
     cercare "--accent" non poteva trovarli. Non era distrazione:
     era che non esisteva un posto da cui passassero tutti.

     LA REGOLA DELLA CASA, ESTESA. Prima diceva: ogni colore che
     finisce su un TESTO passa da un token --text-*. Ora dice:
     ogni colore del sito passa da un token. I testi dai
     --text-*, tutto il resto da qui. Fuori dalla tavolozza non
     si scrive nessun colore in cifre.

     Come si cambia il colore del sito, adesso: si apre la
     tavolozza qui sopra, si riscrive --accent e le sue quattro
     derivate, e si e' finito. Non serve cercare niente.

     L'UNICA ECCEZIONE, dichiarata il 27/08/2026 e confermata
     oggi: il visualizzatore a tutto schermo dell'Atlante
     (.atlas-lb). E' una superficie scura sopra fotografie, con
     una sua scala di bianchi e di neri trasparenti che col
     resto del sito non c'entra e che un cambio di accento non
     tocca. Li' i valori restano letterali e scritti sul posto.
     Tirarli qui dentro vorrebbe dire dieci token per un
     componente solo: sarebbe rinominare, non semplificare.
     =========================================================== */

  /* I tre fondi, dal piu' chiaro al piu' marcato. */
  --ui-page:        var(--surface);     /* il fondo della pagina */
  --ui-raised:      var(--surface-2);   /* piede, riquadri in rilievo, il rimando in fondo quando ci passi sopra */
  --ui-sunken:      var(--surface-3);   /* il riquadro dell'immagine mentre arriva, le righe della tabella sotto il mouse */

  /* I filetti. Sono due pesi, non due colori a caso: il nero apre
     una sezione, il chiaro separa due righe dentro la stessa. */
  --ui-rule:        var(--line);
  --ui-rule-strong: var(--ink);
  --ui-rule-dashed: var(--hairline);    /* il bordo tratteggiato dei segnaposto immagine */

  /* I segni nell'accento di sito, uguali su ogni pagina. */
  --ui-mark:        var(--accent);       /* pallino della nav, contorno della casella dell'Atlante */
  --ui-mark-soft:   var(--accent-soft);  /* riga in alto e pallino della mail, nel piede */

  /* Separato da --ui-mark anche se oggi vale lo stesso arancione:
     l'anello di fuoco e' l'unica cosa che vede chi naviga con la
     tastiera, e se un giorno gli servisse piu' contrasto si
     scurisce qui senza spegnere anche i pallini. E' la stessa
     ragione per cui --text-display sta separato da --text-strong. */
  --ui-focus:       var(--accent);

  /* Le velature: colore steso sottile sotto un testo o dentro una
     casella, dove serve un segno che non copra quello che c'e'. */
  --ui-wash:        var(--accent-wash);
  --ui-wash-strong: var(--accent-wash-2);
  --ui-seen:        var(--ink-wash);     /* le tavole dell'Atlante gia' aperte */
  --ui-shadow:      var(--ink-shadow);   /* l'unica ombra del sito, sotto l'anteprima dell'Atlante */

  /* I segni che portano l'accento di PAGINA invece di quello di
     sito: filetto della citazione, barra della card, linguetta
     della fase aperta, anello di fuoco della striscia. Oggi le
     pagine non dichiarano piu' un accento proprio, quindi vale
     ovunque l'arancione; il canale resta perche' il giorno che
     una pagina volesse il suo colore, basta il suo [data-page]. */
  --ui-command:     var(--page-accent);
}

/* Da qui in poi token che non riguardano i colori: possono restare su :root. */
:root {
  /* Ritmo */

  /* PUNTO APERTO (20/09/2026): questo e' il margine laterale della HOME, e li'
     e' corretto. Le cinque pagine di caso, nei loro file di design, ne hanno
     uno piu' largo: clamp(24px, 7.4vw, 120px). Il sito applica questo a tutte
     e sei. E' lo stesso schema di --lh-body, che vale 1.6 in home e 1.5 nei
     casi, ma li' e' gia' risolto e qui no.
     Quanto pesa: 3px per lato a 390, 8 a 1024, 12 a 1440, 24 sopra i 1621
     dove i due tetti divergono (96 contro 120). Si vede sulle cose a piena
     larghezza, non sulla prosa, che ha gia' un tetto suo.
     Rimandato da Nicola il 20/09/2026. Per farlo: ridefinire --gutter dentro
     [data-page], come e' stato fatto per --lh-body. La riga e' una, il lavoro
     vero e' rimisurare le cinque pagine alle quattro larghezze, perche'
     sposta ogni elemento e restringe le immagini.
     Dettaglio e misure in _review/2026-09-20_piano-integrazione.md. */
  --gutter:       clamp(20px, 6.6vw, 96px);
  --section-gap:  clamp(92px, 12vw, 168px);

  /* Tipografia.
     Due voci e basta. --font-body dice le cose, --font-mono le etichetta.
     I fallback sono caratteri di sistema con proporzioni simili, cosi'
     se il woff2 tarda la pagina non balla. */
  --font-body: 'Geist', -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, sans-serif;
  --font-mono: 'DM Mono', ui-monospace, SFMono-Regular, Menlo, Consolas, monospace;

  /* Pesi, nominati per ruolo invece che per numero.
     Geist copre da 100 a 900, quindi il Light esiste. Usarlo pero' costa:
     sotto i 24px un 300 si sgrana sugli schermi non retina e il testo si
     legge peggio. Regola della casa: il Light solo nei corpi grossi, cioe'
     il sottotitolo del titolo di caso. Tutto il resto tiene il 400 e fa la
     gerarchia con corpo, colore e spazio. */
  --w-light:   300;   /* solo display, mai sotto i 24px */
  --w-body:    400;   /* testo corrente e titoloni */
  --w-medium:  500;   /* nome in testata, stato attivo, etichette in evidenza */
  --w-strong:  600;   /* enfasi dentro il testo, rara */

  /* Spaziatura ottica: piu' il corpo cresce, piu' si stringe.
     Le maiuscole minute vanno invece allargate, altrimenti si impastano. */
  --track-xl:   -.035em;  /* oltre i 48px */
  --track-l:    -.025em;  /* 26-48px */
  --track-m:    -.012em;  /* 17-25px */
  --track-caps:   .11em;  /* etichette maiuscole sotto i 14px */

  /* Interlinee: stretta sui titoli, larga sul testo che si legge davvero.

     --lh-body vale 1.6 QUI e 1.5 sulle pagine progetto, vedi [data-page]
     piu' sotto. Non e' una svista: i file di Claude Design usano davvero due
     valori diversi, 1.6 nella home e 1.5 nelle cinque pagine di caso.
     Verificato misurando i due rendering fianco a fianco il 20/09/2026, dopo
     averla portata a 1.5 per tutti e aver visto la home scostarsi dal suo
     file. La prosa lunga di un caso sta piu' fitta, le poche righe della home
     stanno piu' larghe. */
  --lh-display: 1.04;
  --lh-title:   1.2;
  --lh-lead:    1.4;
  --lh-body:    1.6;

  --ease: cubic-bezier(.16, 1, .3, 1);
}

/* ===========================================================
   LE PAGINE PROGETTO           (rifatto il 21/08/2026)

   Un solo blocco per tutte e tre. Il selettore e' l'attributo
   nudo, [data-page], senza valore: vale per qualunque pagina lo
   porti. Le pagine nuove (CER, CSC, ATM) erediteranno da qui
   senza che si debba scrivere altro.

   PRIMA erano tre blocchi, uno per progetto, e ognuno portava
   la sua tinta: Evvu arancione e verde, Nodes Now lilla e viola,
   Orsero petrolio e ambra. Il 21/08 Nicola ha provato Orsero
   quasi senza colore, gli e' piaciuta, e ha chiesto di portarla
   sulle altre due. I colori di progetto sono quindi spariti dal
   sito. Sono qui sotto, se un giorno si vogliono indietro:

     [data-page="evvu"]      accento #ea5926 / #bb471e, tinta #50ac33
     [data-page="nodes-now"] accento #b5b5f5 / #8a8ae0, tinta #a16cff
     [data-page="orsero"]    accento #0f7b6c / #0b5c51, tinta #b45309

   COME FUNZIONA ORA. Due livelli e basta:

   - nero, e lo prende solo chi conta: il nome nel titolo di caso
     e i passaggi evidenziati (.hi). Non c'e' una riga che lo
     dica, ed e' voluto: --page-tint non viene dichiarato, e il
     suo valore di riserva e' gia' --ink;
   - grigio #8a8a8a su tutto il resto del testo. Sono i cinque
     token qui sotto;
   - il blu di sito sui comandi, e anche questo senza scriverlo:
     senza --page-accent vale --accent.

   Regola: quando il valore di riserva dice gia' la cosa giusta,
   non lo si ripete. Una riga che ripete la riserva e' una riga
   che qualcuno dovra' leggere e verificare per niente.

   TRE TOKEN DI TESTO RESTANO FUORI, ognuno per un motivo suo:

   - --text-faint (#a0a0a0) tiene "Side Quests" e "My Desk", le
     voci di menu non ancora attive. Portarlo a #8a8a8a le
     renderebbe piu' scure di prima e identiche a "Work", che
     invece si clicca: sparirebbe l'unico segno che le distingue;
   - --text-marker e' il pallino degli elenchi, che e' grafica;
   - --text-tint e' quello che tiene neri nome e .hi. Toccarlo
     renderebbe la pagina monocroma.

   DUE COSE NON DI TESTO seguono l'accento e quindi ora sono blu
   dove prima erano arancione o lilla: il filetto della citazione
   (.quote__bar, su Evvu e Nodes Now) e il contorno di messa a
   fuoco della striscia di card. Voluto: erano l'accento di
   pagina, e l'accento di pagina ora e' il blu di sito.

   IL CONTO DEL CONTRASTO. #8a8a8a su bianco fa 3,45:1. Regge sui
   titoloni (sopra i 24px la soglia e' 3:1), sta sotto il 4,5:1 su
   tutto il resto, prosa lunga compresa, che prima stava a 10,9:1.
   E' il prezzo dei due livelli, messo davanti a Nicola coi numeri
   prima di procedere e accettato. Si rilegge in _tools/colori.html.

   Se un giorno una pagina volesse discostarsi, si rimette un
   blocco col suo nome DOPO questo: stessa specificita', vince
   l'ultimo. Per esempio:
     [data-page="cer"] { --text-body: #3d3d3d; }
   =========================================================== */
[data-page] {
  /* Vedi la nota su --lh-body fra le interlinee: le pagine di caso hanno la
     prosa piu' fitta della home, come nei rispettivi file di design. */
  --lh-body:        1.5;

  --text-display:   var(--muted-3);
  --text-strong:    var(--muted-3);
  --text-body:      var(--muted-3);
  --text-secondary: var(--muted-3);
  --text-label:     var(--muted-3);
}

/* Testata e piede sono arredo di sito, non contenuto di pagina: devono essere
   identici ovunque, home compresa. Chiesto da Nicola il 21/08 guardando il piede
   di Orsero, dove "LET'S TALK" era grigio mentre sulla home e' nero.

   Qui i token tornano ai valori del pannello generale. Funziona perche' le
   variabili CSS si ereditano: il blocco [data-page] le schiarisce sul <body>,
   queste due regole le riscrivono piu' in basso nell'albero, e da li' in giu'
   vale di nuovo il valore di partenza. Cosi' quello che la pagina schiarisce si
   ferma al contenuto, senza una sola dichiarazione di colore in piu'.

   Se un domani si aggiunge un token al pannello e una pagina lo sovrascrive,
   va aggiunto anche qui: e' l'unico punto da tenere allineato a mano.

   L'ultima riga, color, non e' di troppo: senza, meta' del lavoro non si vede.
   Il body dichiara color: var(--text-strong), e quella variabile viene risolta
   li', sul body. Quello che scende ai figli e' il risultato, cioe' un grigio
   gia' fatto, non la formula: rimettere a posto i token piu' in basso non lo
   ricalcola. Chi ha un colore suo (le righe del piede) tornava nero da solo,
   chi eredita e basta (il marchio, l'indirizzo mail) restava grigio. Questa
   riga fa ripartire l'ereditarieta' dal valore giusto. */
.site-header,
.contact {
  /* Testata e piede restano arredo di sito: stessa interlinea ovunque, come
     i colori qui sotto. Senza questa riga, dentro una pagina progetto
     erediterebbero l'1.5 del contenuto e sarebbero leggermente piu' fitti
     che in home, contro la regola presa con Nicola il 21/08/2026. */
  --lh-body:        1.6;

  --text-display:   var(--ink);
  --text-strong:    var(--ink);
  --text-body:      var(--ink-2);
  --text-secondary: var(--ink-3);
  --text-label:     var(--muted);

  color: var(--text-strong);
  /* La riga qui sopra rimette il token, ma da sola non basta: line-height e'
     dichiarato sul body, quindi li' si risolve una volta e i figli ereditano
     il RISULTATO, non la formula. Senza ridichiararlo qui, dentro una pagina
     progetto testata e piede restavano all'1.5 del contenuto. E' la stessa
     trappola dei colori annotata sopra, in un'altra proprieta'. */
  line-height: var(--lh-body);
}

/* ---------- Reset essenziale ---------- */

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

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

body {
  margin: 0;
  background: var(--ui-page);
  color: var(--text-strong);
  font-family: var(--font-body);
  font-weight: var(--w-body);
  line-height: var(--lh-body);
  -webkit-font-smoothing: antialiased;
  -moz-osx-font-smoothing: grayscale;
}

h1, h2, h3, h4, p, figure, blockquote, ul, ol { margin: 0; padding: 0; }
ul, ol { list-style: none; }
img { max-width: 100%; display: block; }

/* Un capoverso non deve finire con una parola sola sull'ultima riga, e un
   titolo breve va spezzato in righe di lunghezza simile. Sono le due
   impostazioni di text-wrap: pretty per il testo corrente, balance per i
   titoli.

   Fino al 20/09/2026 pretty era dichiarato componente per componente,
   venticinque volte, e cinque componenti erano rimasti scoperti per
   dimenticanza. Qui la regola e' una sola e vale per tutto: chi aggiunge un
   paragrafo domani non deve ricordarsi di niente.

   Perche' pretty e non balance sul testo corrente: balance pareggia le righe,
   e su un capoverso lungo le accorcia tutte, allargando il margine a destra.
   Serve sui titoli di poche righe, e infatti li' resta dichiarato a mano:
   .impact__title, .reflection__title, .cases__title, .slide__name. Quelle
   quattro vincono su questa regola perche' una classe conta piu' di un
   elemento, a prescindere dall'ordine nel file.

   Restano a mano anche .cases__pattern e .cases__q: sono <span>, non
   paragrafi, e questa regola non li raggiunge.

   Dove pretty non e' supportato il testo va a capo come ha sempre fatto.
   Non c'e' niente da rimediare con JavaScript: riscrivere il contenuto dei
   paragrafi per incollare le ultime due parole staccherebbe i nodi che
   carousel.js e cards.js tengono in mano, e congelerebbe a una larghezza
   sola una scelta che deve seguire lo schermo. */
h1, h2, h3, h4, h5, h6,
p, li, blockquote, figcaption, dd { text-wrap: pretty; }

a {
  color: inherit;
  text-decoration: none;
  transition: color .2s ease;
}

/* La freccia dei rimandi che portano fuori dalla pagina: RESUME nel menu e
   LINKEDIN nel piede. Sta qui in cima e non dentro uno dei due blocchi perche'
   la usano entrambi.
   Tre dettagli che sembrano pignoleria e non lo sono. La freccia e' un carattere
   di testo, non un'icona, quindi da sola non si puo' muovere: serve lo <span>
   che la avvolge nel markup. Lo span va reso inline-block, perche' su un
   elemento inline puro transform non ha alcun effetto e niente segnala
   l'errore. E lo spazio fra la parola e la freccia sta fuori dallo span,
   altrimenti si muoverebbe anche lui e la parola sembrerebbe allungarsi. */
.link-arrow {
  display: inline-block;
  transition: transform .2s ease;
}

.site-nav .nav-resume:hover .link-arrow,
.contact__social:hover .link-arrow { transform: translate(2px, -2px); }

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

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

/* ---------- Impaginazione ---------- */

.wrap { padding-inline: var(--gutter); }

/* Il piede va ancorato al fondo della finestra, non del contenuto: se la pagina
   e' piu' bassa della finestra (zoom ridotto, schermi alti), senza questo il
   piede finisce a meta' pagina e sotto resta uno spazio bianco vuoto invece che
   in fondo. .page si allunga almeno quanto la finestra e main si prende lo
   spazio in avanzo, cosi' il piede resta sempre giu'. */
.page {
  animation: pageIn .55s var(--ease) both;
  display: flex;
  flex-direction: column;
  min-height: 100vh;
  min-height: 100dvh;
}

main { flex: 1 0 auto; }

@keyframes pageIn {
  from { opacity: 0; transform: translateY(14px); }
  to   { opacity: 1; transform: none; }
}

/* ---------- Testata ---------- */

.site-header {
  display: flex;
  justify-content: space-between;
  align-items: baseline;
  gap: 24px;
  padding-block: 26px;
  border-bottom: 1px solid var(--ui-rule);
}

.site-header__left {
  display: flex;
  align-items: center;
  gap: clamp(16px, 2.4vw, 32px);
}

.wordmark {
  font-size: clamp(16px, 1.5vw, 21px);
  font-weight: var(--w-medium);
  letter-spacing: .04em;
}

.wordmark:hover { color: var(--text-link); }

/* Sta a riposo nello stesso grigio delle voci di menu e si scurisce al
   passaggio, perche' e' navigazione di servizio come loro, non un'azione.
   Sui 12px mono maiuscolo il grigio --muted vale 4,7:1 su bianco: passa la
   soglia dei testi piccoli, ma di poco, ed e' il testo piu' debole della
   testata. Se un giorno dovesse scendere ancora, va rivisto. */
.back-link {
  font-family: var(--font-mono);
  font-size: 12px;
  letter-spacing: var(--track-caps);
  text-transform: uppercase;
  color: var(--text-label);
  white-space: nowrap;
}

.back-link:hover { color: var(--text-strong); }

.site-nav {
  display: flex;
  align-items: center;
  gap: clamp(16px, 2.6vw, 36px);
  font-family: var(--font-mono);
  font-size: clamp(11px, 1vw, 13px);
  font-weight: var(--w-body);
  letter-spacing: var(--track-caps);
  text-transform: uppercase;
  color: var(--text-label);
}

.site-nav a:hover { color: var(--text-strong); }

.site-nav .is-current {
  display: flex;
  align-items: center;
  gap: 8px;
  font-weight: var(--w-medium);
  color: var(--text-strong);
}

.site-nav .is-current::before {
  content: "";
  width: 6px; height: 6px;
  border-radius: 50%;
  background: var(--ui-mark);
  flex: none;
}

/* Unica voce del menu che porta fuori dal sito, ed e' vestita esattamente come
   LINKEDIN nel piede: blu gia' da ferma, senza sottolineatura, con la freccia
   che scivola al passaggio. Il blu a riposo vuol dire sempre la stessa cosa nel
   sito, cioe' questo rimando ti porta via dalla pagina.
   PRIMA (fino al 21/08/2026) era nera con una riga di 1px sotto, disegnata come
   sfondo con un gradiente invece che con text-decoration, per non toccare la
   coda della g ne' la freccia. Tolta perche' il blu dice gia' che si clicca, e
   la riga faceva pesare questa voce piu' di tutte le altre del menu. Se dovesse
   tornare, era: background-image: linear-gradient(currentColor, currentColor);
   background-size: 100% 1px; background-position: 0 100%; no-repeat. */
.site-nav .nav-resume { color: var(--text-link); }
.site-nav .nav-resume:hover { color: var(--text-link-hover); }

/* Voci presenti ma non ancora raggiungibili: si vedono, si capisce che
   arriveranno, non fingono di essere link. Sono <span>, non <a>, cosi'
   nessuno ci clicca sopra a vuoto e i lettori di schermo lo dicono. */
.site-nav .nav-soon {
  color: var(--text-faint);
  cursor: default;
}

/* ---------- Home: apertura ---------- */

.intro {
  display: grid;
  grid-template-columns: 1fr 1fr;
  gap: clamp(32px, 4.4vw, 64px);
  align-items: start;
  padding-block: clamp(32px, 3.6vw, 56px) clamp(20px, 2.2vw, 28px);
}

.statement {
  font-size: clamp(38px, 5.7vw, 82px);
  line-height: var(--lh-display);
  color: var(--text-display);
  font-weight: var(--w-body);
  letter-spacing: var(--track-xl);
}

/* Il sottotitolo sotto la frase d'apertura, dal 20/09/2026. --muted-3 e non
   --text-secondary: sulla home non c'e' data-page, quindi --text-secondary
   varrebbe --ink-3, piu' scuro di quanto serva qui. */
.intro__lead {
  margin-top: clamp(16px, 1.6vw, 20px);
  font-size: clamp(17px, 1.5vw, 21px);
  line-height: var(--lh-lead);
  color: var(--muted-3);
  letter-spacing: var(--track-m);
  max-width: 38ch;
}

.timeline__row {
  display: grid;
  /* Anno, poi ruolo, poi azienda. La colonna dell'anno e' larga abbastanza
     per un intervallo tipo 2022/24, non solo per un anno singolo. */
  grid-template-columns: 76px 1fr 1fr;
  gap: 16px;
  align-items: baseline;
  padding-block: 20px;
  border-bottom: 1px solid var(--ui-rule);
  /* La scatola sborda 14px a sinistra: serve al rettangolo grigio dell'hover,
     che deve partire prima del testo invece di incollarcisi. Margine negativo
     per la scatola, imbottitura uguale e opposta per tenere fermo il testo.
     Sta qui, su TUTTE le righe, e non sulle sole righe collegate a un progetto:
     il filetto e' largo quanto la scatola, quindi se una riga sola non avesse il
     margine il suo filetto partirebbe 14px piu' a destra e sarebbe piu' corto.
     Succedeva all'ultima riga, quella del Politecnico, che non e' collegata a
     nessun progetto. Spostare queste due righe altrove riapre il difetto. */
  padding-left: 14px;
  margin-left: -14px;
}

.timeline__year {
  font-family: var(--font-mono);
  font-size: 14px;
  color: var(--text-faint);
}

/* Sulla riga del ruolo attuale l'anno resta grigio come tutti gli altri: il
   segno di "e' questo che faccio ora" e' passato dall'anno al ruolo, che e'
   l'informazione che si vuole leggere per prima. Il peso medio viaggia col
   colore, non in aggiunta: e' la stessa compensazione di .hi, un blu su bianco
   rende meno segno di un nero a parita' di peso. */
.timeline__row--current .timeline__role {
  color: var(--text-link);
  font-weight: var(--w-medium);
}

/* Il ruolo e' la voce forte: la storia qui e' la progressione, non il logo.
   L'azienda resta piccola e in grigio, come un riferimento. */
.timeline__role  { font-size: clamp(16px, 1.4vw, 18px); letter-spacing: var(--track-m); }
.timeline__org   { font-size: 14px; color: var(--text-label); }

/* SPENTO IL 20/09/2026, SU RICHIESTA DI NICOLA. NON CANCELLATO.

   Righe collegate a un progetto del carosello (attributo data-slide): passandoci
   sopra il mouse lo sfondo si schiariva e il progetto andava in evidenza nel
   carosello (carousel.js). La riga della formazione non ha data-slide, quindi
   niente cursore ne stato hover: resta inerte, come deciso, ma la sua geometria
   e' la stessa delle altre (vedi .timeline__row). Lo stato hover stava dentro
   @media (hover: hover) perche' su touch :hover resta appiccicato.

   Il collegamento e' sospeso, non rimosso: l'attributo data-slide resta
   nell'HTML e il codice resta qui sotto e in carousel.js. Per riaccendere
   servono due gesti, e vanno fatti tutti e due: togliere i commenti qui e
   rimettere TIMELINE_SYNC a true in carousel.js. Spento solo di qua, la riga
   si schiarirebbe al passaggio del mouse senza che succeda niente nel
   carosello; spento solo di la', il cursore a manina prometterebbe un'azione
   che non c'e'. */
/*
.timeline__row[data-slide] {
  cursor: pointer;
  transition: background-color .2s ease;
}

@media (hover: hover) {
  .timeline__row[data-slide]:hover { background: var(--ui-sunken); }
}
*/

/* ---------- Home: carosello lavori ---------- */

.work { padding-bottom: clamp(24px, 3vw, 40px); }

/* Regola .work__head rimossa il 2026-08-02 insieme all'intestazione visibile
   della sezione lavori. Lo spazio sopra il carosello resta garantito dal
   padding-top di .carousel. */

.eyebrow {
  font-family: var(--font-mono);
  font-size: 11px;
  letter-spacing: var(--track-caps);
  text-transform: uppercase;
  color: var(--text-label);
  /* Il peso va dichiarato qui, altrimenti lo decide il browser. La meta' di
     queste etichette sono <h2> o <h3>, e i titoli nascono in grassetto: quelle
     finivano a 700, mentre le stesse etichette scritte come testo normale
     (BACK TO in fondo alla pagina, le voci del menu) restavano a 400. Stessa
     classe, stesso carattere, due pesi diversi a seconda di come era scritto il
     codice.

     Peggio: di DM Mono il sito carica il 400 e il 500, il 700 non esiste. Il
     browser prendeva il 500 e ispessiva lui il disegno delle lettere. Tenendo
     il 400 come riferimento: il 500 vero porta il 119,2% di inchiostro, quel
     700 fabbricato il 124,4%. A 11px si legge come un impasto.

     Tutti e sei i file di design dichiarano 400. Corretto il 20/09/2026, su
     richiesta di Nicola. Nessuno spostamento: DM Mono e' monospaziato, la
     larghezza delle lettere non dipende dal peso. */
  font-weight: var(--w-body);
}

.carousel {
  overflow: hidden;
  padding-top: clamp(10px, 1.4vw, 18px);
}

/* Le card stanno tutte in posizione assoluta, sovrapposte al centro della
   traccia: il JavaScript le sposta con translateX e le scala in base alla
   distanza dal centro (vedi carousel.js). Traslano e crescono davvero, invece
   di cambiare solo larghezza restando ferme come nella fisarmonica precedente.
   L'altezza deve bastare alla card grande piu' la sua didascalia sotto. */
.carousel__track {
  --slide-gap: 30px;   /* spazio costante fra i bordi di due card vicine, letto dal JavaScript */
  position: relative;
  /* Il pavimento e' passato da 430 a 450 il 21/08/2026. Sotto i 1075px il 40vw
     scende sotto il pavimento, che quindi resta fermo mentre la card continua a
     crescere con la finestra (0.3vw): lo spazio per la didascalia si stringe da
     solo. Fra 1011 e 1021px la card di Nodes Now sforava di 3px e la traccia le
     tagliava l'ultima riga. Il ritaglio non si vede, il testo sparisce e basta.
     Con 450 il punto peggiore avanza 17px. Sopra i 1125px non cambia niente:
     li' comanda il 40vw. */
  height: clamp(450px, 40vw, 520px);
}

.slide {
  position: absolute;
  left: 50%;
  top: 0;
  width: clamp(240px, 30vw, 440px);
  /* Origine in alto: scalando, le card restano allineate al bordo superiore
     invece di centrarsi in verticale con le cime sfalsate. */
  transform-origin: center top;
  display: flex;
  flex-direction: column;
  text-align: left;
  font: inherit;
  color: inherit;
  background: none;
  border: 0;
  padding: 0;
  will-change: transform, opacity;
  transition: transform .6s cubic-bezier(.65, 0, .35, 1),
              opacity .5s ease;
}

.slide--link:hover .slide__name { color: var(--text-link); }

/* Zoom appena accennato sull'immagine al passaggio del mouse (21/08/2026).
   Solo su .slide--link, cioe' le tre card che portano davvero a una pagina:
   il movimento diventa il modo in cui la fila dice dove si puo' cliccare,
   invece di promettere una pagina che non esiste su CER, CSC e ATM.

   Cresce l'immagine, non la card: la didascalia non si muove di un pixel e la
   geometria della fila resta quella calcolata dal JavaScript. Il taglio lo fa
   .slide__frame, che ha gia' overflow: hidden.

   Il 4% e' voluto piccolo. Le card sono in movimento quasi sempre e si scalano
   gia' per distanza dal centro: uno zoom generoso qui si sommerebbe a quello e
   sembrerebbe un salto. La transizione sta sull'immagine e non sull'hover, cosi
   e' simmetrica anche in uscita.

   transform e' composito, non rifa' il layout: non puo' far sfarfallare il
   carosello, che a ogni fotogramma ridisegna gia' sei card.

   Dal 27/08/2026 la card ATM contiene un <video> invece di un <img>: le due
   regole valgono per entrambi, altrimenti sarebbe l'unica card ferma all'hover.

   ATTENZIONE (28/08/2026). Aggiungendo quelle due righe il 27/08 il commento
   era stato chiuso una riga troppo presto e la coda del testo era rimasta
   fuori. Per il browser non era prosa: era l'inizio di un selettore, che si
   mangiava la regola qui sotto e la buttava via. Risultato, la transizione non
   esisteva piu' e lo zoom scattava di colpo su tutte e sei le card, non solo
   su ATM. Non si vedeva guardando la pagina, perche' una card che si
   ingrandisce senza dissolvenza sembra solo una scelta brusca.

   Da cui una regola per chi scrive qui dentro: nel testo di un commento non si
   scrive mai la sequenza asterisco-barra, nemmeno per parlarne, perche' li'
   il commento finisce e il resto diventa codice rotto. Se serve nominarla, si
   nomina a parole, come in questa riga. */
.slot--filled img,
.slot--filled video { transition: transform .45s ease; }

@media (hover: hover) {
  .slide--link:hover .slot--filled img,
  .slide--link:hover .slot--filled video { transform: scale(1.04); }
}

/* ---------- Il carosello si afferra (19/08/2026) ----------

   Non ci sono frecce ne' pallini: il cursore e' l'unico modo che ha il sito di
   dire "questo si puo' muovere". Percio' la mano aperta sta su TUTTA la fascia,
   card comprese, ed e' la sola forma di invito presente.

   Eccezione: la card al centro tiene il cursore a puntatore. E' quella che si
   apre, ed e' anche l'unica che porta la didascalia col nome del progetto. La
   divisione che ne esce e' leggibile senza spiegazioni: al centro si clicca,
   ai lati si tira. */
.carousel__track {
  cursor: grab;
  /* Il gesto orizzontale lo gestiamo noi, quello verticale resta al browser:
     su un portatile col touch la pagina continua a scorrere normalmente. */
  touch-action: pan-y;
  /* Trascinando, il browser di suo selezionerebbe il testo delle card. */
  user-select: none;
  -webkit-user-select: none;
}

.slide.is-focus.slide--link { cursor: pointer; }

.carousel__track.is-dragging,
.carousel__track.is-dragging .slide,
.carousel__track.is-dragging .slide.is-focus.slide--link { cursor: grabbing; }

/* Le transizioni servono ad ammorbidire gli scatti della rotazione. Mentre si
   trascina sarebbero un ritardo: le card arriverebbero mezzo secondo dopo la
   mano. Qui il JavaScript disegna ogni fotogramma, quindi il movimento e' gia'
   continuo di suo. */
.carousel__track.is-dragging .slide { transition: none; }

/* La didascalia compare solo a nastro fermo. Il motivo e' lo stesso del ritardo
   di .6s qui sotto: mentre la card cambia taglia le parole andrebbero a capo di
   continuo, e si legge come uno sfarfallio. Trascinando succede a ogni
   fotogramma, quindi via del tutto. */
.carousel__track.is-dragging .slide__caption { opacity: 0; transition: none; }

/* Il browser "raccoglie" le immagini quando si trascina sopra, e parte la sua
   anteprima fantasma. Il JavaScript lo blocca gia', questo e' il rinforzo. */
.carousel__track img { -webkit-user-drag: none; user-drag: none; }

/* Il rapporto 4:3 deve comandare l'altezza. Senza `overflow: hidden` sul
   riquadro e `min-height: 0` sul segnaposto, l'altezza minima automatica del
   contenuto vince sul rapporto: il riquadro si allunga per contenere il testo
   e, mentre la card cambia larghezza, il testo va a capo in modo diverso e
   l'altezza salta a scatti. Era la causa principale dello sfarfallio. */
.slide__frame {
  display: grid;
  background: var(--ui-sunken);
  aspect-ratio: 4 / 3;
  width: 100%;
  overflow: hidden;
}

.slide__frame > .slot {
  height: 100%;
  min-height: 0;
  min-width: 0;
}

/* La didascalia sta fuori dal flusso, appesa sotto il riquadro. Cosi l'altezza
   della card dipende solo dal riquadro (rapporto 4:3) e nessun testo che va a
   capo puo far muovere la fila mentre le card cambiano larghezza. Sulla card
   richiusa, larga zero, il testo andrebbe a capo una parola per riga: fuori dal
   flusso non fa danno e resta comunque invisibile. */
.slide__caption {
  position: absolute;
  top: 100%;
  left: 0;
  right: 0;
  margin-top: 14px;
  display: flex;
  flex-direction: column;
  gap: 4px;
  overflow: hidden;
  opacity: 0;
  transition: opacity .4s ease;
}

/* La didascalia entra DOPO che la card ha finito di allargarsi. Se comparisse
   durante, le parole andrebbero a capo di continuo sotto gli occhi: e la lettura
   a scatti che si vede come sfarfallio del testo. */
.slide.is-focus .slide__caption {
  opacity: 1;
  transition: opacity .5s ease .6s;
}

.slide__name {
  font-size: clamp(18px, 1.7vw, 22px);
  color: var(--text-display);
  letter-spacing: var(--track-m);
  /* Stessa storia delle etichette, ma qui il grassetto era vero e non
     fabbricato: il nome del progetto e' un <h3>, e Geist i pesi ce li ha tutti.
     Lo stacco era quindi il piu' largo del sito, 151,3% di inchiostro contro il
     400 che dichiara il file di design della home. Corretto il 20/09/2026.
     Verificato che nessuna delle sei card cambia altezza. */
  font-weight: var(--w-body);
  /* Titolo breve di card: le righe vanno pareggiate, non solo salvate
     dalla vedova. Stessa scelta di .cases__title e .impact__title. */
  text-wrap: balance;
}

.slide__desc {
  font-size: 16px;
  color: var(--text-label);
  letter-spacing: var(--track-m);
}

.slide__meta {
  font-family: var(--font-mono);
  font-size: 11px;
  letter-spacing: var(--track-caps);
  text-transform: uppercase;
  color: var(--text-faint);
  margin-top: 4px;
}

.slide__meta .soon { color: var(--text-note); }

/* Segnaposto immagine dentro il carosello: qui le scatole cambiano larghezza in
   continuazione, quindi ogni cosa che si ridisegna a ogni fotogramma va tolta.
   La frase lunga del segnaposto andava a capo in modo diverso a ogni istante
   dell'animazione (e su quattro card insieme): resta la sola etichetta, su una
   riga sola. Il bordo passa da tratteggiato a continuo perche' un tratteggio su
   una scatola che si allarga rifa' il passo dei trattini di continuo e luccica.
   Fuori dal carosello il segnaposto resta com'e', con la frase per intero. */
.carousel .slot {
  padding: 12px;
  border-style: solid;
}

/* Card con dentro l'immagine vera: via l'imbottitura e il bordo che servono al
   solo segnaposto. Serve ripetere .carousel, altrimenti la regola qui sopra
   vince per specificita' e l'immagine resterebbe incorniciata da 12px di grigio.
   Stessa ragione per cui esiste `.card .slot--filled`. */
.carousel .slot--filled { padding: 0; border: 0; }

.carousel .slot__hint { font-size: 0; }

/* Spaziatura fra le lettere ridotta apposta: cosi' l'etichetta sta su una riga
   sola anche nella card piu' stretta e non deve mai andare a capo. */
.carousel .slot__hint::before {
  margin-bottom: 0;
  letter-spacing: .06em;
  white-space: nowrap;
}

/* ---------- Piede ---------- */

/* Rifatto il 21/08/2026: era alto piu' di 200px, quasi tutti vuoti. L'invito
   stava in corpo 32 su una riga sua e l'indirizzo in corpo 22 sotto, incolonnati.
   Ora stanno affiancati nello stesso corpo del rimando a LinkedIn: il piede e'
   arredo di sito, non deve pesare quanto un titolo di sezione. */
.contact {
  background: var(--ui-raised);
  border-top: 2px solid var(--ui-mark-soft);
  padding-block: clamp(24px, 2.6vw, 36px);
  display: flex;
  justify-content: space-between;
  align-items: center;
  gap: clamp(16px, 3vw, 40px);
  flex-wrap: wrap;
}

/* Da colonna a riga. Il ritorno a capo resta possibile: sotto i 400px l'invito
   e un indirizzo di 29 caratteri non ci stanno affiancati, e vanno a capo invece
   di uscire dallo schermo. */
.contact__lines {
  display: flex;
  flex-direction: row;
  flex-wrap: wrap;
  align-items: center;
  gap: 8px 14px;
}

/* Stesso corpo di .contact__social, il rimando a LinkedIn. Via il max-width,
   che serviva a mandare a capo una riga che ora e' corta.

   Maiuscolo dal 21/08/2026. Il maiuscolo si fa in CSS e non nell'HTML: nella
   pagina resta scritto "Let's talk", cosi' e' quello che finisce nei risultati
   di ricerca e nella scheda dei preferiti, e chi lo copia non si porta via una
   riga urlata. La spaziatura passa a --track-caps come su LINKEDIN: le maiuscole
   hanno bisogno di piu' aria fra le lettere, con la spaziatura da minuscolo si
   accavallano. Il carattere resta quello di prima, non diventa monospaziato. */
.contact__line {
  font-size: clamp(12px, 1.1vw, 14px);
  color: var(--text-display);
  line-height: var(--lh-title);
  letter-spacing: var(--track-caps);
  text-transform: uppercase;
}

.contact__mail {
  display: flex;
  align-items: center;
  gap: 8px;
  font-size: clamp(12px, 1.1vw, 14px);
  letter-spacing: var(--track-m);
}

.contact__mail::before {
  content: "";
  width: 6px; height: 6px;
  border-radius: 50%;
  background: var(--ui-mark-soft);
  flex: none;
}

/* Era l'unico link del sito che non reagiva al passaggio del mouse. Il pallino
   davanti non si accende insieme al testo: e' grafica, non testo, e resta
   nell'arancione tenue del piede. Era lilla fino al 20/09/2026, rimasto indietro
   dal cambio di colore d'accento e corretto su segnalazione di Nicola. */
.contact__mail:hover { color: var(--text-link); }

/* Blu fisso anche sui case study, dove il rimando "All works" appena sopra e'
   nella tinta del progetto. Provata la tinta di pagina per coerenza e scartata
   subito: su fondo --surface-2 l'arancione di Evvu sta a 3,2:1 e il lilla di
   Nodes Now a 1,8:1, contro il 4,5:1 che serve a un testo di questa misura. Le
   tinte reggono sul titolo grande sopra, non su un mono da 13px. Il blu sta a
   5,2:1. Il piede e' arredo di sito, non contenuto di pagina: che resti uguale
   ovunque e' anche piu' corretto. */
.contact__social {
  font-family: var(--font-mono);
  font-size: clamp(12px, 1.1vw, 14px);
  font-weight: var(--w-medium);
  letter-spacing: var(--track-caps);
  text-transform: uppercase;
  color: var(--text-link);
}

.contact__social:hover { color: var(--text-link-hover); }

/* Questo link e' blu gia' da fermo, quindi al passaggio puo' solo scurirsi di
   poco: uno scarto che quasi non si vede. Il segnale vero lo da' la freccia che
   parte in diagonale, perche' e' movimento e non colore. La regola sta in cima
   al foglio, su .link-arrow, perche' la condivide con RESUME nel menu. */

/* ---------- Case study ---------- */

.hero-frame { padding-inline: var(--gutter); }

.hero-frame > .slot { aspect-ratio: 16 / 9; }

.case-title {
  padding-top: clamp(48px, 8vw, 96px);
  display: flex;
  flex-direction: column;
  gap: 28px;
  max-width: 1180px;
}

/* Titolo del caso. Era una riga in flex, quindi nome e sottotitolo erano due
   blocchi che andavano a capo interi. Ora e' testo normale: va a capo parola per
   parola dentro il sottotitolo, e il nome resta incollato alla barra grazie allo
   spazio unificatore nel markup. */
.case-title__line {
  font-size: clamp(34px, 4.4vw, 62px);
  color: var(--text-display);
  line-height: var(--lh-display);
  letter-spacing: var(--track-xl);
  /* <h1> nasce in grassetto per volonta' del browser, non nostra: il peso
     del body non lo tocca, perche' la regola di sistema sta sull'elemento e
     l'ereditarieta' perde contro di lei. Il nome del progetto finiva quindi
     a 700 mentre barra e soggetto, che dichiarano il 300, restavano leggeri:
     da qui lo stacco che si vedeva sulla prima parola. Nei cinque file di
     design l'h1 porta font-weight:400. Dal 20/09/2026 anche qui. */
  font-weight: var(--w-body);
}

/* Il nome del progetto porta il colore del progetto e il peso della riga, 400:
   a distinguerlo bastano il nero e la posizione, non serve appesantirlo. Chi
   non dichiara la tinta resta nero, vedi --page-tint fra i token. */
.case-title__name { color: var(--text-tint); }

/* La barra segue il nome (nero): sono la stessa introduzione alla riga.
   Il soggetto invece prende l'accento di sito, dall'ultima iterazione fatta
   in Claude Design del 20/09/2026: e' l'unico punto della pagina dove torna
   un terzo colore oltre a nero e grigio. Il Light lo allontana di un passo
   dal nome senza rimpicciolirlo, cosi' la riga ha due livelli di lettura a
   parita' di corpo. Qui si puo' fare perche' siamo sopra i 34px: sotto quella
   soglia il 300 si sgranerebbe. */
.case-title__sep {
  color: var(--text-tint);
  font-weight: var(--w-light);
  padding-inline: .06em;
}
.case-title__subject {
  color: var(--page-accent);
  font-weight: var(--w-light);
}

/* La domanda che apre il caso e' una voce a parte, non prosa: in corsivo si
   legge come tale e si stacca dal titolo senza bisogno di altri segni. */
.case-title__hmw {
  font-size: clamp(16px, 1.5vw, 21px);
  line-height: var(--lh-lead);
  color: var(--text-secondary);
  max-width: 1000px;
  letter-spacing: var(--track-m);
  font-style: italic;
}

/* La scheda dei fatti apre la pagina: meno aria delle sezioni vere,
   51px contro 168 nel file di design. */
.facts { padding-top: clamp(37px, 3.7vw, 51px); }

.facts__row {
  display: grid;
  grid-template-columns: 200px 1fr;
  gap: 32px;
  padding-block: 22px;
  border-bottom: 1px solid var(--ui-rule);
}

.facts__row:first-child { border-top: 1px solid var(--ui-rule-strong); }

.facts__key { padding-top: 4px; }

.facts__val {
  font-size: clamp(15px, 1.15vw, 17px);
  line-height: var(--lh-body);
  max-width: 900px;
}

/* Elenco dentro la cella del valore, per le righe che elencano piu' voci invece
   di una frase sola. Il reset globale toglie i punti a tutti gli ul, quindi qui
   vanno rimessi; il rientro e' lo stesso delle liste nel corpo del testo. */
.facts__list {
  list-style: disc;
  padding-left: 1.15em;
  margin-top: 4px;
}

/* Dal 20/09/2026 la riga Team di Orsero porta due coppie frase-elenco (la
   nostra squadra, poi chi c'era da parte del cliente): senza questa regola
   la seconda frase si attacca all'elenco sopra, senza respiro. */
.facts__val ul + p { margin-top: 22px; }

/* ---------- L'apertura del caso ---------- */

/* Titolo, scheda e immagine: i tre blocchi che stanno prima del primo scorrimento.
   Le regole valgono solo dentro .case-lead, quindi finche' e' avvolta solo la
   pagina Nodes Now le altre quattro restano come sono. Prova del 07/09/2026,
   sezione 70 del README.

   Il problema era di ingombro, non di ordine: spostata l'immagine sotto la
   scheda, il testo sopra misurava 861px e su un portatile da 1440x900 l'immagine
   cominciava a 948, cioe' tutta sotto la piega. Qui quel testo scende a 527px e
   l'immagine comincia a 614: 286px sopra la piega, senza toccare una parola. */

/* Il titolo prende tutta la larghezza della colonna invece dei 1180px di
   default: da 990 a 1235px di misura a 1440. Con quella larghezza il titolo di
   Nodes Now sta in due righe invece che in tre, cioe' 72px in meno.

   Il minimo e il massimo del corpo restano quelli del sito, 34 e 62px. Cambia
   solo quanto cresce in mezzo, da 4,4vw a 3,8vw. Serve alle finestre di mezzo:
   a 1280 il titolo a 4,4vw tornava su tre righe e la piega si richiudeva, 16%
   di immagine invece del 24%. Sopra i 1630px il massimo e' comunque 62px, come
   prima. Provato a 1728, 1600, 1512, 1440, 1280 e 1024: due righe dappertutto.

   Attenzione quando si estende: le due righe dipendono da quanto e' lungo il
   titolo, quindi vanno verificate pagina per pagina, non date per scontate. */
.case-lead .case-title {
  padding-top: clamp(40px, 4.4vw, 64px);
  gap: clamp(16px, 1.6vw, 20px);
  max-width: none;
}

.case-lead .case-title__line { font-size: clamp(34px, 3.8vw, 62px); }

/* La domanda in corsivo tiene il suo max-width di 1000px: il titolo si allarga,
   lei no. Due misure diverse sono anche due livelli di lettura diversi. */

.case-lead .facts { padding-top: clamp(32px, 3.2vw, 44px); }

.case-lead > .figure { margin-top: clamp(32px, 3.2vw, 44px); }

/* Da 1001px in su la scheda smette di essere una tabella di tre righe e diventa
   una striscia di tre colonne, come nella pagina di riferimento portata da
   Nicola. Tre righe alte 410px diventano tre colonne alte 249px.

   Sotto i 1000px non si applica niente: resta la regola generale che impila
   etichetta e valore, quella nella sezione "Adattamento a schermi piccoli". Su
   un telefono tre colonne da 120px non si leggerebbero.

   Il filetto nero sotto l'etichetta non e' nuovo: e' lo stesso trattamento di
   .summary__head, cioe' ACTIVITIES e DELIVERABLES subito sotto l'immagine. La
   scheda e il sommario diventano due strisce che si somigliano.

   Le colonne stanno a 1.2 / 1.2 / 0.8. My role e Team sono prosa e vogliono la
   stessa misura; Timeline e' sempre una riga corta e la colonna stretta le
   basta. Non e' una misura cucita su questi testi: e' la forma del contenuto. */
@media (min-width: 1001px) {
  .case-lead .facts {
    display: grid;
    grid-template-columns: 1.2fr 1.2fr .8fr;
    column-gap: clamp(24px, 2.6vw, 44px);
    align-items: start;
  }

  .case-lead .facts__row {
    display: block;
    padding-block: 0;
    border-bottom: 0;
  }

  .case-lead .facts__row:first-child { border-top: 0; }

  .case-lead .facts__key {
    padding-top: 0;
    padding-bottom: 14px;
    margin-bottom: 16px;
    border-bottom: 1px solid var(--ui-rule-strong);
  }

  .case-lead .facts__val { max-width: none; }
}

.summary {
  padding-top: clamp(92px, 12vw, 168px);
}

.summary__cols {
  display: grid;
  grid-template-columns: 1fr 1fr;
  gap: clamp(28px, 4vw, 56px);
  padding-bottom: 48px;
}

.summary__head {
  display: block;
  padding-bottom: 14px;
  border-bottom: 1px solid var(--ui-rule-strong);
}

.summary__list li {
  font-size: clamp(14px, 1.05vw, 16px);
  padding-block: 13px;
  border-bottom: 1px solid var(--ui-rule);
}

.outcomes {
  display: grid;
  grid-template-columns: 200px 1fr;
  gap: 32px;
}

.outcomes__val {
  font-size: clamp(16px, 1.35vw, 19px);
  line-height: var(--lh-body);
  max-width: 900px;
  letter-spacing: var(--track-m);
}

.section { padding-top: var(--section-gap); }

/* Solution e Impact prendono un fondo tenue, alternato al bianco delle altre
   sezioni: cosi' nel design dell'ultima iterazione fatta in Claude Design,
   20/09/2026. .section e' gia' un elemento a piena larghezza (.wrap non ha un
   max-width, solo il padding laterale), quindi il fondo arriva da bordo a
   bordo senza bisogno di un contenitore in piu'. Il padding-bottom qui sotto
   e' lo spazio dentro il fondo colorato, quello che nel design chiude ogni
   sezione prima che cominci la prossima: senza, il colore si fermerebbe di
   scatto subito sotto l'ultima riga di testo. */
section[aria-labelledby="s-solution"],
section[aria-labelledby="s-impact"] {
  background: var(--ui-raised);
}
section[aria-labelledby="s-solution"] { padding-bottom: clamp(74px, 10vw, 138px); }

/* L'Impact apre con meno aria delle altre sezioni, 102px invece di 168: nel
   design e' una coda, non un capitolo nuovo. Misurato sul file, 20/09/2026. */
section[aria-labelledby="s-impact"] {
  padding-top: clamp(56px, 7.8vw, 102px);
  padding-bottom: clamp(64px, 8vw, 104px);
}

/* Bianco fra l'immagine e la fascia tenue dell'Impact. Serve dove l'Impact
   segue una figura: un'immagine non ha padding suo, quindi il fondo colorato
   partiva a filo del bordo inferiore, zero pixel. Succedeva su Orsero, Evvu,
   E.ON e ATM. Segnalato da Nicola il 20/09/2026 su Orsero.

   Nei quattro file di design quella fascia porta margin-top:clamp(92px,12vw,168px),
   che e' esattamente --section-gap: qui si riusa il token invece di ripetere la
   misura. Nodes Now non entra nella regola e non deve: li' l'Impact segue una
   sezione bianca, il design le da' 72px invece di 168, e quei 72 arrivano gia'
   dal padding-bottom della frase in rilievo. Con il selettore .figure + non
   c'e' bisogno di eccezioni per pagina: la condizione e' scritta nel selettore
   stesso, cioe' "quando prima c'e' un'immagine". */
.figure + section[aria-labelledby="s-impact"] { margin-top: var(--section-gap); }

.section__head {
  display: block;
  padding-bottom: 14px;
  border-bottom: 1px solid var(--ui-rule-strong);
  margin-bottom: clamp(28px, 4vw, 48px);
}

.section__head--tight { margin-bottom: 0; }

.prose-cols {
  display: grid;
  grid-template-columns: 1fr 1fr;
  gap: clamp(28px, 4vw, 56px);
  max-width: 1180px;
}

/* Variante a una colonna, per i blocchi in cui una frase deve stare SOTTO il
   paragrafo e non di fianco. La misura di riga resta quella di una colonna del
   blocco doppio (1180 meno lo stacco, diviso due): la riga non si allunga oltre
   la lunghezza a cui e' tarato il resto della pagina. */
.prose-cols--one {
  grid-template-columns: 1fr;
  max-width: 562px;
}

/* Colonna unica, ma piu' larga di --one: e' la misura di lettura delle
   sezioni discorsive, 700px come nel file di design. --one resta a 562 per i
   cappelli brevi, dove una riga lunga il doppio si leggerebbe peggio.
   Introdotta il 20/09/2026 per l'Approach di Nodes Now: il design non usa la
   doppia colonna in nessuna delle cinque pagine, il sito si' quasi ovunque.
   Qui e' cambiata solo la sezione segnalata da Nicola. */
.prose-cols--read {
  grid-template-columns: 1fr;
  max-width: 700px;
  /* A colonna unica i due .prose-col si impilano, e la distanza fra l'ultimo
     paragrafo del primo e il primo del secondo la detta il row-gap della
     griglia, non il gap interno alla colonna. Col valore ereditato da
     .prose-cols erano 56px contro i 22 di due paragrafi vicini: sembrava una
     riga vuota di troppo, segnalata da Nicola il 20/09/2026. Qui vale 26 come
     dentro la colonna, cosi' il passo e' unico da cima a fondo, come nel
     design. */
  row-gap: 26px;
}

.prose-col {
  display: flex;
  flex-direction: column;
  /* 26 e non 22: e' il valore del file di design, uguale in tutti e cinque. */
  gap: 26px;
}

.prose-col p {
  font-size: clamp(15px, 1.15vw, 17px);
  line-height: var(--lh-body);
  color: var(--text-body);
}

/* Elenco dentro la prosa (i filoni di ricerca paralleli su Nodes Now). Stesse
   regole degli obiettivi: pallino rimesso a mano perche' il reset lo toglie a
   tutte le liste, spazio fra le voci con il margine e non con flex, altrimenti
   il pallino sparisce. */
.prose-col ul {
  list-style: disc;
  padding-left: 1.15em;
}

.prose-col li {
  font-size: clamp(15px, 1.15vw, 17px);
  line-height: var(--lh-body);
  color: var(--text-body);
}

.prose-col li + li { margin-top: 10px; }
.prose-col li::marker { color: var(--text-marker); }

.goals {
  display: grid;
  grid-template-columns: 1fr 1fr;
  gap: clamp(28px, 4vw, 56px);
  max-width: 1180px;
  margin-top: clamp(40px, 5vw, 64px);
}

.goals__col {
  display: flex;
  flex-direction: column;
  gap: 16px;
  padding-top: 18px;
  border-top: 1px solid var(--ui-rule-strong);
}

/* Gli obiettivi sono un elenco vero, con il pallino: il reset generale toglie i
   segni a tutte le liste, qui li rimettiamo. Niente flex sull'ul, altrimenti le
   voci smettono di comportarsi da elenco e il pallino sparisce: lo spazio fra
   una voce e l'altra lo fa il margine. */
.goals__col ul {
  list-style: disc;
  padding-left: 1.15em;
}

.goals__col li {
  font-size: clamp(15px, 1.15vw, 17px);
  line-height: var(--lh-body);
}

.goals__col li + li { margin-top: 12px; }
.goals__col li::marker { color: var(--text-marker); }

.pull {
  font-size: clamp(23px, 2.8vw, 33px);
  color: var(--text-display);
  line-height: var(--lh-title);
  letter-spacing: var(--track-l);
  /* Stesso passo di una sezione: su Nodes Now questa frase sta da sola in una
     fascia bianca fra due sezioni col fondo tenue, e con 88px sopra
     l'alternanza dei fondi si stringeva troppo. Nel design ne ha 168. */
  padding-top: clamp(92px, 12vw, 168px);
}

/* Quando la frase sta da sola in una fascia sua, fra due sezioni col fondo
   tenue, le serve respiro anche SOTTO: senza, il colore della sezione dopo
   partiva a filo dell'ultima riga di testo, zero pixel, e le due fasce si
   toccavano. Nel design ce ne sono 72. Il :only-child limita la regola a quel
   caso: nelle altre quattro pagine la frase chiude una sezione che contiene
   gia' altro, e li' lo spazio sotto lo mette la sezione. */
section > .pull:only-child { padding-bottom: clamp(40px, 5vw, 72px); }

.quote {
  display: flex;
  gap: 28px;
  padding-block: 36px;
}

/* La citazione che chiude una sezione di prosa ha bisogno di respiro sopra:
   stesso passo dello stacco fra prosa e obiettivi. */
.prose-cols + .quote { margin-top: clamp(40px, 5vw, 64px); }

/* Stesso passo sopra il repertorio. Senza, il testo di apertura della
   Solution finiva appiccicato alla prima riga dell'elenco: 1px misurato il
   20/09/2026, contro i 63 del file di design. */
.prose-cols + .cases { margin-top: clamp(40px, 5vw, 64px); }

/* Il filetto della citazione prende l'accento della pagina, non il blu di sito:
   ogni progetto lo porta del proprio colore senza toccare questa regola. */
.quote__bar {
  width: 3px;
  background: var(--ui-command);
  flex: none;
}

.quote__body {
  display: flex;
  flex-direction: column;
  gap: 18px;
  max-width: 1180px;
}

.quote__text {
  font-size: clamp(19px, 2vw, 25px);
  color: var(--text-display);
  line-height: 1.32;
  letter-spacing: var(--track-l);
}

/* <cite> nasce in corsivo per impostazione del browser. Qui e' un'etichetta in
   maiuscoletto monospaziato, non un titolo citato: font-style normal. */
.quote__source {
  font-family: var(--font-mono);
  font-size: 12px;
  font-style: normal;
  letter-spacing: var(--track-caps);
  text-transform: uppercase;
  color: var(--text-faint);
}

.figure { margin-top: clamp(56px, 8vw, 96px); }
.figure .slot { aspect-ratio: 16 / 9; }

/* ---------- Repertorio di casi: striscia orizzontale di card ----------

   Prima comparsa: pagina Nodes Now, i cinque pattern di interazione. Si scorre
   a mano (trackpad, dito, tastiera, le due frecce accese da cards.js) e non
   ruota da sola: dentro ogni card c'e' testo da leggere e un link che porta
   fuori dal sito, un movimento autonomo litigherebbe con la lettura.
   Lo scorrimento e' quello nativo del browser con l'aggancio (scroll-snap):
   senza JavaScript la striscia funziona lo stesso, si perdono solo le frecce. */

.cards { margin-top: clamp(40px, 5vw, 64px); }

/* I margini negativi portano la striscia fino ai bordi dello schermo mentre il
   testo resta dentro la colonna: le card entrano ed escono dal margine invece
   di fermarsi a meta' pagina. L'imbottitura rimette dentro la prima card, e
   scroll-padding fa fermare l'aggancio sullo stesso allineamento del testo. */
.cards__strip {
  display: flex;
  align-items: stretch;
  gap: clamp(20px, 2.4vw, 32px);
  overflow-x: auto;
  overscroll-behavior-x: contain;
  scroll-snap-type: x mandatory;
  scroll-padding-left: var(--gutter);
  margin-inline: calc(var(--gutter) * -1);
  padding-inline: var(--gutter);
  padding-bottom: 18px;
  scrollbar-width: thin;
  scrollbar-color: var(--hairline) transparent;
}

.cards__strip:focus-visible {
  outline: 2px solid var(--ui-command);
  outline-offset: 4px;
}

/* La striscia si afferra col mouse, come il carosello della home (27/08/2026).
   La mano la accende cards.js con .is-grabbable, non il CSS da solo: se il
   JavaScript non arriva non deve comparire un cursore che promette un gesto
   che non c'e'. E' la stessa regola per cui le frecce nascono hidden. */
.cards__strip.is-grabbable { cursor: grab; }

.cards__strip.is-dragging {
  cursor: grabbing;
  /* Trascinando, il browser di suo selezionerebbe il testo sotto al cursore:
     l'evidenziazione azzurra seguirebbe la mano attraverso le figure. */
  user-select: none;
  -webkit-user-select: none;
  /* L'aggancio combatte con lo scorrimento a mano: a ogni pixel imposto
     riporterebbe la striscia sulla tacca piu' vicina e la mano non riuscirebbe
     a staccarsene. Si spegne qui e torna al rilascio, che e' anche il momento
     in cui il browser assesta da solo sulla pagina piu' vicina. */
  scroll-snap-type: none;
}

/* Larghezza della card, tarata su quante se ne vedono per volta: con 28vw ne
   entrano circa tre e mezza a qualunque larghezza di schermo (a 1440 sono 3,4,
   a 1920 sono 3,4, a 2560 sono 3,5), perche' cresce in proporzione allo
   schermo. Il tetto a 700px evita card enormi sui monitor molto larghi. Sono i
   testi a NON cambiare: i loro corpi hanno gia' un massimo, quindi allargando
   la card cresce solo l'immagine. */
.card {
  flex: 0 0 clamp(300px, 28vw, 700px);
  scroll-snap-align: start;
  display: flex;
  flex-direction: column;
  gap: 10px;
}

/* Nelle card nessun media viene ritagliato: ogni immagine e ogni video si vedono
   interi, alla loro proporzione nativa, quindi i riquadri hanno altezze diverse.
   La fascia che li contiene ha pero' un'altezza sola, quella del media piu' alto
   (Fisheye, quasi quadrato), e i media sono appoggiati in basso. Cosi' i titoli
   delle cinque card cadono tutti sulla stessa riga: e' il titolo il riferimento
   di allineamento, non l'immagine. */
.card .slot {
  aspect-ratio: 9 / 8;
  align-items: flex-end;
  overflow: hidden;
  padding: 16px;
  margin-bottom: 6px;
}

.card .slot__hint { min-height: 0; }

/* Riquadro pieno dentro una card: niente imbottitura e niente fondo grigio,
   altrimenti lo spazio vuoto sopra i media piu' bassi si vedrebbe come una
   scatola. Serve la specificita' di .card, che altrimenti rimette i 16px. */
.card .slot--filled {
  padding: 0;
  background: none;
}

/* Il media torna un elemento nel flusso: larghezza piena, altezza ricavata dalle
   sue proporzioni. Annulla il ritaglio (object-fit: cover) valido altrove. */
.card .slot img,
.card .slot video {
  position: static;
  width: 100%;
  height: auto;
  object-fit: fill;
}

/* ---------- Due varianti della striscia, pagina Orsero (26/08/2026) ----------

   La striscia nasce per le card di Nodes Now: piu' figli stretti, uno accanto
   all'altro. Su Orsero serviva per due casi che non sono card, e in tutti e due
   il contenuto e' un'immagine sola per riquadro. Cambia solo cio' che deve. */

/* 1. Panoramica: un'immagine lunga che si guarda a tratti (l'agenda, 3,98:1).
      Tiene la sua altezza e sfora in larghezza. L'aggancio va spento: con un
      figlio solo largo il doppio del riquadro riporterebbe sempre all'inizio,
      impedendo di fermarsi a meta'. Il passo delle frecce lo corregge cards.js,
      che quando il figlio e' piu' largo del riquadro va di una schermata. */
.cards--pan { margin-top: 0; }

.cards__strip--pan { scroll-snap-type: none; }

/* 560px e' il numero che rende leggibili le etichette delle attivita': sotto i
   500 il testo dentro le fasi si chiude. Sotto i 1000px di finestra scende a 420,
   perche' li' e' l'altezza dello schermo la risorsa scarsa, non la larghezza.
   Il flex-shrink va spento a mano sul <picture>: e' lui il figlio della striscia,
   e senza questo verrebbe compresso alla larghezza del riquadro, che e' esattamente
   lo schiacciamento che si voleva evitare. */
.cards__strip--pan > picture {
  flex: 0 0 auto;
  display: block;
}

.pan__img {
  display: block;
  height: 560px;
  width: auto;
  max-width: none;
}

/* 2. Diapositive: pagine di un documento, una alla volta (le due del report).
      Larghe quanto la colonna del testo, aggancio acceso: lo scorrimento si
      ferma sempre su una pagina intera, mai a cavallo di due. */
.card--slide {
  flex: 0 0 min(88vw, 1180px);
  scroll-snap-align: start;
}

/* Le pagine sono 16:9 e vanno viste intere: il 9/8 delle card di Nodes Now, che
   nasce per allineare cinque titoli, qui ritaglierebbe. */
.card--slide .slot {
  aspect-ratio: 16 / 9;
  align-items: stretch;
  padding: 0;
  margin-bottom: 0;
}

.cards__controls {
  display: flex;
  align-items: center;
  gap: 12px;
  margin-top: 18px;
}

.cards__btn {
  width: 40px;
  height: 40px;
  border: 1px solid var(--ui-rule);
  border-radius: 50%;
  background: transparent;
  color: var(--text-label);
  /* I pulsanti non ereditano il carattere dal body: senza questa riga le due
     frecce escono nel carattere di sistema. */
  font-family: var(--font-body);
  font-size: 15px;
  line-height: 1;
  cursor: pointer;
  transition: border-color .2s ease, color .2s ease;
}

/* Il bordo va in blu con currentColor invece che con --accent scritto a mano:
   cosi' resta per forza uguale alla freccia, anche se un domani il blu cambia
   in un posto solo. */
.cards__btn:hover:not(:disabled) {
  color: var(--text-link);
  border-color: currentColor;
}

.cards__btn:disabled {
  opacity: .3;
  cursor: default;
}

/* Qui c'era .cards__count, il "2 / 5" accanto alle frecce. Tolto il 21/08/2026:
   diceva una cosa che la striscia gia' mostra da sola, e le frecce disattivate
   dicono gia' quando si e' in fondo. Se dovesse tornare, serve rimettere anche
   il <p data-cards-count> nel markup e, in cards.js, la funzione index() con la
   riga di refresh() che scriveva il testo. */

/* RIFATTO IL 20/09/2026 SUL FILE DI DESIGN.

   Prima era una griglia a due colonne: un numero progressivo (01, 02, 03) in
   monospaziato a sinistra e il testo a destra, rientrato di 84px. I numeri
   erano stati aggiunti il 19/09; il file di design non li ha in nessuna delle
   cinque pagine, e il testo parte a filo del bordo come tutto il resto.
   Tolti dal markup di tutte e cinque le pagine insieme alla loro regola.

   Resta un elenco ordinato: <ol> dice gia' che i risultati sono contati, il
   numero scritto non aggiunge niente. Il filetto fra un item e l'altro fa il
   lavoro di separazione che prima faceva la colonna dei numeri. */
.impact__item {
  padding-block: clamp(30px, 3.4vw, 44px);
  border-bottom: 1px solid var(--ui-rule);
}

/* La numerazione era in accento: contava troppo rispetto ai titoli che
   accompagna. In nero fa il suo mestiere di indice e basta. --ink e non
   --text-strong apposta: sulle pagine progetto --text-strong e' stato
   portato al grigio dalla semplificazione del 21/08/2026, e la numerazione
   sarebbe sparita nello stesso grigio del resto invece di restare un indice
   leggibile. Corretto il 20/09/2026. */
.impact__body {
  display: flex;
  flex-direction: column;
  gap: 14px;
  max-width: min(100%, 64ch);
}

.impact__title {
  font-size: clamp(21px, 2.5vw, 30px);
  line-height: var(--lh-title);
  /* Un <h3> nasce in grassetto: qui va riportato al peso del testo, che e'
     quello che dice il file di design. La gerarchia la fanno gia' il corpo,
     il colore e lo spazio, come su tutto il resto del sito. */
  font-weight: var(--w-body);
  /* Nero, non il grigio di pagina: nel design l'Impact e' l'unico blocco di
     testo corrente che resta in nero, titolo e paragrafo insieme. E' la voce
     che dice come e' andata a finire, e sta un gradino sopra la cronaca. */
  color: var(--text-tint);
  letter-spacing: var(--track-l);
  text-wrap: balance;
  max-width: 24ch;
}

.impact__text {
  font-size: clamp(14px, 1.05vw, 16px);
  line-height: var(--lh-body);
  color: var(--text-tint);
}

.reflection {
  padding-block: var(--section-gap);
}

/* Due distanze, non una. Il titolo sta a 14px dal paragrafo che introduce,
   perche' lo introduce: sono la stessa cosa. Fra un paragrafo e l'altro ce ne
   vogliono 22, altrimenti il blocco si legge come un muro solo. Sono le due
   misure dei file di design: 14px nella Riflessione di Nodes Now, che ha il
   titolo, 22 nelle altre quattro, che prima non ce l'avevano. Il salto lo fa
   il margine sulla coppia di paragrafi, che si somma allo spazio del flex. */
.reflection__body {
  display: flex;
  flex-direction: column;
  gap: 14px;
  max-width: 880px;
}

.reflection__body p + p { margin-top: 8px; }

/* Stessa scala di .impact__title: e' lo stesso ruolo, un sottotitolo nero
   che introduce un blocco, non un titolo di sezione nuovo. */
.reflection__title {
  font-size: clamp(21px, 2.5vw, 30px);
  line-height: var(--lh-title);
  /* Stesso motivo del titolo dell'Impact: <h3> nasce in grassetto, il design
     lo vuole al peso del testo. */
  font-weight: var(--w-body);
  /* Nero, come nel file di design. Dal 20/09/2026 ce l'hanno tutte e cinque le
     pagine: nel design il titolo sta nella sola Riflessione di Nodes Now, gli
     altri quattro li ha scritti Claude su richiesta di Nicola perche' le
     pagine si chiudessero allo stesso modo. Stessa ragione del titolo
     dell'Impact per il nero: e' una conclusione, non cronaca, e i paragrafi
     sotto restano grigi. */
  color: var(--text-tint);
  letter-spacing: var(--track-l);
  text-wrap: balance;
}

.reflection__body p {
  font-size: clamp(15px, 1.15vw, 17px);
  line-height: var(--lh-body);
  color: var(--text-body);
}

.next {
  display: flex;
  justify-content: space-between;
  align-items: center;
  gap: 24px;
  border-top: 1px solid var(--ui-rule-strong);
  padding-block: clamp(36px, 5vw, 56px);
  transition: background .2s ease;
}

.next:hover { background: var(--ui-raised); }

.next__label {
  display: flex;
  flex-direction: column;
  gap: 6px;
}

/* Il rimando in fondo non ha piu' la freccia a destra (tolta il 2026-08-18): il
   colore di pagina sul titolo basta a dire che si clicca, e il blocco resta
   pulito. Se dovesse tornare, serve anche una regola per la freccia.
   Il testo va in maiuscolo dal CSS e non nel markup, cosi' vale per ogni pagina
   e chi legge con la sintesi vocale sente una parola, non una sigla. Le
   maiuscole vogliono spaziatura positiva: la crenatura stretta del display le
   impasterebbe. */
.next__title {
  font-size: clamp(20px, 2.2vw, 25px);
  text-transform: uppercase;
  letter-spacing: .02em;
  color: var(--text-command);
}

.next:hover .next__title { color: var(--text-command-hover); }

/* ---------- Slot immagine (segnaposto) ---------- */

.slot {
  position: relative;
  width: 100%;
  background: var(--ui-sunken);
  border: 1px dashed var(--ui-rule-dashed);
  display: flex;
  align-items: center;
  justify-content: center;
  padding: 24px;
}

.slot__hint {
  font-family: var(--font-mono);
  font-size: 12px;
  line-height: var(--lh-body);
  letter-spacing: .02em;
  color: var(--text-label);
  text-align: center;
  max-width: 46ch;
}

/* Credito sotto un'immagine di terzi. Prima comparsa: pagina ATM, le tavole del
   PGT del Comune di Milano, che sono Creative Commons e vanno attribuite. Piccolo
   e in grigio: e' un obbligo di licenza, non un contenuto da leggere, e non deve
   competere con il titolo che gli sta sotto. Sta fuori dal riquadro e non dentro,
   cosi' non ci finisce sopra quando l'immagine e' scura.

   Il colore e' --text-label, cioe' il grigio del testo secondario, e non
   --text-note: quello e' il lilla riservato alle cose ancora da fare (.ph, .soon,
   "Immagine da inserire"). Un credito di licenza e' definitivo, non provvisorio,
   e nel lilla sembrerebbe un appunto lasciato li' per sbaglio. */
.credit {
  margin-top: 10px;
  font-family: var(--font-mono);
  font-size: 11px;
  letter-spacing: .02em;
  color: var(--text-label);
}

.slot__hint::before {
  content: "Immagine da inserire";
  display: block;
  font-size: 10px;
  letter-spacing: var(--track-caps);
  text-transform: uppercase;
  color: var(--text-note);
  margin-bottom: 8px;
}

/* Riquadro con dentro il materiale vero: via il bordo tratteggiato e
   l'imbottitura, che servono solo al segnaposto. Il fondo resta, si vede
   per l'istante in cui l'immagine sta ancora arrivando. */
.slot--filled {
  border: 0;
  padding: 0;
  overflow: hidden;
}

/* Riquadro senza fondo. Il grigio di .slot serve a due cose: segnare il posto
   finche' l'immagine arriva, e fare da carta sotto i PNG con il fondo
   trasparente. Quando il contenuto non e' un'immagine che riempie il riquadro
   ma un disegno che ha il suo bianco, come la mappa dell'Atlante sulla pagina
   ATM, quel grigio esce ai lati e sembra il segnaposto rimasto acceso.
   Sta qui e non su .slot--filled perche' vale per un caso solo, e cambiarlo per
   tutti vorrebbe dire togliere la carta a chi ancora ci conta. */
.slot--plain { background: var(--ui-page); }

/* <picture> serve solo a offrire il WebP: non deve generare una scatola sua,
   altrimenti resta un elemento vuoto dentro il flex del riquadro. */
.slot picture { display: contents; }

/* Riquadro che prende la forma della propria immagine invece di imporne una.
   I riquadri a tutta larghezza sono 16:9 per impostazione, che va bene finche'
   il materiale e' 16:9; quando non lo e', questa classe evita il ritaglio. Serve
   ripetere .hero-frame e .figure perche' e' li' che il 16:9 e' dichiarato, e a
   parita' di specificita' vince chi arriva dopo. */
.hero-frame > .slot--free,
.figure .slot--free {
  aspect-ratio: auto;
}

.slot img,
.slot video {
  position: absolute;
  inset: 0;
  width: 100%; height: 100%;
  object-fit: cover;
}

/* Dentro un riquadro libero il media torna un elemento nel flusso: larghezza
   piena, altezza dalle sue proporzioni, nessun ritaglio. Deve stare dopo la
   regola qui sopra: stessa specificita', vince l'ultima. */
.slot--free img,
.slot--free video {
  position: static;
  width: 100%;
  height: auto;
  object-fit: fill;
}

/* Un'immagine quasi quadrata, lasciata a piena larghezza, viene piu' alta dello
   schermo. Prima comparsa: la mappa di riconciliazione della pagina ATM, che su
   un portatile rendeva 1235x1119 px, cioe' 1,24 volte l'altezza della finestra.
   Su una mappa e' un difetto vero: il suo senso e' il disegno d'insieme, i punti
   colorati che si addensano al centro e si diradano verso il fuori. Se per
   vederla tutta bisogna scorrere, quel disegno non lo si vede mai.

   Il limite e' scritto in vh e non in pixel, cosi' si adatta agli schermi invece
   di indovinarne uno. Il min() serve al telefono: li' 94vh e' molto piu' della
   larghezza disponibile, vince il 100% e non cambia niente.

   Centrata (28/08/2026), su richiesta di Nicola. Prima stava a sinistra, per
   far combaciare il titolo "Reconciliation with existing assets", che e' dentro
   l'immagine e allineato al suo bordo sinistro, con il margine del sito e quindi
   con tutti gli altri titoli della pagina. Quel titolo c'e' ancora. La scelta
   e' fra due allineamenti che non possono valere insieme: il titolo interno con
   quelli della pagina, oppure la figura con le altre figure. Nicola ha preferito
   il secondo, cioe' la coerenza fra le figure, come la mappa dell'Atlante poco
   sopra. Il titolo interno resta fuori squadra di quel tanto. */
.slot--tall {
  max-width: min(100%, 94vh);
  margin-inline: auto;
}

/* Testo ancora da scrivere: segno discreto, si toglie cancellando la classe */
.ph {
  background-image: linear-gradient(var(--text-todo), var(--text-todo));
  background-size: 100% 1px;
  background-position: 0 100%;
  background-repeat: no-repeat;
}

/* Passaggi evidenziati dentro il testo del caso: la tinta del progetto, nessuno
   sfondo, nessuna sottolineatura. Servono a far affiorare la linea del racconto
   a chi scorre la pagina senza leggerla riga per riga.

   Sul peso. Questi passaggi erano gia' Regular come il testo intorno: sembravano
   piu' sottili per via del colore, perche' un verde chiaro su bianco restituisce
   meno segno di un nero a parita' di peso e l'occhio lo legge come un carattere
   piu' magro. Il 500 serve a pareggiare quella perdita, non ad aggiungere
   enfasi. */
.hi {
  color: var(--text-tint);
  font-weight: var(--w-medium);
}

/* Nei corpi grossi la compensazione non serve, il segno c'e' gia' per dimensione:
   li' il 500 si vedrebbe come un grassetto e romperebbe la gerarchia. */
.pull .hi,
.impact__title .hi,
.case-title .hi,
.statement .hi {
  font-weight: inherit;
}

/* Il titolo della home ha bisogno del colore scritto a mano. Le pagine progetto
   portano un data-page che ridefinisce --page-tint con la tinta del lavoro; la
   home no, quindi li' --page-tint vale ancora --ink e un .hi uscirebbe nero su
   nero, cioe' invisibile. Qui serve il blu di sito: 5,71:1 su bianco. */
.statement .hi { color: var(--text-link); }

/* ---------- Le quattro fasi (pagina Nodes Now, 07/09/2026) ----------

   Sostituisce l'immagine 02_context_phases, che era un JPEG da 2560px:
   su un telefono era illeggibile, e i quattro refusi che conteneva non si
   potevano correggere senza rifare il file.

   Struttura: quattro schede in riga, una aperta alla volta. Dentro la scheda
   tre blocchi, l'ambizione della fase e poi le due liste affiancate.

   Due cose nuove per il sito, decise con Nicola il 07/09/2026:

   1. I DUE RIQUADRI CON IL FONDO. Fino a oggi il sito non usava fondi pieni
      sotto il testo. Qui servono a tenere separate due liste che dicono cose
      opposte, il problema e la risposta. Se la cosa convince si puo' portare
      altrove; se non convince, il ripiego e' gia' scritto e provato (occhiello
      piu' filetto nero, come .goals__col).
   2. IL GRASSETTO DENTRO LE VOCI. Non e' .hi e non entra nel conto della
      densita' degli evidenziati: .hi cambia solo il colore, questo cambia
      peso e colore. Marca la frase chiave di ogni voce, come faceva
      l'immagine di partenza.

   Le misure vengono dalla pagina, non sono inventate: i corpi sono quelli di
   .prose-col li e .goals__col li, lo stacco fra le due liste e' quello di
   .prose-cols. Prima erano piu' piccoli e lo schema si leggeva come una nota
   a margine invece che come il pezzo di ricerca che e'.

   Senza JavaScript restano aperte tutte e quattro le fasi: il contenuto si
   legge lo stesso, si perde solo il risparmio di spazio. Stessa regola della
   striscia di card qui sopra. */

.phases__title {
  font-size: clamp(16px, 1.35vw, 19px);
  font-weight: var(--w-body);
  letter-spacing: var(--track-m);
  line-height: var(--lh-title);
  color: var(--text-display);
  margin: 0 0 clamp(24px, 3vw, 34px);
  max-width: 34ch;
}

.phases { display: grid; gap: 0; }

/* display:contents scioglie il contenitore della fase: pulsante e pannello
   diventano figli diretti della griglia e si possono mandare in righe diverse.
   E' cio' che permette di avere lo stesso HTML per telefono e desktop. */
.phase { display: contents; }

.phase__tab {
  appearance: none;
  -webkit-appearance: none;
  width: 100%;
  margin: 0;
  padding: 18px 0 16px;
  border: 0;
  border-top: 1px solid var(--ui-rule);
  background: transparent;
  color: var(--text-strong);
  font: inherit;
  text-align: left;
  cursor: pointer;
  display: flex;
  align-items: baseline;
  gap: 12px;
  transition: color .3s var(--ease);
}

.phase__tab:hover { color: var(--page-accent); }

.phase__num {
  font-family: var(--font-mono);
  font-size: 11px;
  letter-spacing: var(--track-caps);
  color: var(--text-marker);
  transition: color .3s var(--ease);
}

.phase__name {
  font-size: clamp(15px, 1.3vw, 18px);
  font-weight: var(--w-body);
  letter-spacing: var(--track-m);
  line-height: var(--lh-title);
}

/* La fase aperta. Il filetto sopra il pulsante si ispessisce e prende
   l'accento: e' il segno che sostituisce il pallino sulla linea del disegno
   di partenza. Sta come box-shadow interna e non come border, altrimenti il
   pulsante si alzerebbe di un pixel rispetto agli altri tre. */
.phase[data-open="true"] .phase__tab {
  border-top-color: var(--ui-command);
  box-shadow: inset 0 2px 0 0 var(--ui-command);
}
.phase[data-open="true"] .phase__num { color: var(--page-accent); }
.phase[data-open="true"] .phase__name { font-weight: var(--w-medium); }

.phase__panel { padding: 4px 0 40px; }
.phase[data-open="false"] .phase__panel { display: none; }

/* L'ambizione non descrive la fase, dice cosa il design dovrebbe ottenere.
   Due segnali lo dicono: etichetta propria ed il testo in --text-strong
   invece che in --text-body come le voci sotto. Fino al 20/09/2026 aveva
   anche un filetto dell'accento sopra; tolto passando ai tre riquadri
   affiancati (ambizione, vulnerabilita', mosse) a 900px, dove un quarto
   filetto accanto agli altri due box era ridondante. */
.ambition .eyebrow { color: var(--page-accent); }

.ambition__text {
  font-size: clamp(15px, 1.15vw, 17px);
  line-height: var(--lh-body);
  color: var(--text-strong);
  margin: 14px 0 clamp(28px, 4vw, 48px);
  max-width: 62ch;
}
/* Il <b> qui dentro deve pesare E scurire, come .hi nel resto del sito.
   Fino al 20/09/2026 portava solo il peso: su una pagina progetto, dove
   --text-strong e' schiarito a grigio dal blocco [data-page], l'enfasi
   restava dello stesso colore del testo intorno e si perdeva. Nel file di
   design quegli stessi frammenti sono neri. --text-tint e' il token che
   .hi usa gia': l'enfasi del sito passa tutta di li'. */
.ambition__text b,
.layer li b { font-weight: var(--w-medium); color: var(--text-tint); }

.layers { display: grid; gap: clamp(28px, 4vw, 56px); }

.layer { padding: 22px 24px 24px; }
.layer--risk { background: var(--ui-raised); }
.layer--move { background: var(--ui-wash); }
.layer--move .eyebrow { color: var(--page-accent); }

/* Il reset in cima al foglio toglie i pallini a tutte le liste: qui vanno
   rimessi, col rientro delle altre liste della pagina. */
.layer ul { list-style: disc; padding-left: 1.15em; margin: 16px 0 0; }

.layer li {
  font-size: clamp(15px, 1.15vw, 17px);
  line-height: var(--lh-body);
  color: var(--text-body);
  margin-bottom: 12px;
}
.layer li:last-child { margin-bottom: 0; }
.layer li::marker { color: var(--text-marker); }
.layer li i { font-style: italic; color: var(--text-label); }

@media (min-width: 900px) {
  .phases { grid-template-columns: repeat(4, 1fr); column-gap: clamp(16px, 2vw, 32px); }
  .phase__tab { grid-row: 1; padding-right: 8px; }
  .phase__panel { grid-row: 2; grid-column: 1 / -1; padding-top: 12px; }

  /* Ambizione e vulnerabilita'/mosse affiancate invece che impilate: il
     pannello stesso diventa una griglia a due colonne (0.85fr per
     l'ambizione, il resto per .layers), e .layers si apre a sua volta in
     due. Il risultato sono tre riquadri di larghezza quasi uguale senza
     ristrutturare il markup. */
  .phase__panel { display: grid; grid-template-columns: 0.85fr 2fr; column-gap: clamp(24px, 3vw, 44px); align-items: start; }
  .layers { grid-template-columns: 1fr 1fr; }
}

/* Senza JavaScript nessuna fase ha data-open, quindi si vedono tutte e quattro.
   La griglia torna a una colonna sola e le fasi si incolonnano: pulsante,
   pannello, pulsante, pannello. Serve la riga sulla griglia e non solo sui
   figli: lasciando le quattro colonne, ogni pannello finiva schiacciato in un
   quarto di larghezza, 287px a 1440. Misurato, non supposto. */
.phases:not([data-phases-ready]) .phase__panel { display: block; }
.phases:not([data-phases-ready]) .phase__tab { cursor: default; }
@media (min-width: 900px) {
  .phases:not([data-phases-ready]) { grid-template-columns: 1fr; }
  .phases:not([data-phases-ready]) .phase__tab,
  .phases:not([data-phases-ready]) .phase__panel { grid-row: auto; grid-column: 1; }
}

/* ---------- Il repertorio dei casi: elenco e pannello (Nodes Now, 20/09/2026)

   Sostituisce la striscia orizzontale di cards.js nella sezione Solution.
   Non e' una variante di .cards: e' un pattern diverso, un elenco a sinistra
   e un pannello a destra che mostra il caso scelto. Stessa regola di
   .phases: .cases__item si scioglie con display:contents, la riga e il
   pannello diventano figli diretti della griglia, e lo stato sta solo
   nell'attributo data-open, mai in una variabile. Senza JavaScript ogni
   pannello resta aperto sotto la sua riga: si legge come un elenco normale,
   niente si nasconde. Il comportamento sta in assets/js/cases.js. ---------- */

.cases__list {
  display: grid;
  grid-template-columns: 1fr;
}

/* Il filetto nero che apre l'elenco sta sulla PRIMA VOCE, non sul contenitore.
   Sul contenitore era largo quanto tutta la griglia, pannello di destra
   compreso: 1235px contro i 545 dei filetti fra una voce e l'altra, e si
   vedeva sporgere. Nel file di design quel filetto appartiene alla lista, che
   e' larga quanto la sola colonna di sinistra. Sulla voce segue la colonna a
   ogni larghezza, anche sotto i 1000px dove la colonna e' una sola e il
   filetto torna largo quanto la pagina. */
.cases__item:first-child .cases__row { border-top: 1px solid var(--ui-rule-strong); }

.cases__item { display: contents; }

.cases__row {
  appearance: none;
  width: 100%;
  margin: 0;
  padding-block: clamp(14px, 1.5vw, 20px);
  border: 0;
  border-bottom: 1px solid var(--ui-rule);
  background: transparent;
  color: inherit;
  font: inherit;
  text-align: left;
  cursor: pointer;
  display: flex;
  gap: 0;
  /* I bottoni hanno un'imbottitura orizzontale loro di fabbrica (6px in
     Chrome e Safari). Senza questa riga il testo della riga partiva 6px
     dentro rispetto al bordo del testo della pagina. */
  padding-inline: 0;
}

/* Larghezza fissa, mai animata: un cambio di width sposterebbe il testo di
   .cases__col a ogni fotogramma. Solo l'opacita' segnala l'apertura, che
   costa al browser una ricomposizione invece di un nuovo calcolo di
   impaginazione. */
/* RIENTRO SOLO SULLA RIGA APERTA (corretto il 20/09/2026)

   Prima il filetto occupava i suoi 4px e la colonna il suo rientro di 20 su
   TUTTE le righe, aperte e chiuse: la scelta era voluta, evitava che il testo
   traslasse a ogni click. Il risultato pero' era che nessuna voce stava a
   filo del bordo del testo, ed e' il difetto che Nicola ha segnalato. Nel file
   di design le righe chiuse sono a filo e solo quella aperta rientra di 24px.
   Ora fa cosi', e la traslazione torna: e' voluta, la si vede muovere piano
   perche' il rientro e' in transizione insieme al filetto. */
.cases__bar {
  flex: 0 0 0px;
  align-self: stretch;
  transition: opacity .3s ease, flex-basis .3s var(--ease);
  background: var(--ui-command);
  opacity: 0;
}

.cases__row[aria-pressed="true"] .cases__bar { flex: 0 0 4px; }

/* Stesso motivo: il rientro e' fisso, non cresce da 0. Il segnale di
   selezione resta forte lo stesso (il filetto piu' il testo che scurisce),
   e il testo non trasla piu' a ogni click. */
.cases__col {
  flex: 1;
  min-width: 0;
  display: flex;
  flex-direction: column;
  gap: 6px;
  padding-left: 0;
  transition: padding-left .3s var(--ease);
}

.cases__row[aria-pressed="true"] .cases__col { padding-left: 20px; }

.cases__pattern {
  font-size: clamp(17px, 1.8vw, 24px);
  /* 1.15 e non --lh-title: su due righe il design stringe un filo di piu'. */
  line-height: 1.15;
  letter-spacing: var(--track-m);
  color: var(--text-secondary);
  transition: color .25s ease;
  text-wrap: pretty;
}

.cases__row:hover .cases__pattern { color: var(--text-strong); }

/* Griglia con una riga sola invece di max-height: animare max-height
   forza il browser a ricalcolare l'impaginazione a ogni fotogramma, e
   sposta il testo sotto. Da 0fr a 1fr la riga cresce quanto il contenuto,
   e il figlio interno (overflow:hidden) la mostra un po' alla volta. */
.cases__q {
  display: grid;
  grid-template-rows: 0fr;
  opacity: 0;
  font-size: clamp(13px, 1.05vw, 15px);
  line-height: var(--lh-body);
  color: var(--text-secondary);
  transition: grid-template-rows .4s cubic-bezier(.16, 1, .3, 1), opacity .3s ease;
  text-wrap: pretty;
}
.cases__q > span { display: block; overflow: hidden; }

.cases__item[data-open="true"] .cases__bar { opacity: 1; }
.cases__item[data-open="true"] .cases__q { grid-template-rows: 1fr; opacity: 1; }
.cases__item[data-open="true"] .cases__pattern { color: var(--ink); font-weight: var(--w-medium); }
.cases__item[data-open="true"] .cases__q { max-height: 92px; opacity: 1; }

.cases__stage {
  display: flex;
  flex-direction: column;
  gap: clamp(16px, 1.8vw, 24px);
  padding-block: clamp(20px, 2.4vw, 32px);
}

.cases__media {
  aspect-ratio: var(--case-ratio, 16 / 9);
}
.cases__media img,
.cases__media video { width: 100%; height: 100%; object-fit: cover; }

.cases__detailhead {
  display: flex;
  align-items: baseline;
  gap: 12px;
  flex-wrap: wrap;
  justify-content: space-between;
}

.cases__title {
  font-size: clamp(17px, 1.6vw, 22px);
  line-height: var(--lh-title);
  letter-spacing: var(--track-m);
  font-weight: 400;
  color: var(--ink);
  text-wrap: balance;
}

.cases__link {
  font-family: var(--font-mono);
  font-size: 12px;
  color: var(--text-secondary);
}
.cases__link:hover { color: var(--page-accent); }

.cases__copy {
  font-size: clamp(14px, 1.05vw, 16px);
  line-height: var(--lh-body);
  color: var(--text-secondary);
  max-width: 62ch;
}

/* Dissolvenza al cambio di caso: cases.js toglie is-visible, aspetta la
   transizione, sostituisce data-open e la rimette. Stessa cautela imparata
   sull'Atlante (sezione 63 del README): mai togliere e rimettere il
   contenuto nello stesso istante, o la transizione dichiarata nel CSS non
   disegna un fotogramma. */
.cases__stage { opacity: 1; transform: none; transition: opacity .3s ease, transform .35s cubic-bezier(.16, 1, .3, 1); }
.cases__stage.is-changing { opacity: 0; transform: translateY(8px); }

/* Senza JavaScript nessun caso viene chiuso (la regola sotto si attiva solo
   con data-cases-ready): si vedono tutti e cinque, ogni riga seguita dal
   proprio pannello, come un elenco illustrato. */
.cases[data-cases-ready] .cases__item[data-open="false"] .cases__stage { display: none; }

@media (min-width: 1000px) {
  /* LE RIGHE DELL'ELENCO NON SI ALLARGANO PIU' (corretto il 20/09/2026)

     Il pannello a destra dichiara grid-row: 1 / -1, ma -1 e' l'ultima linea
     della griglia ESPLICITA, e qui di righe esplicite non ce n'erano: le
     righe nascevano implicite, una per voce. Cosi' 1 / -1 si accartocciava
     sulla sola riga 1, che diventava alta quanto il pannello. Il risultato
     era un vuoto di 420px fra la prima voce e la seconda, misurato.

     Le righe esplicite qui sotto danno a -1 una linea vera da raggiungere.
     Sono dodici, piu' di quante ne servano: quelle che avanzano restano a
     zero e non si vedono, e il giorno che le voci diventano sei o otto non
     c'e' niente da ritoccare. L'ultima traccia e' 1fr, ed e' la chiave: e'
     li' che finisce l'altezza in piu' del pannello, invece di essere
     spalmata sulle righe allontanandole fra loro. Provato prima dal vivo:
     con repeat(5, auto) le voci finivano a 98px l'una dall'altra invece che
     a 75, cioe' il difetto in piccolo. */
  .cases__list {
    grid-template-columns: 1fr 1.15fr;
    grid-template-rows: repeat(12, min-content) 1fr;
    column-gap: clamp(32px, 4.4vw, 64px);
    align-items: start;
  }
  .cases[data-cases-ready] .cases__row { grid-column: 1; }
  .cases[data-cases-ready] .cases__stage { grid-column: 2; grid-row: 1 / -1; position: sticky; top: 28px; padding-block: 0; }
}

/* ---------- Adattamento a schermi piccoli ---------- */

@media (max-width: 1000px) {
  .intro { grid-template-columns: 1fr; }
  .prose-cols,
  .goals,
  .summary__cols { grid-template-columns: 1fr; }
  .facts__row,
  .outcomes { grid-template-columns: 1fr; gap: 10px; }

  /* Su uno schermo stretto la panoramica si abbassa: 560px di immagine su un
     telefono in verticale mangiano mezza pagina, e a scorrerla di lato si legge
     comunque una fase per volta. Piu' bassa vuol dire anche piu' corta, quindi
     meno strada da fare col dito. */
  .pan__img { height: 420px; }

  /* Le pagine del report, su schermo stretto, smettono di stare in larghezza e
     si comportano come la panoramica qui sopra: dentro c'e' il testo di un
     documento, e una pagina 16:9 larga quanto un telefono sarebbe alta 180px,
     cioe' una figurina. Tengono la stessa altezza dell'agenda e si scorrono.
     L'aggancio passa da mandatory a proximity: con pagine piu' larghe dello
     schermo, l'aggancio rigido impedirebbe di fermarsi a meta' di una pagina e
     meta' del suo contenuto resterebbe irraggiungibile. */
  .cards--slides .cards__strip { scroll-snap-type: x proximity; }

  .card--slide { flex: 0 0 auto; }

  .card--slide .slot {
    aspect-ratio: auto;
    height: 420px;
  }

  .card--slide .slot img,
  .card--slide .slot video {
    width: auto;
    height: 100%;
    max-width: none;
  }
}

@media (max-width: 760px) {
  .site-header { flex-direction: column; align-items: flex-start; gap: 14px; }
  .site-nav { flex-wrap: wrap; gap: 14px; font-size: 11px; }

  .carousel { overflow: visible; }
  /* La traccia smette di essere il piano del coverflow e diventa una pila:
     altezza automatica, card una sotto l'altra. Il JavaScript, quando riconosce
     lo schermo stretto, toglie da solo gli stili inline (transform, opacity,
     z-index) che scriverebbe per il nastro, cosi' non sovrascrivono la pila. */
  .carousel__track {
    position: static;
    height: auto;
    display: grid;
    grid-template-columns: 1fr;
    gap: 48px;
  }
  /* !important perche' vince sugli stili inline che il JavaScript scrive per il
     nastro (transform, opacity): se si arriva qui attraversando il breakpoint,
     senza questo le card resterebbero scalate e spostate invece di impilarsi. */
  .slide {
    position: static;
    width: auto;
    transform: none !important;
    opacity: 1 !important;
  }
  /* Niente animazione qui: la didascalia torna nel flusso, sotto la sua
     immagine, e si vede sempre. */
  .slide__caption {
    position: static;
    margin-top: 14px;
    opacity: 1 !important;
    transition: none;
  }

  /* Su schermo stretto la riga diventa due colonne: anno a sinistra,
     ruolo sopra e azienda sotto a destra. */
  .timeline__row { grid-template-columns: 68px 1fr; }
  .timeline__org { grid-column: 2; }

  .quote { gap: 18px; }
}

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

  /* La regola qui sopra azzera la durata, non l'effetto: lo zoom della card
     resterebbe, ma di scatto, che per chi chiede meno movimento e' peggio del
     movimento stesso. Qui si spegne del tutto.

     Il video mancava dall'elenco: e' arrivato il 27/08/2026 con la card ATM e
     nessuno ha aggiornato questa riga, quindi ATM era l'unica card che si
     ingrandiva anche a chi aveva chiesto meno movimento. */
  .slide--link:hover .slot--filled img,
  .slide--link:hover .slot--filled video { transform: none; }
  .site-nav .nav-resume:hover .link-arrow,
  .contact__social:hover .link-arrow { transform: none; }
}

/* =============================================================
   NAVIGATORE DELL'ATLANTE DEL PGT (27/08/2026)
   26 tavole cliccabili, al posto del segnaposto 02 della pagina ATM.

   Tutte le classi sono nel namespace .atlas-, quindi questo blocco sta in
   coda senza toccare nulla di esistente.

   Regola della casa rispettata: ogni colore che finisce su un testo passa da
   un token --text-*. Unica eccezione dichiarata, il visualizzatore a tutto
   schermo: e' una superficie scura, e i token --text-* del sito sono tutti
   inchiostri per fondo chiaro. Li' i colori sono letterali e stanno scritti
   sul posto.

   L'unico colore non presente fra i token e' quello della sagoma di Milano:
   e' dichiarato come variabile locale --atlas-land, cosi' non serve
   aggiungere niente a :root.
   ============================================================= */

.atlas-nav{
  --atlas-land:#e9e7e3;
  position:relative;
  max-width:820px;
  margin:0 auto;
  width:100%;
}

/* ---------- la mappa indice ---------- */
.atlas-nav__stage{position:relative}

.atlas-nav__map{display:block; width:100%; height:auto; overflow:visible}

.atlas-nav__land{fill:var(--atlas-land)}

.atlas-nav__tile{cursor:pointer}
.atlas-nav__tile rect{
  fill:transparent; stroke:var(--ui-rule-strong); stroke-width:.9;
  transition:fill .18s ease, stroke .18s ease;
}
.atlas-nav__tile text{
  font-family:var(--font-mono); font-size:11px;
  fill:var(--text-label); text-anchor:middle; dominant-baseline:central;
  pointer-events:none; transition:fill .18s ease;
}
.atlas-nav__tile:focus-visible{outline:none}
.atlas-nav__tile:focus-visible rect{stroke:var(--ui-focus); stroke-width:1.8}

/* L'hover si dichiara solo dove esiste un puntatore. Sul touch il browser lo
   simula al tocco e lo lascia acceso dopo, cosi' la casella toccata resta
   evidenziata come se fosse ancora sotto il dito. */
@media (hover: hover){
  .atlas-nav__tile:hover rect{fill:var(--ui-wash); stroke:var(--ui-mark)}
  .atlas-nav__tile:hover text{fill:var(--text-link)}
}

/* Tavola gia' aperta almeno una volta: leggera campitura, aiuta a capire
   dove si e' arrivati senza contare le caselle. */
.atlas-nav__tile.is-seen rect{fill:var(--ui-seen)}
.atlas-nav__tile.is-current rect{fill:var(--ui-wash-strong); stroke:var(--ui-mark); stroke-width:1.4}

/* Su schermi stretti la mappa si rimpicciolisce tutta insieme, numeri
   compresi: a 390 px un 11 diventerebbe 8 px sullo schermo. Le misure sono
   in unita' del viewBox, quindi crescere qui vuol dire restare uguali una
   volta scalati. Le caselle restano sopra i 44 px di lato. */
@media (max-width: 700px){
  .atlas-nav__tile text{font-size:17px}
  .atlas-nav__tile rect{stroke-width:1.3}
  .atlas-nav__tile.is-current rect{stroke-width:2}
}

/* ---------- anteprima al passaggio del mouse ----------
   Appesa a body, come il visualizzatore e per lo stesso motivo: dentro la
   figura lo slot ha overflow:hidden e la taglierebbe ai bordi della mappa.
   z-index 150, sopra l'intestazione fissa ma sotto il visualizzatore.

   pointer-events:none e' la riga da non togliere: il riquadro copre due o tre
   caselle, e senza quella si mangerebbe il clic destinato a loro, oltre a
   scatenare un pointerleave sulla casella che lo ha appena aperto.

   Le misure sono legate a PEEK_W e PEEK_H in atlante.js, che servono a
   ribaltarlo prima che esca dalla finestra: 260 di larghezza in box-sizing
   border-box, e 188 di altezza che vengono da 246 px di immagine sul rapporto
   1,413 delle tavole, piu' i 12 di respiro e i 2 del bordo. Cambiando una
   misura qui va cambiata anche la', altrimenti il riquadro si ribalta nel
   punto sbagliato.

   Il fondo e' --surface e non --bg: --bg in questo foglio non esiste. Ci era
   finito il 27/08/2026 e non si notava, perche' una variabile inesistente
   rende la dichiarazione non valida e lascia il riquadro trasparente sopra il
   bianco della pagina. Sembrava giusto; sopra qualcosa di scuro non lo
   sarebbe stato. */
.atlas-peek{
  position:fixed; z-index:150; pointer-events:none;
  box-sizing:border-box; width:260px; padding:6px;
  background:var(--ui-page); border:1px solid var(--ui-rule);
  box-shadow:0 10px 30px var(--ui-shadow);
  opacity:0; transform:translateY(4px);
  transition:opacity .16s ease, transform .16s ease;
}
.atlas-peek.is-on{opacity:1; transform:none}
.atlas-peek[hidden]{display:none}
.atlas-peek img{display:block; width:100%; height:auto}

/* Sul tocco non esiste: l'hover resta appiccicato dopo il tap. Lo script gia'
   non la costruisce, questa e' la cintura oltre alle bretelle. */
@media (hover: none){ .atlas-peek{display:none} }

/* ---------- il visualizzatore a tutto schermo ----------
   Costruito da atlante.js e appeso a <body>, non alla figura: il riquadro
   della pagina e' .slot--filled, che ha overflow:hidden e lo taglierebbe.
   z-index 200 per stare sopra l'intestazione fissa.

   Le altezze usano dvh e non vh: su iOS la barra degli indirizzi entra e esce
   mentre si scorre, e vh resta fermo al valore piu' grande, quindi la barra in
   fondo al visualizzatore finirebbe sotto il bordo dello schermo. */
.atlas-lb{
  position:fixed; inset:0; z-index:200;
  height:100dvh;
  background:rgba(13,13,13,.95);
  display:flex; flex-direction:column;
  opacity:0; transition:opacity .18s ease;
}
.atlas-lb.is-on{opacity:1}
.atlas-lb[hidden]{display:none}

.atlas-lb__view{
  position:relative; flex:1 1 auto; overflow:hidden;
  cursor:grab; touch-action:none;
}
.atlas-lb__view.is-dragging{cursor:grabbing}
/* max-width/max-height a none e' obbligatorio, non cosmetico: il foglio del
   sito ha una regola generale img{max-width:100%} pensata per le immagini
   dentro il testo. Qui la larghezza della tavola (3306 px) e' il sistema di
   riferimento dello zoom, e il browser la schiacciava a quella del riquadro
   lasciando l'altezza intera: la tavola usciva stirata in verticale. */
.atlas-lb__view img{
  position:absolute; left:0; top:0;
  max-width:none; max-height:none;
  transform-origin:0 0; will-change:transform;
  user-select:none; -webkit-user-drag:none;
}
/* L'anteprima leggera resta sotto, sfocata, finche' non arriva la tavola piena:
   evita lo schermo nero durante il caricamento. */
.atlas-lb__view .atlas-lb__prev{filter:blur(1.5px)}
.atlas-lb__view .atlas-lb__full{opacity:0; transition:opacity .3s ease}
.atlas-lb__view .atlas-lb__full.is-on{opacity:1}

/* Da qui in giu' si e' sul fondo scuro: colori letterali, non token. */

/* La X. 44 px di lato: e' la misura minima che Apple indica per un bersaglio
   da toccare, e questo e' l'unico modo di uscire sul telefono, quindi non e'
   il posto dove risparmiare spazio. env(safe-area-inset-*) la tiene lontana
   dalla tacca e dagli angoli arrotondati. */
.atlas-lb__close{
  position:absolute; z-index:3;
  top:calc(10px + env(safe-area-inset-top));
  right:calc(12px + env(safe-area-inset-right));
  width:44px; height:44px; padding:0;
  display:flex; align-items:center; justify-content:center;
  border:1px solid rgba(255,255,255,.22);
  background:rgba(13,13,13,.62); color:#fff; cursor:pointer;
  -webkit-backdrop-filter:blur(6px); backdrop-filter:blur(6px);
  transition:border-color .18s ease, background .18s ease;
}
.atlas-lb__close svg{width:22px; height:22px}
.atlas-lb__close svg path,
.atlas-lb__step svg path{
  fill:none; stroke:currentColor; stroke-width:1.7;
  stroke-linecap:round; stroke-linejoin:round;
}
.atlas-lb__close:hover{border-color:#fff; background:rgba(13,13,13,.85)}
.atlas-lb__close:focus-visible{outline:2px solid var(--ui-focus); outline-offset:2px}

.atlas-lb__spin{
  position:absolute; left:50%; top:50%; transform:translate(-50%,-50%); z-index:2;
  font-family:var(--font-mono); font-size:10px; letter-spacing:var(--track-caps);
  text-transform:uppercase; color:#fff;
  background:rgba(13,13,13,.72); padding:8px 14px;
}
.atlas-lb__spin[hidden]{display:none}

/* "Due dita per ingrandire" non e' scritto da nessuna parte e nessuno lo
   prova per caso su una tavola che sembra un'immagine ferma. Compare una
   volta sola per apertura e sparisce da solo dopo due secondi e mezzo, o
   subito, appena il secondo dito scende. */
.atlas-lb__hint{
  position:absolute; z-index:3; left:50%;
  bottom:calc(18px + env(safe-area-inset-bottom));
  transform:translateX(-50%);
  margin:0; padding:9px 15px;
  background:rgba(13,13,13,.78);
  -webkit-backdrop-filter:blur(6px); backdrop-filter:blur(6px);
  border:1px solid rgba(255,255,255,.16);
  font-family:var(--font-mono); font-size:10px; letter-spacing:var(--track-caps);
  text-transform:uppercase; color:#fff; white-space:nowrap;
  pointer-events:none;
}
.atlas-lb__hint[hidden]{display:none}

/* Messaggio di errore leggibile al posto dello schermo nero, se le immagini
   non si trovano. In produzione non dovrebbe mai comparire: serve a chi
   apre il file fuori dalla sua cartella. Fondo bianco, quindi qui i token
   del sito tornano validi. */
.atlas-lb__fail{
  position:absolute; z-index:4; left:50%; top:50%; transform:translate(-50%,-50%);
  width:min(440px,86vw); padding:22px 24px; background:var(--surface);
  display:flex; flex-direction:column; gap:9px; text-align:left;
}
.atlas-lb__fail[hidden]{display:none}
.atlas-lb__fail strong{
  font-family:var(--font-mono); font-size:10px; letter-spacing:var(--track-caps);
  text-transform:uppercase; color:var(--text-link);
}
.atlas-lb__fail span{font-size:13px; line-height:var(--lh-body); color:var(--text-body)}
.atlas-lb__fail code{
  font-family:var(--font-mono); font-size:11.5px; color:var(--text-strong);
  background:var(--surface-3); padding:1px 4px;
}

/* ---------- la barra in fondo ---------- */
.atlas-lb__bar{
  flex:0 0 auto;
  padding:9px 20px;
  padding-left:calc(20px + env(safe-area-inset-left));
  padding-right:calc(20px + env(safe-area-inset-right));
  padding-bottom:calc(9px + env(safe-area-inset-bottom));
  border-top:1px solid rgba(255,255,255,.12);
  display:flex; align-items:center;
  gap:8px 20px; flex-wrap:wrap;
  font-family:var(--font-mono); font-size:10px; letter-spacing:.07em;
  text-transform:uppercase; color:#8d8d8d;
}
.atlas-lb__bar .atlas-lb__now{color:#fff; flex:0 0 auto}
.atlas-lb__bar .atlas-lb__ttl{
  color:#c4c4c4; text-transform:none; letter-spacing:0;
  font-family:var(--font-body); font-size:12.5px;
  flex:1 1 320px; min-width:0;
}
.atlas-lb__bar .atlas-lb__src{flex:0 0 auto; margin-left:auto}

/* Le frecce. Sul telefono sono l'unico modo di cambiare tavola, sul desktop
   sono la versione visibile di ArrowLeft e ArrowRight, che da sole nessuno
   indovina. 44 px anche loro. */
.atlas-lb__nav{display:flex; gap:6px; flex:0 0 auto; margin-left:-10px}
.atlas-lb__step{
  width:44px; height:44px; padding:0;
  display:flex; align-items:center; justify-content:center;
  border:1px solid transparent; background:none; color:#fff; cursor:pointer;
  transition:border-color .18s ease, opacity .18s ease;
}
.atlas-lb__step svg{width:20px; height:20px}
.atlas-lb__step:hover{border-color:rgba(255,255,255,.3)}
.atlas-lb__step:focus-visible{outline:2px solid var(--ui-focus); outline-offset:-2px}
.atlas-lb__step[disabled]{opacity:.28; cursor:default}
.atlas-lb__step[disabled]:hover{border-color:transparent}

/* Sotto gli 860 px l'elenco dei NIL e' troppo lungo per stare su una riga e
   spingerebbe il credito fuori dalla barra. Sparisce il titolo, non il
   credito: quello e' una condizione della licenza e resta a ogni larghezza. */
@media (max-width: 860px){
  .atlas-lb__bar .atlas-lb__ttl{display:none}
}

@media (max-width: 560px){
  .atlas-lb__bar{
    padding-left:calc(12px + env(safe-area-inset-left));
    padding-right:calc(12px + env(safe-area-inset-right));
    gap:4px 12px;
    font-size:9px;
  }
  .atlas-lb__bar .atlas-lb__src{
    /* Va a capo da solo sotto le frecce e il numero: cosi' resta leggibile
       invece di essere schiacciato in un angolo. */
    flex:1 1 100%; margin-left:0; order:3;
    text-transform:none; letter-spacing:0; font-size:10px;
  }
}

/* Telefono coricato: lo schermo e' alto 390 px in tutto, e una barra da 62 px
   si mangia un sesto della tavola. Le frecce si stringono e restano comunque
   sopra i 40 px, che a schermo coricato e' un compromesso accettabile. */
@media (max-height: 460px) and (orientation: landscape){
  .atlas-lb__bar{padding-top:2px; padding-bottom:calc(2px + env(safe-area-inset-bottom))}
  .atlas-lb__step{width:40px; height:40px}
  .atlas-lb__bar .atlas-lb__ttl{display:none}
}

@media (prefers-reduced-motion:reduce){
  .atlas-lb,
  .atlas-lb__view .atlas-lb__full,
  .atlas-lb__close,
  .atlas-lb__step,
  .atlas-nav__tile rect,
  .atlas-nav__tile text{transition-duration:.01ms}
  .atlas-peek{transition-duration:.01ms; transform:none}
}
