/* Home aiwithbarbara.
   Nessuno stile incorporato, nessun attributo style: gira sotto la CSP stretta.
   Animazioni solo con transform e opacity. */


/* I colori e le misure stanno in base.css. */

*{box-sizing:border-box}
html{scroll-behavior:smooth}
body{
  margin:0; color:var(--txt); background:var(--ink);
  /* Le scene a tutta larghezza usano width:100vw, e 100vw comprende
     la barra di scorrimento: otto pixel che sporgevano a destra e
     davano alla pagina una barra di scorrimento ORIZZONTALE. Da fuori
     sembra un sito rotto, e sul telefono si riesce a trascinare la
     pagina di lato.
     clip e non hidden: hidden creerebbe un contenitore di
     scorrimento e romperebbe il position:sticky dell'apertura. */
  overflow-x:clip;
  font-family:var(--s); font-size:clamp(16.5px,1.15vw,20px); line-height:1.62;
  -webkit-font-smoothing:antialiased;
  background-attachment:fixed;
}

/* La barra sta in barra.css: la usano anche /prompt/ e le sezioni. */

/* ---------- impaginazione ---------- */
main{display:block}
section{
  max-width:var(--max); margin:0 auto; padding:0 var(--pad);
}
/* Il titolo di sezione: una misura sola in tutto il sito, al neon.
   Turchese perche' e' quello che guida chi legge. */
.occhiello{
  font-family:var(--m); font-size:clamp(13px,1.5vw,16px); font-weight:700;
  letter-spacing:.2em; text-transform:uppercase; color:var(--teal);
  margin:0 0 22px; text-wrap:balance;
  text-shadow:0 0 14px rgba(var(--teal-rgb),.5), 0 0 36px rgba(var(--teal-rgb),.2);
  animation:respiro 3.4s ease-in-out infinite;
}
@media (prefers-reduced-motion:reduce){ .occhiello{animation:none} }

/* ---------- 1. apertura ---------- */
.apertura{
  position:relative; flex-direction:column; justify-content:center;
  content-visibility:visible;
}
/* La misura della frase e' scritta QUI e in nessun altro posto.
   Prima stava in tre punti diversi del foglio, e i due piu' in basso
   dovevano vincere a forza di !important: tre !important per dire una
   cosa che si dice una volta sola. */
.frase{
  position:relative; z-index:2; margin:0; max-width:30ch;
  font-family:var(--m); font-weight:700; letter-spacing:-.025em;
  font-size:clamp(15.5px,3vw,40px); line-height:1.24; text-wrap:balance;
}
.riga{display:block}
.riga.due{color:var(--soft); margin-top:.55em; font-weight:500}
@media(min-width:900px){.frase{max-width:20ch}}
@keyframes svela{from{opacity:1}to{opacity:0}}

/* Il guasto: due scatti brevissimi quando la frase finisce di
   definirsi. Separazione dei canali e una fetta spostata, poi torna
   a posto e non succede piu'. Un guasto che si ripete diventa un
   fastidio; uno solo e' un segno. */
.frase[data-scritta]{animation:guasto 7s steps(1,end) .6s infinite}
@keyframes guasto{
  0%  {transform:translate3d(0,0,0); text-shadow:none; clip-path:none}
  1.4%{transform:translate3d(-9px,0,0) skewX(-1.4deg);
       text-shadow:7px 0 var(--teal), -7px 0 var(--violet);
       clip-path:inset(6% 0 62% 0)}
  2.6%{transform:translate3d(11px,0,0) skewX(1deg);
       text-shadow:-6px 0 var(--teal), 6px 0 var(--violet);
       clip-path:inset(48% 0 18% 0)}
  3.6%{transform:translate3d(-4px,0,0);
       text-shadow:4px 0 var(--violet), -4px 0 var(--teal);
       clip-path:inset(22% 0 40% 0)}
  4.6%{transform:translate3d(0,0,0); text-shadow:none; clip-path:none}
  30% {transform:translate3d(0,0,0); text-shadow:none; clip-path:none}
  31.2%{transform:translate3d(8px,0,0) skewX(1.6deg);
       text-shadow:-8px 0 var(--violet), 8px 0 var(--teal);
       clip-path:inset(70% 0 6% 0)}
  32.2%{transform:translate3d(-6px,0,0);
       text-shadow:5px 0 var(--teal), -5px 0 var(--violet);
       clip-path:inset(4% 0 76% 0)}
  33.4%{transform:translate3d(0,0,0); text-shadow:none; clip-path:none}
  66% {transform:translate3d(0,0,0); text-shadow:none; clip-path:none}
  67.2%{transform:translate3d(-5px,0,0) skewX(-1deg);
       text-shadow:6px 0 var(--violet), -6px 0 var(--teal);
       clip-path:inset(36% 0 30% 0)}
  68.4%{transform:translate3d(3px,0,0); text-shadow:none; clip-path:none}
  100%{transform:translate3d(0,0,0); text-shadow:none; clip-path:none}
}

/* Il cursore dopo "ora." - resta li' a lampeggiare: la frase non e'
   finita, e' in corso. */
.cursore{
  display:inline-block; width:.5em; height:.86em; margin-left:.12em;
  vertical-align:-.06em; background:var(--teal); border-radius:1px;
  animation:batti 1.15s steps(1,end) infinite;
}
@keyframes batti{0%,49%{opacity:1}50%,100%{opacity:.08}}

.scendi{ left:var(--pad); bottom:36px; z-index:2;
}
@keyframes appari{to{opacity:.75}}

/* ---------- comparse allo scorrimento ---------- */
/* La sezione non sfuma piu' come blocco: sfumano i suoi pezzi, uno
   dopo l'altro. Prima si muovevano insieme il contenitore E il
   contenuto, e il doppio movimento appiattiva lo sfalsamento. */
.rv{opacity:1; transform:none}
.rv:not(.on) [data-sc]{opacity:0}
section.rv{margin-bottom:clamp(96px,13vw,180px)}

/* ---------- 3. la prova ---------- */
.prova-griglia{
  display:grid; gap:16px;
  grid-template-columns:repeat(auto-fit,minmax(min(100%,270px),1fr));
}
.stampa{
  background:linear-gradient(180deg,var(--sur2),var(--sur));
  border:1px solid var(--rule); border-radius:14px; padding:22px;
  /* Ombre vere, sotto l'elemento: mancavano, e sono meta' dell'eleganza. */
  box-shadow:0 1px 0 rgba(var(--bianco-rgb),.04) inset,
             0 18px 34px -22px rgba(var(--nero-rgb),.9),
             0 3px 8px rgba(var(--nero-rgb),.4);
}
.stampa{
  grid-column:span 1; text-decoration:none; color:var(--txt);
  display:flex; flex-direction:column; gap:11px;
  transition:transform .35s var(--curva), border-color .35s var(--curva);
}
@media(min-width:760px){.stampa{}}
.stampa:hover,.stampa:focus-visible{transform:translateY(-3px); border-color:var(--linea-viva)}
.testata{
  font-family:var(--m); font-size:10.5px; font-weight:700; letter-spacing:.18em;
  text-transform:uppercase; color:var(--teal);
}
.titolo-art{font-size:clamp(17px,1.9vw,22px); line-height:1.38; text-wrap:pretty}
.data{font-family:var(--m); font-size:11.5px; color:var(--soft); letter-spacing:.03em}
.elenco{margin:0; font-size:15px; line-height:1.75}

/* ---------- 4. le tre porte ---------- */
.porte-griglia{
  display:grid; gap:16px;
  grid-template-columns:repeat(auto-fit,minmax(min(100%,260px),1fr));
}
.porta{
  position:relative; display:flex; flex-direction:column; gap:9px;
  padding:26px 24px 24px; border-radius:14px; text-decoration:none; color:var(--txt);
  background:linear-gradient(180deg,var(--sur2),var(--sur));
  border:1px solid var(--rule);
  box-shadow:0 1px 0 rgba(var(--bianco-rgb),.04) inset,
             0 18px 34px -22px rgba(var(--nero-rgb),.9),
             0 3px 8px rgba(var(--nero-rgb),.4);
  transition:transform .38s var(--curva), border-color .38s var(--curva);
}
.porta::before{
  content:""; position:absolute; inset:-1px -1px auto -1px; height:2px;
  border-radius:14px 14px 0 0; background:linear-gradient(90deg,var(--teal),var(--violet));
  opacity:0;
}
.porta.viva:hover,.porta.viva:focus-visible{transform:translateY(-5px); border-color:var(--linea-viva)}
.porta-titolo{font-family:var(--m); font-weight:700; font-size:clamp(17px,2.1vw,21px); letter-spacing:-.01em}
.porta-riga{color:var(--soft); font-size:14.5px; line-height:1.6; text-wrap:pretty}
.porta-vai{
  margin-top:6px; font-family:var(--m); font-size:12px; letter-spacing:.04em; color:var(--teal);
}

/* La porta principale pesa un po' di piu': non sono paritarie. */
@media(min-width:900px){
  .porta.principale{padding-top:34px}
  .porta.principale .porta-titolo{font-size:clamp(19px,2.4vw,24px)}
}

/* ---------- 5. bio ---------- */



/* ---------- pie ---------- */
.pie{
  max-width:var(--max); margin:0 auto; padding:36px var(--pad) 56px;
  border-top:1px solid var(--rule);
}
/* LA CHIUSURA, PRIMA CHE COMINCI IL PIEDE.
   Nel piede, schiacciata fra il logo e i dati legali, si leggeva come
   una didascalia del logo. Non lo e': e' l'ultima cosa che il sito
   dice. Qui ha una fascia sua, con aria sopra e sotto, e la riga del
   piede che le passa sotto segna dove finisce il discorso e comincia
   l'anagrafica. */
.chiusa-frase{
  max-width:var(--max); margin:0 auto; padding:66px var(--pad) 58px;
  text-align:center;
}
.chiusa-frase p{
  margin:0; white-space:nowrap;
  font-family:var(--m); font-weight:500; letter-spacing:-.015em;
  line-height:1.3;
  /* STA SU UNA RIGA SOLA, SEMPRE.
     La misura non e' scelta a occhio: e' ricavata dalla frase. In un
     carattere a spaziatura fissa ogni lettera occupa circa 0.6em, e
     la frase piu' lunga fra italiano e inglese ne ha 35. Quindi il
     corpo deve stare sotto (larghezza - margini) / 21, e 4vw ci sta
     anche su uno schermo da 320 pixel.
     ATTENZIONE: se un giorno la frase si allunga oltre le 35 lettere,
     questa misura non basta piu' e la riga esce dallo schermo. */
  font-size:min(3.8vw, 30px);
  color:var(--teal);
  text-shadow:0 0 16px rgba(var(--teal-rgb),.45), 0 0 44px rgba(var(--teal-rgb),.18);
}
/* LA STESSA LUCE DELLA RIGA CHE DICE COSA FA, E NON PER PIGRIZIA.
   Quella dice "progetti che sarebbero rimasti solo idee", questa dice
   "anche questo sito era solo un'idea": sono lo stesso pensiero,
   aperto in cima e chiuso in fondo. Dargli la stessa luce lega le due
   estremita' della pagina.
   Ma i tempi sono diversi - 7.2s invece di 5.6, e il guasto sfasato -
   perche' due frasi che pulsano all'unisono sembrano un meccanismo,
   non un respiro. */
@supports (background-clip:text) or (-webkit-background-clip:text){
  .chiusa-frase p{
    background-image:linear-gradient(100deg,
      var(--teal) 0%, var(--teal) 34%,
      #EAFFFA 44%, #FFFFFF 50%, #EAFFFA 56%,
      var(--violet-lo) 68%, var(--teal) 100%);
    background-size:280% 100%;
    background-position:120% 0;
    -webkit-background-clip:text; background-clip:text;
    -webkit-text-fill-color:transparent; color:transparent;
    animation:scorreLuce 7.2s linear infinite,
              guastoRiga 11s steps(1,end) 6.5s infinite;
  }
}
@media (prefers-reduced-motion:reduce){
  .chiusa-frase p{
    animation:none; background-image:none;
    -webkit-text-fill-color:var(--teal); color:var(--teal);
  }
}
.pie-righe{
  margin:0; display:flex; flex-wrap:wrap; gap:16px;
  font-family:var(--m); font-size:11px; letter-spacing:.13em;
  text-transform:uppercase; color:var(--soft);
}
.pie-righe a{color:var(--soft); text-decoration:none}
.pie-righe a:hover{color:var(--txt)}

/* ---------- movimento ridotto ---------- */
@media (prefers-reduced-motion:reduce){
  html{scroll-behavior:auto}
  *,*::before,*::after{
    animation-duration:.001ms !important; animation-delay:0ms !important;
    transition-duration:.001ms !important;
  }
  .rv{opacity:1; transform:none}

  .frase{animation:none; text-shadow:none; transform:none; clip-path:none}
  .cursore{animation:none; opacity:1}
}

/* ---------- 5. bio e ritratto ---------- */
.bio-griglia{
  display:grid; gap:clamp(22px,3.4vw,44px); align-items:start;
  grid-template-columns:1fr;
}
@media(min-width:820px){
  .bio-griglia{grid-template-columns:minmax(240px,340px) 1fr}
}

.ritratto{
  position:relative; margin:0; border-radius:16px; overflow:hidden;
  border:1px solid var(--rule); background:var(--sur);
  box-shadow:0 1px 0 rgba(var(--bianco-rgb),.05) inset,
             0 26px 50px -28px rgba(var(--nero-rgb),.95),
             0 4px 12px rgba(var(--nero-rgb),.45);
}
.ritratto-foto{
  aspect-ratio:4/5; background-size:cover; background-position:center 22%;
  filter:grayscale(1) contrast(1.06);
  transform:scale(1.05);
  transition:transform 1.4s var(--curva), filter 1.4s var(--curva);
}
.bio.on .ritratto-foto{transform:scale(1)}
.ritratto:hover .ritratto-foto{filter:grayscale(.72) contrast(1.02)}

/* Il ritratto si risolve entrando in vista: stesso linguaggio dello
   scatto in apertura, ma in un colpo solo invece che a scorrimento. */
.ritratto-grezzo{
  position:absolute; inset:0; z-index:2; pointer-events:none;
  background-size:cover; background-position:center 22%;
  filter:blur(20px) saturate(.2) brightness(.7) contrast(1.3);
  opacity:1; transition:opacity 1.5s var(--curva);
}
.bio.on .ritratto-grezzo{opacity:0}

/* Il velo sopra la foto: toglie le strade facili per portarsela via. */
.scudo{
  position:absolute; inset:0; z-index:3;
  -webkit-touch-callout:none; user-select:none;
}
.ritratto figcaption{
  position:absolute; left:0; right:0; bottom:0; z-index:4;
  display:flex; align-items:baseline; gap:10px; padding:14px 16px;
  background:linear-gradient(180deg,transparent,rgba(var(--fondo-rgb),.86) 62%);
  font-family:var(--m);
}
.rit-nome{font-size:13px; font-weight:700; letter-spacing:.01em}
.rit-tag{
  font-size:9.5px; font-weight:700; letter-spacing:.18em; text-transform:uppercase;
  color:var(--ink); background:var(--teal); padding:3px 7px; border-radius:4px;
}

.bio-testo{max-width:62ch; display:flex; flex-direction:column; gap:15px}
.bio-testo p{margin:0; color:var(--soft); text-wrap:pretty}
.bio-apre{
  color:var(--txt) !important; font-family:var(--m); font-weight:700;
  font-size:clamp(17px,2.1vw,21px); line-height:1.4; letter-spacing:-.01em;
}

@media (prefers-reduced-motion:reduce){
  .ritratto-grezzo{display:none}
  .ritratto-foto{transform:none}
}

/* ---------- fasce a nastro ---------- */
/* Non sono attaccate come prima: una respira dopo "chi e'", l'altra
   arriva dopo la prova, cosi' non sembrano un blocco solo. */
.fascia{
  max-width:none; padding:0; margin:clamp(52px,7vw,86px) 0;
}
.fascia.distanziata{margin-top:clamp(66px,9vw,110px)}

/* ---------- APERTURA: la frase e lo scatto che si genera ---------- */
.apertura-griglia{
  display:grid; gap:clamp(26px,4vw,54px); align-items:center;
  grid-template-columns:1fr;
}
@media(min-width:900px){
  .apertura-griglia{grid-template-columns:1.05fr .95fr}
}

/* La frase e' piu' piccola: deve lasciare respiro allo scatto. */

.scendi{
  position:static; margin:clamp(26px,4vw,44px) 0 0; padding:0;
  font-family:var(--m); font-size:10.5px; letter-spacing:.2em;
  text-transform:uppercase; color:var(--soft); opacity:0;
  animation:appari .8s var(--curva) 1.6s forwards;
}

/* ---------- neon: solo dove serve, mai ovunque ---------- */
/* Il turchese e' interazione, il viola e' struttura: il bagliore
   segue la stessa regola, altrimenti diventa una giostra. */
.st b{
  color:var(--teal);
  text-shadow:0 0 14px rgba(var(--teal-rgb),.45), 0 0 34px rgba(var(--teal-rgb),.18);
  animation:respiro 3.4s ease-in-out infinite;
}
.st b.inf{
  color:var(--violet-lo);
  text-shadow:0 0 14px rgba(var(--violet-su-rgb),.45), 0 0 34px rgba(var(--violet-su-rgb),.2);
  animation-delay:1.1s;
}
@keyframes respiro{
  0%,100%{opacity:1}
  46%{opacity:.72}
}
.rit-tag{box-shadow:0 0 16px rgba(var(--teal-rgb),.4)}
.cursore{box-shadow:0 0 12px rgba(var(--teal-rgb),.65)}

@media (prefers-reduced-motion:reduce){
.st b{animation:none}
  .scendi{opacity:.75}
}
.glifo{
  width:17px; height:17px; flex:none; fill:none;
  stroke:currentColor; stroke-width:1.7; stroke-linecap:round; color:var(--soft);
  transition:color .34s var(--curva);
}
.canale-punto{
  width:5px; height:5px; border-radius:50%; background:var(--teal); margin-left:auto;
  box-shadow:0 0 10px rgba(var(--teal-rgb),.75);
  animation:respiro 3.4s ease-in-out infinite;
}
.canale-riga{color:var(--soft); font-size:14px; line-height:1.55; text-wrap:pretty}
.canale-vai{
  align-self:flex-start; margin-top:5px;
  font-family:var(--m); font-size:12.5px; font-weight:500;
  color:var(--ink); background:var(--teal); padding:11px 17px; border-radius:9px;
  box-shadow:0 1px 0 rgba(var(--bianco-rgb),.22) inset,
             0 10px 22px -12px rgba(var(--teal-rgb),.65);
  transition:transform .34s var(--curva);
}

@media (prefers-reduced-motion:reduce){
  .canale-punto{animation:none}
}

/* ---------- il primato, fra le prove ---------- */
/* L'avatar del 2024 non e' chi e': e' da dove e' partita. Sta qui,
   accanto a Repubblica, con la data in evidenza. */
.primato{
  display:flex; flex-direction:column; gap:8px; justify-content:center;
  padding:22px; border-radius:14px;
  background:linear-gradient(180deg,var(--sur2),var(--sur));
  border:1px solid var(--rule);
  box-shadow:0 1px 0 rgba(var(--bianco-rgb),.04) inset,
             0 18px 34px -22px rgba(var(--nero-rgb),.9);
}
.primato-anno{
  font-family:var(--m); font-weight:700; font-size:clamp(24px,3.2vw,34px);
  line-height:1; color:var(--teal); font-variant-numeric:tabular-nums;
  text-shadow:0 0 14px rgba(var(--teal-rgb),.4);
}
.primato-riga{color:var(--soft); font-size:14px; line-height:1.55; text-wrap:pretty}

/* ---------- la firma che chiude ---------- */
.firma-segno{
  display:block; width:auto; height:clamp(38px,5.4vw,52px);
  margin:0 0 20px; opacity:.9;
  filter:drop-shadow(0 0 16px rgba(var(--violet-rgb),.25));
}

/* ---------- ordine e respiro ---------- */
/* La pagina era diventata disordinata perche' ogni pezzo aveva un suo
   margine. Qui il ritmo e' uno solo: sezione, aria, sezione. */
main > section.rv{margin-bottom:clamp(64px,8.5vw,116px)}
main > section.fascia{margin:clamp(44px,6vw,76px) 0}
main > section.posizione{margin-top:clamp(34px,4.4vw,58px);
  margin-bottom:clamp(44px,5.6vw,78px)}

/* ---------- la frase e la scena accanto ----------
   L'alone sta in base.css, perche' lo usa anche la chiusa del
   portfolio. Qui resta solo la griglia e QUALE immagine. */
.posizione{
  display:grid; gap:var(--s5);
  grid-template-columns:1fr;
  align-items:center;
}
@media(min-width:860px){
  .posizione{grid-template-columns:minmax(0,1fr) minmax(0,.92fr); gap:var(--s7)}
}
.posizione-testo{min-width:0}
.posizione-scena[data-c]{
  background-image:url(/assets/foto/posizione.jpg);
  background-image:image-set(
    url(/assets/foto/posizione.avif) type("image/avif"),
    url(/assets/foto/posizione.webp) type("image/webp"),
    url(/assets/foto/posizione.jpg)  type("image/jpeg"));
  background-image:-webkit-image-set(
    url(/assets/foto/posizione.avif) type("image/avif"),
    url(/assets/foto/posizione.jpg)  type("image/jpeg"));
}
/* Finche' non c'e', la frase si riprende tutta la riga. */
.posizione:not(:has(.posizione-scena[data-c])){grid-template-columns:1fr}

.prova .occhiello,.porte .occhiello,.bio .occhiello{margin-bottom:20px}

/* ---------- cosa fa ----------
   Prima era un blocco di QUATTRO righe alto quasi duecento pixel, per
   colpa di max-width:22ch: ventidue caratteri per riga su una frase
   che ne ha sessantotto. Il commento diceva "una riga sola" e non lo
   e' mai stata.
   Una riga sola non si puo': a monospazio servirebbero sedici pixel,
   e la frase che dice cosa fa sembrerebbe una didascalia.
   Quindi si separano le due cose: "Specializzata in" e' raccordo e
   costa quasi niente, la frase vera resta grande su due righe.
   Da 190 pixel a un centinaio. */
.posizione-riga{
  margin:0; max-width:34ch;
  font-family:var(--m); font-weight:500; letter-spacing:-.015em;
  font-size:clamp(18px,2.25vw,26px); line-height:1.26;
  color:var(--soft); text-wrap:balance;
}
/* Il cappello era illeggibile per DUE ragioni insieme, non una:
   dieci pixel e mezzo, e per giunta nel grigio piu' spento che
   abbiamo. Sale di misura, si schiarisce, e stringe la spaziatura
   fra le lettere - che a questa grandezza, se resta larga, spezza
   la parola invece di darle respiro. */
.posizione-cappello{
  display:block; margin-bottom:10px;
  font-size:clamp(13px,1.35vw,16px); font-weight:700;
  letter-spacing:.14em; text-transform:uppercase;
  color:var(--testo-soft);
}
.posizione-riga strong{ font-weight:700}

/* La prova torna a essere tre cose sole: l'articolo, l'anno, i numeri. */
.prova-griglia{align-items:stretch}
@media(min-width:760px){
  .prova-griglia{grid-template-columns:1.6fr 1fr}
  .stampa{grid-column:1/2; grid-row:1/3}
  .primato{grid-column:2/3}
  .stats{grid-column:2/3; align-content:center}
}
.stats{
  padding:22px; border-radius:14px;
  background:linear-gradient(180deg,var(--sur2),var(--sur));
  border:1px solid var(--rule);
  box-shadow:0 1px 0 rgba(var(--bianco-rgb),.04) inset,
             0 18px 34px -22px rgba(var(--nero-rgb),.9);
  grid-template-columns:1fr;
  gap:14px;
}

/* ---------- l'apertura resta ferma mentre si genera ---------- */
/* La sezione e' piu' alta di uno schermo: mentre si scorre dentro
   questa altezza in piu', il contenuto resta fermo e la scansione
   avanza. Finita la generazione, la pagina riprende a scorrere.
   Prima la foto se ne andava via prima di essersi vista. */
.apertura{
  min-height:172vh;
  min-height:172svh;
  display:block; padding-top:0;

  /* I TRE TEMPI DELLA CORSA, scritti qui e letti da home.js.
     Stavano dentro il codice come due numeri fissi, e sul telefono
     non si potevano cambiare senza toccare lo script.
       0    -> --gen     la foto si genera
       --gen -> --tieni  resta ferma, finita, e si guarda
       --tieni -> 1      sfuma via
     Cambiare questi tre numeri e min-height e' tutto cio' che serve
     per decidere quanto la foto resta davanti agli occhi. */
  --gen:.62;
  --tieni:.82;
}
.apertura-ferma{ top:0;
  min-height:100vh; min-height:100svh; padding:calc(72px + 3vh) var(--pad) 4vh;
  max-width:var(--max); margin:0 auto;
  display:flex; flex-direction:column; justify-content:center;
}
.apertura-griglia{padding:0}
@media(max-width:760px){
  /* Sul telefono tutta l'apertura deve stare in una schermata sola:
     se la foto finisce sotto il bordo, si genera dove non si vede.
     Quindi citazione stretta in alto, foto piu' bassa, e niente aria
     sprecata fra l'intestazione e la prima riga. */
  /* LA FOTO SUL TELEFONO SPARIVA PRIMA DI FARSI VEDERE.
     Con 134svh la corsa in cui la pagina resta ferma era un terzo di
     schermata: su un telefono da 844 pixel sono 287 pixel, e la
     dissolvenza cominciava dopo 235. Un colpo di pollice e la foto
     era gia' andata: si generava per nessuno.
     Adesso la corsa e' 78 centesimi di schermata - 658 pixel - e la
     foto resta intera fino a 566. Due volte e mezzo il tempo di
     prima, circa un secondo in piu' a velocita' di lettura normale.
     E i tre tempi si spostano: si genera prima (mezza corsa invece
     di due terzi) e si guarda piu' a lungo. */
  /* TUTTO NELLA STESSA UNITA', ED E' QUI IL PUNTO.
     La corsa era in svh (schermo con la barra del browser aperta) e
     il riquadro fermo pure, ma la scena e la finestra sono in lvh
     (barra ritirata). Risultato: i contatori entravano in campo
     dopo 430 pixel di scorrimento, ma la corsa finiva a 595 - e per
     165 pixel restavano sotto la scena, che li copriva. Non era
     spazio vuoto: era il contenuto nascosto dietro un velo scuro.
     Con corsa e riquadro fermo in lvh, la corsa finisce nello stesso
     istante in cui i contatori arrivano. */
  .apertura{
    min-height:145vh; min-height:145lvh;
    /* Quasi tutta la corsa e' generazione: e' quella la cosa da
       guardare. Finita la foto la pagina non si trattiene piu' -
       restare fermi su una foto gia' fatta e' tempo tolto a chi
       legge, e lascia lo schermo vuoto quando poi sfuma. */
    --gen:.78;
    --tieni:.90;
  }
  .apertura-ferma{
    justify-content:flex-start;
    min-height:100vh; min-height:100lvh;
    padding-top:calc(56px + 22px); padding-bottom:1.5vh;
  }
  .apertura-griglia{gap:18px}
  .scatto{
    height:min(46svh, 62vw * 1.25); aspect-ratio:4/5; width:auto;
    margin-inline:auto; border-radius:14px;
  }
  .scendi{margin-top:10px}
}
@media(max-width:760px) and (max-height:680px){
  /* schermi corti: la foto si stringe ancora, la citazione scende */
  .scatto{height:40svh}
  .frase{font-size:clamp(14px,3.4vw,20px)}
}
/* La riga "continua" sparisce quando la generazione e' finita:
   a quel punto scorrere e' ovvio. */
.scendi{transition:opacity .5s var(--curva)}
.apertura[data-pronta] .scendi{opacity:0 !important}

/* ============================================================
   VITA: come la pagina si comporta mentre la si attraversa.
   Tutto con transform e opacity soltanto. Niente qui dentro fa
   ricalcolare il layout, quindi nulla di tutto questo fa scattare
   lo scorrimento nemmeno su un telefono lento.
   ============================================================ */

/* --- 1. gli elementi arrivano sfalsati -----------------------------
   Tre cose cambiate rispetto a prima, e sono quelle che facevano
   sembrare la pagina prevedibile:

   1. lo SFALSAMENTO non e' piu' lineare. Prima ogni elemento partiva
      78 ms dopo il precedente, sempre: una fila che marcia. Ora
      l'intervallo si accorcia man mano, quindi la fila cade.
   2. la CURVA e' una molla: arriva, supera di un pelo, torna. Prima
      decelerava e basta, come tutto il resto del sito.
   3. la DIREZIONE dipende da dove sta l'elemento: la prima carta
      arriva da sinistra, l'ultima da destra, quelle in mezzo dal
      basso. Prima salivano tutte uguali. */

.rv [data-sc]{
  --dx:0px; --dy:22px; --sc:0;
  opacity:0;
  transform:translate3d(var(--dx), var(--dy), 0) scale(.985);
  transition:opacity var(--d3) var(--curva-entra),
             transform var(--d4) var(--curva-molla);
  /* l'intervallo si accorcia: 62ms, poi 58, poi 54... */
  transition-delay:calc(var(--sc) * 62ms - var(--sc) * var(--sc) * 4ms);
}
.rv.on [data-sc]{opacity:1; transform:none}

/* Le carte arrivano da piu' lontano e appena ridotte: si posano. */
.porta[data-sc],.stampa[data-sc],.primato[data-sc],.strada[data-sc],.scheda[data-sc]{--dy:30px}

/* La direzione, solo dentro le griglie: li' ci sono le carte vere. */
.porte-griglia > [data-sc]:first-child,
.prova-griglia > [data-sc]:first-child,
.dentro > [data-sc]:first-child,
.passi > [data-sc]:first-child{--dx:-30px; --dy:14px}

.porte-griglia > [data-sc]:last-child,
.prova-griglia > [data-sc]:last-child,
.dentro > [data-sc]:last-child,
.passi > [data-sc]:last-child{--dx:30px; --dy:14px}

/* Le tre porte, e solo loro, si risolvono anche dalla sfocatura:
   bozza che diventa definitivo. Sono tre elementi piccoli, quindi
   la sfocatura non costa niente; su tutta la pagina costerebbe. */
.porte-griglia > [data-sc]{
  filter:blur(7px);
  transition:opacity var(--d3) var(--curva-entra),
             transform var(--d4) var(--curva-molla),
             filter var(--d4) var(--curva-entra);
  transition-delay:calc(var(--sc) * 62ms - var(--sc) * var(--sc) * 4ms);
}
.rv.on .porte-griglia > [data-sc]{filter:none}

/* La riga colorata in cima alle porte si disegna dopo l'arrivo. */
.porta::before{
  transform:scaleX(0); transform-origin:left;
  transition:opacity var(--d2) var(--curva-entra),
             transform var(--d4) var(--curva-entra);
  transition-delay:calc(var(--sc) * 62ms + .4s);
}
.rv.on .porta::before{opacity:.55; transform:scaleX(1)}
.porta.viva:hover::before,.porta.viva:focus-visible::before{opacity:1}

/* --- 2. i separatori si generano ---------------------------------
   Una striscia che passa da blocchi grossolani a sfumatura continua:
   il tema della pagina, ripetuto piano fra una sezione e l'altra. */
.separatore{
  position:relative; height:2px; margin:0 auto;
  max-width:var(--max); width:calc(100% - var(--pad) * 2);
  overflow:hidden; border-radius:2px;
}
.separatore::before,.separatore::after{
  content:""; position:absolute; inset:0;
  transition:opacity 1s var(--curva);
}
/* lo stato grezzo: blocchi netti, quantizzati */
.separatore::before{
  background:repeating-linear-gradient(90deg,
    var(--violet) 0 14px, transparent 14px 26px,
    var(--teal) 26px 34px, transparent 34px 52px);
  opacity:.55;
}
/* lo stato risolto: sfumatura continua */
.separatore::after{
  background:linear-gradient(90deg,
    transparent, var(--violet) 22%, var(--teal) 58%, transparent);
  opacity:0;
}
.separatore.on::before{opacity:0}
.separatore.on::after{opacity:.75}

/* --- 3. il fondo respira con lo scorrimento ----------------------
   La sorgente di luce si sposta piano: la stanza resta la stessa,
   ma non e' mai identica a se stessa. */
body{
  background-image:
    radial-gradient(125% 85% at calc(8% + var(--luce,0) * 26%) calc(-8% + var(--luce,0) * 14%),
      var(--luce-alta) 0%, transparent 58%),
    radial-gradient(95% 65% at calc(105% - var(--luce,0) * 30%) calc(108% - var(--luce,0) * 22%),
      var(--luce-bassa) 0%, transparent 52%);
}

/* --- 4. le etichette di sezione ----------------------------------
   Restano monospazio: mentre si decodificano la riga non si muove. */
.occhiello[data-decodifica]{color:var(--teal); opacity:.9}

@media (prefers-reduced-motion:reduce){
  .rv [data-sc]{
    opacity:1 !important; transform:none !important;
    filter:none !important; transition:none !important;
  }
  .porta::before{transform:none; opacity:.55}
  .separatore::before{opacity:0}
  .separatore::after{opacity:.75}
  body{--luce:0}
}

/* La luce vive in vetro.css: la usano tutte le pagine. */

/* --- 6. lo scatto reagisce alla mano ------------------------------
   Un'inclinazione minima, quattro gradi in tutto: si sente piu' di
   quanto si veda, ed e' giusto cosi'. */
@media (hover:hover) and (pointer:fine){
  .scatto{
    transform:perspective(900px)
      rotateX(calc(var(--ty,0) * -2.2deg))
      rotateY(calc(var(--tx,0) * 2.2deg));
    transition:transform .5s var(--curva);
  }
  .apertura-griglia:hover .scatto{transition:transform .12s linear}
}

@media (prefers-reduced-motion:reduce){
  .riflesso::after{display:none}
  .scatto{transform:none !important}
}

/* ---------- la riga che dice cosa fa ----------
   Non basta accenderla: qui la luce ATTRAVERSA le lettere, come se
   la frase fosse incisa nel vetro e qualcosa le passasse dietro.
   Ogni tanto, di rado, un guasto brevissimo: si nota solo se la si
   sta guardando, ed e' giusto cosi'. */
.posizione-riga strong{
  position:relative; display:inline;
  color:var(--teal);                       /* se il taglio sul testo non e' supportato */
  text-shadow:0 0 16px rgba(var(--teal-rgb),.45), 0 0 44px rgba(var(--teal-rgb),.18);
}
@supports (background-clip:text) or (-webkit-background-clip:text){
  .posizione-riga strong{
    background-image:linear-gradient(100deg,
      var(--teal) 0%, var(--teal) 34%,
      #EAFFFA 44%, #FFFFFF 50%, #EAFFFA 56%,
      var(--violet-lo) 68%, var(--teal) 100%);
    background-size:280% 100%;
    background-position:120% 0;
    -webkit-background-clip:text; background-clip:text;
    -webkit-text-fill-color:transparent; color:transparent;
    animation:scorreLuce 5.6s linear infinite,
              guastoRiga 9s steps(1,end) 2.4s infinite;
  }
}
@keyframes scorreLuce{
  0%  {background-position:120% 0}
  100%{background-position:-60% 0}
}
/* Il guasto occupa meno di mezzo secondo su nove: e' un lampo. */
@keyframes guastoRiga{
  0%   {transform:translate3d(0,0,0); filter:none; clip-path:none}
  1.2% {transform:translate3d(-4px,0,0) skewX(-1deg);
        filter:drop-shadow(3px 0 var(--violet)) drop-shadow(-3px 0 var(--teal));
        clip-path:inset(18% 0 44% 0)}
  2.4% {transform:translate3d(5px,0,0);
        filter:drop-shadow(-3px 0 var(--violet)) drop-shadow(3px 0 var(--teal));
        clip-path:inset(52% 0 22% 0)}
  3.4% {transform:translate3d(0,0,0); filter:none; clip-path:none}
  100% {transform:translate3d(0,0,0); filter:none; clip-path:none}
}
@media (prefers-reduced-motion:reduce){
  .posizione-riga strong{
    animation:none; background-image:none;
    -webkit-text-fill-color:var(--teal); color:var(--teal);
  }
}

/* ============================================================
   LA SCENA — la foto non e' piu' dentro un riquadro: e' il fondo
   della parte alta della home, e si genera scorrendo.

   Tre problemi da risolvere insieme, e sono la ragione di ogni
   riga qui sotto:
   1. la frase deve restare LEGGIBILE sopra la foto
   2. la foto deve SFUMARE nel fondo, non finire con un bordo
   3. l'effetto di generazione deve restare quello di prima
   ============================================================ */

.scena{
  /* FISSA alla finestra, non alla sezione. E' l'unico modo per avere
     tre cose insieme: che stia ferma mentre si genera, che riempia lo
     schermo su qualsiasi dispositivo, e che SPARISCA quando l'apertura
     finisce invece di restare dietro al resto della pagina.
     Prima era agganciata alla sezione: continuava a vedersi sotto i
     nastri e le carte, e faceva confusione. */
  position:fixed; top:0; left:0; right:0;
  height:100vh;            /* ricaduta: senza, dove svh non e' noto */
  height:100svh;           /* la scena spariva del tutto */
  z-index:0; overflow:hidden; pointer-events:none;
  --p:0; --uscita:1;
  opacity:var(--uscita);
}
.scena > div{position:absolute; inset:0}

.scena-foto,.scena-grezza{
  /* Due misure: il browser prende la grande su schermo denso. */
  background-image:url(/assets/foto/scena.jpg);
  background-image:image-set(
    url(/assets/foto/scena@2x.avif) type("image/avif") 2x,
    url(/assets/foto/scena.avif)    type("image/avif") 1x,
    url(/assets/foto/scena@2x.webp) type("image/webp") 2x,
    url(/assets/foto/scena.webp)    type("image/webp") 1x,
    url(/assets/foto/scena.jpg)     type("image/jpeg") 1x);
  background-size:cover;
  /* Lo scatto e' gia' 16:9: su schermo largo entra quasi intero e il
     volto cade naturalmente a destra, con i led a sinistra dove va
     la frase. Nessun ritaglio da compensare. */
  background-position:50% 32%;
}

/* Lo stato grezzo: sfocato, spento, sporco di grana. Si vede solo
   a SINISTRA della riga di scansione, che attraversa scorrendo. */
/* La scena e' notturna: senza una spinta, sotto il velo si spegne.
   Solo la foto risolta, non lo strato grezzo. */
.scena-foto{filter:brightness(1.18) contrast(1.04) saturate(1.08)}

.scena-grezza{
  filter:blur(26px) saturate(.22) brightness(.62) contrast(1.3);
  -webkit-mask-image:linear-gradient(90deg,
    transparent calc(var(--p) * 100%), #000 calc(var(--p) * 100% + 6%));
  mask-image:linear-gradient(90deg,
    transparent calc(var(--p) * 100%), #000 calc(var(--p) * 100% + 6%));
}
.scena-grezza::after{
  content:""; position:absolute; inset:0; opacity:.45; mix-blend-mode:overlay;
  background-image:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='160' height='160'%3E%3Cfilter id='n'%3E%3CfeTurbulence type='fractalNoise' baseFrequency='.85' numOctaves='3'/%3E%3C/filter%3E%3Crect width='160' height='160' filter='url(%23n)'/%3E%3C/svg%3E");
}

/* La riga di scansione, la stessa di prima: ora attraversa lo schermo. */
.scena-linea{transform:translateX(calc(var(--p) * 100%))}
.scena-linea::before{
  content:""; position:absolute; top:0; bottom:0; left:0; width:1.5px;
  background:linear-gradient(180deg,transparent,var(--teal) 14%,#fff 50%,var(--teal) 86%,transparent);
  box-shadow:0 0 20px var(--alone-teal), 0 0 52px var(--alone-teal-largo);
}
.scena-linea::after{
  content:""; position:absolute; top:0; bottom:0; right:100%; width:90px;
  background:linear-gradient(90deg,transparent,rgba(var(--teal-rgb),.16));
}
.apertura[data-pronta] .scena-linea{opacity:0; transition:opacity .6s var(--curva-entra)}

/* La scansione tecnica sopra tutto: righe sottilissime. */
.scena-trama{
  opacity:.07; mix-blend-mode:overlay;
  background:repeating-linear-gradient(180deg,
    rgba(var(--bianco-rgb),.5) 0 1px, transparent 1px 3px);
}

/* IL VELO: e' quello che rende la frase leggibile e che fa sfumare
   la foto nel fondo invece di tagliarla con un bordo.
   - scuro pieno a sinistra, dove sta il testo
   - trasparente a destra, dove si vede lei
   - e in basso sfuma nel colore del sito */
.scena-velo{
  background:
    /* da sinistra a destra: pieno dove sta il testo, quasi aperto
       su di lei. Prima al 72% della larghezza c'era ancora il 40%
       di nero e, sommato al velo verticale, il volto spariva. */
    linear-gradient(90deg,
      var(--fondo) 0%, rgba(var(--fondo-rgb),.92) 18%,
      rgba(var(--fondo-rgb),.6) 40%, rgba(var(--fondo-rgb),.18) 66%, rgba(var(--fondo-rgb),.28) 100%),
    /* dall'alto in basso: scuro sotto la barra, poi si apre, e in
       fondo sfuma nel colore del sito senza lasciare bordi */
    linear-gradient(180deg,
      rgba(var(--fondo-rgb),.72) 0%, rgba(var(--fondo-rgb),.12) 16%,
      rgba(var(--fondo-rgb),.12) 52%, rgba(var(--fondo-rgb),.82) 84%, var(--fondo) 100%);
}


/* Sul telefono il testo sta sopra la foto, non accanto: il velo
   diventa verticale, scuro in alto e trasparente in basso. */
@media(max-width:820px){
  /* Lo schermo del telefono e' verticale, la foto e' orizzontale: se
     la scena fosse alta quanto lo schermo il ritaglio terrebbe solo
     un quarto della larghezza e la stanza sparirebbe. Diventa una
     fascia alta, che e' anche cio' che serve alla pagina. */
  /* Era 64vh, e sotto restavano 304 pixel di nero - il 36% dello
     schermo - che si guardavano per mezza schermata di scorrimento.
     A 82 il nero scende a un sesto, e li' sotto ci stanno la barra e
     la scritta CONTINUA: non e' piu' vuoto, e' il posto dove finisce
     la scena. */
  /* PERCHE' IL NERO SOTTO LA FOTO CAMBIAVA DA UNO SCATTO ALL'ALTRO.
     svh e' l'altezza dello schermo CON la barra del browser aperta.
     Quando scorri, quella barra si ritira e la finestra diventa piu'
     alta di colpo: una scena alta 92svh dentro una finestra grande
     lascia sotto una fascia nera di centosessanta pixel che prima
     non c'era. Non era un difetto della sfumatura: era l'unita' di
     misura.
     lvh e' l'altezza CON la barra ritirata, cioe' la piu' grande
     delle due. Con 100lvh la scena riempie sempre, in tutti e due
     gli stati: quando la barra e' aperta il fondo della foto le
     finisce dietro, e non si vede nessuna fascia. */
  .scena{height:100vh; height:100lvh}
  /* UN'ALTRA INQUADRATURA, non lo stesso file ritagliato peggio.
     La scena e' 16:9 e qui il riquadro e' verticale: il browser
     riempie l'altezza e butta via due terzi della larghezza, e in
     quella fetta la testa arriva al bordo alto - perche' ci arriva
     gia' nell'originale. Da telefono sembrava una fronte tagliata.
     scena-alta.* e' un verticale vero, con l'aria sopra la testa
     costruita allungando la tela (scripts/build-img-scena.py). */
  .scena-foto,.scena-grezza{
    background-image:url(/assets/foto/scena-alta.jpg);
    background-image:image-set(
      url(/assets/foto/scena-alta@2x.avif) type("image/avif") 2x,
      url(/assets/foto/scena-alta.avif)    type("image/avif") 1x,
      url(/assets/foto/scena-alta@2x.webp) type("image/webp") 2x,
      url(/assets/foto/scena-alta.webp)    type("image/webp") 1x,
      url(/assets/foto/scena-alta.jpg)     type("image/jpeg") 1x);
    background-position:50% 50%;
  }
  /* IL VELO NON DEVE SOTTERRARE IL VISO.
     La foto e' orizzontale e sul telefono si vede una fetta stretta:
     la testa arriva al bordo alto dell'inquadratura, e sopra ci
     passava un velo all'86% di nero. Il risultato era una fronte
     tagliata dal buio, non dal ritaglio.
     Ora sopra il velo e' piu' leggero (68%) e si apre prima (18%
     invece di 24%), cosi' il viso si vede intero; e sotto scurisce
     piu' tardi (86% invece di 84%) su una scena che e' anche piu'
     alta, quindi il nero in fondo e' meno della meta' di prima.
     Il testo resta leggibile: sta nei primi 30% dove il velo e'
     ancora fitto, e ha la sua ombra in .apertura .frase. */
  .scena-velo{
    background:linear-gradient(180deg,
      rgba(var(--fondo-rgb),.68) 0%, rgba(var(--fondo-rgb),.46) 18%,
      rgba(var(--fondo-rgb),.08) 46%, rgba(var(--fondo-rgb),.34) 74%,
      rgba(var(--fondo-rgb),.86) 92%, var(--fondo) 100%);
  }



}

/* I CONTATORI NON DEVONO ASPETTARE CHE LA SCENA SE NE VADA.
   La scena e' FISSA e copre tutto lo schermo: i contatori entravano
   in campo un pezzo prima che la corsa finisse, e per quel pezzo
   restavano dietro di lei. Da fuori non si legge "contenuto
   coperto": si legge "spazio vuoto", ed e' per questo che il nero
   sembrava non finire mai.
   Adesso salgono SOPRA la scena, che intanto sfuma. Nessun buco, e
   la sezione dopo arriva sulla foto invece che dopo il suo funerale.
   Vale anche se lvh e svh non coincidono, che e' il caso di quasi
   tutti i telefoni. */
main > section.numeri-sez{position:relative; z-index:2}

/* Il contenuto sta sopra la scena, e resta fermo insieme a lei.
   ATTENZIONE: qui c'era position:relative, che sovrascriveva lo
   sticky dichiarato piu' sopra. Il testo scorreva via mentre la
   foto restava. */
.apertura-ferma{position:sticky; z-index:1}

/* L'avanzamento: la barra e la cifra al neon, senza piu' il riquadro
   che le conteneva. */
.avanz{
  display:flex; align-items:center; gap:var(--s3);
  margin:var(--s5) 0 0; max-width:260px; --avanz:0%;
}
.avanz-barra{
  position:relative; flex:1; height:2px; border-radius:2px;
  background:rgba(var(--bianco-rgb),.12); overflow:hidden;
}
.avanz-barra i{
  position:absolute; inset:0 auto 0 0; width:var(--avanz);
  background:linear-gradient(90deg,var(--violet),var(--teal));
  box-shadow:0 0 12px var(--alone-teal);
}
.avanz-cifra{
  font-family:var(--m); font-size:var(--t-mini); font-weight:700;
  letter-spacing:.1em; color:var(--teal); font-variant-numeric:tabular-nums;
  text-shadow:0 0 10px var(--alone-teal), 0 0 26px var(--alone-teal-largo);
  animation:respiro 2.2s ease-in-out infinite;
}
.avanz-cifra[data-pronta]{color:var(--testo); text-shadow:0 0 12px rgba(var(--bianco-rgb),.45); animation:none}

/* Sul telefono la barra tagliava il sopracciglio: a 260 pixel
   attraversava mezza faccia. Corta e sottile resta sulla parte scura
   a sinistra, dove non copre niente.
   NOTA: questo blocco sta QUI e non insieme agli altri per telefono
   piu' in alto, perche' .avanz e' definita a riga 872 e una @media
   scritta prima della regola base non arriva mai al browser. Lo ha
   trovato npm run rivedi, un minuto dopo che l'avevo sbagliato. */
@media(max-width:760px){
  .avanz{max-width:150px; gap:10px}
  .avanz-barra{height:1.5px}
}

/* La frase, sopra la foto, ha bisogno di un po' di corpo in piu'. */
.apertura .frase{text-shadow:0 2px 30px rgba(var(--fondo-rgb),.8), 0 1px 6px rgba(var(--fondo-rgb),.7)}

@media (prefers-reduced-motion:reduce){
  .scena-grezza,.scena-linea{display:none}
  .avanz-cifra{animation:none}
}

/* Nella bio il grassetto e' raro apposta: segna il MESTIERE, cioe'
   l'unica parola che deve restare in testa a chi scorre veloce. */
.bio-testo strong{color:var(--testo); font-weight:700}

/* ------------------------------------------------------------------
   L'INVITO ALLA VERSIONE DINAMICA

   Sta in fondo alla home, appena prima della frase che chiude. Non
   all'ingresso: chi arriva da un DM o da Google cerca una cosa
   precisa, e un bivio prima del contenuto lo fa tornare indietro. Chi
   arriva qui ha letto tutto, e la proposta gli interessa.

   Deve leggersi come un'offerta, non come un pulsante di sistema:
   nessun riquadro pieno, solo una linea sopra che la stacca dal
   discorso e il teal del marchio sul link.
   ------------------------------------------------------------------ */
.invito-scena{
  max-width:var(--largo, 1180px);
  margin:clamp(56px,7vw,96px) auto 0;
  padding:clamp(26px,3vw,38px) var(--fianco, 24px) 0;
  border-top:1px solid var(--linea);
  display:grid; gap:10px; justify-items:start;
}
.invito-scena-riga{
  margin:0; max-width:56ch;
  font-size:clamp(17px,1.5vw,20px); line-height:1.5;
  color:var(--testo-soft);
}
.invito-scena p{margin:0}
.invito-scena-vai{
  display:inline-flex; align-items:center; min-height:44px;
  font-family:var(--mono); font-size:15px; letter-spacing:.02em;
  color:var(--teal); text-decoration:none;
}
.invito-scena-vai:hover{text-decoration:underline; text-underline-offset:4px}
@media (max-width:640px){
  .invito-scena{margin-top:48px; padding-top:22px}
}


/* ------------------------------------------------------------------
   L'INVITO ALLA SCENA, IN PICCOLO (pagine interne).

   Prima stava SOPRA IL TITOLO e su un telefono si mangiava mezzo
   schermo: si leggeva l'invito ad andare altrove prima ancora di
   sapere dove si era finiti. Barbara, 1 ottobre 2026: "l'idea mi piace
   ma risulta un po' invasiva... un'icona che si puo' aprire", e poi
   "sposta tutto un po' giu, non so se metterlo al fondo".

   Adesso sta in fondo, come sulla home, ed e' un bottoncino: una spia
   che pulsa piano e una parola. Chi lo tocca trova la frase e il
   collegamento.

   Si apre senza una riga di JavaScript - e' un <details> - quindi
   funziona anche dove gli script non partono. E la spia si ferma per
   chi ha chiesto meno animazioni.
   ------------------------------------------------------------------ */
/* NIENTE RIGA E NIENTE VUOTO. Barbara: "c'e' troppo spazio con questa
   linea, mettilo semplicemente prima del footer". La linea separava da
   un discorso che qui sopra era gia' finito, e lo stacco grande lo
   faceva sembrare una sezione a se'. E' un bottoncino: si appoggia
   sopra il piede e basta. */
.invito-piccolo{
  max-width:var(--largo, 1180px);
  /* il margine sopra e' NEGATIVO apposta: il vuoto che lo precede non e'
     suo - sulla home e' il respiro della frase di chiusura (58px), sulle
     sezioni il fondo pagina (110 sul largo, 60 sul telefono). Invece di
     andare a toccare quei respiri, che servono ad altro, il bottoncino
     si tira su di quel tanto che basta. */
  margin:clamp(-28px,-2vw,-18px) auto clamp(14px,1.8vw,22px);
  padding:0 var(--fianco, 24px);
  text-align:center;
}
.invito-piccolo p{margin:0}
.invito-piccolo-tasto{
  display:inline-flex; align-items:center; gap:9px;
  min-height:44px; padding:0 15px 0 13px;
  border:1px solid rgba(var(--teal-rgb),.42); border-radius:999px;
  font-family:var(--mono); font-size:13px; letter-spacing:.06em;
  text-transform:uppercase; color:var(--teal-su);
  cursor:pointer; list-style:none; -webkit-user-select:none; user-select:none;
}
.invito-piccolo-tasto::-webkit-details-marker{ display:none }
.invito-piccolo-tasto::marker{ content:'' }
.invito-piccolo-tasto:hover{ border-color:rgba(var(--teal-rgb),.9) }
.invito-piccolo-tasto:focus-visible{ outline:2px solid var(--teal); outline-offset:3px }
.invito-piccolo-spia{
  width:8px; height:8px; border-radius:50%;
  background:var(--teal-su); flex:0 0 auto;
  animation:spiaInvito 2.6s ease-in-out infinite;
}
@keyframes spiaInvito{
  0%,100%{ opacity:.4;  box-shadow:0 0 0 0 rgba(var(--teal-rgb),.5) }
  50%    { opacity:1;   box-shadow:0 0 0 7px rgba(var(--teal-rgb),0) }
}
.invito-piccolo[open] .invito-piccolo-tasto{ border-color:rgba(var(--teal-rgb),.9) }
.invito-piccolo[open] .invito-piccolo-spia{ animation:none; opacity:1 }
.invito-piccolo-dentro{ display:grid; gap:10px; margin-top:14px; justify-items:center }
.invito-piccolo .invito-scena-riga{ margin-inline:auto; max-width:46ch }
@media (prefers-reduced-motion: reduce){
  .invito-piccolo-spia{ animation:none; opacity:.9 }
}
