/* 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);
  font-family:var(--s); font-size:clamp(16.5px,1.15vw,20px); line-height:1.62;
  -webkit-font-smoothing:antialiased;
  /* Il fondo non e' mai nero piatto: una sola sorgente di luce, in alto a
     sinistra, e un riverbero freddo in basso. Fissi, cosi' scorrendo la
     stanza sembra restare ferma e il contenuto muoversi dentro. */
  background-image:
    radial-gradient(125% 85% at 8% -8%, #1A1426 0%, transparent 58%),
    radial-gradient(95% 65% at 105% 108%, #071A19 0%, transparent 52%);
  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(10,214,182,.5), 0 0 36px rgba(10,214,182,.2);
  animation:respiro 3.4s ease-in-out infinite;
}
@media (prefers-reduced-motion:reduce){ .occhiello{animation:none} }
.occhiello.piccolo{margin-bottom:10px}

/* ---------- 1. apertura ---------- */
.apertura{
  position:relative; min-height:100svh;
  display:flex; flex-direction:column; justify-content:center;
  content-visibility:visible;
}
/* Sul telefono la frase non deve mangiarsi lo schermo: si fa piu'
   piccola e l'apertura si accorcia, cosi' si intuisce che sotto
   continua senza dover scorrere alla cieca. */
@media(max-width:700px){
  .apertura{min-height:74svh}
}
.frase{
  position:relative; z-index:2; margin:0; max-width:19ch;
  font-family:var(--m); font-weight:700; letter-spacing:-.025em;
  font-size:clamp(23px,5.4vw,68px); line-height:1.16; text-wrap:balance;
}
.riga{display:block}
.riga.due{color:var(--soft); margin-top:.55em; font-weight:500}
@media(min-width:900px){.frase{max-width:24ch}}

/* Il velo: la frase non arriva, si definisce. Tessere che si dissolvono
   in ordine sparso, come un'immagine che si risolve. */
.velo{
  position:absolute; inset:0; z-index:3; pointer-events:none;
  display:grid; grid-template-columns:repeat(var(--col,14),1fr);
  grid-auto-rows:1fr;
}
.velo b{
  display:block; background:var(--ink);
  animation:svela .9s var(--curva) both;
  animation-delay:calc(var(--t) * 1ms);
}
@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{
  position:absolute; left:var(--pad); bottom:36px; z-index:2; margin: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.9s forwards;
}
@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)}
.chi.rv{margin-top:clamp(40px,7vw,90px)}

/* ---------- 2. chi ---------- */
.riga-chi{
  margin:0; max-width:30ch;
  font-size:clamp(21px,2.9vw,34px); line-height:1.35; text-wrap:balance;
}
.riga-chi strong{font-weight:600; color:var(--txt)}
.chi .riga-chi{color:var(--soft)}

/* ---------- 3. la prova ---------- */
.prova-griglia{
  display:grid; gap:16px;
  grid-template-columns:repeat(auto-fit,minmax(min(100%,270px),1fr));
}
.stampa,.numeri,.partner{
  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(255,255,255,.04) inset,
             0 18px 34px -22px rgba(0,0,0,.9),
             0 3px 8px rgba(0,0,0,.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{grid-column:span 2}}
.stampa:hover,.stampa:focus-visible{transform:translateY(-3px); border-color:#33333C}
.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}

.numeri{display:flex; flex-direction:column; gap:18px; justify-content:center}
.numero{display:flex; flex-direction:column; gap:2px}
.numero b{
  font-family:var(--m); font-weight:700; font-size:clamp(26px,3.4vw,36px);
  line-height:1; color:var(--violet-lo); font-variant-numeric:tabular-nums;
}
.numero span{font-size:13px; color:var(--soft)}

.partner{display:flex; flex-direction:column; justify-content:center}
.elenco{margin:0; font-size:15px; line-height:1.75}
.elenco.secondario{color:var(--soft); font-size:13.5px; margin-top:6px}

/* ---------- 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(255,255,255,.04) inset,
             0 18px 34px -22px rgba(0,0,0,.9),
             0 3px 8px rgba(0,0,0,.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; transition:opacity .38s var(--curva);
}
.porta.viva:hover,.porta.viva:focus-visible{transform:translateY(-5px); border-color:#33333C}
.porta.viva:hover::before,.porta.viva:focus-visible::before{opacity:1}
.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);
}
.porta.spenta{opacity:.62}
.porta.spenta .porta-vai{color:var(--soft)}

/* 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 ---------- */
.bio-testo{max-width:62ch; display:flex; flex-direction:column; gap:15px}
.bio-testo p{margin:0; color:var(--soft); text-wrap:pretty}

/* ---------- 6. Instagram ---------- */
.ig-scheda{
  display:flex; align-items:center; gap:18px; padding:20px 22px;
  border-radius:16px; 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(255,255,255,.04) inset,
             0 18px 34px -22px rgba(0,0,0,.9);
  transition:transform .38s var(--curva), border-color .38s var(--curva);
}
.ig-scheda:hover,.ig-scheda:focus-visible{transform:translateY(-4px); border-color:#33333C}
.ig-anello{
  flex:none; width:58px; height:58px; border-radius:50%; padding:2.5px;
  /* Unico elemento a colori di tutta la pagina. */
  background:conic-gradient(from 200deg,#F9CE34,#EE2A7B,#6228D7,#F9CE34);
  display:grid; place-items:center;
}
.ig-dentro{
  width:100%; height:100%; border-radius:50%; background:var(--sur);
  display:grid; place-items:center;
  font-family:var(--m); font-weight:700; font-size:17px; color:var(--txt);
}
.ig-testo{display:flex; flex-direction:column; gap:3px; flex:1}
.ig-nome{font-family:var(--m); font-weight:700; font-size:15px}
.ig-riga{color:var(--soft); font-size:14px; line-height:1.55; text-wrap:pretty}
.ig-freccia{font-family:var(--m); color:var(--teal); font-size:19px; flex:none}

/* ---------- pie ---------- */
.pie{
  max-width:var(--max); margin:0 auto; padding:36px var(--pad) 56px;
  border-top:1px solid var(--rule);
}
.firma{margin:0 0 14px; color:var(--soft); font-size:14.5px; font-style:italic}
.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}
  .velo{display:none}
  .scendi{opacity:.75}
  .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(255,255,255,.05) inset,
             0 26px 50px -28px rgba(0,0,0,.95),
             0 4px 12px rgba(0,0,0,.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(8,8,10,.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;
}
.bio-chiude{
  color:var(--txt) !important; font-size:clamp(16px,1.7vw,19px);
  padding-top:6px; border-top:1px solid var(--rule); margin-top:6px !important;
}

@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)}

/* ---------- scheda Instagram, veste nuova ---------- */
.ig-dentro{overflow:hidden}
.ig-nome{display:flex; align-items:center; gap:7px}
.ig-glifo{
  width:15px; height:15px; flex:none; fill:none;
  stroke:currentColor; stroke-width:1.7; color:var(--soft);
}
.ig-go{
  flex:none; font-family:var(--m); font-size:12.5px; font-weight:500;
  color:var(--ink); background:var(--teal); padding:11px 16px; border-radius:9px;
  white-space:nowrap; align-self:center;
  box-shadow:0 1px 0 rgba(255,255,255,.22) inset,
             0 10px 22px -12px rgba(10,214,182,.6);
  transition:transform .34s var(--curva);
}
.ig-scheda:hover .ig-go,.ig-scheda:focus-visible .ig-go{transform:translateY(-2px)}
@media(max-width:620px){
  .ig-scheda{flex-wrap:wrap}
  .ig-go{width:100%; text-align:center; margin-top:4px}
}

/* ---------- 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. */
.frase{font-size:clamp(15.5px,3vw,40px) !important; max-width:30ch !important; line-height:1.24 !important}
@media(min-width:900px){.frase{max-width:20ch !important}}

.scatto{
  --p:0;
  /* AVIF se il browser lo legge, altrimenti WebP, altrimenti JPEG. */
  --scatto:image-set(
    url(/assets/foto/home.avif) type("image/avif"),
    url(/assets/foto/home.webp) type("image/webp"),
    url(/assets/foto/home.jpg)  type("image/jpeg"));
  --senza-foto:0;
  position:relative; margin:0; border-radius:18px; overflow:hidden;
  aspect-ratio:4/5; border:1px solid var(--rule); background:var(--sur);
  box-shadow:0 1px 0 rgba(255,255,255,.05) inset,
             0 34px 64px -34px rgba(0,0,0,.95),
             0 6px 16px rgba(0,0,0,.5);
}
.scatto-foto{
  position:absolute; inset:0;
  background-image:var(--scatto,none); background-size:cover; background-position:center 18%;
  /* Non e' un <img>: non si trascina, non ha un tasto destro utile,
     non compare fra le immagini della pagina. */
  pointer-events:none; user-select:none; -webkit-touch-callout:none;
}
/* Se la foto non c'e' ancora, il riquadro resta bello lo stesso. */
.scatto-foto::after{
  content:""; position:absolute; inset:0;
  background:
    radial-gradient(70% 55% at 50% 34%, rgba(107,22,207,.36), transparent 70%),
    linear-gradient(180deg, #191324, #0C0D14);
  opacity:var(--senza-foto,1);
}

/* La trama tecnica sopra: righe sottilissime, come una scansione. */
.scatto-trama{
  position:absolute; inset:0; z-index:2; pointer-events:none; opacity:.16;
  background:repeating-linear-gradient(180deg,
    rgba(255,255,255,.5) 0 1px, transparent 1px 3px);
  mix-blend-mode:overlay;
}

/* La generazione, come la fa davvero un modello: non un mosaico che
   si buca, ma RUMORE CHE SI RISOLVE. Sopra la riga di scansione
   l'immagine e' definita, sotto e' ancora grezza: sfocata, spenta,
   sporca di grana. La riga scende con lo scorrimento. */
.scatto-grezzo{
  position:absolute; inset:0; z-index:2; pointer-events:none;
  background-image:var(--scatto,none); background-size:cover; background-position:center 18%;
  filter:blur(18px) saturate(.25) brightness(.72) contrast(1.25);
  /* si vede solo SOTTO la riga: il bordo e' morbido, non un taglio */
  -webkit-mask-image:linear-gradient(90deg,
    transparent calc(var(--p,0) * 100%),
    #000 calc(var(--p,0) * 100% + 11%));
  mask-image:linear-gradient(90deg,
    transparent calc(var(--p,0) * 100%),
    #000 calc(var(--p,0) * 100% + 11%));
}
/* La grana sopra la parte non ancora risolta. */
.scatto-grezzo::after{
  content:""; position:absolute; inset:0; opacity:.5; 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: sottile, al neon, con una scia sopra.
   Si sposta con transform, non con top: non fa ricalcolare nulla. */
.scatto-linea{
  position:absolute; top:0; bottom:0; left:0; width:100%; z-index:3;
  pointer-events:none; transform:translateX(calc(var(--p,0) * 100%));
}
.scatto-linea::before{
  content:""; position:absolute; top:0; bottom:0; left:0; width:1.5px;
  background:linear-gradient(180deg,transparent,var(--teal) 16%,#fff 50%,var(--teal) 84%,transparent);
  box-shadow:0 0 16px rgba(10,214,182,.95), 0 0 40px rgba(10,214,182,.5);
}
.scatto-linea::after{
  content:""; position:absolute; top:0; bottom:0; right:100%; width:60px;
  background:linear-gradient(90deg,transparent,rgba(10,214,182,.2));
}
.scatto-linea[data-pronta]{opacity:0; transition:opacity .5s var(--curva)}

.scatto-didascalia{
  position:absolute; left:0; right:0; bottom:0; z-index:4;
  display:flex; align-items:center; justify-content:space-between; gap:10px;
  padding:13px 15px; font-family:var(--m);
  background:linear-gradient(180deg,transparent,rgba(8,8,10,.88) 64%);
}
.dida-etichetta{
  font-size:9.5px; font-weight:700; letter-spacing:.2em; text-transform:uppercase;
  color:var(--soft);
}
.dida-stato{
  font-size:9.5px; font-weight:700; letter-spacing:.16em; text-transform:uppercase;
  color:var(--teal);
}
.dida-stato[data-stato="pronta"]{color:var(--txt)}

.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(10,214,182,.45), 0 0 34px rgba(10,214,182,.18);
  animation:respiro 3.4s ease-in-out infinite;
}
.st b.inf{
  color:var(--violet-lo);
  text-shadow:0 0 14px rgba(155,92,240,.45), 0 0 34px rgba(155,92,240,.2);
  animation-delay:1.1s;
}
@keyframes respiro{
  0%,100%{opacity:1}
  46%{opacity:.72}
}
.pallino{animation:respiro 3.4s ease-in-out infinite}
.rit-tag{box-shadow:0 0 16px rgba(10,214,182,.4)}
.cursore{box-shadow:0 0 12px rgba(10,214,182,.65)}

@media (prefers-reduced-motion:reduce){
  .scatto-grezzo,.scatto-linea{display:none}
  .st b,.pallino{animation:none}
  .scendi{opacity:.75}
}

/* ---------- dove trovarla ---------- */
/* Non un bottone solo appiccicato in fondo: una griglia di canali,
   con Instagram che pesa di piu' perche' e' da li' che passa tutto. */
.social-griglia{
  display:grid; gap:14px;
  grid-template-columns:repeat(auto-fit,minmax(min(100%,168px),1fr));
}
.canale{
  position:relative; display:flex; flex-direction:column; gap:7px;
  padding:18px 18px 16px; border-radius:13px; text-decoration:none; color:var(--txt);
  background:linear-gradient(180deg,var(--sur2),var(--sur));
  border:1px solid var(--rule); overflow:hidden;
  box-shadow:0 1px 0 rgba(255,255,255,.04) inset,
             0 16px 30px -20px rgba(0,0,0,.9);
  transition:transform .34s var(--curva), border-color .34s var(--curva);
}
.canale::after{
  content:""; position:absolute; inset:auto -1px -1px -1px; height:1px;
  background:linear-gradient(90deg,transparent,var(--teal),transparent);
  opacity:0; transition:opacity .34s var(--curva);
}
.canale:hover,.canale:focus-visible{transform:translateY(-4px); border-color:#33333C}
.canale:hover::after,.canale:focus-visible::after{opacity:1}

.canale-alto{display:flex; align-items:center; gap:9px}
.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:hover .glifo{color:var(--teal)}
.canale-nome{
  font-family:var(--m); font-size:11px; font-weight:700;
  letter-spacing:.16em; text-transform:uppercase; color:var(--soft);
}
.canale-punto{
  width:5px; height:5px; border-radius:50%; background:var(--teal); margin-left:auto;
  box-shadow:0 0 10px rgba(10,214,182,.75);
  animation:respiro 3.4s ease-in-out infinite;
}
.canale-tag{font-family:var(--m); font-size:14px; font-weight:500; letter-spacing:-.01em}
.canale-riga{color:var(--soft); font-size:14px; line-height:1.55; text-wrap:pretty}

.canale.primario{
  grid-column:1/-1; gap:9px; padding:22px;
  border-color:#2C2C36;
}
@media(min-width:820px){
  .social-griglia{grid-template-columns:repeat(3,1fr)}
  .canale.primario{grid-column:1/-1}
}
.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(255,255,255,.22) inset,
             0 10px 22px -12px rgba(10,214,182,.65);
  transition:transform .34s var(--curva);
}
.canale.primario:hover .canale-vai{transform:translateY(-2px)}

@media (prefers-reduced-motion:reduce){
  .canale-punto{animation:none}
}

/* ---------- indicatore di generazione: neon, non parole ---------- */
.scatto-didascalia{--avanz:0%}
.dida-barra{
  position:relative; flex:1; height:2px; border-radius:2px;
  background:rgba(255,255,255,.12); overflow:hidden;
}
.dida-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 rgba(10,214,182,.8);
}
.dida-cifra{
  font-family:var(--m); font-size:11px; font-weight:700;
  letter-spacing:.1em; color:var(--teal); font-variant-numeric:tabular-nums;
  text-shadow:0 0 10px rgba(10,214,182,.7), 0 0 26px rgba(10,214,182,.3);
  animation:respiro 2.2s ease-in-out infinite;
}
.dida-cifra[data-pronta]{color:var(--txt); text-shadow:0 0 12px rgba(255,255,255,.45); animation:none}

/* Finche' la foto non c'e', il riquadro lo dice invece di fingere. */
.scatto-foto::before{
  content:"foto in arrivo"; position:absolute; inset:0; z-index:1;
  display:grid; place-items:center; opacity:var(--senza-foto,1);
  font-family:var(--m); font-size:10.5px; letter-spacing:.24em;
  text-transform:uppercase; color:rgba(244,244,242,.34);
}

/* ---------- chi: due righe, non un paragrafo ---------- */
/* Subito dopo la citazione non regge un blocco di testo: qui basta
   il nome e il fatto che colpisce. Il resto sta nella bio, in fondo,
   per chi ha voglia di arrivarci. */
.chi{display:flex; flex-direction:column; gap:14px}
.chi-nome{
  margin:0; font-family:var(--m); font-size:12px; font-weight:700;
  letter-spacing:.14em; text-transform:uppercase; color:var(--txt);
  display:flex; flex-wrap:wrap; align-items:baseline; gap:12px;
}
.chi-nome span{
  font-weight:500; letter-spacing:.14em; color:var(--soft);
  padding-left:12px; border-left:1px solid var(--rule);
}
.chi .riga-chi{
  font-size:clamp(18px,2.7vw,31px); line-height:1.34; max-width:24ch;
}

/* ---------- 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(255,255,255,.04) inset,
             0 18px 34px -22px rgba(0,0,0,.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(10,214,182,.4);
}
.primato-riga{color:var(--soft); font-size:14px; line-height:1.55; text-wrap:pretty}

/* ---------- identita': una riga sotto lo scatto, non un blocco ---------- */
.identita{
  margin:clamp(18px,3vw,26px) 0 0; display:flex; flex-wrap:wrap;
  align-items:baseline; gap:12px; font-family:var(--m);
}
.id-nome{font-size:12.5px; font-weight:700; letter-spacing:.13em; text-transform:uppercase}
.id-ruolo{
  font-size:11px; font-weight:500; letter-spacing:.16em; text-transform:uppercase;
  color:var(--teal); padding-left:12px; border-left:1px solid var(--rule);
  text-shadow:0 0 12px rgba(10,214,182,.35);
}

/* ---------- l'intento, fra le prove ---------- */
.intento{
  grid-column:1/-1; padding:22px; border-radius:14px;
  background:linear-gradient(180deg,var(--sur2),var(--sur));
  border:1px solid var(--rule);
  box-shadow:0 1px 0 rgba(255,255,255,.04) inset,
             0 18px 34px -22px rgba(0,0,0,.9);
}
.intento-riga{
  font-size:clamp(17px,2.2vw,23px); line-height:1.44; text-wrap:pretty;
  color:var(--soft); display:block; max-width:52ch;
}
.intento-riga strong{color:var(--txt); font-weight:600}

/* ---------- 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(107,22,207,.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(40px,5.5vw,72px)}
.prova .occhiello,.porte .occhiello,.bio .occhiello,.social .occhiello{margin-bottom:20px}

/* ---------- cosa fa: una riga sola ---------- */
.posizione-riga{
  margin:0; max-width:22ch;
  font-family:var(--m); font-weight:500; letter-spacing:-.015em;
  font-size:clamp(20px,3.4vw,38px); line-height:1.26;
  color:var(--soft); text-wrap:balance;
}
.posizione-riga strong{color:var(--txt); 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(255,255,255,.04) inset,
             0 18px 34px -22px rgba(0,0,0,.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:152svh;
  display:block; padding-top:0;
}
.apertura-ferma{
  position:sticky; top:0;
  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. */
  .apertura{min-height:132svh}
  .apertura-ferma{
    justify-content:flex-start;
    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) !important}
}
/* 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}

/* ---------- la chiusura della bio ---------- */
/* "Dimostrami che sai usarli" e' una sfida, non una conclusione:
   sta nel turchese dell'interazione e si accende come gli altri
   dettagli al neon. */
.bio-chiude{
  color:var(--teal) !important;
  font-family:var(--m); font-weight:700; letter-spacing:-.01em;
  font-size:clamp(17px,2.2vw,24px) !important; line-height:1.38;
  text-shadow:0 0 14px rgba(10,214,182,.5), 0 0 38px rgba(10,214,182,.22);
  animation:respiro 3.4s ease-in-out infinite;
  animation-delay:.6s;
}
@media (prefers-reduced-motion:reduce){ .bio-chiude{animation:none} }

/* ============================================================
   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],.canale[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%),
      #1A1426 0%, transparent 58%),
    radial-gradient(95% 65% at calc(105% - var(--luce,0) * 30%) calc(108% - var(--luce,0) * 22%),
      #071A19 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(10,214,182,.45), 0 0 44px rgba(10,214,182,.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);
  }
}
