/* ==========================================================================
   Yunivo — La voce fa il giro
   --------------------------------------------------------------------------
   Il foglio e' scritto mobile-first: le regole senza media query descrivono il
   telefono, e i breakpoint aggiungono spazio man mano che lo schermo cresce.

   Due modalita' convivono, decise dall'attributo data-film sull'elemento <html>:

     data-film="static"  (predefinito nel markup)
        Poster fissi + testi impilati. E' cio' che si vede senza JavaScript,
        senza supporto AVIF, con "riduci animazioni" o con il risparmio dati.
        Deve essere una pagina completa e leggibile, non un ripiego.

     data-film="scroll"  (impostato da app.js quando puo' davvero funzionare)
        Il film legato allo scorrimento, in tre atti.

   Scrivere la versione statica come predefinita, e non come eccezione, e' il
   motivo per cui la pagina non e' mai vuota mentre il film carica.
   ========================================================================== */

/* --------------------------------------------------------------------------
   1. Token
   -------------------------------------------------------------------------- */
:root {
  color-scheme: dark;

  --ink: #010001;
  --paper: #f2eee5;
  --amber: #ffab18;
  /* Ambra scurita: sul fondo avorio quella chiara sta a 4,1:1, sotto il minimo
     di 4,5:1 richiesto per il testo piccolo. */
  --amber-on-paper: #8a5a0c;

  /* Testo su fondo scuro. Nessun valore scende sotto 5:1 di contrasto. */
  --text: #f2eee5;
  --text-muted: rgba(242, 238, 229, 0.74);
  --text-dim: rgba(242, 238, 229, 0.62);
  --text-faint: rgba(242, 238, 229, 0.54);

  /* Sopra il film si usa bianco puro, non avorio: il crema si legge come
     sporco quando passa sopra un fotogramma luminoso. */
  --on-film: #fff;

  --ink-muted: rgba(1, 0, 1, 0.66);

  --line: rgba(242, 238, 229, 0.16);
  --line-strong: rgba(242, 238, 229, 0.28);

  --header-height: 50px;
  --gutter: 22px;
  /* La misura massima del contenuto. Il film resta a tutto schermo — e' una
     ripresa, non un blocco di testo — ma sotto di lui la pagina si ferma qui e
     si centra: senza un tetto, su un monitor da 2560px le colonne di una stessa
     sezione si allontanano fra loro finche' non sembrano piu' imparentate,
     mentre i titoli e i paragrafi hanno gia' smesso di crescere da un pezzo.
     E' lo stesso valore su cui era gia' tarata la fila delle schermate app. */
  --shell: 1240px;
  --ease: cubic-bezier(0.16, 1, 0.3, 1);

  /* Scala tipografica fluida, pensata da 360px in su. */
  --type-hero: clamp(2.9rem, 13vw, 10.5rem);
  --type-title: clamp(2.3rem, 10vw, 7.2rem);
  --type-section: clamp(2.2rem, 8.6vw, 7rem);
  --type-sub: clamp(1.6rem, 5.2vw, 3.4rem);
  --type-lead: clamp(1.125rem, 2.4vw, 2rem);
  --type-body: clamp(0.95rem, 1.15vw, 1.0625rem);

  /* Quanti pixel di scorrimento vale UN fotogramma. E' questo — non il numero
     di fotogrammi — che decide quanto scorre fluido il film: l'altezza di ogni
     atto si calcola da qui e dalla sua lunghezza in fotogrammi. */
  --film-step: 5px;
}

@media (min-width: 700px) {
  :root {
    --header-height: 48px;
    --gutter: clamp(32px, 4.5vw, 80px);
    --film-step: 7px;
  }
}

@media (min-width: 1200px) {
  :root {
    --header-height: 48px;
    --film-step: 9px;
  }
}

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

html {
  background: var(--ink);
  /* Niente scorrimento morbido: un'ancora che attraversa un atto percorrerebbe
     migliaia di pixel di animazione prima di arrivare a destinazione. */
  scroll-behavior: auto;
  -webkit-text-size-adjust: 100%;
}

body {
  margin: 0;
  overflow-x: hidden;
  background: var(--ink);
  color: var(--text);
  font-family: "Manrope", ui-sans-serif, system-ui, -apple-system, "Segoe UI", sans-serif;
  font-size: 16px;
  line-height: 1.6;
  -webkit-font-smoothing: antialiased;
}

body.is-loading {
  overflow: hidden;
}

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

a {
  color: inherit;
  text-decoration: none;
}

::selection {
  background: var(--amber);
  color: var(--ink);
}

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

.skip-link {
  position: fixed;
  z-index: 2000;
  top: 10px;
  left: 10px;
  padding: 12px 18px;
  border-radius: 999px;
  background: var(--amber);
  color: var(--ink);
  font-size: 14px;
  font-weight: 700;
  transform: translateY(-160%);
  transition: transform 0.2s var(--ease);
}

.skip-link:focus-visible {
  transform: translateY(0);
}

/* --------------------------------------------------------------------------
   2. Elementi tipografici condivisi
   -------------------------------------------------------------------------- */
.eyebrow,
.section-kicker {
  margin: 0 0 16px;
  color: var(--amber);
  font-size: clamp(0.625rem, 1.5vw, 0.6875rem);
  font-weight: 700;
  letter-spacing: 0.22em;
  line-height: 1.4;
  text-transform: uppercase;
}

.display {
  margin: 0;
  font-family: "Instrument Serif", Georgia, serif;
  font-weight: 400;
  letter-spacing: -0.035em;
  line-height: 0.92;
  text-wrap: balance;
}

.display em {
  color: var(--amber);
  font-style: italic;
}

/* Il tetto di --shell si applica come margine interno, non come max-width sul
   blocco di testo: cosi' il fondo della sezione e i filetti di separazione
   restano a tutto schermo (la fascia avorio delle schermate app perderebbe
   tutto il suo peso ridotta a un rettangolo centrato) e a fermarsi e' solo il
   contenuto. Sotto i ~1400px il conto e' negativo e vince il margine normale:
   nulla cambia rispetto a prima su portatili e telefoni. */
.content-section {
  padding-right: max(var(--gutter), (100% - var(--shell)) / 2);
  padding-left: max(var(--gutter), (100% - var(--shell)) / 2);
  scroll-margin-top: var(--header-height);
}

/* --------------------------------------------------------------------------
   3. Movimento d'arrivo delle sezioni
   -------------------------------------------------------------------------- */
/* Le sezioni salgono e si accendono quando entrano in campo, sfalsate di ~90ms
   fra i figli. Senza, la pagina sotto il film si legge come una pila di
   blocchetti fermi dopo una ripresa cinematografica. */
[data-enter] .wrap > *,
[data-enter] > .journey__list > li,
[data-enter] > .phones {
  opacity: 0;
  transform: translateY(26px);
  transition: opacity 0.9s var(--ease), transform 0.9s var(--ease);
}

[data-enter].is-in .wrap > *,
[data-enter].is-in > .journey__list > li,
[data-enter].is-in > .phones {
  opacity: 1;
  transform: none;
}

[data-enter].is-in .wrap > *:nth-child(2),
[data-enter].is-in > .journey__list > li:nth-child(2) {
  transition-delay: 0.09s;
}

[data-enter].is-in .wrap > *:nth-child(3),
[data-enter].is-in > .journey__list > li:nth-child(3) {
  transition-delay: 0.18s;
}

[data-enter].is-in .wrap > *:nth-child(4),
[data-enter].is-in > .journey__list > li:nth-child(4) {
  transition-delay: 0.27s;
}

/* --------------------------------------------------------------------------
   4. Schermata di caricamento
   -------------------------------------------------------------------------- */
.film-loader {
  display: none;
}

[data-film="scroll"] .film-loader {
  position: fixed;
  z-index: 1000;
  inset: 0;
  display: grid;
  align-content: center;
  justify-items: center;
  padding: var(--gutter);
  background: var(--ink);
  transition: opacity 0.6s var(--ease), visibility 0.6s;
}

.film-loader.is-hidden {
  opacity: 0;
  visibility: hidden;
  pointer-events: none;
}

.film-loader__mark img {
  width: 68px;
  height: auto;
}

.film-loader__label {
  margin: 26px 0 16px;
  color: var(--text-muted);
  font-size: 11px;
  font-weight: 600;
  letter-spacing: 0.16em;
  text-align: center;
  text-transform: uppercase;
}

.film-loader__track {
  width: min(220px, 60vw);
  height: 2px;
  overflow: hidden;
  border-radius: 2px;
  background: rgba(255, 255, 255, 0.18);
}

.film-loader__track span {
  display: block;
  width: 100%;
  height: 100%;
  background: var(--amber);
  transform: scaleX(0);
  transform-origin: left;
  transition: transform 0.18s linear;
}

.film-loader__count {
  margin: 12px 0 0;
  color: var(--text-faint);
  font-size: 11px;
  font-variant-numeric: tabular-nums;
}

/* --------------------------------------------------------------------------
   5. Header
   -------------------------------------------------------------------------- */
.site-header {
  position: fixed;
  z-index: 100;
  top: 0;
  left: 0;
  display: flex;
  width: 100%;
  height: var(--header-height);
  align-items: center;
  padding: 0 var(--gutter);
  color: var(--on-film);
  transition: color 0.3s ease, background 0.3s ease;
}

/* Un film passa da alte luci a quasi-nero in uno scroll, e il chrome non deve
   mai poggiare su girato nudo: velo morbido sotto l'header, piu' ombra sul
   testo. Costa niente e toglie di mezzo un'intera classe di problemi. */
.site-header::before {
  position: absolute;
  z-index: -1;
  inset: 0 0 auto 0;
  height: 190%;
  background: linear-gradient(to bottom, rgba(2, 1, 0, 0.62), rgba(2, 1, 0, 0));
  content: "";
  pointer-events: none;
  transition: opacity 0.3s ease;
}

.site-header.is-solid {
  background: rgba(1, 0, 1, 0.82);
  backdrop-filter: blur(18px);
}

.site-header.is-solid::before {
  opacity: 0;
}

/* Attivata da app.js solo se l'immagine sotto l'header e' davvero chiara. */
.site-header.on-light:not(.is-solid) {
  color: #16120d;
}

.site-header.on-light:not(.is-solid)::before {
  background: linear-gradient(to bottom, rgba(255, 250, 240, 0.55), rgba(255, 250, 240, 0));
}

.brand {
  display: inline-flex;
  align-items: center;
  gap: 10px;
  text-shadow: 0 1px 18px rgba(0, 0, 0, 0.5);
}

.brand img {
  width: 30px;
  height: auto;
  filter: drop-shadow(0 1px 10px rgba(0, 0, 0, 0.5));
}

.brand span {
  font-family: "Bagel Fat One", ui-sans-serif, system-ui, sans-serif;
  font-size: clamp(1.25rem, 4vw, 1.5rem);
  letter-spacing: -0.04em;
}

/* --------------------------------------------------------------------------
   6. Film — struttura comune
   -------------------------------------------------------------------------- */
.film {
  position: relative;
  background: var(--ink);
}

.film__viewport {
  position: relative;
  overflow: hidden;
  background: var(--ink);
}

/* <picture> serve solo a scegliere il file giusto: non deve creare una scatola
   fra il riquadro e l'immagine, altrimenti object-fit non ha piu' un'altezza
   su cui lavorare. */
.film__viewport picture {
  display: contents;
}

.film__canvas,
.film__poster {
  width: 100%;
  height: 100%;
  object-fit: cover;
}

.film__shade {
  position: absolute;
  inset: 0;
  background: linear-gradient(
    180deg,
    rgba(0, 0, 0, 0.34),
    transparent 24%,
    transparent 66%,
    rgba(0, 0, 0, 0.5)
  );
  pointer-events: none;
}

.film-copy h1,
.film-copy h2 {
  margin: 0;
  font-family: "Instrument Serif", Georgia, serif;
  font-weight: 400;
  letter-spacing: -0.04em;
  line-height: 0.92;
  text-wrap: balance;
}

.film-copy h1 {
  font-size: var(--type-hero);
}

.film-copy h2 {
  font-size: var(--type-title);
}

.film-copy em {
  color: var(--amber);
  font-style: italic;
}

.film__intro-note {
  max-width: 34ch;
  margin: 20px 0 0;
  color: var(--text-muted);
  font-size: var(--type-body);
  line-height: 1.6;
}

/* --------------------------------------------------------------------------
   7. Film — modalita' statica (predefinita)
   -------------------------------------------------------------------------- */
[data-film="static"] .film__stage {
  display: block;
}

[data-film="static"] .film__viewport {
  aspect-ratio: 4 / 5;
}

[data-film="static"] .film__canvas,
[data-film="static"] .film__hud,
[data-film="static"] .film__handoff,
[data-film="static"] .film__signature {
  display: none;
}

[data-film="static"] .film__copy-layer {
  display: grid;
  gap: clamp(48px, 9vw, 96px);
  padding: clamp(56px, 12vw, 130px) var(--gutter) clamp(40px, 8vw, 90px);
}

/* Nessun max-width sui blocchi: le interruzioni di riga dei titoli sono gia'
   nel markup (<br>), e un limite in "ch" qui verrebbe calcolato sul corpo del
   testo (16px) mentre dentro c'e' un titolo da 168px — il risultato era una
   colonna da 215px con le parole spezzate. La misura di lettura serve solo
   alla nota di testo, che infatti ce l'ha. */
[data-film="static"] .film-copy {
  max-width: none;
}

[data-film="static"] .film__line--right {
  justify-self: end;
  text-align: right;
}

@media (min-width: 700px) {
  [data-film="static"] .film__viewport {
    aspect-ratio: 16 / 9;
  }

  [data-film="static"] .film__copy-layer {
    gap: clamp(70px, 8vw, 130px);
  }
}

/* --------------------------------------------------------------------------
   8. Film — modalita' scorrimento
   -------------------------------------------------------------------------- */
/* --act-span (nell'HTML, per atto) e' la corsa dell'atto misurata in unita' di
   --film-step. Nei primi due atti vale quanto la loro lunghezza in fotogrammi,
   cosi' il film scorre alla stessa velocita'; il terzo ne ha di piu' del dovuto
   di proposito, perche' il finale — gli archi che si formano e il marchio che
   ci atterra sopra — ha bisogno di respirare invece di passare in un colpo di
   rotella. Cambiare la fluidita' di tutto il film e' un numero solo. */
[data-film="scroll"] .film {
  height: calc(var(--act-span) * var(--film-step) + 100vh);
  height: calc(var(--act-span) * var(--film-step) + 100svh);
}

[data-film="scroll"] .film__poster {
  display: none;
}

[data-film="scroll"] .film__stage {
  position: sticky;
  top: 0;
  display: grid;
  overflow: hidden;
  /* svh e non vh: su iOS e Android la barra degli indirizzi che compare e
     scompare cambierebbe l'altezza del palco a meta' scorrimento. */
  height: 100vh;
  height: 100svh;
  /* respiro sotto l'header | film (prende cio' che resta) | testi | indicatori */
  grid-template-rows: var(--header-height) minmax(0, 1fr) auto auto;
}

/* Le righe vanno assegnate esplicitamente: lasciando fare al posizionamento
   automatico, il film finirebbe nella prima riga — quella che esiste solo per
   lasciare respiro sotto l'header — e sborderebbe sui testi.
   Il film prende tutto lo spazio che avanza invece di avere un'altezza fissa
   4:5: su un telefono corto (640-667px) un riquadro rigido non lascerebbe
   abbastanza spazio ai testi. Il ritaglio residuo se lo prende "cover". */
[data-film="scroll"] .film__viewport {
  width: 100%;
  height: 100%;
  aspect-ratio: auto;
  grid-row: 2;
}

[data-film="scroll"] .film__copy-layer {
  position: relative;
  min-height: clamp(148px, 26svh, 240px);
  grid-row: 3;
}

[data-film="scroll"] .film__hud {
  grid-row: 4;
}

[data-film="scroll"] .film-copy {
  --copy-opacity: 0;
  --copy-shift: 22px;
  position: absolute;
  z-index: 3;
  display: flex;
  flex-direction: column;
  justify-content: center;
  padding: 10px var(--gutter);
  inset: 0;
  color: var(--on-film);
  opacity: var(--copy-opacity);
  transform: translate3d(0, var(--copy-shift), 0);
  will-change: opacity, transform;
}

/* Su schermi bassi la nota sotto il titolo e' la prima cosa a cedere il posto. */
@media (max-height: 700px) {
  [data-film="scroll"] .film__intro-note {
    display: none;
  }
}

/* Dalla dimensione tablet in su il film torna a tutto schermo e i testi gli si
   sovrappongono. Da qui in poi serve un velo sotto ogni testo: il film passa
   sopra la carta avorio e i medaglioni chiari, e un serif bianco su avorio
   sparisce. */
@media (min-width: 700px) {
  [data-film="scroll"] .film__stage {
    grid-template-rows: 1fr;
  }

  [data-film="scroll"] .film__viewport,
  [data-film="scroll"] .film__copy-layer {
    grid-row: 1;
    grid-column: 1;
  }

  [data-film="scroll"] .film__viewport {
    aspect-ratio: auto;
    height: 100%;
  }

  [data-film="scroll"] .film__copy-layer {
    min-height: 0;
    padding: 0;
  }

  /* Da qui in su gli indicatori non occupano una riga propria: si sovrappongono
     al film, in basso. Lasciarli nel flusso della griglia accorcerebbe il film
     dell'altezza degli indicatori stessi. */
  [data-film="scroll"] .film__hud {
    position: absolute;
    right: 0;
    bottom: 0;
    left: 0;
  }

  [data-film="scroll"] .film-copy {
    display: block;
    padding: 0;
    inset: auto;
    width: min(52vw, 760px);
  }

  [data-film="scroll"] .film-copy::before {
    position: absolute;
    z-index: -1;
    inset: -70% -22% -70% -16%;
    background: radial-gradient(
      58% 56% at 24% 50%,
      rgba(5, 3, 1, 0.72),
      rgba(5, 3, 1, 0.4) 46%,
      transparent 78%
    );
    content: "";
    pointer-events: none;
  }

  [data-film="scroll"] .film__line--right::before {
    background: radial-gradient(
      58% 56% at 76% 50%,
      rgba(5, 3, 1, 0.72),
      rgba(5, 3, 1, 0.4) 46%,
      transparent 78%
    );
  }

  [data-film="scroll"] .film__final::before {
    background: radial-gradient(
      54% 60% at 50% 50%,
      rgba(5, 3, 1, 0.74),
      rgba(5, 3, 1, 0.42) 48%,
      transparent 78%
    );
  }

  [data-film="scroll"] .film__intro {
    top: 27%;
    left: var(--gutter);
  }

  [data-film="scroll"] .film__line {
    top: 50%;
    transform: translate3d(0, calc(-50% + var(--copy-shift)), 0);
  }

  [data-film="scroll"] .film__line--left {
    left: var(--gutter);
  }

  [data-film="scroll"] .film__line--right {
    right: var(--gutter);
    text-align: right;
  }

  [data-film="scroll"] .film__final {
    top: 50%;
    left: 50%;
    width: min(80vw, 1100px);
    text-align: center;
    transform: translate3d(-50%, calc(-50% + var(--copy-shift)), 0);
  }

  [data-film="scroll"] .film__shade {
    background:
      linear-gradient(90deg, rgba(0, 0, 0, 0.36), transparent 40%, transparent 62%, rgba(0, 0, 0, 0.24)),
      linear-gradient(180deg, rgba(0, 0, 0, 0.24), transparent 26%, transparent 68%, rgba(0, 0, 0, 0.42));
  }
}

/* Sul telefono i testi stanno nel nero sotto il film: niente velo, servirebbe
   solo a scurire il nero. */
[data-film="scroll"] .film__line--right {
  text-align: right;
}

/* La firma: il marchio arriva sopra i due archi che il filo disegna da solo
   nell'ultimo fotogramma. Le percentuali sono la posizione di quegli archi
   dentro l'inquadratura, misurate sul fotogramma finale. */
/* Posizione e larghezza le imposta app.js in pixel, calcolate sul fotogramma
   davvero disegnato (vedi ARCHES): qui restano solo le cose che non dipendono
   dall'inquadratura. */
.film__signature {
  --signature-opacity: 0;
  position: absolute;
  /* sopra il velo nero: quando la stanza si dissolve, il marchio resta */
  z-index: 4;
  top: 57%;
  left: 50%;
  width: 20%;
  opacity: var(--signature-opacity);
  transform: translate(-50%, -50%);
  pointer-events: none;
}

.film__signature img {
  width: 100%;
  height: auto;
  filter: drop-shadow(0 0 30px rgba(255, 171, 24, 0.5));
}

/* Indicatori (capitolo, avanzamento, invito a scorrere) */
.film__hud {
  position: relative;
  z-index: 4;
  display: flex;
  align-items: center;
  justify-content: space-between;
  gap: 16px;
  padding: 0 var(--gutter) max(18px, env(safe-area-inset-bottom));
  color: var(--on-film);
}

.film__chapter {
  display: flex;
  gap: 10px;
  align-items: baseline;
  margin: 0;
  font-size: 10px;
  font-weight: 600;
  letter-spacing: 0.16em;
  opacity: 0.72;
  text-shadow: 0 1px 14px rgba(0, 0, 0, 0.6);
  text-transform: uppercase;
}

.film__chapter-index {
  color: var(--amber);
  opacity: 1;
}

.film__meter {
  display: flex;
  min-width: 0;
  flex: 1;
  align-items: center;
  justify-content: flex-end;
  gap: 12px;
}

.film__hint {
  margin: 0;
  font-size: 10px;
  letter-spacing: 0.14em;
  opacity: 0.62;
  text-shadow: 0 1px 14px rgba(0, 0, 0, 0.6);
  text-transform: uppercase;
  transition: opacity 0.4s ease;
  white-space: nowrap;
}

.film__progress {
  width: min(34vw, 420px);
  height: 2px;
  overflow: hidden;
  border-radius: 2px;
  background: rgba(255, 255, 255, 0.26);
}

.film__progress span {
  display: block;
  width: 100%;
  height: 100%;
  background: var(--amber);
  transform: scaleX(0);
  transform-origin: left;
}

/* L'invito a scorrere serve soprattutto sul telefono, dove il film sta dentro
   un riquadro e non e' ovvio che sia lo scorrimento a muoverlo. Ma la frase
   intera non ci sta accanto a capitolo e barra: sotto i 520px resta "Scorri". */
.film__hint--short {
  display: none;
}

@media (max-width: 520px) {
  .film__hint--long {
    display: none;
  }

  .film__hint--short {
    display: inline;
  }

  .film__progress {
    width: min(28vw, 140px);
  }
}

/* Velo nero che cuce ogni atto con il contenuto che segue. Sta dentro il
   riquadro dell'immagine, non sopra tutto il palco: cosi' l'immagine sfuma ma
   il testo dell'atto resta leggibile fino all'ultimo. */
[data-film="scroll"] .film__handoff {
  position: absolute;
  z-index: 3;
  inset: 0;
  background: var(--ink);
  opacity: 0;
  pointer-events: none;
}

/* --------------------------------------------------------------------------
   9. Contenuto
   -------------------------------------------------------------------------- */
/* Su telefono il contenuto decide l'altezza della sezione: imporre quasi una
   schermata intera anche ai blocchi brevi sommava grandi vuoti neri fra due
   sezioni consecutive. Il ritmo piu' cinematografico torna dai tablet in su. */
.page-content {
  position: relative;
  z-index: 7;
  background: var(--ink);
}

/* La prima sezione dopo un atto non porta il filetto in alto: cadrebbe
   esattamente sulla cucitura col film e si vedrebbe come una riga arbitraria in
   mezzo al nero. */
.page-content > section:first-child {
  border-top: 0;
}

.page-content > section {
  display: flex;
  flex-direction: column;
  justify-content: center;
  padding-top: clamp(56px, 7.5vh, 64px);
  padding-top: clamp(56px, 7.5svh, 64px);
  padding-bottom: clamp(56px, 7.5vh, 64px);
  padding-bottom: clamp(56px, 7.5svh, 64px);
}

@media (min-width: 700px) {
  .page-content > section {
    min-height: min(92vh, 900px);
    padding-top: clamp(90px, 14vh, 190px);
    padding-bottom: clamp(90px, 14vh, 190px);
  }
}

.manifesto__title {
  font-size: var(--type-section);
}

.manifesto__body {
  display: grid;
  gap: clamp(32px, 5vw, 64px);
  margin-top: clamp(40px, 8vh, 120px);
}

.manifesto__body > p:first-child {
  max-width: 26ch;
  margin: 0;
  font-size: var(--type-lead);
  letter-spacing: -0.02em;
  line-height: 1.45;
}

.manifesto__aside {
  margin: 0;
  color: var(--text-dim);
  font-size: 13px;
  line-height: 2;
}

/* Il rientro e' in percentuale del contenuto, non della finestra: espresso in
   vw continuava a crescere anche dopo che la sezione si era fermata a --shell,
   e sopra i 1500px spingeva la nota laterale cosi' lontano dal paragrafo da
   farla sembrare un elemento a se'. Il 20% e' la stessa proporzione che 18vw
   aveva su un portatile da 1440px, dove il blocco era gia' giusto. */
@media (min-width: 900px) {
  .manifesto__body {
    grid-template-columns: minmax(0, 1.4fr) minmax(0, 0.6fr);
    gap: clamp(40px, 6vw, 88px);
    padding-left: 20%;
  }

  .manifesto__body > p:first-child {
    max-width: 34ch;
  }
}

/* Come funziona */
.journey {
  border-top: 1px solid var(--line);
}

/* Il contrasto di scala: il titolo domina, l'elenco fa da voce bassa. Se ogni
   titolo e' grande come gli altri la pagina non ha ritmo. */
.journey__title {
  font-size: var(--type-section);
}

.section-heading {
  margin-bottom: clamp(40px, 7vh, 90px);
}

.journey__list {
  display: grid;
  margin: 0;
  padding: 0;
  gap: 0;
  list-style: none;
}

.journey__list li {
  display: grid;
  padding: clamp(24px, 3.4vh, 40px) 0;
  gap: 6px 20px;
  border-top: 1px solid var(--line);
  grid-template-columns: auto 1fr;
}

.journey__list li:last-child {
  border-bottom: 1px solid var(--line);
}

.journey__step {
  padding-top: 0.9em;
  color: var(--amber);
  font-size: 11px;
  font-weight: 700;
  grid-row: span 2;
  letter-spacing: 0.18em;
}

.journey__list h3 {
  margin: 0;
  font-family: "Instrument Serif", Georgia, serif;
  font-size: var(--type-sub);
  font-weight: 400;
  letter-spacing: -0.03em;
  line-height: 1.05;
}

.journey__list p {
  max-width: 46ch;
  margin: 0;
  color: var(--text-dim);
  font-size: var(--type-body);
  line-height: 1.7;
}

@media (min-width: 900px) {
  /* La stessa sezione riceve display:flex da .page-content > section: questo
     selettore deve essere almeno altrettanto specifico, altrimenti la griglia
     non nasce e il titolo sticky finisce sopra all'elenco a tutta larghezza. */
  .page-content > .journey {
    display: grid;
    grid-template-columns: minmax(0, 0.82fr) minmax(0, 1.18fr);
    gap: clamp(32px, 6vw, 88px);
  }

  /* Deve restare circoscritta a .journey: e' li' che il titolo accompagna
     l'elenco restando fermo. Applicata a tutte le .section-heading colpiva
     anche quella centrata delle schermate, dove align-self:start la faceva
     rimpicciolire al proprio contenuto invece di occupare la colonna. */
  .journey .section-heading {
    position: sticky;
    top: calc(var(--header-height) + 8vh);
    margin-bottom: 0;
    align-self: start;
  }

  .journey__list li {
    align-content: center;
    min-height: 30vh;
    gap: clamp(16px, 2vw, 30px);
    grid-template-columns: 60px minmax(0, 0.8fr) minmax(0, 1fr);
  }

  .journey__step {
    padding-top: 0.7em;
    grid-row: auto;
  }
}

/* Schermate dell'app */
.product-showcase {
  overflow: hidden;
  background: var(--paper);
  color: var(--ink);
}

.section-heading--center {
  position: static;
  margin-bottom: 0;
  text-align: center;
}

.section-heading--center .section-kicker {
  color: var(--amber-on-paper);
}

.showcase__title {
  font-size: var(--type-section);
}

.showcase__note {
  max-width: 40ch;
  margin: 24px auto 0;
  color: var(--ink-muted);
  font-size: var(--type-body);
}

/* Sul telefono: una fila che scorre con aggancio, il gesto nativo per sfogliare
   quattro schermate. */
.phones {
  display: grid;
  overflow-x: auto;
  margin-top: clamp(48px, 8vh, 110px);
  margin-inline: calc(var(--gutter) * -1);
  padding-inline: var(--gutter);
  gap: 20px;
  grid-auto-columns: 74vw;
  grid-auto-flow: column;
  scroll-padding-inline: var(--gutter);
  scroll-snap-type: x mandatory;
  /* Senza questo, arrivando in fondo alla fila lo scorrimento "sfonda" e su
     alcuni telefoni fa scattare il gesto di ritorno alla pagina precedente. */
  overscroll-behavior-x: contain;
  scrollbar-width: none;
}

.phones::-webkit-scrollbar {
  display: none;
}

.phone {
  margin: 0;
  scroll-snap-align: center;
}

.phone__shell {
  overflow: hidden;
  padding: 6px;
  border: 1px solid rgba(0, 0, 0, 0.16);
  border-radius: 34px;
  background: #101010;
  box-shadow: 0 26px 60px rgba(37, 25, 6, 0.22);
}

.phone__shell picture {
  display: contents;
}

.phone__shell img {
  width: 100%;
  height: auto;
  border-radius: 28px;
}

.phone figcaption {
  margin-top: 16px;
  color: var(--ink-muted);
  font-size: 11px;
  font-weight: 700;
  letter-spacing: 0.08em;
  text-align: center;
  text-transform: uppercase;
}

@media (min-width: 700px) {
  .phones {
    justify-content: center;
    grid-auto-columns: min(300px, 34vw);
  }
}

/* Da desktop le quattro schermate stanno una accanto all'altra, sfalsate in
   verticale. La versione a ventaglio sovrapposto era piu' scenografica ma
   copriva tre schermate su quattro e faceva collidere le didascalie: queste
   immagini sono l'argomento di vendita piu' forte della pagina, nasconderle
   per una posa e' un cattivo affare. */
@media (min-width: 1100px) {
  .phones {
    display: grid;
    overflow: visible;
    margin-inline: 0;
    padding-inline: 0;
    gap: clamp(18px, 2.2vw, 40px);
    grid-template-columns: repeat(4, minmax(0, 1fr));
    align-items: start;
    max-width: var(--shell);
    margin-right: auto;
    margin-left: auto;
  }

  .phone {
    transition: transform 0.5s var(--ease);
  }

  /* Lo sfalsamento e' quel tanto che basta a togliere l'aria da catalogo. */
  .phone--1,
  .phone--3 {
    transform: translateY(34px);
  }

  .phone:hover {
    transform: translateY(0) scale(1.03);
  }

  .phone--2:hover,
  .phone--4:hover {
    transform: translateY(-12px) scale(1.03);
  }
}

/* Anonimato */
.privacy__title {
  font-size: var(--type-section);
}

.privacy__details {
  margin-top: clamp(40px, 7vh, 90px);
}

.privacy__details > p {
  max-width: 48ch;
  margin: 0;
  color: var(--text-muted);
  font-size: var(--type-lead);
  line-height: 1.6;
}

.privacy__facts {
  margin: clamp(40px, 7vh, 90px) 0 0;
  border-top: 1px solid var(--line);
}

.privacy__facts > div {
  display: flex;
  align-items: baseline;
  justify-content: space-between;
  gap: 20px;
  padding: 20px 0;
  border-bottom: 1px solid var(--line);
}

.privacy__facts dt {
  color: var(--amber);
  font-family: "Instrument Serif", Georgia, serif;
  font-size: clamp(2.25rem, 6vw, 3.4rem);
  line-height: 1;
}

.privacy__facts dd {
  margin: 0;
  color: var(--text-faint);
  font-size: 11px;
  letter-spacing: 0.09em;
  text-align: right;
  text-transform: uppercase;
}

@media (min-width: 900px) {
  .privacy .wrap {
    display: grid;
    align-items: center;
    gap: clamp(40px, 7vw, 100px);
    grid-template-columns: minmax(0, 1.25fr) minmax(0, 0.75fr);
  }

  .privacy__details {
    margin-top: 0;
  }
}

/* Regole */
.rules {
  border-top: 1px solid var(--line);
}

.rules__title {
  font-size: var(--type-section);
}

.rules__copy > p:last-child {
  max-width: 54ch;
  margin: clamp(26px, 4vh, 46px) 0 0;
  color: var(--text-dim);
  font-size: var(--type-body);
  line-height: 1.75;
}

@media (min-width: 900px) {
  .rules__copy {
    width: min(100%, 960px);
    margin-left: auto;
  }
}

/* Chiusura */
.closing {
  position: relative;
  overflow: hidden;
  padding-right: max(var(--gutter), (100% - var(--shell)) / 2);
  padding-left: max(var(--gutter), (100% - var(--shell)) / 2);
  scroll-margin-top: var(--header-height);
  text-align: center;
}

.closing .wrap {
  position: relative;
  display: grid;
  justify-items: center;
}

.closing__glow {
  position: absolute;
  top: 50%;
  left: 50%;
  width: min(84vw, 1000px);
  aspect-ratio: 1;
  border-radius: 50%;
  background: radial-gradient(circle, rgba(255, 171, 24, 0.2), rgba(255, 171, 24, 0.05) 38%, transparent 70%);
  transform: translate(-50%, -50%);
  pointer-events: none;
}

.closing__title {
  font-size: var(--type-hero);
}

.closing__note {
  margin: 26px 0 0;
  color: var(--text-dim);
  font-size: var(--type-body);
}

/* I due pulsanti finali sono l'elemento piu' sicuro di se' della pagina:
   dimensione vera, bordo ambra, alone a riposo.

   Restano disegnati come il resto del sito invece di usare i badge ufficiali
   di Apple e Google: quelle due immagini arrivano con il loro nero, i loro
   angoli e la loro tipografia, e affiancate qui sembrerebbero incollate sopra
   la pagina. La forma e' identica per entrambi gli store — a distinguerli e'
   il solo simbolo, come dev'essere quando nessuna delle due piattaforme e'
   quella "principale". */
/* I due pulsanti sono sempre larghi UGUALI, affiancati o impilati che siano:
   "App Store" e "Google Play" hanno lunghezze diverse (220px contro 202px col
   corpo piu' grande) e lasciarli alla loro larghezza naturale li fa sembrare
   due pulsanti sbagliati invece di due scelte pari — proprio nel punto in cui
   la pagina chiede di fidarsi. Nessuno dei due store e' quello principale.

   Sul telefono stanno impilati dentro una colonna stretta: larghi quanto il
   contenitore diventavano una fascia enorme sotto il titolo.

   La larghezza piena serve anche a un'altra cosa: .closing .wrap e' una griglia
   con justify-items: center, e senza di essa la riga resterebbe larga quanto il
   suo contenuto. */
.store-links {
  display: flex;
  width: 100%;
  max-width: 268px;
  flex-direction: column;
  align-items: stretch;
  gap: 12px;
  margin-top: clamp(34px, 5vh, 56px);
}

/* Da qui in su ci stanno affiancati. Il tetto di 480px sulla riga tiene ogni
   pulsante a 233px al massimo: sopra i 220px che chiede "Google Play" col corpo
   piu' grande, senza arrivare alla fascia larga mezza pagina che verrebbe fuori
   lasciandoli crescere fino a --shell. */
@media (min-width: 480px) {
  .store-links {
    max-width: 480px;
    flex-direction: row;
    flex-wrap: nowrap;
    justify-content: center;
    gap: 14px;
  }

  /* flex-basis 0 e' quello che li rende identici: la larghezza non dipende piu'
     dal nome dello store ma solo dallo spazio disponibile, diviso in due. */
  .store-badge {
    flex: 1 1 0;
  }
}

.store-badge {
  display: inline-flex;
  align-items: center;
  /* Il pulsante e' sempre piu' largo del suo contenuto, quindi icona e testo
     vanno centrati insieme: allineati a sinistra resterebbero appesi al bordo. */
  justify-content: center;
  gap: 14px;
  margin: 0;
  padding: 15px 22px;
  border: 1px solid rgba(255, 171, 24, 0.45);
  border-radius: 16px;
  background: linear-gradient(180deg, rgba(255, 171, 24, 0.14), rgba(255, 171, 24, 0.05));
  box-shadow: 0 0 60px rgba(255, 171, 24, 0.14), inset 0 1px 0 rgba(255, 255, 255, 0.08);
  color: var(--text);
  text-align: left;
  text-decoration: none;
  transition: transform 0.4s var(--ease), border-color 0.4s var(--ease), box-shadow 0.4s var(--ease);
}

/* :focus-visible insieme a :hover, se no il pulsante piu' importante della
   pagina non da' nessun segno a chi naviga da tastiera. */
.store-badge:hover,
.store-badge:focus-visible {
  border-color: rgba(255, 171, 24, 0.85);
  box-shadow: 0 0 80px rgba(255, 171, 24, 0.26), inset 0 1px 0 rgba(255, 255, 255, 0.12);
  transform: translateY(-2px);
}

.store-badge:active {
  transform: translateY(0);
}

@media (prefers-reduced-motion: reduce) {
  .store-badge {
    transition: none;
  }

  .store-badge:hover,
  .store-badge:focus-visible {
    transform: none;
  }
}

.store-badge svg {
  width: 26px;
  flex: none;
  fill: var(--amber);
}

/* Da tablet in su il pulsante torna della misura piena: sul telefono era stretto
   per non occupare mezzo schermo, qui lo spazio c'e'. */
@media (min-width: 480px) {
  .store-badge {
    gap: 16px;
    padding: 18px 28px;
  }

  .store-badge svg {
    width: 30px;
  }
}

.store-badge > span {
  display: flex;
  flex-direction: column;
  font-size: clamp(1.05rem, 2.4vw, 1.35rem);
  font-weight: 600;
  letter-spacing: -0.02em;
  line-height: 1.15;
}

.store-badge small {
  margin-bottom: 3px;
  color: var(--amber);
  font-size: 9px;
  font-weight: 700;
  letter-spacing: 0.14em;
  text-transform: uppercase;
}

/* --------------------------------------------------------------------------
   10. Footer
   -------------------------------------------------------------------------- */
/* Qui il margine e non il padding: il filetto in alto deve cominciare e finire
   dove comincia e finisce il contenuto, come gia' faceva col solo --gutter. */
.site-footer {
  display: grid;
  margin: 0 max(var(--gutter), (100% - var(--shell)) / 2);
  padding: 48px 0 max(48px, env(safe-area-inset-bottom));
  gap: 32px;
  border-top: 1px solid var(--line);
}

.site-footer__brand {
  display: grid;
  gap: 14px;
  justify-items: start;
}

.site-footer .brand {
  text-shadow: none;
}

.site-footer__tagline {
  max-width: 32ch;
  margin: 0;
  color: var(--text-dim);
  font-size: 13px;
  line-height: 1.7;
}

.site-footer__links {
  display: flex;
  margin: 0;
  padding: 0;
  flex-wrap: wrap;
  gap: 10px 24px;
  font-size: 13px;
  list-style: none;
}

.site-footer__links a {
  color: var(--text-dim);
  text-decoration: underline;
  text-underline-offset: 4px;
  transition: color 0.2s ease;
}

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

.site-footer__meta {
  margin: 0;
  color: var(--text-faint);
  font-size: 12px;
}

@media (min-width: 900px) {
  .site-footer {
    align-items: end;
    gap: 40px;
    grid-template-columns: auto 1fr auto;
  }

  .site-footer__links {
    justify-content: center;
  }

  .site-footer__meta {
    text-align: right;
  }
}

/* --------------------------------------------------------------------------
   11. Movimento ridotto
   -------------------------------------------------------------------------- */
/* app.js legge la stessa preferenza e non avvia proprio il film: qui si spegne
   anche il movimento d'arrivo delle sezioni, che altrimenti resterebbe l'unica
   animazione della pagina. */
@media (prefers-reduced-motion: reduce) {
  *,
  *::before,
  *::after {
    animation-duration: 0.01ms !important;
    animation-iteration-count: 1 !important;
    scroll-behavior: auto !important;
    transition-duration: 0.01ms !important;
  }

  [data-enter] .wrap > *,
  [data-enter] > .journey__list > li,
  [data-enter] > .phones {
    opacity: 1;
    transform: none;
  }

  .phones {
    scroll-snap-type: none;
  }
}
