/*
 * SoulFuel — il foglio di stile del sito.
 *
 * Il disegno viene da Temp/Soulfuel.dc.html. Quel file e' una tela: una pagina
 * sola, tutto a stili in linea, con dentro un'altra famiglia e attributi che
 * nessun browser conosce (`style-hover`, `<image-slot>`, `<sc-if>`, `{{ }}`),
 * che funzionano solo grazie a support.js e image-slot.js. Qui il linguaggio
 * visivo e' riscritto come foglio vero e agganciato al markup che i modelli
 * PHP producono, cosi' vale su tutte le rotte e in tutte e quattro le lingue.
 *
 * Quello che il modello detta e che qui e' legge:
 *   - due caratteri: Newsreader per i titoli, in pesi molto leggeri; Karla per
 *     il testo. I titoli non sono mai in grassetto.
 *   - una cornice sola: 1240px, margine laterale 26px.
 *   - un ritmo solo: 92px fra due sezioni.
 *   - misure ottiche, non un sistema numerico: 13.5px, 44px, 26px esistono
 *     perche' a occhio funzionano.
 *   - ogni titolo di sezione ha sopra un occhiello: riga corta, maiuscolo
 *     spaziato, colore argilla.
 *   - il ritmo della pagina alterna carta e fasce: due sezioni su --bg, poi
 *     una fascia piena su --surface2 con un filo sopra e sotto.
 *   - un solo bottone pieno per schermata.
 *   - angoli tondi ovunque, mai bordi marcati; le pillole sono 999px.
 *
 * Giorno e notte stanno in questo stesso file: la notte si accende con
 * <html class="night">, che PHP scrive dal server — nessun lampo al caricamento.
 */

/* ==================================================== caratteri ============= */
/*
 * I due caratteri sono ospitati qui, non presi da Google. Sono file variabili:
 * un file solo copre tutti i pesi da 200 a 800, e sono quattro in tutto invece
 * delle otto-dieci che servirebbero con i tagli statici.
 * Il modello li chiamava da fonts.googleapis.com; per un sito con impressum
 * tedesco quella riga trasmette l'indirizzo IP di chi legge a un terzo, ed e'
 * esattamente cio' che il Landgericht München I ha condannato nel 2022.
 * Se un file manca, valgono i ripieghi di sistema dichiarati in --titolo e
 * --testo: il sito resta leggibile, cambia solo l'aspetto.
 */
@font-face {
  font-family: "Newsreader";
  src: url("/Style/Font/SoulFuel-Style-Font-Newsreader1.woff2") format("woff2-variations");
  font-weight: 200 800;
  font-stretch: 100%;
  font-style: normal;
  font-display: swap;
}
@font-face {
  font-family: "Newsreader";
  src: url("/Style/Font/SoulFuel-Style-Font-Newsreader1Corsivo.woff2") format("woff2-variations");
  font-weight: 200 800;
  font-style: italic;
  font-display: swap;
}
@font-face {
  font-family: "Karla";
  src: url("/Style/Font/SoulFuel-Style-Font-Karla1.woff2") format("woff2-variations");
  font-weight: 200 800;
  font-style: normal;
  font-display: swap;
}
@font-face {
  font-family: "Karla";
  src: url("/Style/Font/SoulFuel-Style-Font-Karla1Corsivo.woff2") format("woff2-variations");
  font-weight: 200 800;
  font-style: italic;
  font-display: swap;
}

/*
 * Newsreader ha un secondo asse, `opsz` (optical size): il disegno della
 * lettera cambia a seconda del corpo in cui verra' stampata. Lasciato libero,
 * il browser lo imposta da solo in base al font-size — ed e' quello che
 * vogliamo, perche' i titoli qui vanno da 25px a 74px. Si dichiara solo perche'
 * senza `font-optical-sizing` esplicito qualche browser lo ignora.
 */
h1, h2, h3, body > header p#marchio b, body > footer b#firma {
  font-optical-sizing: auto;
}

/* ==================================================== il giorno ============= */

:root {
  color-scheme: light;

  --bg: #FBF8F1;
  --surface: #FFFFFF;
  --surface2: #F3EFE4;
  --glass: rgba(251, 248, 241, 0.82);
  --ink: #1D2A22;
  --ink2: #4E5D52;
  --muted: #8B9A8C;
  --line: #E4DECE;

  --moss: #3E6B4F;
  --moss-soft: #E1EBDD;
  --sun: #E3A33C;
  --clay: #C1674A;
  --sky: #5E90B8;

  /* L'OMBRA SENZA SPREAD NEGATIVO.
     Era «0 18px 40px -22px»: un alone largo quaranta e rientrato di ventidue.
     In Firefox si vedeva morbido; in Chrome no — le sezioni hanno
     `animation-timeline: view()`, che le mette su un piano di composizione
     separato, e li' Chrome rasterizzava quell'ombra come un RETTANGOLO PIENO
     sfalsato in basso a destra. Non un'ombra sfumata: una seconda scheda
     grigia che spuntava da sotto la prima.
     Due strati corti e senza rientro danno lo stesso stacco e non si prestano
     a quell'errore. La profondita' vera la fa il bordo, che c'e' gia'. */
  --shadow: 0 1px 2px rgba(29, 42, 34, 0.06), 0 6px 16px rgba(29, 42, 34, 0.07);

  --titolo: Newsreader, Georgia, "Times New Roman", serif;
  --testo: Karla, system-ui, -apple-system, "Segoe UI", sans-serif;

  --cornice: 1240px;
  --lato: 26px;
  --ritmo: 92px;
  --lettura: 62ch;
}

/* ==================================================== la notte ============== */

:root.night {
  color-scheme: dark;
  --bg: #0F1518;
  --surface: #18211F;
  --surface2: #1E2825;
  --glass: rgba(15, 21, 24, 0.82);
  --ink: #EFEBE0;
  --ink2: #B7C2B7;
  --muted: #7C8A80;
  --line: #2A3630;
  --moss: #82BC92;
  --moss-soft: #22312A;
  --sun: #E9B45E;
  --clay: #DD8767;
  --sky: #93B9D8;
  --shadow: 0 1px 2px rgba(0, 0, 0, 0.35), 0 6px 16px rgba(0, 0, 0, 0.28);
}

/* Senza scelta esplicita decide il sistema operativo. `day` sul tag <html>
   blocca il chiaro anche se il sistema e' scuro: una scelta vale piu' di una
   preferenza generale. */
@media (prefers-color-scheme: dark) {
  :root:not(.day) {
    color-scheme: dark;
    --bg: #0F1518;
    --surface: #18211F;
    --surface2: #1E2825;
    --glass: rgba(15, 21, 24, 0.82);
    --ink: #EFEBE0;
    --ink2: #B7C2B7;
    --muted: #7C8A80;
    --line: #2A3630;
    --moss: #82BC92;
    --moss-soft: #22312A;
    --sun: #E9B45E;
    --clay: #DD8767;
    --sky: #93B9D8;
    --shadow: 0 1px 2px rgba(0, 0, 0, 0.35), 0 6px 16px rgba(0, 0, 0, 0.28);
  }
}

/* ==================================================== fondamenta ============ */

* { box-sizing: border-box; }
html { scroll-behavior: smooth; }

body {
  margin: 0;
  overflow-x: hidden;
  background: var(--bg);
  color: var(--ink);
  font-family: var(--testo);
  font-size: 16px;
  line-height: 1.65;
  -webkit-font-smoothing: antialiased;
  transition: background 0.5s ease, color 0.5s ease;
}

a { color: var(--moss); text-decoration: none; }
a:hover { color: var(--clay); text-decoration: underline; }

img { display: block; max-width: 100%; height: auto; }
input, button, textarea, select { font: inherit; color: inherit; }
::selection { background: var(--sun); color: #1D2A22; }
:focus-visible { outline: 2px solid var(--moss); outline-offset: 3px; }

@keyframes rise { from { opacity: 0; transform: translateY(22px); } to { opacity: 1; transform: none; } }
@keyframes ping { 0% { opacity: 0.9; transform: scale(0.6); } 70%, 100% { opacity: 0; transform: scale(2.4); } }
@keyframes drift { from { transform: translateX(0); } to { transform: translateX(-50%); } }
@keyframes traccia { to { stroke-dashoffset: 0; } }

a#salta {
  position: absolute;
  left: -100vw;
  padding: 12px 20px;
  border-radius: 999px;
  background: var(--moss);
  color: #fff;
}
a#salta:focus { position: static; display: inline-block; margin: 12px; }

/* ==================================================== la testata ============ */

/* Fascia: fondo da bordo a bordo, contenuto nella cornice. Come il piede. */
body > header {
  position: sticky;
  top: 0;
  z-index: 60;
  background: var(--glass);
  backdrop-filter: blur(14px);
  border-bottom: 1px solid var(--line);
}

body > header > div {
  display: grid;
  grid-template-columns: auto 1fr auto auto auto;
  align-items: center;
  gap: 10px 20px;
  max-width: var(--cornice);
  margin: 0 auto;
  padding: 14px var(--lato);
}

body > header p { margin: 0; }

body > header p#marchio > a {
  display: flex;
  flex-direction: column;
  gap: 1px;
  color: var(--ink);
  text-decoration: none;
}
body > header p#marchio b {
  font-family: var(--titolo);
  font-size: 23px;
  font-weight: 500;
  letter-spacing: 0.16em;
  text-transform: uppercase;
}
body > header p#marchio span {
  font-size: 9.5px;
  letter-spacing: 0.28em;
  text-transform: uppercase;
  color: var(--muted);
}

body > header nav > ul {
  display: flex;
  flex-wrap: wrap;
  gap: 22px;
  margin: 0;
  padding: 0;
  list-style: none;
  font-size: 13.5px;
}
body > header nav > ul > li > a { color: var(--ink2); }
body > header nav > ul > li > a:hover,
body > header nav > ul > li > a[aria-current] { color: var(--moss); text-decoration: none; }

/* L'unico bottone pieno della testata. Una sola azione principale, sempre. */
body > header nav > ul > li#invito > a {
  padding: 10px 18px;
  border-radius: 999px;
  background: var(--moss);
  color: #fff;
  font-size: 13px;
  font-weight: 500;
}
body > header nav > ul > li#invito > a:hover { background: var(--clay); color: #fff; }

body > header p#servizio {
  display: flex;
  align-items: center;
  gap: 10px;
  font-size: 10.5px;
  letter-spacing: 0.2em;
  text-transform: uppercase;
}
body > header p#servizio a { color: var(--muted); }
body > header p#servizio a:hover { color: var(--moss); text-decoration: none; }
body > header p#servizio b { color: var(--ink); font-weight: 700; }

/*
 * L'interruttore giorno/notte: un cerchio di 38px con dentro un glifo, come nel
 * modello. E' un <a>, non un <button>, perche' senza JavaScript deve comunque
 * portare da qualche parte — ma deve avere l'aspetto e la misura di un bottone.
 */
body > header a#tema {
  display: grid;
  place-items: center;
  width: 38px;
  height: 38px;
  border: 1px solid var(--line);
  border-radius: 50%;
  background: var(--surface);
  color: var(--ink2);
  font-size: 15px;
  line-height: 1;
  cursor: pointer;
  transition: border-color var(--breve, 160ms) ease, color 160ms ease;
}
body > header a#tema:hover {
  border-color: var(--moss);
  color: var(--moss);
  text-decoration: none;
}

body > header a#instagram {
  display: grid;
  place-items: center;
  width: 38px;
  height: 38px;
  border: 1px solid var(--line);
  border-radius: 50%;
  background: var(--surface);
  color: var(--ink2);
  transition: border-color var(--breve, 160ms) ease, color 160ms ease;
}
body > header a#instagram:hover { border-color: var(--clay); color: var(--clay); }
body > header a#instagram svg {
  width: 19px;
  height: 19px;
  fill: none;
  stroke: currentColor;
  stroke-width: 1.7;
}
body > header a#instagram svg [data-pieno] { fill: currentColor; stroke: none; }

body > p#allarme {
  margin: 0;
  padding: 12px var(--lato);
  background: var(--clay);
  color: #fff;
  font-size: 13px;
}
body > p#allarme code { padding: 1px 6px; border-radius: 4px; background: rgba(0, 0, 0, 0.22); }

body > progress {
  position: fixed;
  inset: 0 0 auto 0;
  z-index: 70;
  width: 100%;
  height: 3px;
  appearance: none;
  border: 0;
  background: none;
}
body > progress::-webkit-progress-bar { background: none; }
body > progress::-webkit-progress-value { background: var(--clay); }
body > progress::-moz-progress-bar { background: var(--clay); }

/* ==================================================== il contenuto ========== */

main > article,
main > section {
  max-width: var(--cornice);
  margin: 0 auto;
  padding: var(--ritmo) var(--lato) 20px;
  /* La testata e' appiccicata in alto: senza questo, un'ancora porta la sezione
     esattamente sotto la testata e il titolo resta nascosto. */
  scroll-margin-top: 84px;
}

@media (max-width: 900px) {
  main > article,
  main > section { scroll-margin-top: 0; }
}

h1, h2, h3 {
  margin: 0 0 24px;
  font-family: var(--titolo);
  font-weight: 200;
  line-height: 1.06;
  letter-spacing: -0.02em;
  text-wrap: pretty;
}
h1 { font-size: clamp(40px, 5.1vw, 74px); line-height: 1.02; }
h2 { font-size: clamp(30px, 3.6vw, 50px); letter-spacing: -0.015em; margin-bottom: 38px; }
h3 { font-size: 25px; font-weight: 300; line-height: 1.2; letter-spacing: -0.01em; margin-bottom: 8px; }

h1 em, h2 em { font-style: normal; font-weight: 300; color: var(--moss); }

p { margin: 0 0 16px; max-width: var(--lettura); font-size: 17px; color: var(--ink2); }
p:last-child { margin-bottom: 0; }
small { font-size: 12px; color: var(--muted); }
time { font-variant-numeric: tabular-nums; }

/* L'OCCHIELLO — il segno che tiene insieme tutta la pagina. */
main [data-occhiello]::before {
  content: attr(data-occhiello);
  display: block;
  margin-bottom: 14px;
  font-family: var(--testo);
  font-size: 11px;
  font-weight: 500;
  letter-spacing: 0.26em;
  text-transform: uppercase;
  color: var(--clay);
}

/* ==================================================== l'apertura ============ */

main > article#apertura {
  display: grid;
  grid-template-columns: 1.05fr 0.95fr;
  gap: 56px;
  align-items: center;
  padding-top: 64px;
}
main > article#apertura > * { grid-column: 1; animation: rise 0.8s ease both; }

/* Il battito: pallino argilla che pulsa, poi il giorno, poi il luogo. */
main > article#apertura > p#adesso {
  display: flex;
  align-items: center;
  gap: 10px;
  margin-bottom: 22px;
  font-size: 11px;
  letter-spacing: 0.24em;
  text-transform: uppercase;
  color: var(--ink2);
}
main > article#apertura > p#adesso > b {
  position: relative;
  width: 9px;
  height: 9px;
  border-radius: 50%;
  background: var(--clay);
}
main > article#apertura > p#adesso > b::after {
  content: "";
  position: absolute;
  inset: 0;
  border-radius: 50%;
  background: var(--clay);
  animation: ping 2s ease-out infinite;
}
main > article#apertura > p#adesso > i { width: 22px; height: 1px; background: var(--line); }
main > article#apertura > p#adesso > span { color: var(--muted); }

main > article#apertura > p#occhiello { font-size: 13px; font-style: italic; color: var(--muted); }

main > article#apertura > figure {
  grid-column: 2;
  grid-row: 1 / span 6;
  margin: 0;
  border-radius: 26px;
  overflow: hidden;
  box-shadow: var(--shadow);
  animation: rise 1s 0.1s ease both;
}
main > article#apertura > figure img { width: 100%; aspect-ratio: 4 / 5; object-fit: cover; }

/*
 * IL TITOLO SI MUOVE PIANO.
 *
 * La copertina e' 1024x768, cioe' orizzontale, e sta in una cornice 4:5, cioe'
 * verticale: `cover` ne taglia via i lati. La fotografia intera esiste, e' solo
 * nascosta — quindi una carrellata mostra davvero qualcosa che prima era fuori
 * campo, mentre un ingrandimento non aggiunge niente.
 *
 * PERCHE' SCATTAVA, E COSA L'HA SISTEMATO
 * Tre cose messe insieme, e nessuna delle tre da sola bastava.
 *
 * 1. `ease-in-out` su trentaquattro secondi vuol dire che all'inizio e alla
 *    fine l'immagine avanza di frazioni di pixel al secondo. E' esattamente li'
 *    che l'occhio vede gli scatti, perche' il movimento cade sotto la
 *    risoluzione dello schermo e riparte a strappi. Con `linear` la velocita'
 *    e' costante e non esiste piu' una zona lenta.
 *
 * 2. `translateX` in percentuale si ricalcola sulla larghezza dell'elemento ad
 *    ogni fotogramma. `translate3d` con la terza coordinata a zero chiede
 *    esplicitamente alla scheda video una superficie sua, e li' i movimenti
 *    sotto il pixel vengono resi davvero, non arrotondati.
 *
 * 3. Il ritorno con `alternate` inverte la direzione nel punto di velocita'
 *    minima — il momento peggiore. Il giro qui e' intero: va, torna e ricomincia
 *    dentro gli stessi fotogrammi, sempre alla stessa andatura.
 *
 * `backface-visibility` e' li' per Safari, che senza fa lo stesso lavoro con
 *  meno precisione.
 *
 * L'animazione sta sull'IMMAGINE, non sulla <figure>: la figure ha gia' la sua
 * entrata `rise`, e due animazioni sullo stesso elemento si azzuffano.
 */
@media (prefers-reduced-motion: no-preference) {
  main > article#apertura > figure img {
    width: 118%;
    max-width: none;
    will-change: transform;
    backface-visibility: hidden;
    animation: carrello 68s linear infinite;
  }
}

@keyframes carrello {
  0%   { transform: translate3d(0, 0, 0); }
  50%  { transform: translate3d(-15.25%, 0, 0); }
  100% { transform: translate3d(0, 0, 0); }
}

main > article#apertura > p#inviti { display: flex; gap: 12px; flex-wrap: wrap; max-width: none; }
main > article#apertura > p#inviti > a {
  padding: 14px 26px;
  border-radius: 999px;
  font-size: 14px;
  font-weight: 500;
}
/* Il bordo trasparente non si vede ed e' li' apposta: il secondo invito ha un
   contorno di 1 px, e senza questo il primo verrebbe 2 px piu' basso. Di fianco
   non lo nota nessuno, incolonnati sul telefono sono due pastiglie storte. */
main > article#apertura > p#inviti > a:first-child { background: var(--ink); color: var(--bg); border: 1px solid var(--ink); }
main > article#apertura > p#inviti > a:first-child:hover { background: var(--moss); color: #fff; text-decoration: none; }
main > article#apertura > p#inviti > a + a { border: 1px solid var(--line); color: var(--ink); }
main > article#apertura > p#inviti > a + a:hover { border-color: var(--moss); color: var(--moss); text-decoration: none; }


/* ==================================================== il nastro ============= */

main > div#nastro {
  margin-top: 34px;
  padding: 13px 0;
  overflow: hidden;
  background: var(--surface2);
  border-top: 1px solid var(--line);
  border-bottom: 1px solid var(--line);
}

/*
 * UNA RIGA SOLA, anche se le strisce sono due.
 *
 * La seconda striscia non e' un errore: l'animazione trasla del cinquanta per
 * cento, quindi a meta' giro deve trovare una copia identica, altrimenti si
 * vede il vuoto. Il difetto era un altro: il flex stava sui figli invece che
 * sul contenitore, cosi' le due strisce erano due blocchi e si impilavano —
 * due righe uguali, una sopra l'altra. Il contenitore deve essere il nastro.
 */
main > div#nastro > div {
  display: flex;
  width: max-content;
  animation: drift 38s linear infinite;
}

main > div#nastro p {
  display: flex;
  gap: 44px;
  margin: 0;
  padding-right: 44px;
  max-width: none;
  font-size: 12.5px;
  letter-spacing: 0.16em;
  text-transform: uppercase;
  color: var(--ink2);
  white-space: nowrap;
}
main > div#nastro p > b { color: var(--clay); font-weight: 400; }

@media (prefers-reduced-motion: reduce) {
  main > div#nastro > div { animation: none; width: 100%; }
  main > div#nastro p:last-child { display: none; }
  main > div#nastro p { flex-wrap: wrap; white-space: normal; }
}

/* ==================================================== i numeri ============== */

main [data-blocco="dati"] > dl {
  display: grid;
  grid-template-columns: repeat(auto-fit, minmax(200px, 1fr));
  gap: 1px;
  margin: 0;
  background: var(--line);
  border: 1px solid var(--line);
  border-radius: 20px;
  overflow: hidden;
}
main [data-blocco="dati"] > dl > div {
  display: grid;
  align-content: start;
  padding: 26px 22px 22px;
  background: var(--surface);
}
main [data-blocco="dati"] dt {
  order: 2;
  margin-top: 12px;
  font-size: 13.5px;
  font-weight: 500;
  color: var(--ink);
}
main [data-blocco="dati"] dd {
  order: 1;
  margin: 0;
  font-family: var(--titolo);
  font-weight: 300;
  font-size: 44px;
  line-height: 1;
  letter-spacing: -0.02em;
  font-variant-numeric: tabular-nums;
}
main [data-blocco="dati"] dd small {
  display: block;
  margin-top: 6px;
  font-family: var(--testo);
  font-size: 11.5px;
  font-style: italic;
  letter-spacing: 0;
  color: var(--muted);
}
main [data-blocco="dati"] dd small a { color: var(--muted); }

/* ==================================================== le raccolte =========== */

/* DISCENDENTE, NON FIGLIO DIRETTO — e non e' pignoleria.
   Il diario ha un <div data-fermo> fra la sezione e la lista, e ogni regola
   scritta «> ul» ha smesso di valere nel momento in cui quel div e' comparso.
   Il risultato: tornavano i punti elenco, e le piastrelle perdevano il loro
   `display: flex`, quindi ognuna era alta quanto il proprio testo invece che
   quanto le altre. Nessun errore da nessuna parte, solo una pagina sbagliata.
   Dentro una raccolta c'e' una lista sola: il discendente e' sicuro. */
main [data-blocco="raccolta"] ul,
main [data-blocco="raccolta"] ol {
  display: grid;
  grid-template-columns: repeat(auto-fit, minmax(320px, 1fr));
  gap: 30px;
  margin: 0;
  padding: 0;
  list-style: none;
}
main [data-blocco="raccolta"] ul > li {
  display: flex;
  flex-direction: column;
  gap: 15px;
}
main [data-blocco="raccolta"] ul > li > a,
main [data-blocco="raccolta"] ul > li > figure {
  margin: 0;
  border-radius: 18px;
  overflow: hidden;
  background: var(--surface2);
}
main [data-blocco="raccolta"] ul > li img {
  width: 100%;
  aspect-ratio: 3 / 2;
  object-fit: cover;
  transition: transform 0.6s cubic-bezier(0.2, 0.7, 0.3, 1);
}
@media (hover: hover) {
  main [data-blocco="raccolta"] ul > li a:hover img { transform: scale(1.04); }
}
main [data-blocco="raccolta"] ul > li h3 { margin: 0; }
main [data-blocco="raccolta"] ul > li h3 > a { color: var(--ink); }
main [data-blocco="raccolta"] ul > li h3 > a:hover { color: var(--moss); text-decoration: none; }
main [data-blocco="raccolta"] ul > li p { margin: 0; font-size: 14.5px; line-height: 1.6; }

/* La riga di servizio della piastrella: sezione · data · minuti. */
main [data-blocco="raccolta"] p.riga,
main [data-blocco="raccolta"] ul > li > p:first-of-type {
  display: flex;
  flex-wrap: wrap;
  gap: 10px;
  align-items: center;
  font-size: 11px;
  letter-spacing: 0.16em;
  text-transform: uppercase;
  color: var(--muted);
}
main [data-blocco="raccolta"] ul > li > p:first-of-type > b { color: var(--moss); font-weight: 400; }

/* Il "continua a leggere": filo sotto, non pillola. */
main [data-blocco="raccolta"] ul > li > a.oltre {
  align-self: flex-start;
  border-radius: 0;
  background: none;
  border-bottom: 1px solid var(--moss);
  font-size: 13px;
  font-weight: 500;
}
main [data-blocco="raccolta"] ul > li > a.oltre:hover { border-color: var(--clay); text-decoration: none; }

/* ==================================================== le fasce ============== */

/*
 * Il ritmo della pagina: due sezioni su carta, poi una fascia piena.
 * Una regola sola per tutte, cosi' la stessa situazione ha sempre lo stesso
 * aspetto in tutte le pagine.
 */
main > [data-fascia] {
  max-width: none;
  margin-top: var(--ritmo);
  padding: 88px calc(50vw - var(--cornice) / 2 + var(--lato));
  background: var(--surface2);
  border-top: 1px solid var(--line);
  border-bottom: 1px solid var(--line);
}
@media (max-width: 1240px) {
  main > [data-fascia] { padding-inline: var(--lato); }
}

/* Il richiamo: cartiglio scuro con angoli molto tondi, dentro la cornice. */
main > [data-blocco="richiamo"] {
  max-width: var(--cornice);
  margin: var(--ritmo) auto 0;
  padding: var(--ritmo) var(--lato);
  background: none;
  border: 0;
}
main > [data-blocco="richiamo"] > div {
  display: grid;
  grid-template-columns: 1.1fr 0.9fr;
  gap: 52px;
  align-items: center;
  padding: 60px 52px;
  border-radius: 28px;
  background: var(--ink);
  color: var(--bg);
}
main > [data-blocco="richiamo"] h2 { color: var(--bg); margin-bottom: 16px; font-size: clamp(28px, 3.4vw, 46px); }
main > [data-blocco="richiamo"] h2::before { color: inherit; opacity: 0.55; }
main > [data-blocco="richiamo"] p { color: var(--bg); opacity: 0.72; font-size: 15px; }
main > [data-blocco="richiamo"] a:not(.pieno) { color: var(--sun); }

/* ==================================================== le note ============== */

main [data-blocco="nota"] {
  max-width: var(--lettura);
  padding: 20px 22px;
  border-radius: 0 16px 16px 0;
  border-left: 3px solid var(--clay);
  background: var(--surface2);
}
main [data-blocco="nota"] p { margin: 0; font-size: 15px; }

/* PERCHE' «STORIE» FINIVA FUORI SQUADRA.

   La sezione ha due attributi, e ognuno portava misure che si annullavano:
     riga 676  [data-fascia]         max-width: none + padding calcolato per
                                     incolonnare il contenuto col telaio
     riga 713  [data-blocco="nota"]  max-width: --lettura   (vince: viene dopo)
     riga 724  section[nota]         padding: 0             (vince: piu' specifico)
   Netto: larghezza della colonna di lettura, padding zero, nessun margine
   automatico — cioe' incollata al bordo sinistro di <main>, mentre ogni altra
   sezione parte dal bordo del telaio. Su uno schermo largo sono centinaia di
   pixel di scarto, e si vede.

   Qui sotto si smette di TOGLIERE e si mettono valori espliciti. Chi ha anche
   `data-fascia` riprende la banda a tutta larghezza col contenuto incolonnato:
   era lo scopo del calc() originale, prima che `padding: 0` lo cancellasse. */
main > section[data-blocco="nota"] {
  border-left: 0;
  border-radius: 0;
  background: none;
  max-width: var(--cornice);
  margin: 0 auto;
  padding: var(--ritmo) var(--lato) 20px;
}

main > section[data-blocco="nota"][data-fascia] {
  max-width: none;
  margin-top: var(--ritmo);
  padding: 88px calc(50vw - var(--cornice) / 2 + var(--lato));
  background: var(--surface2);
  border-top: 1px solid var(--line);
  border-bottom: 1px solid var(--line);
}

main > section[data-blocco="nota"] > ol,
main > section[data-blocco="nota"] > ul {
  max-width: var(--lettura);
  margin: 0;
  padding-left: 1.2em;
}
main > section[data-blocco="nota"] li { margin-bottom: 12px; color: var(--ink2); }
main > section[data-blocco="nota"] li::marker { color: var(--moss); }
/* Nessun rientro qui dentro.
   `data-blocco="nota"` porta con se' la barra a sinistra e il fondo colorato:
   e' fatto per un inciso a margine. Su «crescere», «benessere» e «il mezzo»
   pero' non sono incisi — sono le storie e i consigli, cioe' il motivo per cui
   la pagina esiste. Restano allineati a tutto il resto. */
main > section[data-blocco="nota"] > article,
main > section[data-blocco="nota"] > article > * {
  border-left: 0;
  padding-left: 0;
  margin-left: 0;
}

main > section[data-blocco="nota"] > article { max-width: var(--lettura); margin-bottom: 32px; }

/* ==================================================== la mappa ============= */

/*
 * La fascia della mappa, dal modello: il tracciato a sinistra in una scheda con
 * angoli molto tondi, l'elenco delle tappe a destra in una scheda bordata.
 * Il modello ne ha otto e le mostra tutte; qui sono diciotto, quindi l'elenco
 * scorre dentro la sua scheda invece di allungare la pagina di mezzo schermo.
 */
main [data-mappa] {
  display: grid;
  grid-template-columns: 1.25fr 0.75fr;
  gap: 34px;
  align-items: stretch;
  margin-top: 38px;
}

/* `align-self: start`: senza, la figura prendeva l'altezza della riga e il
   disegno restava in cima con il vuoto sotto. */
/* La colonna di sinistra: la mappa e, sotto, il rimando a tutte le tappe.
   Prima il rimando stava in fondo alla colonna destra, sotto l'elenco e sotto
   la scheda — l'ultimo posto in cui uno lo cerca. */
main [data-mappa] > [data-colonna] { align-self: start; }
main [data-mappa] > [data-colonna] > figure { margin: 0; }
main [data-mappa] > [data-colonna] > p[data-oltre] { margin: 18px 0 0; text-align: left; }

/* La colonna di destra e' alta quanto la mappa: l'elenco prende tutto lo spazio
   che avanza e scorre al suo interno, il link resta in fondo. */
main [data-mappa] > div {
  display: flex;
  flex-direction: column;
  min-height: 0;
}

main figure#tracciato {
  position: relative;
  margin: 0;
  padding: 18px;
  border: 1px solid var(--line);
  border-radius: 24px;
  background: var(--surface);
  box-shadow: var(--shadow);
}
main figure#tracciato svg {
  display: block;
  width: 100%;
  height: auto;
  color: var(--moss);
}

/* La pastiglia vive nella banda vuota sotto il tracciato, che la tela quadrata
   lascia apposta. Non intercetta il puntatore: sotto ci sono le soste. */
main figure#tracciato > figcaption {
  position: absolute;
  left: 32px;
  bottom: 32px;
  padding: 7px 14px;
  border-radius: 999px;
  background: var(--glass);
  backdrop-filter: blur(8px);
  font-size: 11px;
  letter-spacing: 0.14em;
  text-transform: uppercase;
  color: var(--ink2);
  font-style: normal;
  pointer-events: none;
}

/* --- le soste ------------------------------------------------------------ */

/* Ingresso e evidenziazione agiscono su proprieta' DIVERSE — opacita' per
   l'una, raggio e colore per l'altra. Con `transform` su un <g> l'origine e'
   l'angolo della mappa, non il centro del punto, e `animation … both` batte
   qualunque dichiarazione normale: vedi Criticita §10. */
main svg [data-soste] circle {
  fill: var(--clay);
  transition: r 200ms cubic-bezier(0.2, 0.7, 0.3, 1), fill 200ms ease;
}
main svg [data-soste] [data-alone] { opacity: 0; transition: opacity 200ms ease; }

/*
 * Il puntatore sui punti della mappa mancava del tutto: il legame era scritto
 * solo dall'elenco verso la mappa. Ora vale nei due sensi — la regola CSS
 * copre il passaggio del mouse sul punto, lo script accende la riga corrispondente.
 * `pointer-events: all` serve perche' l'alone e' trasparente, e un cerchio
 * trasparente per difetto non riceve il puntatore.
 */
main svg [data-sosta] { cursor: pointer; }
main svg [data-sosta] [data-alone] { pointer-events: all; }
main svg [data-sosta]:hover circle,
main svg [data-sosta][data-accesa] circle { fill: var(--sun); r: 8; }
main svg [data-sosta]:hover [data-alone],
main svg [data-sosta][data-accesa] [data-alone] { opacity: 0.28; r: 20; }

/* L'arrivo pulsa: e' dove il viaggio si e' fermato. */
@media (prefers-reduced-motion: no-preference) {
  main svg [data-arrivo] [data-alone] { animation: respiro 2.8s ease-in-out infinite; }
}
@keyframes respiro {
  0%, 100% { opacity: 0.10; }
  50%      { opacity: 0.34; }
}

/* --- il tracciato che si disegna ----------------------------------------- */

main svg [data-tracciato] {
  stroke-dasharray: var(--traccia, none);
  stroke-dashoffset: var(--traccia, 0);
}

@media (prefers-reduced-motion: no-preference) {
  main svg [data-tracciato][data-disegna] {
    animation: traccia 2.6s cubic-bezier(0.35, 0, 0.2, 1) both;
  }
  /* Le soste compaiono mentre la linea le raggiunge. Solo opacita': il ritardo
     lo scrive lo script, che sa a che punto della linea sta ciascuna. */
  main svg [data-disegna] ~ [data-soste] [data-sosta] {
    animation: comparsa 0.45s ease-out both;
    animation-delay: calc(var(--quando, 0) * 1ms);
  }
}

@keyframes comparsa { from { opacity: 0; } to { opacity: 1; } }

/* --- l'elenco delle tappe ------------------------------------------------ */

/*
 * LA SCHEDA DELL'ELENCO.
 *
 * Stessa famiglia della mappa: stesso bordo, stesso raggio, stessa ombra. La
 * differenza e' dove sta l'ancora visiva — la mappa ha la pastiglia in basso a
 * sinistra, l'elenco l'intestazione in alto — cosi' le due colonne si
 * bilanciano invece di sembrare due oggetti capitati vicini.
 */
main [data-elenco] {
  display: flex;
  flex-direction: column;
  min-height: 0;
  flex: 1 1 auto;
  margin-bottom: 18px;
  background: var(--surface);
  border: 1px solid var(--line);
  border-radius: 24px;
  box-shadow: var(--shadow);
  overflow: hidden;
}

/* L'intestazione: occhiello a sinistra, quanti sono a destra. */
main [data-elenco] > p {
  display: flex;
  align-items: baseline;
  justify-content: space-between;
  gap: 12px;
  margin: 0;
  padding: 18px 22px 14px;
  max-width: none;
  border-bottom: 1px solid var(--line);
  font-size: 11px;
  letter-spacing: 0.26em;
  text-transform: uppercase;
}
main [data-elenco] > p > b { color: var(--clay); font-weight: 500; }
main [data-elenco] > p > span { color: var(--muted); letter-spacing: 0.14em; font-variant-numeric: tabular-nums; }

/*
 * L'elenco non allunga la fascia: si ferma e scorre. La riga della griglia e'
 * alta quanto l'elemento piu' alto, quindi senza tetto le diciotto tappe
 * trascinerebbero con se' anche la cornice della mappa.
 */
main ul[id="tappe"] {
  flex: 1 1 auto;
  min-height: 12rem;
  max-height: 19rem;
  overflow-y: auto;
  overscroll-behavior: contain;
  margin: 0;
  padding: 0;
  list-style: none;
  scrollbar-width: thin;
  scrollbar-color: var(--line) transparent;
}
main ul[id="tappe"] > li > a {
  display: flex;
  align-items: baseline;
  gap: 12px;
  padding: 12px 22px;
  border-bottom: 1px solid var(--line);
  color: var(--ink);
}
main ul[id="tappe"] > li:last-child > a { border-bottom: 0; }
main ul[id="tappe"] > li > a:hover,
main ul[id="tappe"] > li > a:focus-visible,
main ul[id="tappe"] > li > a[data-accesa] { background: var(--moss-soft); text-decoration: none; }
main ul[id="tappe"] > li > a > small { flex: 0 0 auto; letter-spacing: 0.14em; color: var(--muted); }
main ul[id="tappe"] > li > a > small:last-child { margin-left: auto; font-variant-numeric: tabular-nums; }
main ul[id="tappe"] > li > a > b {
  font-family: var(--titolo);
  font-size: 16px;
  font-weight: 400;
  line-height: 1.25;
}
main [data-mappa] > div > p { margin: 0; text-align: right; }



/*
 * LA SCHEDA DELLA TAPPA SCELTA.
 *
 * Terza scheda della fascia, sotto l'elenco: stessa famiglia della mappa e
 * dell'elenco — bordo, raggio, ombra — ma senza scorrimento, perche' e' sempre
 * alta uguale. Il valore sta sopra l'etichetta, come nelle schede dei numeri:
 * una sola grammatica per i dati in tutto il sito.
 */
main [data-scheda] {
  padding: 22px;
  background: var(--surface);
  border: 1px solid var(--line);
  border-radius: 24px;
  box-shadow: var(--shadow);
}
main [data-scheda] > p:first-child {
  margin: 0 0 10px;
  max-width: none;
  font-size: 10.5px;
  letter-spacing: 0.26em;
  text-transform: uppercase;
}
main [data-scheda] > p:first-child > b { color: var(--clay); font-weight: 500; }
main [data-scheda] > h3 { margin: 0 0 4px; font-size: 24px; }
main [data-scheda] > h3 > a { color: var(--ink); }
main [data-scheda] > h3 > a:hover { color: var(--moss); text-decoration: none; }
main [data-scheda] > p:nth-of-type(2) {
  margin: 0 0 18px;
  max-width: none;
  font-size: 12.5px;
  color: var(--muted);
}

main [data-scheda] > dl {
  display: flex;
  flex-wrap: wrap;
  gap: 22px;
  margin: 0;
  padding-top: 16px;
  border-top: 1px solid var(--line);
}
main [data-scheda] > dl > div { display: flex; flex-direction: column; }
main [data-scheda] dd {
  order: 1;
  margin: 0;
  font-family: var(--titolo);
  font-size: 24px;
  font-weight: 300;
  line-height: 1.1;
  font-variant-numeric: tabular-nums;
}
main [data-scheda] dt {
  order: 2;
  font-size: 10.5px;
  letter-spacing: 0.1em;
  text-transform: uppercase;
  color: var(--muted);
}
main [data-scheda] dt > small { display: block; letter-spacing: 0; text-transform: none; }

main [data-mappa] > div > script { display: none; }


/* ============================================= i paesi e la cartina ======= */
/* La sagoma a sinistra, l'elenco a destra. Sotto i 900px l'elenco passa sotto:
   la cartina non si stringe oltre, altrimenti Portogallo e Austria spariscono.
   I 900px sono lo stesso punto di rottura che usa tutto il resto del foglio. */
main [data-paesi] { margin: 28px 0 0; }
main [data-paesi][data-con-cartina] {
  display: grid;
  grid-template-columns: minmax(0, 320px) minmax(0, 1fr);
  gap: 32px;
  align-items: center;
}
main [data-paesi] > figure { margin: 0; }
main [data-paesi] svg[data-cartina] { display: block; width: 100%; height: auto; }
/* Il resto d'Europa fa da contesto: c'e', ma non compete. Il filo del colore
   della carta fa da confine fra un paese e l'altro — i contorni sono anelli
   separati, quindi basta un tratto, non serve disegnare le frontiere a parte. */
main [data-paesi] svg[data-cartina] path {
  stroke: var(--paper);
  stroke-width: 1.6;
  stroke-linejoin: round;
  vector-effect: non-scaling-stroke;
}
main [data-paesi] svg[data-cartina] [data-altrove] {
  fill: var(--line);
  opacity: 0.55;
}
main [data-paesi] svg[data-cartina] [data-paese] {
  fill: var(--moss);
  transition: fill 200ms ease;
}
main [data-paesi] svg[data-cartina] [data-paese]:hover,
main [data-paesi] svg[data-cartina] [data-paese][data-accesa] { fill: var(--clay); }

main [data-paesi] > div > p {
  margin: 0 0 14px;
  font-size: 12px;
  letter-spacing: 0.14em;
  text-transform: uppercase;
  color: var(--ink2);
}
main [data-paesi] ul {
  display: flex;
  flex-wrap: wrap;
  gap: 10px;
  margin: 0;
  padding: 0;
  list-style: none;
}
main [data-paesi] ul > li {
  display: flex;
  align-items: baseline;
  gap: 8px;
  padding: 8px 16px;
  border: 1px solid var(--line);
  border-radius: 999px;
  background: var(--surface);
  font-size: 13px;
}
main [data-paesi] ul > li > b {
  font-family: var(--titolo);
  font-size: 14px;
  font-weight: 500;
  letter-spacing: 0.08em;
  color: var(--moss);
}
main [data-paesi] ul > li > span { color: var(--ink2); }
/* La pastiglia si accende insieme al paese sulla cartina, nei due sensi.
   Il disegno reagiva gia' al passaggio del puntatore e prometteva percio' un
   legame con l'elenco che poi non c'era. */
main [data-paesi] ul > li {
  transition: border-color 200ms ease, background 200ms ease, color 200ms ease;
  cursor: default;
}
main [data-paesi] ul > li:hover,
main [data-paesi] ul > li:focus-visible,
main [data-paesi] ul > li[data-accesa] {
  border-color: var(--clay);
  background: var(--clay);
  color: var(--paper);
  outline: none;
}
main [data-paesi] ul > li:hover > b,
main [data-paesi] ul > li:focus-visible > b,
main [data-paesi] ul > li[data-accesa] > b,
main [data-paesi] ul > li:hover > span,
main [data-paesi] ul > li:focus-visible > span,
main [data-paesi] ul > li[data-accesa] > span { color: var(--paper); }

@media (max-width: 900px) {
  main [data-paesi][data-con-cartina] { grid-template-columns: minmax(0, 1fr); gap: 24px; }
  main [data-paesi] > figure { max-width: 320px; margin-inline: auto; }
}




/* ================================ la fila che si ferma e scorre =========== */
/*
 * L'effetto di ltx.io, e il modo in cui e' fatto davvero.
 *
 * Non e' una fila che si sposta mentre passa: e' una fila che SI FERMA in mezzo
 * allo schermo e sfila di lato mentre la pagina, sotto, continua a scendere.
 * Per questo sembra sospesa. Prima la corsa era legata al transito della
 * sezione nella finestra, e allora le due cose accadevano insieme: la fila
 * scivolava via mentre usciva di scena, e volava.
 *
 * Il meccanismo e' in tre pezzi:
 *   1. la <section> e' alta una schermata PIU' la corsa orizzontale. Quella
 *      altezza in piu' e' il tempo che ci si prende: si scorre e la pagina
 *      avanza, ma quello che si vede resta fermo.
 *   2. il <div data-fermo> dentro e' `sticky` e alto una schermata: e' lui a
 *      restare incollato.
 *   3. --avanzamento vale quanto si e' scesi DENTRO quell'altezza in piu'.
 *
 * L'`overflow: hidden` sta sul div e non sulla sezione: su un antenato
 * romperebbe lo `sticky` del figlio, ed e' un errore che non da' nessun
 * messaggio — semplicemente l'effetto non c'e'.
 *
 * NIENTE DI TUTTO QUESTO SI ATTIVA DA SOLO.
 * Tutte le regole qui sotto chiedono anche [data-pronto], che mette lo script
 * dopo aver misurato una corsa vera. Senza — script assente, finestra stretta,
 * fila che ci sta tutta — la sezione resta una raccolta normale. Prima
 * l'altezza da una schermata valeva sempre, e se lo script non partiva restava
 * un buco alto quanto lo schermo con dentro una lista tagliata.
 */
main [data-scorrevole][data-guidato][data-pronto] {
  height: calc(82vh + var(--scorsa, 0px));
  padding-top: 0;
  padding-bottom: 0;
}

main [data-scorrevole][data-guidato][data-pronto] > [data-fermo] {
  position: sticky;
  /* NON 100vh, e non da zero.
     Con l'altezza piena e il contenuto centrato restavano due fasce di vuoto
     sopra e sotto la fila — e siccome le sezioni vicine hanno il loro --ritmo,
     quel vuoto si sommava al loro: il diario sembrava staccato dal resto della
     pagina. Ottantadue centesimi di schermo bastano alla fila e lasciano
     intravedere cosa viene dopo, che e\' anche un invito a continuare. */
  top: 9vh;
  height: 82vh;
  display: flex;
  flex-direction: column;
  justify-content: center;
  overflow: hidden;
}

main [data-scorrevole][data-guidato][data-pronto] [data-fermo] ul {
  align-items: stretch;
  width: max-content;
  overflow: visible;
  scroll-snap-type: none;
  padding-bottom: 0;
  transform: translate3d(calc(var(--avanzamento, 0) * var(--corsa, 0px)), 0, 0);
  will-change: transform;
}

/* Fuori di qui le piastrelle misurano `calc((100% - 52px) / 3)`, cioe' una
   percentuale della fila. Dentro una fila larga `max-content` quella
   percentuale non ha piu' un riferimento e non sborda niente: la corsa sarebbe
   di zero pixel e l'effetto non si vedrebbe. Qui la misura torna assoluta. */
main [data-scorrevole][data-guidato][data-pronto] [data-fermo] ul > li { flex: 0 0 320px; }

main [data-scorrevole][data-guidato][data-pronto] [data-fermo] ul::-webkit-scrollbar { display: none; }

/* Chi ha chiesto meno movimento riprende il comando, e chi guarda dal telefono
   pure: niente altezza in piu', niente sticky, la barra torna visibile. */
@media (prefers-reduced-motion: reduce), (max-width: 900px) {
  main [data-scorrevole][data-guidato][data-pronto] { height: auto; }
  main [data-scorrevole][data-guidato][data-pronto] > [data-fermo] {
    position: static;
    height: auto;
    display: block;
    overflow: visible;
  }
  main [data-scorrevole][data-guidato][data-pronto] [data-fermo] ul {
    width: auto;
    overflow-x: auto;
    transform: none;
    padding-bottom: 20px;
  }
  main [data-scorrevole][data-guidato][data-pronto] [data-fermo] ul > li { flex: 0 0 300px; }
}

/* ============================================= i temi del diario ========= */
/* La barra dei filtri: pastiglie della stessa famiglia di quelle dei paesi,
   cosi' il sito ha un solo modo di disegnare «una cosa che si puo' scegliere». */
main nav[id="temi"] {
  max-width: var(--cornice);
  margin: 0 auto 8px;
  padding: 0 24px;
}
main nav[id="temi"] > p {
  margin: 0 0 12px;
  font-size: 12px;
  letter-spacing: 0.14em;
  text-transform: uppercase;
  color: var(--ink2);
}
main nav[id="temi"] ul {
  display: flex;
  flex-wrap: wrap;
  gap: 10px;
  margin: 0;
  padding: 0;
  list-style: none;
}
main nav[id="temi"] a,
main nav[id="temi"] span {
  display: flex;
  align-items: baseline;
  gap: 8px;
  padding: 9px 18px;
  border: 1px solid var(--line);
  border-radius: 999px;
  background: var(--surface);
  color: var(--ink);
  text-decoration: none;
  transition: border-color 200ms ease, background 200ms ease, color 200ms ease;
}
main nav[id="temi"] a > b,
main nav[id="temi"] span > b { font-weight: 500; font-size: 14px; }
main nav[id="temi"] a > small,
main nav[id="temi"] span > small { font-size: 12px; color: var(--ink2); }
main nav[id="temi"] a:hover { border-color: var(--moss); }
/* Il tema scelto: pieno, non solo bordato — si deve vedere da lontano quale
   filtro e' attivo, anche a colpo d'occhio scorrendo. */
main nav[id="temi"] a[aria-current] {
  background: var(--moss);
  border-color: var(--moss);
  color: var(--paper);
}
main nav[id="temi"] a[aria-current] > small { color: var(--paper); opacity: 0.75; }
/* I temi ancora senza articoli: dichiarati, non nascosti, ma chiaramente non
   cliccabili. */
main nav[id="temi"] span[data-vuoto] {
  border-style: dashed;
  background: none;
  color: var(--ink2);
  cursor: default;
}
main nav[id="temi"] span[data-vuoto] > b { font-weight: 400; }


/* I paesi sotto la spur: i vicini come filo di contorno, quelli attraversati
   pieni. Il fondo deve dire dove siamo stati senza rubare la scena alla linea,
   percio' il verde e' tenue e il contorno degli altri e' quasi un accenno. */
main svg [data-terre] path {
  fill: none;
  stroke: var(--line);
  stroke-width: 1;
  stroke-linejoin: round;
  vector-effect: non-scaling-stroke;
}
main svg [data-terre] path[data-nostro] {
  fill: var(--moss);
  fill-opacity: 0.16;
  stroke: var(--moss);
  stroke-opacity: 0.45;
  stroke-width: 1.2;
}


/* Instagram nel piede: il glifo e' disegnato a tratto, come il resto delle
   icone del sito, e prende il colore dal testo intorno. Il pallino in alto a
   destra e' l'unica parte piena. */
body > footer p[data-social] { margin: 20px 0 0; }
body > footer p[data-social] > a {
  display: inline-flex;
  align-items: center;
  gap: 10px;
  padding: 8px 16px 8px 12px;
  border: 1px solid var(--line);
  border-radius: 999px;
  color: var(--ink2);
  text-decoration: none;
  font-size: 13px;
  transition: border-color 200ms ease, color 200ms ease;
}
body > footer p[data-social] > a:hover { border-color: var(--clay); color: var(--clay); }
body > footer p[data-social] svg {
  width: 20px;
  height: 20px;
  fill: none;
  stroke: currentColor;
  stroke-width: 1.7;
}
body > footer p[data-social] svg [data-pieno] { fill: currentColor; stroke: none; }

/* ============================================= lo scorrevole ============== */

/*
 * Dal modello: sotto una raccolta si scorre in orizzontale invece di allungare
 * la pagina. Cosi' in home stanno sei o otto voci nello spazio di tre.
 *
 * E' scorrimento nativo con `scroll-snap`, non una libreria: funziona col dito,
 * con la rotella, con la barra di scorrimento e con il tasto di tabulazione,
 * e senza JavaScript resta una fila che si scorre. Le due frecce sono
 * un'aggiunta dello script — se non arriva, non manca niente.
 */
/* `flex: 0 0 <base>` non cresce e non si restringe: le piastrelle escono dal
   contenitore ed e' li' che `overflow-x` serve a qualcosa. Con
   `grid-auto-columns: minmax(0, …)` si stringevano invece di uscire.

   DISCENDENTE E NON FIGLIO DIRETTO, e c'e' un motivo preciso.
   Quando il diario ha avuto bisogno di un <div data-fermo> attorno alla fila,
   ogni regola scritta `> ul` ha smesso di valere di colpo: la lista perdeva
   `display: flex`, le piastrelle si impilavano una sotto l'altra e la corsa
   diventava zero. Il guasto non dava nessun errore, si vedeva e basta.
   Dentro una raccolta scorrevole c'e' una <ul> sola e le piastrelle non ne
   contengono altre: il discendente e' sicuro, il figlio diretto era fragile. */
main [data-scorrevole] ul {
  display: flex;
  align-items: stretch;
  gap: 26px;
  overflow-x: auto;
  scroll-snap-type: x mandatory;
  overscroll-behavior-x: contain;
  padding-bottom: 20px;
  margin-bottom: 6px;
  scrollbar-width: thin;
  scrollbar-color: var(--line) transparent;
}
main [data-scorrevole] ul > li {
  flex: 0 0 300px;
  scroll-snap-align: start;
}

@media (min-width: 900px) {
  main [data-scorrevole] ul > li { flex: 0 0 calc((100% - 52px) / 3); }
}

/*
 * La barra si vede, come nel modello: e' l'unico segno che dice «qui c'e'
 * dell'altro» prima che qualcuno provi a trascinare.
 */
main [data-scorrevole] ul::-webkit-scrollbar { height: 8px; }
main [data-scorrevole] ul::-webkit-scrollbar-track { background: var(--surface2); border-radius: 999px; }
main [data-scorrevole] ul::-webkit-scrollbar-thumb { background: var(--line); border-radius: 999px; }
main [data-scorrevole] ul::-webkit-scrollbar-thumb:hover { background: var(--muted); }

/* Le frecce, in fondo a destra come nel modello. */
main p[data-frecce] {
  display: flex;
  gap: 10px;
  justify-content: flex-end;
  margin: -6px 0 0;
  max-width: none;
}
main p[data-frecce] button {
  width: 40px;
  height: 40px;
  border: 1px solid var(--line);
  border-radius: 50%;
  background: var(--surface);
  color: var(--ink2);
  font-size: 16px;
  line-height: 1;
  cursor: pointer;
  transition: border-color 160ms ease, color 160ms ease;
}
main p[data-frecce] button:hover:not(:disabled) { border-color: var(--moss); color: var(--moss); }
main p[data-frecce] button:disabled { opacity: 0.35; cursor: default; }

/* ============================================= vita in camper ============== */

/*
 * Dal modello: a sinistra il titolo con la fotografia sotto, a destra le voci
 * numerate che si aprono. Sono <details>: si aprono senza JavaScript, si
 * stampano aperte, e la ricerca del browser le trova anche chiuse.
 */
main [data-pratiche] {
  display: grid;
  grid-template-columns: 0.85fr 1.15fr;
  gap: 44px;
  align-items: start;
}
main [data-pratiche] figure {
  margin: 26px 0 0;
  border-radius: 20px;
  overflow: hidden;
}
main [data-pratiche] figure img { aspect-ratio: 4 / 3; object-fit: cover; }

main [data-pratiche] details {
  max-width: none;
  padding: 0;
  border-bottom: 1px solid var(--line);
}
main [data-pratiche] details > summary {
  display: flex;
  align-items: baseline;
  gap: 16px;
  padding: 18px 0;
  cursor: pointer;
  list-style: none;
  font-family: var(--titolo);
  font-size: 20px;
  font-weight: 300;
  line-height: 1.3;
}
main [data-pratiche] details > summary::-webkit-details-marker { display: none; }
main [data-pratiche] details > summary > small {
  flex: 0 0 auto;
  font-family: var(--testo);
  font-size: 11px;
  letter-spacing: 0.18em;
  color: var(--clay);
}
main [data-pratiche] details > summary > span { flex: 1; }
main [data-pratiche] details > summary::after {
  content: "+";
  flex: 0 0 auto;
  color: var(--moss);
  font-size: 22px;
  line-height: 1;
}
main [data-pratiche] details[open] > summary::after { content: "–"; }
main [data-pratiche] details > p { margin: 0 0 20px; padding-left: 40px; font-size: 15px; }

/* Le lacune si vedono: filo tratteggiato e colore d'accento. Una voce non
   ancora scritta e' meglio dichiarata che riempita di parole plausibili. */
main [data-pratiche] details[data-lacuna] > summary > span::after {
  content: " ·";
  color: var(--clay);
}
main p[data-lacuna] {
  margin-left: 40px;
  padding: 14px 16px;
  border: 1px dashed var(--clay);
  border-radius: 12px;
  background: var(--surface2);
  color: var(--ink2);
  font-size: 14px;
  font-style: italic;
}

/* ==================================================== il racconto ========== */

main > article[data-blocco="racconto"] > header { margin-bottom: 32px; }
main > article[data-blocco="racconto"] > header > p {
  font-size: 11px;
  letter-spacing: 0.16em;
  text-transform: uppercase;
  color: var(--muted);
}
/*
 * L'IMMAGINE STA NELLA COLONNA DEL TESTO.
 *
 * Due tentativi sbagliati prima di questo, e vale la pena scriverli.
 *
 * 1. Nessuna regola: il ritratto (1024x1365) restava alla sua misura dentro un
 *    riquadro largo quanto la pagina, e si vedeva la cornice girare attorno al
 *    vuoto.
 * 2. `width: fit-content` sulla cornice piu' `max-height` sull'immagine: sembra
 *    risolto, e in Firefox lo e'. In Chrome no — li' `fit-content` si calcola
 *    sulla larghezza NATURALE dell'immagine, mentre l'immagine si stringe per
 *    via del limite d'altezza. La cornice torna piu' larga del suo contenuto,
 *    cioe' esattamente il problema di partenza, su un navigatore solo.
 *
 * La soluzione non e' un'altra misura automatica: e' dare alla cornice una
 * larghezza DEFINITA e far riempire l'immagine. Quella larghezza e' la colonna
 * del testo. Cosi' fotografia e paragrafi condividono lo stesso bordo sinistro
 * E lo stesso bordo destro — un unico blocco, invece di tre larghezze diverse
 * incolonnate a sinistra, che era la cosa che si notava.
 *
 * Il titolo resta piu' largo: quello e' voluto in tutto il sito.
 */
main > article[data-blocco="racconto"] > figure,
main > article[data-blocco="racconto"] > picture {
  display: block;
  width: 100%;
  max-width: var(--lettura);
  margin: 0 0 32px;
  border-radius: 26px;
  overflow: hidden;
  box-shadow: var(--shadow);
}

main > article[data-blocco="racconto"] > figure img,
main > article[data-blocco="racconto"] > figure picture,
main > article[data-blocco="racconto"] > picture img {
  display: block;
  width: 100%;
  height: auto;
}


/* La prima riga di un'apertura in prima persona: sta piu' grande, perche' e'
   la frase che regge tutta la pagina. */
main > article[data-blocco="racconto"] > p[data-primo] {
  /* Il carattere del titolo, non quello del testo: sul sito ogni misura grande
     e' Newsreader. In Karla, a ventiquattro pixel, stonava con tutta la
     pagina — era la stessa forma dei paragrafi, solo gonfiata. */
  font-family: var(--titolo);
  font-size: clamp(22px, 2.4vw, 30px);
  font-weight: 200;
  line-height: 1.22;
  letter-spacing: -0.015em;
  color: var(--ink);
  margin-bottom: 26px;
}

/*
 * I TITOLI INTERMEDI DEL RACCONTO.
 *
 * Senza questa regola prendevano l'h2 generale — clamp(30px, 3.6vw, 50px) —
 * cioe' la misura dei titoli di sezione, quasi quanto l'h1 dell'articolo:
 * «Punta Prosciutto» sarebbe gridato piu' forte del titolo del pezzo.
 * Qui stanno fra il testo (17px) e il titolo, nella colonna del testo, con
 * molta aria sopra e poca sotto: l'aria sopra e' quella che fa capire che
 * comincia un capitolo, senza bisogno di una riga o di un altro colore.
 */
main > article[data-blocco="racconto"] > h2[data-titoletto] {
  max-width: var(--lettura);
  font-size: clamp(21px, 2.1vw, 26px);
  font-weight: 400;
  letter-spacing: -0.01em;
  color: var(--ink);
  margin: 42px 0 12px;
}
/* «34. Tag: Polignano und Alberobello» comincia con un titoletto, subito sotto
   la fotografia: li' i quarantadue pixel sono un buco, non un respiro. La
   regola guarda cosa viene PRIMA, non se e' il primo h2 della pagina — il
   primo titoletto di un articolo normale sta in mezzo al testo e l'aria gli
   serve tutta. */
main > article[data-blocco="racconto"] > figure + h2[data-titoletto],
main > article[data-blocco="racconto"] > aside + h2[data-titoletto] {
  margin-top: 26px;
}

main > article[data-blocco="racconto"] figcaption {
  padding: 12px 4px 0;
  font-size: 12px;
  font-style: italic;
  color: var(--muted);
}

/* ==================================================== domande ============== */

main details {
  padding: 20px 0;
  border-bottom: 1px solid var(--line);
  max-width: 820px;
}
main details > summary {
  cursor: pointer;
  font-family: var(--titolo);
  font-size: 21px;
  font-weight: 300;
  list-style: none;
}
main details > summary::-webkit-details-marker { display: none; }
main details > summary::after { content: " +"; color: var(--moss); }
main details[open] > summary::after { content: " –"; }
main details > p { margin-top: 12px; font-size: 15px; }

/* ==================================================== il modulo ============ */

form { max-width: 32rem; }
form p { max-width: none; }
form label { display: block; margin-bottom: 6px; font-size: 13px; font-weight: 500; color: var(--ink); }
form input, form textarea {
  width: 100%;
  padding: 14px 16px;
  border: 1px solid var(--line);
  border-radius: 14px;
  background: var(--surface);
  font-size: 14.5px;
}
form input:focus, form textarea:focus { border-color: var(--moss); outline: none; }
form button {
  padding: 16px 26px;
  border: 0;
  border-radius: 14px;
  background: var(--sun);
  color: #2A1F0C;
  font-size: 14px;
  font-weight: 700;
  cursor: pointer;
}
form button:hover { background: var(--ink); color: var(--bg); }

a.pieno {
  display: inline-block;
  padding: 14px 26px;
  border-radius: 999px;
  background: var(--sun);
  color: #2A1F0C;
  font-size: 14px;
  font-weight: 500;
}
a.pieno:hover { background: #fff; color: var(--ink); text-decoration: none; }

/* ==================================================== il piede ============= */

body > footer {
  margin-top: var(--ritmo);
  background: var(--surface2);
  border-top: 1px solid var(--line);
}
body > footer > div {
  display: grid;
  grid-template-columns: 1.4fr 1fr 1fr 1fr;
  gap: 40px;
  max-width: var(--cornice);
  margin: 0 auto;
  padding: 52px var(--lato);
}
body > footer b#firma {
  display: block;
  font-family: var(--titolo);
  font-size: 21px;
  font-weight: 400;
  letter-spacing: 0.16em;
  text-transform: uppercase;
}
body > footer b#firma + small {
  display: block;
  margin-bottom: 16px;
  font-size: 10px;
  letter-spacing: 0.28em;
  text-transform: uppercase;
}
body > footer p { font-size: 13px; line-height: 1.6; max-width: 34ch; }
body > footer nav > b {
  display: block;
  margin-bottom: 12px;
  font-size: 11px;
  font-weight: 400;
  letter-spacing: 0.2em;
  text-transform: uppercase;
  color: var(--muted);
}
body > footer nav > ul { display: grid; gap: 9px; margin: 0; padding: 0; list-style: none; font-size: 13.5px; }
body > footer a { color: var(--ink2); }
body > footer a:hover { color: var(--moss); }
body > footer > p#coda {
  display: flex;
  flex-wrap: wrap;
  justify-content: space-between;
  gap: 20px;
  max-width: var(--cornice);
  margin: 0 auto;
  padding: 0 var(--lato) 40px;
  font-size: 11.5px;
  color: var(--muted);
}

/* ==================================================== la lente ============= */

body > dialog#lente {
  width: 100vw;
  max-width: 100vw;
  height: 100dvh;
  max-height: 100dvh;
  margin: 0;
  padding: 0;
  border: 0;
  background: var(--bg);
}
body > dialog#lente::backdrop { background: rgba(15, 21, 24, 0.94); }
body > dialog#lente img { width: 100%; height: 100dvh; object-fit: contain; }
body > dialog#lente button {
  position: absolute;
  top: 18px;
  right: 18px;
  width: 44px;
  height: 44px;
  border-radius: 50%;
  border: 1px solid var(--line);
  background: var(--surface);
  cursor: pointer;
}

/* ==================================================== entrata in scena ===== */

@media (prefers-reduced-motion: no-preference) {
  main > section {
    animation: rise 0.7s ease both;
    animation-timeline: view();
    animation-range: entry 0% entry 30%;
  }
}

/* ==================================================== il telefono ========== */

@media (max-width: 900px) {
  :root { --ritmo: 56px; --lato: 18px; }

  body > header { position: static; }
  body > header > div { grid-template-columns: 1fr auto auto auto; gap: 10px 12px; }
  body > header nav { grid-column: 1 / -1; order: 3; }
  body > header nav > ul { gap: 14px; }

  main > article#apertura { grid-template-columns: 1fr; gap: 28px; padding-top: 32px; }
  main > article#apertura > figure { grid-column: 1; grid-row: auto; order: -1; }
  main > article#apertura > figure img { aspect-ratio: 4 / 3; }

  /* I DUE INVITI, INCOLONNATI DI PROPOSITO.
     In tedesco misurano insieme quasi 490 px — «Sieh, wie weit wir gekommen
     sind» e' lungo — e sul telefono vanno a capo da soli. Ma andare a capo non
     basta: restano larghi in modo diverso, uno pieno e uno vuoto, a 12 px di
     distanza. Sembrano due pezzi caduti male, non una scelta.
     Cosi' invece si vede che e' voluto. `fit-content` sul contenitore piu'
     `stretch` sulle pastiglie da' a tutte e due la larghezza della piu' larga:
     restano incolonnate e uguali senza attraversare tutto lo schermo, che a 900
     px sarebbe una pastiglia lunga un palmo. `max-width: 100%` e' la rete: su
     uno schermo stretto il testo va a capo dentro il bordo invece di uscirne.
     La soglia e' questa e non una nuova: i Criteri ne ammettono due, e qui a
     900 px l'apertura passa gia' a una colonna sola. */
  main > article#apertura > p#inviti {
    flex-direction: column;
    align-items: stretch;
    gap: 10px;
    width: fit-content;
    max-width: 100%;
  }
  main > article#apertura > p#inviti > a { text-align: center; }

  main [data-blocco="raccolta"] ul,
  main [data-blocco="raccolta"] ol { grid-template-columns: 1fr; gap: 24px; }
  main [data-blocco="dati"] > dl { grid-template-columns: repeat(2, 1fr); }
  main [data-mappa] { grid-template-columns: 1fr; gap: 20px; }
  main ul[id="tappe"] { max-height: 20rem; min-height: 0; }
  main [data-pratiche] { grid-template-columns: 1fr; gap: 24px; }
  main [data-pratiche] details > p, main p[data-lacuna] { padding-left: 0; margin-left: 0; }
  main figure#tracciato { padding: 10px; border-radius: 18px; }
  main figure#tracciato > figcaption { left: 18px; bottom: 18px; }


  main > [data-blocco="richiamo"] > div { grid-template-columns: 1fr; gap: 28px; padding: 36px 26px; }

  body > footer > div { grid-template-columns: 1fr 1fr; gap: 28px; }
}

/* ============================================ la striscia in fondo ========= */
/*
 * QUANDO L'ULTIMA SEZIONE E' UNA FASCIA.
 *
 * Il piede ha lo stesso fondo delle fasce (--surface2) e sopra di se' 92 px di
 * margine. Se l'ultima sezione della pagina e' una fascia, quei 92 px restano
 * del colore della pagina e finiscono incastrati fra due blocchi dello stesso
 * colore: si legge come una banda colorata vuota, appiccicata in fondo. Non
 * c'era niente dentro perche' non e' un blocco — e' un margine.
 *
 * Capita solo dove l'alternanza finisce su una fascia, cioe' su blog, viaggio e
 * benessere. Con `:has()` si riconosce esattamente quel caso e si toglie il
 * margine: la fascia scorre dentro il piede, e a separarli resta il filo del
 * bordo, che e' quello che deve fare.
 */
body:has(main > [data-fascia]:last-child) > footer { margin-top: 0; }

/* ==================================================== la stampa ============ */

@media print {
  body { background: #fff; color: #000; }
  body > header, body > footer, body > progress, main > div#nastro { display: none; }
  main > section { animation: none; }
  main > [data-fascia] { background: none; border: 0; padding-inline: 0; }
}
