/*
 * Koræi — la vetrina pubblica.
 *
 * Solo l'impaginazione della pagina larga: i colori, i caratteri, il marchio e lo sfondo disegnato
 * arrivano da app.css, che questa pagina carica per primo. Qui non c'e' nemmeno un colore scritto a
 * mano - se domani cambia l'accento del prodotto, cambia anche la vetrina.
 *
 * Ogni classe comincia per "lp-". L'applicazione e' un guscio stretto da telefono e questa e' una
 * pagina larga da desktop: le due impaginazioni non hanno niente in comune, e un prefisso e' cio'
 * che garantisce che nessuna regola scritta qui possa arrivare su una schermata dell'app.
 */

/* ---------- l'impianto ---------- */

/*
  Le due superfici che l'applicazione non ha, e che questa pagina si ricava dalle sue.

  Un'app da telefono e' una colonna sola: non le servono ne' una fascia che sprofonda sotto il
  fondo della pagina, ne' la scocca di un telefono disegnato. Servono qui, e invece di due colori
  scritti a mano sono due mescole del fondo vero - cosi' restano giuste anche il giorno in cui il
  fondo cambia, e non nasce una seconda tavolozza accanto a quella del prodotto.
*/
.lp {
  --lp-fondo: color-mix(in srgb, black 40%, var(--bg));
  --lp-scocca: color-mix(in srgb, var(--ink) 7%, var(--bg));
}
/* In chiaro la fascia non puo' essere il fondo mescolato al nero: su una pagina bianca sarebbe una
   striscia scura in mezzo al testo. E' l'inchiostro a bassissima dose, cioe' la stessa idea al
   contrario - una fascia appena piu' profonda della pagina, qualunque sia la pagina. */
:root:has(.lp-theme-light:checked) .lp {
  --lp-fondo: color-mix(in srgb, var(--ink) 5%, var(--bg));
}

.lp-wrap {
  width: 100%;
  max-width: 1120px;
  margin-inline: auto;
  padding-inline: 22px;
}

/* Il salto delle ancore deve tenere conto della barra fissa, altrimenti il titolo della sezione
   finisce sotto di essa. */
section[id] { scroll-margin-top: 88px; }

/*
  La pagina non scorre di lato, mai.

  I blocchi arrivano da oltre il bordo destro, e un elemento fuori dal bordo destro allarga il
  documento: misurato prima, 474 pixel di larghezza su una finestra da 412, cioe' la pagina si
  poteva trascinare di lato e tutto sembrava spostato a sinistra con una striscia vuota a destra.
  "E' anche decentrata, non deve esserci quello spazio in piu' a destra."

  Il taglio sta su <main> e non su <body>: sul body l'overflow si propaga alla finestra, e un asse
  ritagliato con l'altro visibile la trasformerebbe in un contenitore che scorre - lo stesso guaio
  dell'eroe qui sopra, ma su tutta la pagina. E clip invece di hidden per la stessa ragione.
*/
.lp main { overflow-x: clip; }

.lp-section { padding: clamp(56px, 7vw, 92px) 0; }
/* Due fondi oltre a quello del corpo: uno appena sollevato, uno piu' profondo del nero della
   pagina. E' il ritmo del riferimento - chiaro, grigio, scuro - riletto su un tema scuro. */
.lp-section--soft { background: var(--surface-2); }
.lp-section--dark {
  background: var(--lp-fondo);
  border-block: 1px solid var(--line-soft);
}

.lp-head { max-width: 760px; margin-bottom: 34px; }
.lp-head--center { margin-inline: auto; text-align: center; }

.lp-eyebrow {
  display: inline-flex;
  align-items: center;
  gap: 9px;
  margin-bottom: 14px;
  font-family: var(--cond);
  font-size: 13px;
  font-weight: 600;
  letter-spacing: 2.4px;
  text-transform: uppercase;
  color: var(--accent-text);
}
/* Il trattino davanti all'occhiello: e' il segno che apre ogni sezione del prodotto. */
.lp-eyebrow::before {
  content: "";
  width: 24px;
  height: 3px;
  border-radius: 3px;
  background: var(--accent);
  /* Si allunga da sinistra quando la sezione arriva (vedi lp-riga): senza un'origine dichiarata
     crescerebbe dal centro, che di un trattino di ventiquattro pixel non si accorge nessuno. */
  transform-origin: left center;
}

.lp h1,
.lp h2 {
  font-family: var(--sans);
  font-weight: 800;
  line-height: 1.06;
  letter-spacing: -.02em;
  text-wrap: balance;
}
.lp h2 { font-size: clamp(28px, 4.2vw, 44px); }
.lp h3 {
  font-family: var(--sans);
  font-size: 17px;
  font-weight: 700;
  line-height: 1.3;
  color: var(--ink);
}
.lp p { color: var(--mut); }

.lp-lead {
  margin-top: 14px;
  max-width: 62ch;
  font-size: 17px;
  color: var(--mut);
}
.lp-head--center .lp-lead { margin-inline: auto; }

/* ---------- i bottoni ---------- */
/*
  Non riusano .btn dell'applicazione di proposito: quello e' largo quanto la sua colonna, perche'
  in un guscio da 520px i bottoni si impilano. Qui stanno in fila, quindi la larghezza e' quella
  del testo. Tutto il resto - la pillola, il carattere condensato, il maiuscoletto spaziato - e' lo
  stesso, cosi' i due bottoni sono riconoscibilmente gli stessi bottoni.
*/
.lp-btn {
  display: inline-flex;
  align-items: center;
  justify-content: center;
  gap: 10px;
  min-height: 44px;
  padding: 13px 24px;
  border: 1px solid transparent;
  border-radius: 999px;
  font-family: var(--cond);
  font-size: 15.5px;
  font-weight: 600;
  letter-spacing: 2px;
  text-transform: uppercase;
  text-decoration: none;
  white-space: nowrap;
  cursor: pointer;
  transition: transform .18s ease, background .18s ease, border-color .18s ease, color .18s ease;
}
.lp-btn--primary {
  background: var(--accent);
  color: var(--on-accent);
  box-shadow: var(--glow-accent-soft);
}
.lp-btn--ghost {
  border-color: var(--line);
  color: var(--ink);
}
.lp-btn--sm { min-height: 38px; padding: 9px 18px; font-size: 14px; }
.lp-btn--lg { padding: 16px 30px; font-size: 16.5px; }
.lp-btn--primary:hover { transform: translateY(-2px); box-shadow: var(--glow-accent); }
.lp-btn--ghost:hover { border-color: var(--accent-line); color: var(--accent-text); }
@media (prefers-reduced-motion: reduce) {
  .lp-btn { transition: none; }
  .lp-btn:hover { transform: none; }
}

/* ---------- la barra in alto ---------- */

.lp-nav {
  position: fixed;
  inset: 0 0 auto 0;
  z-index: 90;
  padding: 12px 0;
  background: var(--bar);
  border-bottom: 1px solid var(--line-soft);
  backdrop-filter: blur(14px);
}
.lp-nav__inner {
  display: flex;
  align-items: center;
  justify-content: space-between;
  gap: 20px;
}
.lp-logo {
  display: inline-flex;
  align-items: center;
  gap: 9px;
  text-decoration: none;
}
.lp-nav__links { display: flex; align-items: center; gap: 22px; }
.lp-nav__menu { display: flex; align-items: center; gap: 22px; }
.lp-nav__links a {
  font-size: 14.5px;
  font-weight: 600;
  color: var(--mut);
  text-decoration: none;
  white-space: nowrap;
}
.lp-nav__links a:hover { color: var(--ink); }
.lp-nav__cta { display: flex; align-items: center; gap: 10px; }
/* Le due porte dentro al pannello esistono solo su telefono: nella barra larga ci sono gia'. */
.lp-nav__doors { display: none; }

/*
  Il menu su telefono, con la casella nascosta all'inizio del corpo.

  La casella e' fuori campo invece che hidden: un input nascosto esce dall'ordine di tabulazione e
  il menu diventa irraggiungibile da tastiera. Stesso motivo, stessa soluzione del drawer dell'app.
*/
/* ---------- la scelta del colore, nella barra ---------- */
/*
  I pallini e il loro anello stanno in app.css: la stessa fila e' anche nella registrazione, che
  questo foglio non lo carica. Qui c'e' solo dove finiscono dentro la barra.
*/
/*
  I pallini nella barra: sempre visibili, a ogni larghezza.

  La zona premibile scende da 44 a 26. E' l'unico posto dell'applicazione dove si scende sotto i 44,
  e vale la pena scrivere perche': quattro zone da 44 sono 176px, e su un telefono da 320 accanto al
  marchio e all'hamburger semplicemente non ci stanno - la scelta era fra pallini piu' piccoli e
  pallini che si vedono solo aprendo il menu, cioe' che non si vedono. Sbagliare mira qui non
  cancella e non invia niente: prende il colore accanto, si vede subito e si ricorregge al tocco
  dopo. Nel form di registrazione, dove la stessa fila e' un campo vero, i 44 pieni restano.
*/
/*
  La pastiglia del colore nella barra: e' .appearance dell'applicazione, quindi qui c'e' solo cio'
  che riguarda questa pagina. Il pallino chiuso non ha una classe .swatch-* addosso - il colore in
  uso qui non lo sa il server, lo sa il foglio - e allora se lo prende da var(--accent), che il
  :has() ridefinisce nell'istante in cui si sceglie un pallino nel pannello.
*/
.lp-accent { flex: none; }
.lp-accent > summary .swatch { background: var(--accent); }
/* Sei pallini da 44 fanno 264, che entrano anche in uno schermo da 320 - ma il pannello si
   dimensiona sul contenuto, quindi senza un tetto non ci sarebbe niente a fermarlo se un giorno i
   colori diventassero otto. Nessun a capo: incolonnati diventavano una lista alta mezzo schermo. */
.lp-accent .appearance-panel { max-width: calc(100vw - 24px); }
.lp-accent .accent-choice { flex-wrap: nowrap; }
/* Il comando del tema sotto la fila dei colori, largo quanto il pannello: nel pannello
   dell'applicazione e' un <button>, qui una <label>, e la classe e' la stessa - manca solo cio' che
   un bottone ha di suo. */
.lp-accent .mode-toggle { display: block; text-align: center; cursor: pointer; }

/* Le due caselle che comandano senza JavaScript - il menu e il tema - stanno fuori schermo e non
   nascoste: hidden le toglierebbe dall'ordine di tabulazione, e il menu deve restare raggiungibile
   da tastiera. */
.lp-menu-toggle,
.lp-theme-light { position: absolute; left: -9999px; }
.lp-burger {
  display: none;
  width: 44px;
  height: 44px;
  padding: 12px 10px;
  border-radius: 10px;
  cursor: pointer;
}
.lp-burger span {
  display: block;
  height: 2px;
  border-radius: 2px;
  background: var(--ink);
}
.lp-burger span + span { margin-top: 5px; }

@media (max-width: 900px) {
  .lp-burger { display: block; }
  /* I link scendono sotto la barra come un pannello, e il collegamento e' il combinatore di
     fratelli: la casella sta prima di tutto, quindi puo' raggiungere qualunque cosa la segua. */
  .lp-nav__links {
    position: fixed;
    left: 0;
    right: 0;
    top: 64px;
    flex-direction: column;
    align-items: stretch;
    gap: 0;
    padding: 6px 22px 14px;
    background: var(--panel);
    border-bottom: 1px solid var(--line-soft);
    box-shadow: var(--shadow-panel);
    display: none;
  }
  .lp-menu-toggle:checked ~ .lp-nav .lp-nav__links { display: flex; }
  .lp-nav__menu { flex-direction: column; align-items: stretch; gap: 0; }
  .lp-nav__links a {
    display: flex;
    align-items: center;
    min-height: 46px;
    border-top: 1px solid var(--line-soft);
    font-size: 16px;
  }
  /* La fila e' incollata all'hamburger: un filo d'aria e nient'altro. */
  .lp-accent { margin-left: auto; }
  /*
    Nella barra restano tre cose: il marchio, i colori e l'hamburger. I due bottoni scendono nel
    pannello, larghi quanto lui - su un telefono e' dove uno li cerca dopo aver aperto il menu, e
    lasciarne uno su in mezzo ai pallini stringeva tutto senza che nessuno dei due si leggesse bene.
  */
  .lp-nav__cta .lp-btn { display: none; }
  .lp-nav__doors {
    display: flex;
    flex-direction: column;
    gap: 10px;
    margin-top: 14px;
    padding-top: 14px;
    border-top: 1px solid var(--line-soft);
  }
  /* Meno aria fra i tre, cosi' i pallini ci stanno anche su uno schermo da 320. */
  .lp-nav__inner { gap: 10px; }
}

/* ---------- l'apertura ---------- */

.lp-hero {
  position: relative;
  padding: 132px 0 56px;
  /*
    clip e non hidden, ed e' un difetto vero.

    "overflow: hidden" fa dell'eroe un contenitore che scorre - non scorre davvero, ma per il
    browser lo e' - e "animation-timeline: view()" si lega al PIU' VICINO contenitore che scorre.
    Le sei parole qui sotto si legavano quindi a questa scatola, che sta ferma: la loro comparsa
    restava congelata a un valore qualunque per sempre. Misurato: 0,22 / 0,05 / 0 di opacita' a
    scorrimento 0, 400, 800, 1200 e 2000 - gli stessi tre numeri, cioe' non si muoveva niente.
    "Non si vede nemmeno se scrollo verso il basso": non era un colore troppo scuro, era questo.

    "overflow: clip" ritaglia esattamente allo stesso modo e non e' un contenitore che scorre, quindi
    dentro l'eroe la finestra torna a essere la finestra.
  */
  overflow: clip;
}
/*
  Una luce dell'accento dietro il telefono, appena accennata: la stessa idea dello sfondo disegnato
  dell'app, non un secondo elemento grafico.

  E' UN CERCHIO, E DEVE RESTARLO. Prima era un gradiente dentro a un riquadro alto il 150% e largo il
  70%: su un telefono quel riquadro e' 273 per 1972 pixel, e un cerchio "farthest-corner" dentro a una
  scatola cosi' alta ha un raggio di quasi millecinquecento - percio' il colore non arrivava mai a
  trasparente prima del bordo e veniva tagliato di netto. Sullo schermo era mezzo eroe coperto da un
  rettangolo verde oliva con una riga verticale in mezzo, riportato con uno screenshot: "questo alone
  verde sullo sfondo non va bene".

  Adesso il riquadro e' quadrato - aspect-ratio: 1 - e il gradiente e' "closest-side", cioe' arriva a
  trasparente esattamente sul bordo qualunque sia la larghezza. Un cerchio che sfuma resta un cerchio
  che sfuma a ogni schermo, che e' l'unico modo di scriverne uno che non vada verificato a mano su
  ogni misura.

  In alto a destra e non al centro: sta dietro al telefono, che e' li', e la colonna del testo resta
  pulita. Una tinta sopra le parole non e' un'atmosfera, e' meno contrasto.
*/
.lp-hero::before {
  content: "";
  position: absolute;
  top: -14%;
  right: -26%;
  width: min(680px, 92%);
  aspect-ratio: 1;
  pointer-events: none;
  background: radial-gradient(closest-side circle,
              color-mix(in srgb, var(--accent) 12%, transparent), transparent);
}
.lp-hero__grid {
  position: relative;
  display: grid;
  grid-template-columns: 1.08fr .92fr;
  gap: 48px;
  align-items: center;
}

/*
  La conferma dell'uscita, sopra l'apertura.

  Verde come le conferme dell'applicazione e non nell'accento: e' un esito, non un invito, e sul
  colore del marchio si confonderebbe con i due bottoni che ha sotto.
*/
/* p.lp-signout e non .lp-signout: ".lp p" qui sopra e' una classe piu' un elemento e vincerebbe
   sulla sola classe, ridipingendo la riga del grigio del testo comune. Misurato in pagina - era
   grigia. */
p.lp-signout {
  /* Sopra la luce dell'apertura: quella e' posizionata, quindi si dipinge sopra tutto cio' che non
     lo e' - compresa questa riga, che ne uscirebbe tinta. */
  position: relative;
  margin-bottom: 26px;
  padding: 13px 18px;
  border: 1px solid color-mix(in srgb, var(--ok) 45%, transparent);
  border-radius: var(--r-sm);
  background: color-mix(in srgb, var(--ok) 10%, transparent);
  font-size: 15px;
  font-weight: 600;
  color: var(--ok);
}

.lp-badge {
  display: inline-flex;
  align-items: center;
  gap: 10px;
  margin-bottom: 22px;
  padding: 6px 14px 6px 6px;
  border: 1px solid var(--accent-line);
  border-radius: 999px;
  background: var(--accent-soft);
  font-size: 13px;
  font-weight: 600;
  color: var(--ink-2);
}
.lp-badge b {
  padding: 3px 9px;
  border-radius: 999px;
  background: var(--accent);
  color: var(--on-accent);
  font-family: var(--cond);
  font-size: 12px;
  font-weight: 600;
  letter-spacing: 1.4px;
  text-transform: uppercase;
}

/* Il marchio e' il titolo della pagina, alla misura che ha sul cartellone e non nella barra. */
.lp-hero__brand { display: flex; align-items: center; gap: 12px; }
.lp-hero__brand .logo-ring { width: clamp(38px, 6vw, 52px); height: clamp(38px, 6vw, 52px); }
.lp-hero__brand .logo-word { font-size: clamp(40px, 6.6vw, 62px); letter-spacing: -1.4px; }

.lp-hero__claim {
  margin-top: 16px;
  font-family: var(--sans);
  font-size: clamp(20px, 2.6vw, 27px);
  font-weight: 700;
  line-height: 1.2;
  letter-spacing: -.02em;
  color: var(--ink);
  text-wrap: balance;
}
.lp-hero__text { margin-top: 16px; max-width: 52ch; font-size: 17px; }
.lp-hero__actions { display: flex; flex-wrap: wrap; gap: 12px; margin-top: 30px; }
.lp-hero__note { margin-top: 18px; font-size: 13.5px; color: var(--mut2); }

/* La striscia dei sei ambiti, sotto l'apertura: sei parole e nient'altro. */
.lp-pillars {
  display: grid;
  grid-template-columns: repeat(6, 1fr);
  gap: 10px;
  margin-top: 48px;
  padding-top: 24px;
  border-top: 1px solid var(--line-soft);
}
.lp-pillar {
  padding: 4px;
  border-right: 1px solid var(--line-soft);
  font-family: var(--cond);
  font-size: 13px;
  font-weight: 600;
  letter-spacing: 2px;
  text-transform: uppercase;
  text-align: center;
  color: var(--mut);
}
.lp-pillar:last-child { border-right: 0; }

/* ---------- il telefono disegnato ---------- */

.lp-phone {
  position: relative;
  display: flex;
  align-items: center;
  justify-content: center;
  min-height: 420px;
}
.lp-phone__glow {
  position: absolute;
  width: 74%;
  aspect-ratio: 1;
  border-radius: 50%;
  background: radial-gradient(circle,
              color-mix(in srgb, var(--accent) 26%, transparent), transparent 66%);
  filter: blur(14px);
}
.lp-phone svg {
  position: relative;
  width: min(280px, 84%);
  height: auto;
  filter: drop-shadow(0 34px 54px rgba(0, 0, 0, .55));
}
.lp-phone__body { fill: var(--lp-scocca); stroke: var(--line); stroke-width: 1; }
.lp-phone__screen { fill: var(--bg); }
.lp-phone__card { fill: var(--surface); stroke: var(--line-soft); stroke-width: 1; }
.lp-phone__line { fill: var(--mut2); opacity: .55; }
.lp-phone__line--accent { fill: var(--accent); opacity: 1; }
.lp-phone__ring-mark { fill: none; stroke: var(--accent); stroke-width: 2; }
.lp-phone__brand { fill: var(--ink); font-family: var(--sans); font-size: 11px; font-weight: 800; }
.lp-phone__track { fill: none; stroke: var(--track); stroke-width: 7; }
.lp-phone__ring { fill: none; stroke: var(--accent); stroke-width: 7; }
.lp-phone__figure { fill: var(--ink); font-family: var(--sans); font-size: 24px; font-weight: 800; }
.lp-phone__caption {
  fill: var(--mut);
  font-family: var(--cond);
  font-size: 10px;
  font-weight: 600;
  letter-spacing: 2px;
}
.lp-phone__day { fill: var(--field); stroke: var(--line-soft); stroke-width: 1; }
.lp-phone__day--done { fill: color-mix(in srgb, var(--accent) 28%, transparent); }
.lp-phone__day--today { fill: none; stroke: var(--accent); stroke-width: 1.5; }

/* ---------- e il telefono si accende da solo ----------

   Chiesto guardando la vetrina: "riesci a fare un componente che messo al posto di quella IMG
   statica faccia un'animazione figa? magari usa three JS?" - e poi: "se 3js e' troppo ovviamente
   non usarlo".

   E' troppo, per tre motivi che si sommano proprio qui. La regola "script-src 'self'" vieta i CDN,
   quindi la libreria andrebbe copiata nel repository: seicento kilobyte di JavaScript da scaricare
   ed eseguire sulla PRIMA schermata che vede chi arriva, spesso in 4G, prima di qualunque cosa
   utile. Poi una tela WebGL disegna pixel: il testo dentro non e' testo, e a quel punto il telefono
   non e' piu' la stessa home ridotta ai suoi segni ma un oggetto che le somiglia. E infine un
   oggetto tridimensionale che ruota dice "guarda che bella animazione"; questa qui dice "l'anello
   misura, il numero sale, la settimana si riempie, il coach scrive", che e' cosa fa il prodotto.

   Quindi: zero kilobyte, nessuna libreria, nessuna riga di script. Il disegno c'era gia' ed e' un
   SVG - le animazioni sono di questo foglio.

   COME STA INSIEME. Una sola durata, 11 secondi, per ogni pezzo che partecipa alla sequenza, e ogni
   fotogramma chiave e' scritto in percentuale di quella. E' il modo di tenere sincronizzate otto
   animazioni indipendenti senza un direttore d'orchestra: nessuna puo' scivolare rispetto alle
   altre, perche' hanno tutte lo stesso giro.

   Lo sfalsamento - le sette caselle che si accendono una dopo l'altra, le righe che si scrivono in
   fila - e' fatto con "animation-delay" positivi. Con la stessa durata un ritardo non e' uno
   sfasamento che si accumula: e' una distanza costante, giro dopo giro, e nel primo giro fa
   esattamente cio' che sembra. Con durate diverse, invece, si vedrebbe il disegno andare a pezzi
   dopo un minuto.

   QUANTO CI METTE, ed e' stato regolato due volte in direzioni opposte. La prima versione ci metteva
   quasi sei secondi - "deve essere piu' veloce a fare apparire gli elementi" - e sei secondi sono
   piu' di quanto chiunque guardi una vetrina prima di scorrere: mostrava il prodotto a chi se n'era
   gia' andato. Stretta a tre, e' diventata troppo svelta per essere seguita: "anche questa piu'
   lenta", detto cerchiando il telefono.

   Poi, con la vetrina in produzione: "questa animazione falla aprire prima e accelerala un
   pochino". Non una terza inversione - un aggiustamento, e vale la pena dire di quanto. Il giro e'
   passato da tredici a undici secondi e dentro al giro ogni pezzo arriva qualche punto prima.
   Misurato nel browser, fermando il disegno secondo per secondo: l'anello e' chiuso a 1,8 invece che
   a 2,2, la settimana e' piena a 3,0 invece che a 3,7, l'ultima riga del coach e' scritta a 4,3
   invece che a 5,2. Un sesto piu' svelto, che e' "un pochino" e non il ritorno ai tre secondi gia'
   bocciati - e i due movimenti che si guardano davvero, l'anello e la settimana, sono quelli che
   guadagnano di piu'.

   La pausa in fondo resta la parte piu' lunga del giro - sette secondi su undici - perche' un ciclo
   che riparte subito diventa un lampeggio, e perche' e' li' che sta il disegno finito: chi arriva a
   caso sulla pagina lo trova completo molto piu' spesso di quanto lo trovi vuoto.

   E LO STATO DI PARTENZA E' QUELLO FINALE. Ogni regola qui sotto scrive il disegno com'e' a
   sequenza compiuta - anello a 78, giorni pieni, righe intere. Chi ha chiesto meno movimento, o un
   browser che le animazioni non le fa, vede la vetrina di prima: uguale, ferma, giusta. */

/* La circonferenza del cerchio r=38 e' 238,76: l'anello disegnato e' 179 di quelli, cioe' il 75%
   scarso che il numero dichiara. Scritto come tratto pieno piu' scostamento invece che come
   "tratto e vuoto", perche' e' lo scostamento che si puo' animare per disegnarlo. */
.lp-phone__ring { stroke-dasharray: 239; stroke-dashoffset: 60; }
/* Il rullo dei numeri fermo sull'ultimo dei cinque: 4 passi da 26. */
.lp-phone__roll { transform: translateY(-104px); }
/* Le righe crescono dal proprio bordo sinistro, non dall'origine del disegno: senza fill-box
   "left" e' il margine sinistro dell'intero SVG e la riga partirebbe da fuori schermo. */
.lp-phone__write { transform-box: fill-box; transform-origin: left center; }
/* La luce sul vetro non c'e', finche' non passa. */
.lp-phone__sheen { opacity: 0; }
.lp-phone__sheen-stop { stop-color: var(--accent); }

@media (prefers-reduced-motion: no-preference) {
  /* Il telefono respira, con un giro suo: un galleggiamento agganciato alla sequenza si leggerebbe
     come un movimento della sequenza, e questo invece deve solo togliere la sensazione di adesivo
     incollato sulla pagina. */
  .lp-phone svg { animation: lp-galleggia 7s ease-in-out infinite; }
  .lp-phone__glow { animation: lp-alone 5.5s ease-in-out infinite; }

  .lp-phone__ring { animation: lp-anello 11s cubic-bezier(.22, .8, .3, 1) infinite; }
  /* A scatti e non fluido: un contatore che scorre di continuo e' un nastro, uno che salta da un
     valore all'altro e' un numero che sale. */
  .lp-phone__roll { animation: lp-rullo 11s steps(4, jump-end) infinite; }
  .lp-phone__caption { animation: lp-compare 11s ease-out infinite; animation-delay: .2s; }

  .lp-phone__day { animation: lp-giorno 11s cubic-bezier(.2, .9, .3, 1) infinite; }
  .lp-phone__day:nth-child(1) { animation-delay: 0s; }
  .lp-phone__day:nth-child(2) { animation-delay: .1s; }
  .lp-phone__day:nth-child(3) { animation-delay: .2s; }
  .lp-phone__day:nth-child(4) { animation-delay: .3s; }
  .lp-phone__day:nth-child(5) { animation-delay: .4s; }
  .lp-phone__day:nth-child(6) { animation-delay: .5s; }
  .lp-phone__day:nth-child(7) { animation-delay: .6s; }

  .lp-phone__card--1 { animation: lp-carta 11s cubic-bezier(.2, .9, .3, 1) infinite; }
  .lp-phone__card--2 { animation: lp-carta 11s cubic-bezier(.2, .9, .3, 1) infinite; animation-delay: .5s; }

  /* Le righe si scrivono da sinistra, che e' da dove si scrive. */
  .lp-phone__write { animation: lp-scrive 11s cubic-bezier(.25, .8, .35, 1) infinite; }
  .lp-phone__write--1 { animation-delay: .1s; }
  .lp-phone__write--2 { animation-delay: .22s; }
  .lp-phone__write--3 { animation-delay: .34s; }
  .lp-phone__write--4 { animation-delay: .46s; }
  .lp-phone__write--5 { animation-delay: .62s; }
  .lp-phone__write--6 { animation-delay: .74s; }

  .lp-phone__sheen { animation: lp-luce 11s ease-in-out infinite; }

  /* Ultima, e deve stare ultima: la scorciatoia "animation" riazzera il riempimento, quindi messa
     piu' in alto sarebbe stata cancellata da ogni riga qui sopra.

     Serve a tutto cio' che parte in ritardo: durante l'attesa l'elemento tiene il primo fotogramma
     - invisibile - invece del proprio stato di riposo, che e' quello finale. Senza, al primo giro
     si vedeva mezza settimana gia' accesa per un istante, e poi sparire. */
  .lp-phone__caption, .lp-phone__day, .lp-phone__card--1, .lp-phone__card--2,
  .lp-phone__write, .lp-phone__sheen { animation-fill-mode: backwards; }
}

/* L'anello si disegna: da vuoto - tutto lo scostamento - al 75% che il numero dichiara. */
@keyframes lp-anello {
  0% { stroke-dashoffset: 239; }
  16%, 100% { stroke-dashoffset: 60; }
}
/* Il numero sale mentre l'anello arriva, e resta su per il resto del giro. */
@keyframes lp-rullo {
  0%, 1% { transform: translateY(0); }
  18%, 100% { transform: translateY(-104px); }
}
/* "PRONTO" arriva quando c'e' qualcosa di cui esserlo. */
@keyframes lp-compare {
  0%, 16% { opacity: 0; }
  21%, 100% { opacity: 1; }
}
/* Una casella per volta, con un piccolo scatto verso l'alto: la settimana che si riempie. */
@keyframes lp-giorno {
  0%, 16% { opacity: 0; transform: translateY(4px); }
  22%, 100% { opacity: 1; transform: translateY(0); }
}
/* Le carte salgono di poco, quanto basta a dire che sono arrivate adesso. */
@keyframes lp-carta {
  0%, 22% { opacity: 0; transform: translateY(8px); }
  28%, 100% { opacity: 1; transform: translateY(0); }
}
/* La riga si allunga da sinistra: il coach che scrive. */
@keyframes lp-scrive {
  0%, 22% { transform: scaleX(0); }
  32%, 100% { transform: scaleX(1); }
}
/* La luce scende sul vetro una volta per giro, verso la fine: e' il respiro fra un ciclo e il
   successivo, non un effetto di suo. */
@keyframes lp-luce {
  0%, 62% { opacity: 0; transform: translateY(-70px); }
  66% { opacity: 1; }
  86% { opacity: 1; transform: translateY(370px); }
  90%, 100% { opacity: 0; transform: translateY(370px); }
}
@keyframes lp-galleggia {
  0%, 100% { transform: translateY(0); }
  50% { transform: translateY(-9px); }
}
@keyframes lp-alone {
  0%, 100% { opacity: .85; transform: scale(1); }
  50% { opacity: 1; transform: scale(1.06); }
}


/* ==========================================================================
   Il resto della vetrina si muove: il marchio, il bottone, le sezioni, il piano
   ==========================================================================

   "Mettila anche sull'anello Koraei, poi metti anche un effetto sul bottone crea account tipo
   scanner, in generale metti un po' di animazioni nella landing e poi metti in risalto la card
   abbonamento a pagamento."

   Stesse regole del telefono qui sopra: nessuna libreria, nessuna riga di script, e ogni cosa parte
   dallo stato in cui deve restare - chi ha chiesto meno movimento vede la pagina ferma e intera.
   ========================================================================== */

/* ---------- il marchio si disegna ----------

   Una volta sola, all'apertura, e poi sta fermo. Un anello che gira in eterno nella barra fissa e'
   un movimento che accompagna la lettura di tutta la pagina, e a quel punto non dice piu' niente:
   dice solo che qualcosa si muove. Disegnarlo una volta e' l'atto di presentarsi.

   La circonferenza di r=10 e' 62,83. Solo in vetrina, non nell'applicazione: dentro, la barra la si
   attraversa cinquanta volte al giorno. */
@media (prefers-reduced-motion: no-preference) {
  .lp-logo .logo-ring circle,
  .lp-hero__brand .logo-ring circle {
    stroke-dasharray: 63;
    animation: lp-marchio 1.1s cubic-bezier(.3, .8, .35, 1) both;
  }
  .lp-hero__brand .logo-ring circle { animation-delay: .15s; }
}
@keyframes lp-marchio {
  from { stroke-dashoffset: 63; opacity: .2; }
  to { stroke-dashoffset: 0; opacity: 1; }
}

/* ---------- lo scanner sul bottone che porta all'iscrizione ----------

   Una lama di luce inclinata che attraversa la pillola: e' il gesto che l'applicazione fa davvero
   quando legge la foto di un piatto o di una scheda, quindi il bottone che porta dentro fa lo stesso
   movimento. Il taglio a 20 gradi e' quello che lo fa leggere come una lettura e non come un
   riflesso.

   Passa ogni quattro secondi e mezzo, e il passaggio dura mezzo secondo: il resto e' pausa. Un
   bottone che luccica di continuo e' una pubblicita', uno che luccica ogni tanto e' un invito.

   Al passaggio del dito o del puntatore riparte subito e piu' svelta - li' e' una risposta, e una
   risposta arriva adesso.

   overflow: hidden sulla pillola, cosi' la lama e' tagliata dai bordi arrotondati invece di uscire
   dai lati; e position: relative, che senza il ::after si ancorerebbe alla pagina. */
.lp-btn--scan { position: relative; overflow: hidden; isolation: isolate; }
.lp-btn--scan::after {
  content: "";
  position: absolute;
  top: -60%;
  bottom: -60%;
  width: 42px;
  left: -60px;
  transform: skewX(-20deg);
  /* Bianco, e non var(--on-accent): quello e' il colore del TESTO sull'accento, cioe' quasi nero
     su tutte e quattro le palette. La lama usciva scura - un'ombra che attraversa il bottone invece
     di una luce. Visto in uno screenshot del bottone con l'animazione fermata a meta' corsa. */
  background: linear-gradient(90deg,
              transparent,
              rgba(255, 255, 255, .5),
              transparent);
  pointer-events: none;
}
@media (prefers-reduced-motion: no-preference) {
  .lp-btn--scan::after { animation: lp-scanner 4.5s ease-in-out infinite; }
  .lp-btn--scan:hover::after { animation-duration: 1.1s; }
}
@keyframes lp-scanner {
  0% { left: -60px; opacity: 0; }
  4% { opacity: 1; }
  14% { left: 100%; opacity: 1; }
  16%, 100% { left: 100%; opacity: 0; }
}

/* ---------- le sezioni arrivano mentre si scorre ----------

   Legate allo scorrimento e non a un orologio: un blocco che si anima dopo tot secondi si anima
   anche quando e' fuori schermo, e chi ci arriva scorrendo lo trova gia' finito. "animation-timeline:
   view()" fa avanzare l'animazione con la posizione dell'elemento nella finestra, che e' la stessa
   cosa che si fa di solito con un osservatore in JavaScript - qui senza JavaScript.

   Dentro a @supports perche' oggi la sanno fare i browser di Chrome e non ancora Safari. Dove non
   c'e', la regola non si applica affatto: i blocchi stanno dove sono, opachi e fermi, cioe' la
   pagina di prima. E' il motivo per cui l'animazione toglie e non aggiunge - parte dallo stato
   finale e lo raggiunge - invece di nascondere qualcosa che poi qualcuno deve mostrare. */
@supports (animation-timeline: view()) {
  @media (prefers-reduced-motion: no-preference) {
    /*
      Tutti da destra, e tutti allo stesso modo.

      "Tutti i box nella landing devono scorrere da dx verso sx, dall'alto verso il basso in
      sequenza." Prima erano tre movimenti diversi - chi saliva dal basso, chi entrava da sinistra,
      chi da destra a seconda della colonna - e su una pagina che si legge tutta d'un fiato tre
      direzioni non sono varieta': sono tre cose che si muovono e nessuna regola che le tenga.

      Uno solo, quindi, e la sequenza dall'alto in basso viene da se': ogni blocco ha il suo tempo
      legato alla PROPRIA posizione nella finestra, quindi entra quando gli tocca. Non c'e' un
      ritardo da calcolare - e' lo scorrimento a fare l'ordine.

      QUANTO DURA, in un'animazione che non ha una durata. Legata allo scorrimento, la "durata" e'
      quanta strada si percorre mentre avviene, e si dichiara come un tratto di una delle fasi. La
      prima versione usava la fase di ENTRATA, ed e' li' l'errore: quella fase e' lunga quanto il
      blocco, non quanto la finestra - una scheda alta 170 pixel entrava tutta in 170 pixel di
      scorrimento, e allargarne la percentuale non poteva cambiare granche'. "Adesso e' troppo veloce,
      quasi non si vede l'animazione": era vero, e raddoppiare i numeri dentro alla fase sbagliata
      lasciava la comparsa in 143 pixel invece che in 71.

      Adesso il tratto sta nella fase lunga - dal primo istante in cui il blocco tocca lo schermo
      all'ultimo in cui lo lascia, cioe' finestra piu' blocco - e ne usa il primo 38%: su un telefono
      sono quasi quattrocento pixel di scorrimento, e la scheda arriva a posto quando e' a meta'
      schermo. Misurato, non stimato.

      DA DOVE ARRIVA. "Le animazioni dei box devono partire da piu' a destra, quasi fuori campo":
      erano quarantadue pixel, che su un telefono si leggevano come un assestamento e non come un
      arrivo. Adesso e' quasi la larghezza della finestra - 88vw, con un tetto di 560 pixel perche'
      su uno schermo grande una scheda non deve farsi mezzo metro di strada - quindi il blocco parte
      oltre il bordo e attraversa lo schermo intero.

      Quello che lo rende possibile e' il ritaglio su <main>: senza, un elemento oltre il bordo
      destro allarga il documento e la pagina si trascina di lato per tutta la durata dell'entrata.
    */
    /*
      La striscia dei sei ambiti non e' in questo elenco, ed e' una richiesta: "le scritte sotto
      devono essere subito visualizzate, non a scorrimento". Sta attaccata all'apertura, mezza
      schermata sotto il bottone, quindi chi arriva la vede senza aver scorso niente - e una cosa
      che si vede senza scorrere non puo' dipendere dallo scorrimento per essere leggibile. Sono
      anche sei parole e non un blocco: non c'e' niente da presentare, sono un indice.
    */
    .lp-head, .lp-card, .lp-step, .lp-row, .lp-fact, .lp-plan, .lp-split > * {
      animation: lp-entra linear both;
      animation-timeline: view();
      animation-range: cover 2% cover 38%;
    }
    /*
      E dentro a una fila, uno dopo l'altro.

      Due o tre schede affiancate stanno alla stessa altezza, quindi entrerebbero tutte nello stesso
      istante: la sequenza dall'alto in basso non le distingue, perche' in basso non ci sono. La
      seconda e la terza colonna prendono una finestra spostata di qualche punto piu' avanti, che a
      schermo si legge come "prima quella, poi quella".
    */
    .lp-cards--2 > .lp-card:nth-child(even),
    .lp-cards--3 > .lp-card:nth-child(3n+2) { animation-range: cover 8% cover 44%; }
    .lp-cards--3 > .lp-card:nth-child(3n) { animation-range: cover 14% cover 50%; }
    /* Il piano Pro dopo il gratuito, che e' l'ordine in cui si leggono. */
    .lp-plan--featured { animation-range: cover 8% cover 44%; }
  }
}
@keyframes lp-entra {
  from { opacity: 0; transform: translateX(min(88vw, 560px)); }
  to { opacity: 1; transform: none; }
}

/* Le schede rispondono al dito. Due pixel e un bordo: quanto basta a dire "questa e' una cosa",
   niente di piu' - non sono premibili e non devono sembrarlo. */
.lp-card { transition: transform .2s ease, border-color .2s ease; }
.lp-card:hover { transform: translateY(-3px); border-color: var(--accent-line); }
@media (prefers-reduced-motion: reduce) {
  .lp-card { transition: none; }
  .lp-card:hover { transform: none; }
}

/* ---------- il piano a pagamento, messo in risalto ----------

   Era gia' segnato - bordo dell'accento e un'etichetta - e sulla fila si leggeva come il gemello del
   gratuito con una riga di colore in piu'. Adesso e' piu' grande degli altri, sta su un fondo suo,
   ha un alone che respira e l'etichetta che si sente.

   Il rialzo e' scale e non un'altezza diversa: la fila resta una griglia di celle uguali, quindi
   nessuno degli altri si sposta, e su telefono - dove le schede si impilano - lo tolgo, perche' li'
   una scheda piu' larga delle altre esce dalla colonna invece di emergere. */
.lp-plan--featured {
  background:
    radial-gradient(120% 80% at 50% 0%,
                    color-mix(in srgb, var(--accent) 12%, transparent), transparent 70%),
    linear-gradient(180deg, var(--surface), var(--surface-2));
}
@media (min-width: 720px) {
  .lp-plan--featured { transform: scale(1.045); z-index: 1; }
}
@media (prefers-reduced-motion: no-preference) {
  .lp-plan--featured { animation: lp-piano 3.6s ease-in-out infinite; }
  .lp-plan__tag { animation: lp-etichetta 3.6s ease-in-out infinite; }
}
/* L'alone respira sul bordo, non sul contenuto: e' la scheda a farsi notare, e il prezzo dentro
   deve restare leggibile mentre lo fa. */
@keyframes lp-piano {
  0%, 100% { box-shadow: var(--shadow-card),
                         0 0 0 1px color-mix(in srgb, var(--accent) 26%, transparent),
                         0 0 26px color-mix(in srgb, var(--accent) 14%, transparent); }
  50% { box-shadow: var(--shadow-card),
                    0 0 0 1px color-mix(in srgb, var(--accent) 55%, transparent),
                    0 0 44px color-mix(in srgb, var(--accent) 30%, transparent); }
}
@keyframes lp-etichetta {
  0%, 100% { transform: translateY(0); }
  50% { transform: translateY(-2px); }
}


/* ---------- l'eroe entra all'apertura ----------

   Le comparse legate allo scorrimento non servono a niente per quello che sta gia' sullo schermo
   quando la pagina si apre: sono gia' arrivate. Qui il tempo va bene, ed e' l'unico posto della
   vetrina in cui e' cosi'.

   Sale una riga per volta, dal basso, con un ottavo di secondo fra l'una e l'altra: e' l'ordine in
   cui si legge, quindi e' anche l'ordine in cui deve comparire. Il ritardo piu' lungo e' del
   telefono - un secondo intero - perche' e' la cosa che poi si mette a fare tutto da sola e deve
   arrivare quando il testo accanto e' gia' fermo.

   "both" perche' senza, durante il ritardo, ogni pezzo si vedrebbe al suo posto per un istante e
   poi sparirebbe per rientrare. */
@media (prefers-reduced-motion: no-preference) {
  .lp-badge, .lp-hero__brand, .lp-hero__claim, .lp-hero__text,
  .lp-hero__actions, .lp-hero__note, .lp-phone {
    animation: lp-eroe .85s cubic-bezier(.2, .8, .3, 1) both;
  }
  .lp-hero__brand { animation-delay: .08s; }
  .lp-hero__claim { animation-delay: .16s; }
  .lp-hero__text { animation-delay: .26s; }
  .lp-hero__actions { animation-delay: .36s; }
  .lp-hero__note { animation-delay: .46s; }
  .lp-phone { animation-delay: .3s; animation-duration: 1.1s; }
}
@keyframes lp-eroe {
  from { opacity: 0; transform: translateY(20px); }
  to { opacity: 1; transform: none; }
}

/* ---------- e il resto arriva scorrendo ----------

   Aggiunte alle prime: la striscia dei sei ambiti, le righe con la spunta, i quattro passi, la riga
   onesta sui pagamenti, il trattino davanti a ogni occhiello.

   La direzione la decide il blocco qui sopra ed e' una sola per tutti - da destra - perche' e' quella
   che e' stata chiesta guardando la pagina scorrere.

   Il telefono si muove piu' piano della pagina mentre lo si supera: quattro punti percentuali di
   scarto, che bastano a dargli profondita' e non abbastanza da farlo sembrare staccato.

   Tutto dentro a @supports, come le prime: dove il browser non sa legare un'animazione allo
   scorrimento - Safari, oggi - la regola non si applica e la pagina resta quella ferma di sempre. */
@supports (animation-timeline: view()) {
  @media (prefers-reduced-motion: no-preference) {
    .lp-tick, .lp-facts, .lp-fineprint {
      animation: lp-entra linear both;
      animation-timeline: view();
      animation-range: cover 2% cover 38%;
    }
    /* Il trattino dell'occhiello si allunga da sinistra mentre la sezione arriva. */
    .lp-eyebrow::before {
      animation: lp-riga linear both;
      animation-timeline: view();
      animation-range: cover 6% cover 40%;
    }
    /* La parallasse del telefono, mentre lo si supera. */
    .lp-phone svg {
      animation: lp-eroe .85s cubic-bezier(.2, .8, .3, 1), lp-parallasse linear;
      animation-timeline: auto, view();
      animation-range: normal, cover;
    }
  }
}
@keyframes lp-riga {
  from { transform: scaleX(0); }
  to { transform: scaleX(1); }
}
@keyframes lp-parallasse {
  from { transform: translateY(24px); }
  to { transform: translateY(-24px); }
}

/* ---------- il problema e la risposta ---------- */

.lp-split {
  display: grid;
  grid-template-columns: 1fr 1fr;
  gap: 40px;
  align-items: start;
}
.lp-ticks { display: flex; flex-direction: column; gap: 11px; margin: 0; padding: 0; list-style: none; }
.lp-tick {
  padding: 15px 18px;
  border: 1px solid var(--line-soft);
  border-radius: var(--r-sm);
  background: var(--field);
  font-size: 15.5px;
  font-weight: 600;
  color: var(--ink-2);
}
/* L'ultima riga e' la conseguenza delle tre sopra, e va letta come tale invece che come la
   quarta di un elenco. */
.lp-tick--alert {
  border-color: color-mix(in srgb, var(--danger) 45%, transparent);
  background: color-mix(in srgb, var(--danger) 10%, transparent);
  color: var(--danger-ink);
}

.lp-rows { display: flex; flex-direction: column; gap: 22px; }
.lp-row { padding-left: 16px; border-left: 2px solid var(--accent-line); }
.lp-row p { margin-top: 6px; font-size: 15.5px; }

/* ---------- le carte ---------- */

.lp-cards { display: grid; gap: 18px; }
.lp-cards--2 { grid-template-columns: repeat(2, 1fr); }
.lp-cards--3 { grid-template-columns: repeat(3, 1fr); }

.lp-card {
  padding: 24px 22px;
  border: 1px solid var(--line-soft);
  border-radius: var(--r);
  background: linear-gradient(180deg, var(--surface), var(--surface-2));
  box-shadow: var(--shadow-card);
}
.lp-card p { margin-top: 8px; font-size: 15px; }
/* Le carte dei limiti non sono carte da sfogliare: sono affermazioni. Niente rilievo, un filo
   d'accento a sinistra e basta. */
.lp-card--line {
  background: none;
  box-shadow: none;
  border-left: 3px solid var(--accent);
}

/* ---------- i quattro passi ---------- */

.lp-steps { display: grid; grid-template-columns: repeat(4, 1fr); gap: 16px; }
.lp-step {
  padding: 22px 20px;
  border: 1px solid var(--line-soft);
  border-radius: var(--r);
  background: var(--surface);
}
.lp-step__n {
  display: grid;
  place-items: center;
  width: 38px;
  height: 38px;
  margin-bottom: 14px;
  border-radius: 50%;
  background: var(--accent);
  color: var(--on-accent);
  font-family: var(--cond);
  font-size: 17px;
  font-weight: 600;
}
.lp-step p { margin-top: 7px; font-size: 14.5px; }

.lp-facts { display: grid; grid-template-columns: repeat(3, 1fr); gap: 16px; margin-top: 28px; }
.lp-fact {
  padding: 20px 18px;
  border: 1px solid var(--line-soft);
  border-radius: var(--r-sm);
  background: var(--field);
}
.lp-fact b {
  display: block;
  margin-bottom: 6px;
  font-family: var(--sans);
  font-size: 32px;
  font-weight: 800;
  line-height: 1;
  letter-spacing: -.03em;
  color: var(--accent-text);
}
.lp-fact span { font-size: 14.5px; color: var(--mut); }

/* ---------- i piani ---------- */

.lp-plan {
  display: flex;
  flex-direction: column;
  padding: 28px 26px;
  border: 1px solid var(--line-soft);
  border-radius: var(--r);
  background: linear-gradient(180deg, var(--surface), var(--surface-2));
}
.lp-plan--featured {
  position: relative;
  border: 1px solid var(--accent-line);
  box-shadow: var(--shadow-card);
}
.lp-plan__tag {
  position: absolute;
  top: -12px;
  left: 26px;
  padding: 4px 12px;
  border-radius: 999px;
  background: var(--accent);
  color: var(--on-accent);
  font-family: var(--cond);
  font-size: 12px;
  font-weight: 600;
  letter-spacing: 1.6px;
  text-transform: uppercase;
}
.lp-plan h3 { font-size: 20px; }
.lp-plan__price {
  margin-top: 10px;
  font-family: var(--sans);
  font-size: 36px;
  font-weight: 800;
  line-height: 1;
  letter-spacing: -.03em;
  color: var(--ink);
}
.lp-plan__price small {
  margin-left: 6px;
  font-family: var(--cond);
  font-size: 15px;
  font-weight: 600;
  letter-spacing: 1.6px;
  text-transform: uppercase;
  color: var(--mut2);
}
.lp-plan__note { margin-top: 8px; font-size: 14px; color: var(--mut2); }
.lp-plan__list {
  display: flex;
  flex-direction: column;
  gap: 10px;
  margin: 20px 0 24px;
  padding: 0;
  list-style: none;
}
.lp-plan__list li {
  position: relative;
  padding-left: 20px;
  font-size: 15px;
  color: var(--ink-2);
}
/* La spunta e' disegnata dal foglio: un carattere in piu' nel markup di ogni riga sarebbe letto
   ad alta voce da uno screen reader senza voler dire niente. */
.lp-plan__list li::before {
  content: "";
  position: absolute;
  left: 2px;
  top: 6px;
  width: 5px;
  height: 9px;
  border: solid var(--accent);
  border-width: 0 2px 2px 0;
  transform: rotate(45deg);
}
/* Il bottone del piano va in fondo alla carta, cosi' i due bottoni sono allineati anche quando
   gli elenchi hanno lunghezze diverse. */
.lp-plan .lp-btn { margin-top: auto; }

.lp-fineprint {
  max-width: 68ch;
  margin: 26px auto 0;
  font-size: 13.5px;
  color: var(--mut2);
  text-align: center;
}

/* ---------- l'invito finale ---------- */

.lp-cta { max-width: 720px; text-align: center; }
.lp-cta .lp-hero__actions { justify-content: center; margin-top: 26px; }
.lp-cta .lp-eyebrow { justify-content: center; }

/* ---------- il piede ---------- */

.lp-footer { padding: 44px 0 22px; border-top: 1px solid var(--line-soft); background: var(--lp-fondo); }
.lp-footer__grid {
  display: grid;
  grid-template-columns: 1.5fr 1fr 1fr;
  gap: 30px;
  padding-bottom: 26px;
  border-bottom: 1px solid var(--line-soft);
}
.lp-footer p { margin-top: 12px; max-width: 40ch; font-size: 14px; }
.lp-footer h4 {
  margin-bottom: 12px;
  font-family: var(--cond);
  font-size: 13px;
  font-weight: 600;
  letter-spacing: 2.2px;
  text-transform: uppercase;
  color: var(--ink);
}
.lp-footer__links { display: flex; flex-direction: column; gap: 9px; }
.lp-footer__links a { font-size: 14.5px; color: var(--mut); text-decoration: none; }
.lp-footer__links a:hover { color: var(--accent-text); }
.lp-footer__bottom {
  display: flex;
  flex-wrap: wrap;
  justify-content: space-between;
  gap: 10px;
  padding-top: 20px;
  font-size: 13px;
  color: var(--mut2);
}

/* ---------- gli schermi stretti ---------- */

@media (max-width: 980px) {
  .lp-hero__grid { grid-template-columns: 1fr; gap: 30px; }
  .lp-phone { min-height: 320px; }
  .lp-phone svg { width: min(230px, 62%); }
  .lp-steps { grid-template-columns: repeat(2, 1fr); }
  .lp-split { grid-template-columns: 1fr; gap: 28px; }
  .lp-cards--3 { grid-template-columns: repeat(2, 1fr); }
}

@media (max-width: 680px) {
  .lp-hero { padding-top: 116px; }
  .lp-cards--2,
  .lp-cards--3 { grid-template-columns: 1fr; }
  .lp-facts { grid-template-columns: 1fr; }
  .lp-footer__grid { grid-template-columns: 1fr; }
  /* Sei colonne su un telefono sono sei parole tagliate a meta': due righe da tre. */
  .lp-pillars { grid-template-columns: repeat(3, 1fr); gap: 16px 6px; }
  .lp-pillar:nth-child(3n) { border-right: 0; }
}

@media (max-width: 460px) {
  .lp-steps { grid-template-columns: 1fr; }
  .lp-hero__actions .lp-btn { flex: 1 1 100%; }
}

/* ---------- l'informativa ---------- */
/*
  Un documento, non una pagina di vendita: una colonna sola, stretta abbastanza da leggersi, con i
  titoli che si distinguono dal testo e niente altro. Riusa la barra e il piede della vetrina perche'
  chi ci arriva dalla vetrina non deve sentirsi altrove, e i colori sono quelli del prodotto.

  La misura e' 68 caratteri circa: piu' larga di cosi' l'occhio perde la riga, e questo e' un testo
  che qualcuno deve leggere per intero almeno una volta.
*/
/* La barra e' fissa, quindi la prima riga del documento le finiva sotto: qui sopra c'e' la sua
   altezza piu' l'aria che avrebbe avuto comunque. Visto in pagina - la parola "informativa" era
   tagliata a meta'. */
.lp-legal { padding: calc(72px + clamp(24px, 4vw, 48px)) 0 clamp(56px, 7vw, 92px); }
/* Su telefono la vetrina nasconde i bottoni della barra e li manda nel menu, che qui non c'e': senza
   questo, da un telefono si esce da questa pagina solo dal piede. */
.lp-legal-nav .lp-btn { display: inline-flex; }
.lp-legal .lp-wrap { max-width: 760px; }
.lp-legal h1 { margin: 6px 0 18px; }
.lp-legal h2 {
  margin: 42px 0 12px;
  font-size: clamp(20px, 3vw, 25px);
  line-height: 1.25;
}
.lp-legal h3 {
  margin: 24px 0 8px;
  font-size: 16px;
  color: var(--accent-text);
}
.lp-legal p { margin: 0 0 14px; line-height: 1.65; color: var(--ink-2); }
.lp-legal strong { color: var(--ink); }
.lp-legal__lead { font-size: 17.5px; color: var(--ink); }
.lp-legal__updated {
  margin-bottom: 8px;
  font-family: var(--cond);
  font-size: 13px;
  letter-spacing: 1.2px;
  text-transform: uppercase;
  color: var(--mut);
}
.lp-legal__list { margin: 0 0 14px; padding-left: 20px; }
.lp-legal__list li { margin-bottom: 9px; line-height: 1.6; color: var(--ink-2); }
.lp-legal__nowrap { white-space: nowrap; }

/* La tabella delle basi giuridiche. Scorre per conto suo invece di allargare la pagina: su un
   telefono due colonne di testo non ci stanno, e una pagina che scorre in orizzontale e' rotta. */
.lp-legal__table {
  display: block;
  overflow-x: auto;
  width: 100%;
  margin: 0 0 18px;
  border-collapse: collapse;
  font-size: 14.5px;
}
.lp-legal__table th,
.lp-legal__table td {
  padding: 11px 14px;
  border: 1px solid var(--line-soft);
  text-align: left;
  vertical-align: top;
  line-height: 1.5;
  color: var(--ink-2);
}
.lp-legal__table th {
  font-family: var(--cond);
  font-size: 12.5px;
  letter-spacing: 1.3px;
  text-transform: uppercase;
  color: var(--accent-text);
  white-space: nowrap;
}

/*
  I buchi da riempire, evidenziati apposta.

  Titolare, sede e indirizzo di contatto non li puo' inventare chi scrive il codice. Un indirizzo
  sbagliato dentro a un documento legale e' un danno molto piu' grande di una casella gialla che si
  vede: questa si nota subito e chiede di essere chiusa, quello passa inosservato per anni.
*/
.lp-legal__todo {
  padding: 1px 7px;
  border: 1px dashed color-mix(in srgb, var(--accent) 60%, transparent);
  border-radius: 6px;
  background: color-mix(in srgb, var(--accent) 12%, transparent);
  font-size: .95em;
  color: var(--ink);
}
