/* ===========================================================================
   ANTEX — componenti
   ---------------------------------------------------------------------------
   Fondamentali (token, temi, tipografia, vetro, pulsanti) stanno in antex.css.
   Qui ci sono i componenti: navigazione, hero, simulatore, mockup di prodotto,
   sezioni e movimento.

   REGOLA UNICA SUL COLORE, ed è quella che tiene in piedi i due temi:
   nessuna regola qui sotto scrive un colore. Né un esadecimale, né un rgba.
   Tutto passa dai token semantici di antex.css — --bg, --surface, --text,
   --line, --accent-fg, --on-accent, --ok-bg... — che cambiano valore fra
   chiaro e scuro senza che nessun componente lo sappia.

   La versione precedente non funzionava così: i componenti «chiari» (la
   knowledge base, il mockup dell'attendibilità, la scheda lead, il riquadro
   del codice di integrazione) scrivevano #FFFFFF e var(--ink) a mano, perché
   vivevano dentro sezioni dichiarate chiare — c'era una sola polarità
   possibile e il colore poteva essere costante. Con due temi quella scorciatoia
   diventa un bug garantito: quegli stessi riquadri, in tema scuro, sarebbero
   rimasti lastre bianche in mezzo alla pagina.

   Regola di ritmo (VibeCurb): due sezioni adiacenti non condividono lo stesso
   impianto. Se una è a griglia, la successiva non lo è. Le classi qui sotto
   servono impianti diversi apposta — non è ridondanza.
   =========================================================================== */

/* ===========================================================================
   NAVIGAZIONE  (par. 14.1)
   Trasparente in cima, vetro dopo lo scroll.
   =========================================================================== */
.nav {
  position: fixed;
  top: 0; left: 0; right: 0;
  z-index: var(--z-nav);
  padding: 18px var(--shell-pad);
  transition: padding var(--t-slow) var(--ease);
}
.nav__inner {
  max-width: var(--shell);
  margin: 0 auto;
  display: flex;
  align-items: center;
  gap: 22px;
  padding: 10px 12px 10px 22px;
  border-radius: var(--r-pill);
  /* In cima alla pagina la barra è invisibile: nessun fondo, nessun bordo.
     Il vetro compare solo quando c'è contenuto che le scorre sotto. */
  background: transparent;
  border: 1px solid transparent;
  /* `max-width` e `padding` sono in lista perché sulla home la barra si
     RESTRINGE allo scroll (vedi il blocco più sotto): senza, il passaggio da
     piena larghezza a pastiglia sarebbe uno scatto. */
  transition: max-width var(--t-slow) var(--ease),
              padding var(--t-slow) var(--ease),
              background-color var(--t-slow) var(--ease),
              border-color var(--t-slow) var(--ease),
              box-shadow var(--t-slow) var(--ease),
              backdrop-filter var(--t-slow) var(--ease);
}
.nav.is-stuck { padding-block: 12px; }
/* IL VETRO DELLA BARRA — sfocatura, saturazione e riflesso.
   Sfocare il fondo, da solo, dà un rettangolo semitrasparente. Quello che si
   legge come vetro sono tre cose insieme:
     * la SFOCATURA, che allontana ciò che passa sotto;
     * la SATURAZIONE, che ravviva i colori attraversati invece di spegnerli —
       è la differenza fra vetro e velo grigio;
     * il RIFLESSO sul bordo alto, la riga di luce che dichiara lo spessore.
       È lo stesso principio di `.g2::before`, qui ottenuto con un'ombra
       interna: costa un pseudo-elemento in meno, segue da solo il raggio
       della pastiglia e viaggia sulla transizione di `box-shadow` che c'è
       già. Il colore è `--g2-shine`, che cambia con il tema.
   La seconda ombra interna, appena percettibile, scurisce il bordo basso:
   è quella che fa sembrare la lastra spessa e non disegnata. */
.nav.is-stuck .nav__inner {
  background: var(--nav-bg);
  -webkit-backdrop-filter: blur(var(--nav-blur)) saturate(190%);
          backdrop-filter: blur(var(--nav-blur)) saturate(190%);
  border-color: var(--g1-line);
  box-shadow: var(--shadow-lift),
              inset 0 1px 0 var(--g2-shine),
              inset 0 -1px 0 rgba(0, 0, 0, 0.14);
}

.brand { display: flex; align-items: center; gap: 11px; flex: none; }
/* Il simbolo del brand è 600x538: `width: auto` mantiene il rapporto
   d'aspetto, che le guidelines impongono di non alterare. */
.brand__mark { height: 26px; width: auto; flex: none; }
/* La scritta del marchio è in OUTFIT, non nel carattere del sito: è la metà
   scritta del logo e sta accanto al simbolo estratto dalle guidelines, che è
   disegnato in Outfit. Il resto del sito è in Inter per deroga del committente
   (vedi antex.css), ma la deroga vale per il TESTO, non per il logo.
   Il tracking è positivo perché la scritta è maiuscola: il -0.02em di prima
   era la crenatura da titolo di Inter, e in maiuscolo stringe le lettere una
   sull'altra. Il peso scende da 800 a 600 perché Outfit ha l'occhio più largo
   di Inter e a 800 la scritta pesava più del simbolo che le sta accanto — nel
   lockup ufficiale è il simbolo a comandare. */
.brand__name {
  font-family: var(--f-brand);
  font-weight: 600;
  font-size: 1.18rem;
  letter-spacing: 0.02em;
  color: var(--text);
}

.nav__links { display: flex; align-items: center; gap: 2px; margin-left: 4px; }
/* Le voci non vanno mai a capo DENTRO se stesse: «La piattaforma» spezzato in
   due righe alza la barra e disallinea tutte le altre voci. Se lo spazio non
   basta si stringe il respiro (vedi la media query dei 1340px), non si manda a
   capo un'etichetta di due parole. */
.nav__link {
  white-space: nowrap;
  position: relative;
  display: inline-flex;
  align-items: center;
  gap: 6px;
  padding: 9px 13px;
  font-size: 0.94rem;
  font-weight: 500;
  color: var(--text-2);
  border-radius: var(--r-sm);
  transition: color var(--t-fast) var(--ease), background-color var(--t-fast) var(--ease);
}
.nav__link:hover, .nav__link[aria-expanded="true"] {
  color: var(--text);
  background: var(--surface);
}
/* La pagina in cui ci si trova. Su una monopagina non serviva: adesso è
   l'unica cosa che dice a chi naviga dove si trova, e non è affidata al solo
   colore — c'è anche il filetto sotto la voce. */
.nav__link[aria-current="page"] { color: var(--text); font-weight: 600; }
.nav__link[aria-current="page"]::after {
  content: "";
  position: absolute; left: 13px; right: 13px; bottom: 3px;
  height: 2px; border-radius: 2px;
  background: var(--accent-fg);
}
.nav__caret { width: 10px; height: 10px; opacity: 0.65; transition: transform var(--t-fast) var(--ease); }
.nav__link[aria-expanded="true"] .nav__caret { transform: rotate(180deg); }

.nav__spacer { flex: 1 1 auto; }
.nav__cta { display: flex; align-items: center; gap: 8px; flex: none; }
.nav__cta .btn { min-height: 42px; padding: 10px 20px; font-size: 0.9rem; }

/* --- Interruttore del tema ---
   È un pulsante solo, non un gruppo a tre stati (chiaro / scuro / sistema).
   Tre stati richiedono un'etichetta per essere capiti, e in una barra dove
   ogni pixel è conteso l'etichetta non c'è: il risultato sarebbe un controllo
   che nessuno capisce. Qui il comportamento è: finché non si tocca niente
   comanda il sistema (lo fa il CSS da solo, senza JavaScript); al primo tocco
   si passa all'altro tema e la scelta resta. */
.themetoggle {
  width: 42px; height: 42px;
  flex: none;
  display: grid; place-items: center;
  border-radius: var(--r-sm);
  border: 1px solid var(--line-2);
  color: var(--text-2);
  background: transparent;
  cursor: pointer;
  transition: color var(--t-fast) var(--ease), border-color var(--t-fast) var(--ease), background-color var(--t-fast) var(--ease);
}
.themetoggle:hover { color: var(--text); border-color: var(--line-3); background: var(--surface); }
.themetoggle svg { width: 18px; height: 18px; }
/* Le due icone stanno tutte e due nel DOM e se ne mostra una: costruirle da
   JavaScript significherebbe avere l'icona in due posti (qui e in icons.php)
   e farle divergere alla prima modifica. */
.themetoggle__moon { display: none; }
:root[data-theme="light"] .themetoggle__sun,
:root:not([data-theme="dark"]) .themetoggle__sun { display: none; }
:root[data-theme="light"] .themetoggle__moon,
:root:not([data-theme="dark"]) .themetoggle__moon { display: block; }
@media (prefers-color-scheme: dark) {
  :root:not([data-theme="light"]) .themetoggle__sun { display: block; }
  :root:not([data-theme="light"]) .themetoggle__moon { display: none; }
}
:root[data-theme="dark"] .themetoggle__sun { display: block; }
:root[data-theme="dark"] .themetoggle__moon { display: none; }

/* --- Mega-menu (par. 14.1): mini-anteprima dei moduli, non un elenco di link. */
.mega {
  position: absolute;
  top: calc(100% + 10px);
  /* Agganciato al bordo SINISTRO del pulsante, non centrato su di lui.
     Centrato, un pannello da 760px su una voce larga 120 che sta a un terzo
     della barra finiva 45px oltre il bordo sinistro dello schermo, e la prima
     colonna di icone usciva tagliata. Il difetto peggiora quanto più la voce
     è a sinistra — e sulla home, dove la barra parte dal bordo, è al massimo.
     Le voci con sottomenu stanno all'inizio del menu, quindi verso destra c'è
     sempre spazio: 760px da lì entrano fino ai 1181px sotto i quali il menu
     diventa comunque un pulsante. */
  left: 0;
  transform: translateY(-8px);
  width: min(760px, calc(100vw - 40px));
  padding: 12px;
  border-radius: var(--r-lg);
  /* TINTA PIENA, e niente `backdrop-filter`.
     Il pannello ne aveva uno (blur 24px) e un fondo al 94%: bastava finché la
     barra sopra era trasparente. Da quando la barra ha il suo vetro, il
     pannello è dentro un elemento che ha già un `backdrop-filter`, e un
     `backdrop-filter` annidato in un altro NON campiona la pagina: campiona il
     gruppo dell'antenato. Risultato misurato con la barra agganciata: il
     titolo bianco della pagina sotto trapassava il pannello a (26,23,47)
     contro un fondo di (12,8,34) — un fantasma perfettamente leggibile.
     Un fondo opaco non ha questo problema e non dipende dal compositore.
     Il carattere di vetro resta: bordo, riflesso sul filo alto (la stessa
     ombra interna della barra) e l'ombra profonda che lo stacca dalla pagina. */
  background: var(--mega-bg);
  border: 1px solid var(--g1-line);
  box-shadow: var(--shadow-deep), inset 0 1px 0 var(--g2-shine);
  display: grid;
  grid-template-columns: repeat(2, 1fr);
  gap: 6px;
  opacity: 0;
  visibility: hidden;
  pointer-events: none;
  transition: opacity var(--t-fast) var(--ease), transform var(--t-fast) var(--ease), visibility var(--t-fast);
}
/* IL PONTE. Fra il pulsante e il pannello ci sono 10px di stacco: un buco in
   cui il puntatore non tocca né l'uno né l'altro, e il menu si chiuderebbe
   proprio mentre ci si sta andando. Questa fascia invisibile lo copre.
   Esiste solo a menu aperto, perché a menu chiuso `.mega` ha
   `pointer-events: none` e il ponte con lei: chiuso non intercetta nulla. */
.mega::before {
  content: "";
  position: absolute;
  left: 0; right: 0; bottom: 100%;
  height: 12px;
}
.mega.is-open {
  opacity: 1;
  visibility: visible;
  pointer-events: auto;
  transform: translateY(0);
}
.mega__item {
  display: grid;
  grid-template-columns: 34px 1fr;
  gap: 14px;
  padding: 14px;
  border-radius: var(--r-md);
  transition: background-color var(--t-fast) var(--ease);
}
.mega__item:hover { background: var(--surface); }
.mega__ico {
  width: 34px; height: 34px;
  display: grid; place-items: center;
  border-radius: var(--r-sm);
  background: var(--accent-soft);
  border: 1px solid var(--accent-line);
  color: var(--accent-fg);
}
.mega__ico svg { width: 17px; height: 17px; }
/* `display: block` e non un dettaglio di stile: sono due <span>, quindi
   INLINE, e su un elemento inline `margin-bottom` non fa niente. Titolo e
   descrizione finivano sulla stessa riga come una frase sola — «Assistenti
   Modello, tono, regole e limiti per ogni assistente.» — e il titolo si
   distingueva solo per il grassetto. È la stessa famiglia di difetto di
   `.sim__name`: una proprietà di blocco scritta su un elemento inline non
   avvisa, semplicemente non succede. */
.mega__t { display: block; font-weight: 600; font-size: 0.96rem; color: var(--text); margin-bottom: 3px; }
.mega__d { display: block; font-size: var(--fs-small); color: var(--text-2); line-height: 1.5; }

/* --- Menu mobile: pannello a tutto schermo (par. 14.1). */
.nav__burger {
  display: none;
  width: 42px; height: 42px;
  align-items: center; justify-content: center;
  border: 1px solid var(--line-2);
  border-radius: var(--r-sm);
  background: transparent;
  cursor: pointer;
  flex: none;
}
.nav__burger span {
  display: block; width: 17px; height: 1.5px;
  background: var(--text);
  position: relative;
  transition: background-color var(--t-fast) var(--ease);
}
.nav__burger span::before, .nav__burger span::after {
  content: ""; position: absolute; left: 0;
  width: 17px; height: 1.5px; background: var(--text);
  transition: transform var(--t-fast) var(--ease);
}
.nav__burger span::before { top: -5px; }
.nav__burger span::after  { top:  5px; }
.nav__burger[aria-expanded="true"] span { background: transparent; }
.nav__burger[aria-expanded="true"] span::before { transform: translateY(5px) rotate(45deg); }
.nav__burger[aria-expanded="true"] span::after  { transform: translateY(-5px) rotate(-45deg); }

.drawer {
  position: fixed; inset: 0;
  z-index: var(--z-menu);
  background: var(--drawer-bg);
  -webkit-backdrop-filter: blur(26px);
  backdrop-filter: blur(26px);
  padding: 92px var(--shell-pad) 40px;
  overflow-y: auto;
  opacity: 0;
  visibility: hidden;
  transition: opacity var(--t-fast) var(--ease), visibility var(--t-fast);
}
.drawer.is-open { opacity: 1; visibility: visible; }
.drawer__group { padding: 22px 0; border-bottom: 1px solid var(--line); }
.drawer__label {
  font-family: var(--f-mono); font-size: var(--fs-micro); letter-spacing: 0.14em;
  text-transform: uppercase; color: var(--text-3); margin-bottom: 14px;
}
.drawer__link {
  display: block; padding: 11px 0;
  font-family: var(--f-display); font-size: 1.3rem; font-weight: 600;
  letter-spacing: -0.02em; color: var(--text);
}
.drawer__link[aria-current="page"] { color: var(--accent-fg); }
.drawer__actions { display: grid; gap: 12px; padding-top: 30px; }
.drawer__actions .btn { width: 100%; }

/* ===========================================================================
   LA BARRA SOPRA LA HERO DELLA HOME — piena larghezza, poi si restringe
   ---------------------------------------------------------------------------
   La hero della home esce dai 1240px del sito e arriva ai bordi
   (`shell--wide`). La barra, ferma a 1240, lasciava il marchio 300px dentro
   rispetto all'occhiello che gli sta sotto: due allineamenti diversi nella
   stessa schermata, e il primo che si legge è quello sbagliato.

   Quindi finché si è in cima alla home la barra sta sulla stessa griglia
   della hero — marchio esattamente sopra l'occhiello, pulsante esattamente
   sopra il bordo destro del simulatore — e appena si scorre torna la
   pastiglia da 1240, che è la misura del resto del sito.

   Il passaggio è animato: `max-width` e `padding` sono nella transizione di
   `.nav__inner` e `padding` in quella di `.nav`, quindi la barra si stringe
   mentre il vetro compare, in un gesto solo. Con `prefers-reduced-motion` le
   durate vanno a zero (blocco in fondo al file) e resta un cambio secco: è
   corretto, non è un ripiego.

   PERCHÉ SOLO SOPRA I 1180px. Sotto, `.shell` non morde più — la pastiglia
   è già larga quanto il viewport — e l'unica cosa che cambierebbe sarebbe il
   respiro interno, che su schermo stretto serve: senza, marchio e menu
   toccherebbero il bordo. Ed è anche la soglia in cui il menu diventa un
   pulsante: non c'è nulla da riallineare.

   PERCHÉ SOLO SULLA HOME. È l'unica pagina con la hero a piena larghezza.
   Sulle altre l'intestazione sta nei 1240 come tutto il resto, e una barra
   larga il doppio del titolo che le sta sotto sarebbe lo stesso difetto
   spostato di una pagina.
   =========================================================================== */
@media (min-width: 1181px) {
  [data-page="home"] .nav:not(.is-stuck) {
    padding-inline: var(--shell-pad-wide);
  }
  /* Il respiro interno della pastiglia va a zero e la geometria passa a
     `.nav`: è l'unico modo perché il marchio cada ESATTAMENTE su
     `--shell-pad-wide`, cioè dove comincia il testo della hero, invece che
     22px più in là. */
  [data-page="home"] .nav:not(.is-stuck) .nav__inner {
    max-width: calc(var(--shell-wide) - 2 * var(--shell-pad-wide));
    padding-inline: 0;
  }
}

/* ===========================================================================
   HERO  (par. 14.2) — split asimmetrico: messaggio a sinistra, prodotto a
   destra. Le due colonne NON condividono la baseline: la tensione è voluta.
   =========================================================================== */
.hero {
  position: relative;
  min-height: 100dvh;
  display: flex;
  align-items: center;
  padding-top: 132px;
  padding-bottom: clamp(60px, 8vw, 100px);
  overflow: hidden;
  background: var(--bg);
}
/* La sorgente di luce: un ellisse appena percettibile sopra il centro.
   In tema chiaro non può essere un velo bianco su bianco (sparirebbe): è il
   gradiente del brand tenuto bassissimo, che dà volume senza colorare. */
.hero::before {
  content: "";
  position: absolute; inset: 0;
  background: radial-gradient(ellipse 70% 55% at 62% 38%, var(--glow-b) 0%, transparent 68%);
  opacity: 0.55;
  pointer-events: none;
}
.hero__glow-a { width: 620px; height: 620px; right: -140px; top: -80px; }
.hero__glow-b { width: 480px; height: 480px; left: -180px; bottom: -160px; }

/* Il contenitore è `.shell--wide` (vedi hero.php): la hero esce dai 1240px
   del sito e arriva ai bordi. Le proporzioni cambiano di conseguenza.

   Perché non più 1.02 / 1.18. Quel rapporto era calcolato su 1160px utili:
   dava 470px al testo, cioè quasi esattamente la sua misura di lettura, e
   nessuno spazio sprecato. Su 1790px lo stesso rapporto darebbe 800px alla
   colonna del testo, che però resta largo 620 (22ch di titolo, 52ch di
   paragrafo): 180px di vuoto DENTRO la colonna, che a schermo si leggono
   come un buco in mezzo alla scena, non come respiro.
   Lo spazio guadagnato va quindi al simulatore — ma nemmeno lui lo vuole
   tutto: oltre gli 860px una chat diventa un campo vuoto con due bolle
   appoggiate ai lati. Le due colonne hanno quindi un tetto, si ancorano ai
   bordi opposti e l'eccedenza finisce in mezzo, dove il vuoto si legge come
   respiro e non come un buco. */
.hero__grid {
  position: relative;
  z-index: 2;
  display: grid;
  grid-template-columns: minmax(0, 1fr) minmax(0, 1.2fr);
  gap: clamp(40px, 4vw, 76px);
  align-items: center;
  width: 100%;
}
/* `width: 100%` prima del tetto: senza, sotto gli 860px la colonna non si
   riempirebbe (un blocco in griglia si stira, ma questo ha `justify-self`
   e senza larghezza dichiarata starebbe al contenuto). */
.hero__sim {
  justify-self: end;
  width: 100%;
  max-width: 860px;
}

/* 700 e non 620: con la colonna più larga il filetto sopra i micro-punti e
   la riga dei pulsanti hanno dove appoggiarsi, e il blocco non sembra una
   colonna stretta incollata al bordo sinistro. Titolo e paragrafo NON si
   allargano: hanno un tetto in `ch` e restano dove sono. */
.hero__copy { max-width: 700px; }
.hero__sub {
  font-size: clamp(1.06rem, 1.3vw, 1.22rem);
  line-height: 1.65;
  color: var(--text-2);
  max-width: 52ch;
  margin: 26px 0 0;
}
.hero__micro {
  display: flex;
  flex-wrap: wrap;
  gap: 10px 22px;
  margin-top: 32px;
  padding-top: 26px;
  border-top: 1px solid var(--line);
}
.hero__micro li {
  display: flex; align-items: center; gap: 8px;
  font-size: var(--fs-small); color: var(--text-2);
}
.hero__micro li::before {
  content: ""; width: 5px; height: 5px; border-radius: 50%;
  background: var(--accent-fg); flex: none;
}

/* ---------------------------------------------------------------------------
   HERO SENZA CORNICE — i tre segni che delimitano la scena
   ---------------------------------------------------------------------------
   Tolto il riquadro di vetro intorno alla conversazione (vedi `.sim--open`),
   la hero resta con due blocchi di contenuto e niente che dica dove finisce
   l'uno e comincia l'altro: si leggono come un unico ammasso. Il confine lo
   ridisegnano tre elementi che segnano SENZA chiudere — un filo, due squadre,
   due cerchi — e che sono decorazione pura: `aria-hidden` nel markup, nessun
   testo, nessuna funzione. Se non arrivassero non mancherebbe niente da
   leggere; sotto i 1024px infatti spariscono, perché a una colonna sola non
   c'è nessun confine verticale da segnare.
   --------------------------------------------------------------------------- */
.hero--open .hero__copy,
.hero--open .hero__sim { position: relative; }

/* IL FILO. Sta addosso al bordo destro della colonna del testo (`left: 100%`
   su `.hero__copy`, che ha un tetto di 700px) e non a metà del vuoto fra le
   due colonne: è la fine di ciò che si legge, non l'inizio di ciò che si
   guarda — e a metà del vuoto, su un monitor da 1920, cadrebbe in mezzo al
   nulla senza appartenere a nessuno dei due.

   L'altezza è in `dvh` e non in percentuale del genitore: deve tagliare tutta
   la schermata come una cucitura, non fermarsi dove finisce il paragrafo. Il
   di più esce dalla hero, che lo ritaglia (`overflow: hidden`). Sfuma alle due
   estremità: una linea che si interrompe di netto sembra un bordo mancante. */
.hero__seam {
  position: absolute;
  left: 100%;
  margin-left: clamp(16px, 1.9vw, 36px);
  top: 50%;
  width: 1px;
  height: 104dvh;
  transform: translateY(-50%);
  background: linear-gradient(180deg, transparent, var(--line-2) 18%, var(--line-2) 82%, transparent);
  pointer-events: none;
}

/* LE SQUADRE. Due angoli opposti dell'inquadratura: in alto a destra e in
   basso a sinistra. Bastano due su quattro — il rettangolo lo chiude l'occhio,
   e disegnarlo tutto sarebbe di nuovo una cornice.

   Sono allineate ai lati della scena e scostate SOLO in verticale. Scostarle
   anche in orizzontale sembrava più naturale ed è la prima cosa che è stata
   provata, ma il vuoto fra le due colonne non è sempre lo stesso: a 1920px
   sono 232px, a 1440px ne restano 58, perché lì la colonna del testo non ha
   ancora raggiunto il suo tetto di 700px mentre quella della scena sì. Con
   uno scarto in `vw` la squadra in basso finiva ADDOSSO al filo verticale
   proprio alle larghezze intermedie. A filo dei bordi, invece, il montante
   della squadra cade esattamente sul bordo dell'avatar e della bolla: è un
   allineamento in più, non un compromesso. */
.hero--open .hero__sim { --mark-off: clamp(14px, 2.2vw, 40px); }
.hero__mark {
  position: absolute;
  width: 26px; height: 34px;
  pointer-events: none;
}
.hero__mark--tr {
  top: calc(var(--mark-off) * -1);
  right: 0;
  border-top: 1px solid var(--line-3);
  border-right: 1px solid var(--line-3);
}
.hero__mark--bl {
  bottom: calc(var(--mark-off) * -1);
  left: 0;
  border-bottom: 1px solid var(--line-3);
  border-left: 1px solid var(--line-3);
}

/* I CERCHI. Danno alla scena la profondità che prima le dava l'ombra del
   riquadro. Sono due filetti alla stessa opacità delle linee del sito: si
   vedono se li si cerca e non prima, che è la definizione di uno sfondo.
   Niente `z-index`: restano sotto `.hero__grid`, che ne ha 2. */
.hero__rings {
  position: absolute;
  right: -13%;
  top: 50%;
  width: min(1180px, 78vw);
  aspect-ratio: 1;
  transform: translateY(-50%);
  border: 1px solid var(--line);
  border-radius: 50%;
  opacity: 0.7;
  pointer-events: none;
}
.hero__rings::before {
  content: "";
  position: absolute;
  inset: 14%;
  border: 1px solid var(--line);
  border-radius: 50%;
}

/* ===========================================================================
   SIMULATORE  (par. 14.2, 15) — l'oggetto Glass 3. Uno per pagina.
   =========================================================================== */
.sim {
  --sim-pad: clamp(14px, 1.5vw, 20px);
  position: relative;
  z-index: 2;
  overflow: hidden;
  font-size: 0.94rem;
}

/* Barra superiore: assistente, modello, stato (par. 15.1). */
.sim__bar {
  display: flex;
  align-items: center;
  gap: 12px;
  padding: 13px var(--sim-pad);
  border-bottom: 1px solid var(--line);
  background: var(--surface);
}
.sim__avatar {
  width: 32px; height: 32px; flex: none;
  border-radius: var(--r-sm);
  display: grid; place-items: center;
  background: var(--accent-fg);
  color: var(--on-accent);
  font-family: var(--f-display);
  font-weight: 800;
  font-size: 0.86rem;
  transition: background-color var(--t-slow) var(--ease), color var(--t-slow) var(--ease);
}
/* `display: block` non è cosmetico: `overflow` e `text-overflow` NON si
   applicano agli elementi inline non rimpiazzati. Da <span> inline il nome
   non veniva troncato e su schermo stretto finiva sotto la pastiglia del
   modello, sovrapposto. */
.sim__name {
  display: block;
  font-weight: 600; font-size: 0.92rem; color: var(--text);
  white-space: nowrap; overflow: hidden; text-overflow: ellipsis;
}
/* Il settore può essere lungo («Manifattura, materiali, retail tecnico»): su
   due righe spingerebbe in basso tutta la barra. Si tronca. */
.sim__role {
  font-family: var(--f-mono); font-size: var(--fs-micro); letter-spacing: 0.05em;
  color: var(--text-3); text-transform: uppercase;
  display: block;
  white-space: nowrap; overflow: hidden; text-overflow: ellipsis;
}
.sim__who { min-width: 0; flex: 1 1 auto; }

/* Selettore del modello: il documento chiede di poter cambiare modello (par. 14.2). */
.sim__model {
  margin-left: auto;
  display: inline-flex; align-items: center; gap: 7px;
  padding: 6px 12px;
  border-radius: var(--r-pill);
  border: 1px solid var(--line-2);
  background: var(--surface);
  font-family: var(--f-mono); font-size: var(--fs-micro); color: var(--text-2);
  cursor: pointer;
  flex: none;
  white-space: nowrap;   /* «Modello bilanciato» su due righe alzerebbe la barra */
  transition: border-color var(--t-fast) var(--ease), color var(--t-fast) var(--ease);
}
.sim__model:hover { border-color: var(--line-3); color: var(--text); }
.sim__model svg { width: 10px; height: 10px; opacity: 0.7; }

.sim__status {
  display: inline-flex; align-items: center; gap: 6px;
  font-family: var(--f-mono); font-size: var(--fs-micro); color: var(--text-3);
  flex: none;
}
.sim__dot {
  width: 7px; height: 7px; border-radius: 50%;
  background: var(--verified);
  box-shadow: 0 0 0 3px var(--ok-bg);
}

/* Corpo: chat a sinistra, pannello di analisi a destra (par. 15.1).
   L'altezza è FISSA e non un minimo. Con `min-height` la riga della griglia
   cresce fino al più alto dei due contenuti: il pannello fonti, con tre
   estratti e la barra di attendibilità, arriva oltre i 600px e spinge il
   simulatore fuori dalla prima schermata — che è esattamente ciò che la hero
   non deve fare. Con un'altezza fissa le due colonne scorrono ciascuna per
   conto proprio e l'oggetto sta nel viewport.
   È salita da 392 a 420px: con Inter e la scala tipografica alzata, alla
   vecchia altezza la prima risposta finiva sotto il bordo. */
.sim__body {
  display: grid;
  grid-template-columns: minmax(0, 1fr) 250px;
  height: var(--sim-body-h, 420px);
}
.sim__chat {
  display: flex;
  flex-direction: column;
  padding: var(--sim-pad);
  gap: 14px;
  overflow-y: auto;
  /* Indispensabile perché l'overflow funzioni dentro una riga di griglia:
     senza, la traccia si allarga al contenuto invece di farlo scorrere. */
  min-height: 0;
}

/* ---------------------------------------------------------------------------
   LE FINESTRE CHE SCORRONO NON MOSTRANO LA BARRA
   ---------------------------------------------------------------------------
   Simulatore e blocchi di codice sono OGGETTI dentro la pagina: un riquadro
   di vetro con dentro una conversazione, una finestra di terminale con dentro
   uno snippet. La barra di scorrimento del sistema operativo li attraversa da
   cima a fondo con una lastra grigia che non appartiene a nessuno dei due, e
   compare o sparisce a seconda del contenuto — quindi lo stesso riquadro non
   ha nemmeno sempre la stessa larghezza interna.

   SI TOGLIE LA BARRA, NON LO SCORRIMENTO: `overflow` resta `auto`, quindi
   rotella, trascinamento su touch, gesto sul trackpad e FRECCE DA TASTIERA
   continuano a funzionare. `scrollbar-width: none` copre Firefox e i browser
   moderni, `::-webkit-scrollbar` copre Chrome e Safari, `-ms-overflow-style`
   i vecchi Edge.

   Il segnale che c'è altro da vedere non si perde: resta il taglio netto del
   contenuto sul bordo del riquadro — una riga di testo mozzata a metà altezza,
   una riga di codice che esce dal lato destro. È lo stesso indizio che usano
   le liste della barra dei prompt qui sotto, che già nascondevano la barra.

   Fuori da questo elenco NON si tocca niente: la tabella di confronto degli
   assistenti (`.matrix-wrap`) tiene la sua, perché lì lo scorrimento
   orizzontale è l'unico modo di arrivare alle colonne di destra e non c'è un
   bordo tagliato che lo suggerisca con altrettanta chiarezza.

   `.snippet__code` — il codice di integrazione — è USCITO da questo elenco:
   adesso va a capo e non scorre più, quindi non ha nessuna barra da
   nascondere. Il motivo del capo-riga sta accanto alla regola, in fondo al
   file. Resta `.code__body`, la finestra a schede di API e MCP, dove il
   codice è un LISTATO e la riga deve restare intera.
   --------------------------------------------------------------------------- */
.sim__chat,
.sim__panel,
.code__body {
  scrollbar-width: none;
  -ms-overflow-style: none;
}
.sim__chat::-webkit-scrollbar,
.sim__panel::-webkit-scrollbar,
.code__body::-webkit-scrollbar { width: 0; height: 0; }

/* Versione «sola conversazione»: niente pannello laterale, niente piede.
   La usa la hero della home, dove chi arriva non sa ancora cosa sia ANTEX:
   fonti, attendibilità, scheda lead e configurazione tutte insieme, in prima
   schermata, davanti a un visitatore che non conosce l'argomento, sono
   esattamente il muro di informazioni che la home nuova deve togliere.
   Chi vuole vedere tutto va nelle simulazioni, dove c'è anche la guida. */
.sim--talk .sim__body { grid-template-columns: minmax(0, 1fr); height: auto; }
/* Piu' alto del riquadro completo, non meno: qui la chat e' sola in larghezza
   e ha la conversazione intera dentro (domanda, risposta di tre paragrafi e
   le chip delle fonti). A 400px l'ultima chip restava tagliata a meta' dal
   bordo — si legge come un errore di rendering, non come «c'e' altro sotto»,
   perche' nella hero nessuno pensa a scorrere DENTRO un riquadro. */
.sim--talk .sim__chat { height: clamp(340px, 56vh, 520px); }
.sim--talk .sim__side { display: none; }
/* Con la hero a piena larghezza questo riquadro arriva oltre i 900px, e il
   92% di 900 è una riga da 130 caratteri: illeggibile, e non somiglia più a
   una chat. Le bolle si fermano alla misura di lettura e il resto della
   larghezza diventa quello che è in ogni chat vera — lo stacco fra chi
   chiede (a destra) e chi risponde (a sinistra). */
.sim--talk .msg { max-width: min(92%, 640px); }

/* ---------------------------------------------------------------------------
   SENZA RIQUADRO — la hero della home
   ---------------------------------------------------------------------------
   Stessa conversazione, niente finestra intorno. Il vetro (`.g3`) porta fondo,
   bordo, angoli e ombra: quattro segnali che dicono insieme «questo è un
   componente, appoggiato sopra la pagina». Nella hero è il messaggio
   sbagliato — chi arriva deve vedere qualcosa che succede lì, non l'anteprima
   di un widget. Quindi la classe del vetro non c'è affatto (la sceglie il PHP,
   vedi `$sim_class` in _simulator.php) e qui si tolgono anche i tre fondi
   interni che restavano: la barra, il piede e le rispettive linee.

   NON è «il simulatore con le regole spente». Senza cornice le proporzioni
   cambiano: il testo cresce, le bolle respirano, l'avatar diventa leggibile a
   distanza. Un riquadro si guarda da vicino, una scena si guarda da lontano.
   --------------------------------------------------------------------------- */
.sim--open {
  overflow: visible;             /* niente da ritagliare: non c'è un bordo */
  font-size: 0.98rem;
}
.sim--open .sim__bar {
  background: none;
  border-bottom: 0;
  padding: 0 0 22px;
  gap: 14px;
}
.sim--open .sim__avatar { width: 40px; height: 40px; font-size: 1rem; border-radius: var(--r-md); }
.sim--open .sim__name { font-size: 1.04rem; }
.sim--open .sim__chat { padding: 0; gap: 16px; }
.sim--open .sim__foot {
  background: none;
  border-top: 0;
  padding: 20px 0 0;
}
.sim--open .msg__bubble { padding: 14px 18px; font-size: 0.95rem; }
/* Le pastiglie del piede sono l'unica cosa che tocca il fondo della sezione
   senza una superficie sotto: senza un filo di bordo sparirebbero. */
.sim--open .prompt { border-color: var(--line); }
.sim--open .prompt:hover { border-color: var(--accent-line); }

/* IL TAGLIO IN FONDO DIVENTA UNA DISSOLVENZA.
   L'altezza della chat resta fissa (senza, ogni scenario darebbe alla hero
   un'altezza diversa e la pagina salterebbe a ogni giro del ciclo). Ma dentro
   un riquadro il taglio netto sul bordo si legge come «c'è altro sotto»,
   mentre senza riquadro si legge come testo tagliato a metà, cioè come un
   difetto. Le ultime righe sfumano: stesso indizio, nessun sospetto di rotto.
   La maschera è solo in basso — sfumare anche in alto nasconderebbe la
   domanda, che è l'unica cosa da cui la scena si capisce. */
.sim--open.sim--talk .sim__chat {
  height: clamp(330px, 50vh, 470px);
  -webkit-mask-image: linear-gradient(180deg, #000 calc(100% - 44px), transparent);
          mask-image: linear-gradient(180deg, #000 calc(100% - 44px), transparent);
}

/* --- Messaggi --- */
.msg { max-width: 92%; }
.msg--user { align-self: flex-end; }
.msg__bubble {
  padding: 12px 16px;
  border-radius: var(--r-md);
  line-height: 1.62;
  font-size: 0.92rem;
}
.msg--user .msg__bubble {
  background: var(--accent-fg);
  color: var(--on-accent);
  border-bottom-right-radius: var(--r-xs);
  font-weight: 500;
}
.msg--bot .msg__bubble {
  background: var(--surface);
  border: 1px solid var(--line);
  color: var(--text);
  border-bottom-left-radius: var(--r-xs);
}
.msg__bubble strong { color: var(--accent-fg); font-weight: 600; }
.msg--bot .msg__bubble p { margin: 0 0 0.7em; max-width: none; }

/* Citazione in linea: il numeretto che rimanda alla fonte. */
.cite {
  display: inline-flex; align-items: center; justify-content: center;
  min-width: 17px; height: 17px; padding: 0 4px;
  margin-left: 3px;
  border-radius: var(--r-xs);
  background: var(--accent-soft);
  border: 1px solid var(--accent-line);
  color: var(--accent-fg);
  font-family: var(--f-mono); font-size: 0.68rem; font-weight: 700;
  vertical-align: 2px;
  cursor: pointer;
  transition: background-color var(--t-fast) var(--ease);
}
.cite:hover { background: var(--accent-line); }

/* Chip fonte sotto la risposta. */
.msg__srcs { display: flex; flex-wrap: wrap; gap: 6px; margin-top: 10px; }
.chip {
  display: inline-flex; align-items: center; gap: 6px;
  padding: 5px 10px;
  border-radius: var(--r-xs);
  background: var(--surface);
  border: 1px solid var(--line);
  font-family: var(--f-mono); font-size: var(--fs-micro); color: var(--text-2);
  cursor: pointer;
  transition: border-color var(--t-fast) var(--ease), color var(--t-fast) var(--ease);
}
.chip:hover { border-color: var(--accent-line); color: var(--text); }
.chip__kind {
  font-size: 0.7rem; font-weight: 700; letter-spacing: 0.05em;
  color: var(--accent-fg); text-transform: uppercase;
}

/* Puntini di elaborazione. */
.typing { display: inline-flex; align-items: center; gap: 4px; padding: 13px 16px; }
.typing i {
  width: 5px; height: 5px; border-radius: 50%;
  background: var(--text-2);
  animation: typing 1.3s var(--ease) infinite;
}
.typing i:nth-child(2) { animation-delay: 0.16s; }
.typing i:nth-child(3) { animation-delay: 0.32s; }
@keyframes typing {
  0%, 60%, 100% { opacity: 0.25; transform: translateY(0); }
  30%           { opacity: 1;    transform: translateY(-3px); }
}

/* Riga di stato "sto leggendo le fonti" (par. 15.2, stato 3). */
.sim__thinking {
  display: flex; align-items: center; gap: 9px;
  font-family: var(--f-mono); font-size: var(--fs-micro); color: var(--text-3);
  padding: 2px 0;
}
.sim__thinking .spin {
  width: 12px; height: 12px; flex: none;
  border: 1.5px solid var(--line-2);
  border-top-color: var(--accent-fg);
  border-radius: 50%;
  animation: spin 0.8s linear infinite;
}
@keyframes spin { to { transform: rotate(360deg); } }

/* Azioni contestuali (par. 14.10): compaiono in base all'argomento. */
.sim__actions { display: flex; flex-wrap: wrap; gap: 7px; margin-top: 4px; }
.act {
  display: inline-flex; align-items: center; gap: 7px;
  padding: 8px 14px;
  border-radius: var(--r-pill);
  border: 1px solid var(--accent-line);
  background: var(--accent-soft);
  color: var(--accent-fg);
  font-size: var(--fs-small); font-weight: 600;
  cursor: pointer;
  transition: background-color var(--t-fast) var(--ease), transform var(--t-fast) var(--ease);
}
.act:hover { background: var(--accent-line); transform: translateY(-1px); }
.act svg { width: 13px; height: 13px; }

/* --- Pannello laterale: fonti / lead / configurazione --- */
.sim__side {
  border-left: 1px solid var(--line);
  background: var(--inset-bg);
  display: flex;
  flex-direction: column;
  min-width: 0;
  min-height: 0;   /* come .sim__chat: abilita lo scorrimento del pannello */
}
.sim__tabs {
  display: flex;
  padding: 4px;
  gap: 2px;
  border-bottom: 1px solid var(--line);
}
.sim__tab {
  flex: 1;
  padding: 8px 4px;
  border: 0; background: transparent;
  border-radius: var(--r-xs);
  font-family: var(--f-mono); font-size: var(--fs-micro); letter-spacing: 0.04em;
  text-transform: uppercase;
  color: var(--text-3);
  cursor: pointer;
  transition: background-color var(--t-fast) var(--ease), color var(--t-fast) var(--ease);
}
.sim__tab:hover { color: var(--text); }
.sim__tab[aria-selected="true"] { background: var(--surface); color: var(--accent-fg); }

.sim__panel { padding: 13px; overflow-y: auto; flex: 1; min-height: 0; display: none; }
.sim__panel.is-active { display: block; }

.panel__head {
  font-family: var(--f-mono); font-size: var(--fs-micro); letter-spacing: 0.12em;
  text-transform: uppercase; color: var(--text-3); margin-bottom: 11px;
}

/* Scheda fonte con estratto: il documento chiede l'estratto usato, non solo il
   nome del file (par. 14.11). */
.src {
  padding: 11px;
  border-radius: var(--r-sm);
  background: var(--surface);
  border: 1px solid var(--line);
  margin-bottom: 8px;
  transition: border-color var(--t-fast) var(--ease), background-color var(--t-fast) var(--ease);
}
.src.is-lit { border-color: var(--accent-line); background: var(--accent-soft); }
.src__top { display: flex; align-items: center; gap: 7px; margin-bottom: 6px; }
.src__n {
  width: 17px; height: 17px; flex: none;
  display: grid; place-items: center;
  border-radius: 4px;
  background: var(--accent-fg); color: var(--on-accent);
  font-family: var(--f-mono); font-size: 0.66rem; font-weight: 700;
}
.src__name {
  font-size: var(--fs-small); font-weight: 600; color: var(--text);
  overflow: hidden; text-overflow: ellipsis; white-space: nowrap;
}
.src__ex {
  font-size: 0.82rem; line-height: 1.55; color: var(--text-2);
  border-left: 2px solid var(--accent-line);
  padding-left: 9px;
  margin-bottom: 7px;
}
.src__meta {
  font-family: var(--f-mono); font-size: var(--fs-micro); color: var(--text-3);
  display: flex; gap: 8px; flex-wrap: wrap;
}

/* Indicatore di attendibilità. Colore + etichetta + barra: mai il solo colore. */
.conf { margin-top: 12px; padding-top: 12px; border-top: 1px solid var(--line); }
.conf__row { display: flex; align-items: baseline; justify-content: space-between; gap: 10px; margin-bottom: 7px; }
.conf__label {
  font-family: var(--f-mono); font-size: var(--fs-micro); letter-spacing: 0.09em;
  text-transform: uppercase; color: var(--text-3);
}
.conf__val { font-size: 0.84rem; font-weight: 700; }
.conf__bar { height: 4px; border-radius: 2px; background: var(--line); overflow: hidden; }
.conf__fill {
  height: 100%; border-radius: 2px;
  width: 0;
  transition: width var(--t-slow) var(--ease), background-color var(--t-slow) var(--ease);
}
.conf--high .conf__val  { color: var(--verified); }
.conf--high .conf__fill { background: var(--verified); }
.conf--mid  .conf__val  { color: var(--caution); }
.conf--mid  .conf__fill { background: var(--caution); }
.conf--low  .conf__val  { color: var(--absent); }
.conf--low  .conf__fill { background: var(--absent); }
.conf__note { font-size: 0.8rem; line-height: 1.5; color: var(--text-3); margin-top: 8px; }

/* Scheda lead che si compila da sola (par. 14.9).
   L'opacità delle righe non compilate è salita da 0,32 a 0,45: a un terzo il
   testo era illeggibile, e la riga «non ancora dedotta» è un'informazione,
   non un elemento decorativo. */
.lead__row {
  display: grid;
  grid-template-columns: 84px 1fr;
  gap: 8px;
  padding: 7px 0;
  border-bottom: 1px solid var(--line);
  font-size: 0.82rem;
  opacity: 0.45;
  transition: opacity var(--t-slow) var(--ease);
}
.lead__row.is-filled { opacity: 1; }
.lead__k {
  font-family: var(--f-mono); font-size: var(--fs-micro); letter-spacing: 0.05em;
  text-transform: uppercase; color: var(--text-3); padding-top: 1px;
}
.lead__v { color: var(--text); font-weight: 500; min-height: 1.2em; }
.lead__v:empty::after { content: "—"; color: var(--text-3); font-weight: 400; }
.lead__score {
  margin-top: 12px; padding: 10px 12px;
  border-radius: var(--r-sm);
  background: var(--ok-bg);
  border: 1px solid var(--ok-line);
  font-size: 0.82rem; color: var(--verified); font-weight: 600;
  display: flex; align-items: center; gap: 8px;
}

/* Configurazione dell'assistente, terzo pannello. */
.cfg__row { padding: 8px 0; border-bottom: 1px solid var(--line); font-size: 0.82rem; }
.cfg__k {
  font-family: var(--f-mono); font-size: var(--fs-micro); letter-spacing: 0.07em;
  text-transform: uppercase; color: var(--text-3); margin-bottom: 3px;
}
.cfg__v { color: var(--text); line-height: 1.45; }

/* Piede: prompt suggeriti e controlli (par. 15.4). */
.sim__foot {
  border-top: 1px solid var(--line);
  padding: 11px var(--sim-pad);
  background: var(--inset-bg);
}
.sim__prompts {
  display: flex; gap: 7px;
  overflow-x: auto;
  padding-bottom: 3px;
  scrollbar-width: none;
}
.sim__prompts::-webkit-scrollbar { display: none; }
.prompt {
  flex: none;
  padding: 8px 13px;
  border-radius: var(--r-pill);
  border: 1px solid var(--line-2);
  background: transparent;
  color: var(--text-2);
  font-size: 0.84rem;
  cursor: pointer;
  white-space: nowrap;
  /* Una domanda suggerita può essere lunga quanto la domanda stessa: senza un
     tetto, la pastiglia diventa larga quanto il simulatore. Si tronca e il
     testo intero resta nel `title`. */
  max-width: 260px;
  overflow: hidden;
  text-overflow: ellipsis;
  transition: border-color var(--t-fast) var(--ease), color var(--t-fast) var(--ease), background-color var(--t-fast) var(--ease);
}
.prompt:hover { border-color: var(--accent-line); color: var(--text); background: var(--accent-soft); }
.prompt[aria-pressed="true"] { border-color: var(--accent-fg); color: var(--accent-fg); background: var(--accent-soft); }

.sim__ctrl { display: flex; align-items: center; gap: 8px; margin-top: 10px; }
.sim__btn {
  display: inline-flex; align-items: center; gap: 7px;
  padding: 7px 12px;
  border-radius: var(--r-pill);
  border: 1px solid var(--line-2);
  background: transparent;
  color: var(--text-2);
  font-family: var(--f-mono); font-size: var(--fs-micro); letter-spacing: 0.03em;
  cursor: pointer;
  transition: color var(--t-fast) var(--ease), border-color var(--t-fast) var(--ease);
}
.sim__btn:hover { color: var(--text); border-color: var(--line-3); }
.sim__btn svg { width: 12px; height: 12px; }
/* Il risultato per l'azienda è una frase intera: su una riga sola sta accanto
   ai controlli, su due li scavalca. Si tronca; il testo completo resta nel
   `title` e per esteso nella sezione «Simulazioni d'uso». */
.sim__hint {
  margin-left: auto;
  min-width: 0;
  font-family: var(--f-mono); font-size: var(--fs-micro); color: var(--text-3);
  white-space: nowrap; overflow: hidden; text-overflow: ellipsis;
}

/* ---------------------------------------------------------------------------
   IL RIQUADRO CHE PRENDE IL POSTO DEL SIMULATORE SU SCHERMO STRETTO
   ---------------------------------------------------------------------------
   Prima era una NOTA sotto il simulatore: «su schermo grande le parti si
   vedono affiancate». Vera e inutile — chi legge da telefono non ha uno
   schermo grande sotto mano, e intanto si trovava comunque davanti la scena
   impilata: sei riquadri in fila per cinque schermate, in cui confrontare la
   risposta con la fonte che la sostiene vuol dire scorrere avanti e indietro
   a memoria. La dimostrazione non dimostrava, stancava.

   Adesso sotto gli 860px il simulatore NON C'E': al suo posto c'è questo
   riquadro, che invita a riaprire la pagina da computer e dice perché.
   Nascosto di partenza e acceso dalla media query, perché la larghezza la
   conosce il CSS e non il PHP.

   È un invito, non un errore: niente colore di avviso, niente icona di
   pericolo. Fondo d'accento tenue e l'icona dello schermo, che è esattamente
   di cosa si sta parlando.
   --------------------------------------------------------------------------- */
.simoff {
  display: none;
  align-items: flex-start;
  gap: 14px;
  margin: 0;
  padding: clamp(18px, 2.4vw, 24px);
  border-radius: var(--r-lg);
  border: 1px solid var(--accent-line);
  background: var(--accent-soft);
  max-width: none;
}
.simoff__ico {
  width: 38px; height: 38px; flex: none;
  display: grid; place-items: center;
  border-radius: var(--r-sm);
  border: 1px solid var(--accent-line);
  background: var(--surface);
  color: var(--accent-fg);
}
.simoff__ico svg { width: 19px; height: 19px; }
.simoff__say { min-width: 0; }
.simoff__t {
  margin: 0 0 6px;
  font-family: var(--f-display);
  font-weight: 700;
  font-size: 1.02rem;
  letter-spacing: -0.02em;
  color: var(--text);
}
/* `max-width: none` perché la regola generale dà a ogni <p> 68ch: qui il
   riquadro è già la misura, e un tetto dentro un tetto lascia una colonna
   vuota a destra dentro un rettangolo colorato. */
.simoff__d {
  margin: 0;
  max-width: none;
  font-size: var(--fs-small);
  line-height: 1.62;
  color: var(--text-2);
}

/* ---------------------------------------------------------------------------
   IL CARTELLO DI AVVIO  (pagina «Simulazioni»)
   ---------------------------------------------------------------------------
   La scena partiva da sola all'ingresso nel viewport e chi arrivava non
   capiva che cosa avesse davanti: qualcosa che va avanti da sé? una finestra
   in cui digitare? Nel dubbio non faceva niente, ed è il difetto peggiore
   possibile sulla pagina che deve far vedere il prodotto al lavoro.

   Copre il SIMULATORE e non la pagina — sta dentro `.sim`, che è già
   `position: relative` — quindi non è una finestra modale: non intrappola il
   fuoco, non blocca lo scorrimento, non ha niente da chiudere. Il velo è
   opaco quasi del tutto (vedi `--veil` in antex.css): un velo trasparente
   darebbe una conversazione mezza leggibile sotto la scritta «avvia», che è
   il modo più sicuro di far leggere quella e non questa.
   --------------------------------------------------------------------------- */
.sim { position: relative; }
.simstart {
  position: absolute;
  inset: 0;
  z-index: 3;
  display: grid;
  place-items: center;
  padding: 20px;
  background: var(--veil);
  border-radius: inherit;
}
.simstart__card { text-align: center; max-width: 46ch; }
.simstart__t {
  margin: 0 0 16px;
  font-family: var(--f-display);
  font-weight: 700;
  font-size: clamp(1.05rem, 1.5vw, 1.3rem);
  letter-spacing: -0.02em;
  color: var(--text);
}
.simstart__btn svg { width: 15px; height: 15px; }
/* La riga sotto il pulsante è la metà che toglie il dubbio — dice che da lì
   in poi si guarda e basta — quindi non è una postilla: stessa misura del
   testo piccolo del sito, non del micro. */
.simstart__d {
  margin: 16px auto 0;
  max-width: 44ch;
  font-size: var(--fs-small);
  line-height: 1.6;
  color: var(--text-2);
}

/* ---------------------------------------------------------------------------
   IL CARTELLO SULLA RISPOSTA FUORI COPIONE
   ---------------------------------------------------------------------------
   Quando si sceglie una domanda che il copione non prevede, l'assistente dice
   che non ha una fonte. Il PERCHÉ quella sia la risposta giusta — ed è il
   motivo per cui la domanda sta lì — stava dentro la stessa bolla, in coda.
   Chi guarda una chat legge la chat: la prima frase la leggeva, il
   ragionamento no.

   Qui è un oggetto diverso e si vede che lo è: fondo d'accento, nessun raggio
   da fumetto, un'etichetta in monospaziato e una freccia che punta in su alla
   risposta. Un cartello messo accanto, non un'altra battuta del dialogo.
   --------------------------------------------------------------------------- */
.simtip {
  position: relative;
  margin: 4px 0 0 0;
  padding: 14px 16px;
  border-radius: var(--r-sm);
  border: 1px solid var(--accent-line);
  background: var(--accent-soft);
}
/* La freccia: due triangoli sovrapposti, quello di sotto grande quanto basta
   a fare da bordo. Sta a sinistra e non al centro perché punta alla bolla
   della risposta, che è allineata a sinistra: al centro indicherebbe il vuoto
   fra le due bolle. */
.simtip::before,
.simtip::after {
  content: "";
  position: absolute;
  left: 22px;
  width: 0; height: 0;
  border-left: 8px solid transparent;
  border-right: 8px solid transparent;
}
.simtip::before {
  top: -9px;
  border-bottom: 9px solid var(--accent-line);
}
.simtip::after {
  top: -8px;
  border-bottom: 8px solid var(--accent-soft);
}
.simtip__label {
  margin: 0 0 6px;
  font-family: var(--f-mono);
  font-size: var(--fs-micro);
  letter-spacing: 0.12em;
  text-transform: uppercase;
  color: var(--accent-fg);
}
.simtip__t {
  margin: 0 0 5px;
  font-weight: 700;
  font-size: 0.96rem;
  letter-spacing: -0.01em;
  color: var(--text);
}
.simtip__d {
  margin: 0;
  max-width: none;
  font-size: var(--fs-small);
  line-height: 1.6;
  color: var(--text-2);
}

/* Avviso: è una simulazione, non un modello dal vivo (par. 22.7 e 27.4). */
.sim__disclaimer {
  margin-top: 14px;
  font-family: var(--f-mono);
  font-size: var(--fs-micro);
  line-height: 1.6;
  color: var(--text-3);
  text-align: center;
}
/* `text-align: center` centra il testo DENTRO il paragrafo, non il paragrafo:
   la regola di base dà a ogni <p> un tetto di 68ch, quindi il blocco resta
   ancorato a sinistra e sotto un simulatore più largo di quei 68ch l'avviso
   esce dall'asse. Finché il riquadro era largo quanto il testo non si vedeva;
   a piena larghezza sì. Solo nella hero: in «Simulazioni d'uso» lo stesso
   paragrafo è allineato a sinistra apposta e centrarlo lo sposterebbe. */
.hero__sim .sim__disclaimer { margin-inline: auto; }
/* Nella pagina «Simulazioni» lo stesso avviso è allineato a sinistra: lì sotto
   il simulatore comincia il testo della pagina, e una riga centrata in mezzo a
   contenuto allineato a sinistra si legge come un blocco fuori posto. Era un
   attributo `style` in pagina; una regola di allineamento è una regola di
   stile, e in un attributo non la trova più nessuno. */
.sim__disclaimer--left { text-align: left; max-width: 70ch; }

/* ===========================================================================
   VISITA GUIDATA DEL SIMULATORE
   ---------------------------------------------------------------------------
   IL PROBLEMA CHE RISOLVE. Il simulatore mostra sei cose insieme: la
   conversazione, le chip delle fonti, il pannello con gli estratti, la barra
   dell'attendibilità, la scheda lead che si compila e la configurazione.
   Sono tutte importanti — è il motivo per cui esistono — ma chi arriva le
   riceve tutte nello stesso istante e senza gerarchia: legge la chat (l'unica
   cosa che riconosce), e tutto il resto gli scorre accanto senza essere
   guardato. Chi invece prova a guardare tutto si arrende.

   LA SOLUZIONE. Una zona per volta. Il motore accende una zona, spegne le
   altre e scrive accanto che cosa si sta guardando; chi legge segue, e alla
   fine ha visto tutte e cinque le parti invece di una sola.

   COME SI SPEGNE UNA ZONA. Con opacità e saturazione, MAI con `filter: blur`
   e mai scendendo sotto 0,35: quello che è in ombra deve restare leggibile
   per chi ha già capito e vuole guardare avanti. La guida accompagna lo
   sguardo, non lo costringe.

   SENZA JAVASCRIPT o con movimento ridotto: tutte le zone restano accese e i
   passi si leggono come un elenco. Non si perde niente.
   =========================================================================== */
/* I PASSI IN RIGA, LA SPIEGAZIONE SOTTO.
   Prima erano una colonna sola a sinistra e il testo a destra: cinque
   pastiglie in una colonna stretta andavano a capo tre volte, in righe di
   lunghezza diversa. Un percorso a tappe letto come un elenco sbilenco non
   dice più che è un percorso — e la larghezza che gli serviva era tutta lì,
   nella colonna accanto.
   Adesso i cinque passi stanno su una riga sola, di pari larghezza, e la
   spiegazione del passo attivo cade subito sotto: si legge da sinistra a
   destra come una sequenza, e la risposta è dove si sta già guardando. */
.simguide {
  display: grid;
  grid-template-columns: minmax(0, 1fr);
  gap: 14px;
  align-items: start;
  margin-bottom: 18px;
  padding: 16px 18px;
  border-radius: var(--r-lg);
  border: 1px solid var(--line);
  background: var(--surface);
}
.simguide__label {
  grid-column: 1 / -1;
  font-family: var(--f-mono); font-size: var(--fs-micro); letter-spacing: 0.12em;
  text-transform: uppercase; color: var(--text-3);
  margin: 0 0 2px;
}
/* Griglia e non flex: `flex-wrap` dà righe di lunghezza diversa, cinque
   colonne uguali danno una sequenza. Le due soglie servono perché il passo
   più lungo («Cosa ha capito di chi scrive») sotto i ~150px di colonna
   andrebbe su quattro righe. */
.simguide__steps {
  display: grid;
  grid-template-columns: repeat(5, minmax(0, 1fr));
  gap: 8px;
}
.simguide__step {
  display: flex; align-items: center; gap: 8px;
  padding: 10px 12px;
  /* Non più una pastiglia: con l'etichetta su due righe il raggio `pill`
     disegna due semicerchi ai lati e la cella sembra deformata. */
  border-radius: var(--r-sm);
  border: 1px solid var(--line-2);
  background: transparent;
  color: var(--text-2);
  font-size: 0.84rem; font-weight: 500;
  cursor: pointer;
  text-align: left;
  transition: border-color var(--t-fast) var(--ease), color var(--t-fast) var(--ease), background-color var(--t-fast) var(--ease);
}
.simguide__step:hover { color: var(--text); border-color: var(--line-3); }
/* Il passo corrente non è distinto dal solo colore: ha anche il numero pieno
   e il peso del testo. Chi non distingue i colori vede comunque quale sta
   guardando. */
.simguide__step[aria-current="true"] {
  border-color: var(--accent-fg);
  color: var(--accent-fg);
  background: var(--accent-soft);
  font-weight: 600;
}
.simguide__n {
  width: 19px; height: 19px; flex: none;
  display: grid; place-items: center;
  border-radius: 50%;
  border: 1px solid currentColor;
  font-family: var(--f-mono); font-size: 0.68rem; font-weight: 700;
}
.simguide__step[aria-current="true"] .simguide__n {
  background: var(--accent-fg);
  color: var(--on-accent);
  border-color: var(--accent-fg);
}
/* Il passo già visto resta segnato: dice quanto manca. */
.simguide__step.is-done .simguide__n { background: var(--accent-soft); }

/* Il minimo d'altezza NON è un numero a caso: le cinque spiegazioni vanno da
   89 a 155 caratteri, cioè da due a tre righe. Senza, il riquadro si
   accorcerebbe e si allungherebbe da solo ogni quattro secondi mentre la
   guida avanza, e con lui salterebbe il simulatore che sta sotto — mentre
   qualcuno lo sta guardando, che è esattamente quando non deve succedere. */
.simguide__say { min-width: 0; min-height: 5.4rem; }
.simguide__t {
  font-family: var(--f-display); font-weight: 700; font-size: 1.02rem;
  letter-spacing: -0.02em; color: var(--text); margin: 0 0 5px;
}
.simguide__d {
  margin: 0;
  font-size: var(--fs-small);
  line-height: 1.6;
  color: var(--text-2);
  max-width: 62ch;
}

/* ---------------------------------------------------------------------------
   LA GUIDA IN COLONNA A DESTRA  (pagina «Simulazioni»)
   ---------------------------------------------------------------------------
   I cinque passi in riga sopra il simulatore costavano ~150px di altezza, e
   con l'intestazione di pagina e il selettore dei casi spingevano la scena
   sotto la piega: si arrivava sulla pagina che deve mostrare il prodotto al
   lavoro e il prodotto non era a schermo.

   Di lato non costano niente: il riquadro è alto abbastanza da contenerli, e
   quello spazio lì era vuoto. Cambia anche come si leggono — un indice di
   cinque voci accanto a un oggetto, invece di una barra di avanzamento sopra
   di esso.

   NON è la vecchia colonna a sinistra che era stata tolta. Là i passi
   stavano in una colonna stretta CON ACCANTO la spiegazione, e cinque
   pastiglie andavano a capo tre volte; qui la colonna è larga 320px, ogni
   passo la occupa tutta e la spiegazione sta sotto l'elenco, dove ha la
   stessa larghezza.

   `align-items: start` e non `stretch`: la guida non deve allungarsi fino in
   fondo al simulatore lasciando dentro un riquadro mezzo vuoto.
   --------------------------------------------------------------------------- */
@media (min-width: 1100px) {
  .simstage--rail {
    display: grid;
    grid-template-columns: minmax(0, 1fr) 320px;
    gap: clamp(20px, 2vw, 30px);
    align-items: start;
  }
  /* L'ordine nel DOM è guida-poi-simulatore (chi ascolta la pagina sente
     prima cosa guarderà), l'ordine a schermo è l'opposto: l'oggetto a
     sinistra, dove l'occhio arriva per primo. */
  .simstage--rail .simguide { grid-column: 2; grid-row: 1; margin-bottom: 0; }
  .simstage--rail > .sim     { grid-column: 1; grid-row: 1; }
  .simstage--rail .simoff    { grid-column: 1 / -1; }
  /* In colonna i passi si impilano: uno per riga, a tutta larghezza. */
  .simstage--rail .simguide__steps { grid-template-columns: minmax(0, 1fr); }
  /* La spiegazione non deve più tenere l'altezza di tre righe fisse: in
     colonna il riquadro è alto e il salto non si vede. */
  .simstage--rail .simguide__say { min-height: 0; }
  /* L'ALTEZZA SEGUE LA FINESTRA, entro due estremi.
     420px fissi erano tarati sulla monopagina, dove il simulatore era una
     sezione fra le altre e sotto continuava la lettura. Qui è il contenuto
     della pagina e deve starci INTERO insieme all'intestazione e ai casi: su
     un portatile da 768px di altezza 420 non ci stanno, su un monitor alto
     lasciano vuoto. Il tetto a 430 resta perché sopra i ~450px la chat non
     guadagna niente — la conversazione è lunga quella che è, e il resto
     diventa spazio bianco dentro un riquadro. */
  .simstage--rail > .sim { --sim-body-h: clamp(300px, 40vh, 420px); }

  /* IL PIEDE SU UNA RIGA SOLA.
     Prompt suggeriti e controlli erano due righe sovrapposte: 114px di piede
     sotto un riquadro che deve stare in una schermata insieme
     all'intestazione e alla fila dei casi. Su una riga sono 52, e i 62px
     risparmiati sono esattamente quelli che decidono se la scena finisce
     sopra o sotto la piega.
     I prompt scorrono già in orizzontale con la barra nascosta, quindi
     stringerli non nasconde niente che prima si vedesse: `min-width: 0` è
     quello che glielo permette dentro un flex — senza, la traccia si allarga
     al contenuto e a spostarsi è il pulsante «riproduci».
     Solo qui: nella hero il piede ha spazio e due righe respirano meglio. */
  .simstage--rail .sim__foot {
    display: flex;
    align-items: center;
    gap: 14px;
  }
  /* Le due basi non sono `auto`, ed è la differenza fra funzionare e no:
     `.sim__ctrl` contiene la frase dell'esito, quindi a base automatica
     misura quanto quella frase intera e si prende tutta la riga, lasciando i
     prompt schiacciati a zero. Con una base in percentuale i due blocchi si
     dividono lo spazio e a stringersi è la frase, che è già scritta per
     troncarsi (il testo intero resta nel `title`). */
  /* LO SPAZIO VA AI PROMPT, non alla frase dell'esito.
     A base automatica `.sim__ctrl` misura quanto la frase intera e si prende
     tutta la riga: restava visibile UNA pastiglia sola, e le altre — fra cui
     la domanda fuori copione, che è metà del motivo per cui il simulatore sta
     lì — sparivano dentro uno scorrimento senza barra, cioè per sempre.
     Con una base fissa e stretta i tre suggerimenti ci stanno tutti (troncati,
     con il testo intero nel `title`) e a stringersi è la frase, che è già
     scritta per troncarsi. */
  .simstage--rail .sim__prompts { flex: 1 1 auto; min-width: 0; padding-bottom: 0; }
  .simstage--rail .sim__ctrl { flex: 0 1 250px; min-width: 0; margin-top: 0; }
  .simstage--rail .prompt { max-width: 170px; }
}

/* ---------------------------------------------------------------------------
   LA FILA DEI CASI, CON LA SUA ETICHETTA
   ---------------------------------------------------------------------------
   Sulla pagina «Simulazioni» l'occhiello della sezione è diventato
   l'etichetta del selettore: era l'unica parte dell'intestazione che non
   ripeteva l'intestazione di pagina, e sopra una fila di pulsanti dice
   esattamente cosa farne.
   --------------------------------------------------------------------------- */
.pickerbar { margin-bottom: clamp(14px, 1.6vw, 22px); }
.pickerbar .eyebrow { margin-bottom: 10px; }
.pickerbar .picker { margin-bottom: 0; }

/* La sezione-scena non ha bisogno del respiro pieno sopra: la separazione
   dalla barra la dà già l'intestazione di pagina, e quei ~120px erano la
   differenza fra vedere la scena e doverla cercare scorrendo. */
.sec--stage { padding-top: clamp(18px, 2.4vw, 34px); }

/* --- Le zone illuminate ---
   ---------------------------------------------------------------------------
   SI ACCENDE QUELLO CHE CONTA, NON SI SPEGNE IL RESTO.

   La prima versione faceva il contrario: la zona corrente restava com'era e
   tutte le altre scendevano al 38% di opacita'. A schermo funzionava benissimo
   — l'occhio andava dove doveva — ma misurando i colori risultanti il difetto
   e' grosso: il testo attenuato scendeva a 1,9:1 sul chiaro e 2,4:1 sullo
   scuro, cioe' sotto qualsiasi soglia leggibile. Per un attimo, va anche bene;
   ma quella zona resta li' per quattro secondi e mezzo, e chi legge piu' piano
   della guida si trova davanti testo che non puo' leggere.

   Adesso l'attenuazione e' leggera (0,68: il testo principale resta sopra
   4,5:1 in tutti e due i temi, misurato) e il lavoro lo fa l'ANELLO sulla zona
   accesa. E' anche piu' preciso: un contorno indica un punto, un'ombra indica
   solo «non qui».
   --------------------------------------------------------------------------- */
[data-focus] .sim__chat,
[data-focus] .sim__side,
[data-focus] [data-zone] {
  transition: opacity var(--t-slow) var(--ease),
              outline-color var(--t-slow) var(--ease),
              filter var(--t-slow) var(--ease);
}

/* Attenuazione del contenitore che NON contiene la zona accesa. */
.sim[data-focus="chat"] .sim__side,
.sim[data-focus="actions"] .sim__side { opacity: 0.68; filter: saturate(0.7); }
.sim[data-focus="sources"] .sim__chat,
.sim[data-focus="conf"] .sim__chat,
.sim[data-focus="lead"] .sim__chat { opacity: 0.68; filter: saturate(0.7); }

/* Dentro il pannello fonti si puo' guardare l'ELENCO oppure l'ATTENDIBILITA':
   sono due passi diversi e vanno separati, altrimenti il passo «quanto e'
   attendibile» punta un blocco alto tre righe in fondo a una colonna piena di
   estratti, e non lo trova nessuno. */
.sim[data-focus="sources"] .conf,
.sim[data-focus="conf"] [data-sim-sources] { opacity: 0.68; }

/* L'anello sulla zona accesa. Una regola sola per tutte e cinque: il valore di
   data-focus e' anche il nome della zona, quindi le coppie si scrivono in fila
   invece di inventare una classe per ciascuna.
   `outline` e non `border`: non occupa spazio e quindi non sposta niente
   quando compare — un bordo che appare allarga il blocco di due pixel e fa
   ballare tutto quello che ha intorno. */
.sim[data-focus="chat"]    [data-zone="chat"],
.sim[data-focus="sources"] [data-zone="sources"],
.sim[data-focus="conf"]    [data-zone="conf"],
.sim[data-focus="lead"]    [data-zone="lead"],
.sim[data-focus="actions"] [data-zone="actions"] {
  outline: 2px solid var(--accent-line);
  outline-offset: 3px;
  border-radius: var(--r-sm);
}
/* La chat e' il riquadro piu' grande e tocca i bordi del vetro: li' l'anello
   va portato DENTRO, altrimenti sborda dall'oggetto. */
.sim[data-focus="chat"] [data-zone="chat"] { outline-offset: -3px; }

/* ===========================================================================
   FASCIA DI FIDUCIA  (par. 14.3) — nastro, non griglia di card.
   Nessun logo cliente inventato, nessun numero non dimostrabile.
   =========================================================================== */
.strip {
  border-block: 1px solid var(--line);
  padding-block: 20px;
  background: var(--bg-2);
  overflow: hidden;
}
/* La geometria del nastro deve tornare al pixel: lo spazio tra le voci sta
   TUTTO dentro la lista (gap fra le voci + padding di coda) e il binario non
   ha gap proprio. Così translateX(-50%) vale esattamente una lista più il suo
   spazio finale, e il giro non salta. Con un gap sul binario il ciclo si
   sfaserebbe di mezzo gap ad ogni ripetizione. */
.strip__track {
  display: flex;
  width: max-content;
  animation: marquee 42s linear infinite;
}
.strip__list {
  display: flex;
  gap: 46px;
  padding-right: 46px;
}
.strip:hover .strip__track { animation-play-state: paused; }
@keyframes marquee {
  from { transform: translateX(0); }
  to   { transform: translateX(-50%); }
}
.strip__item {
  display: flex; align-items: center; gap: 10px;
  font-family: var(--f-mono); font-size: var(--fs-micro); letter-spacing: 0.03em;
  color: var(--text-2);
  white-space: nowrap;
}
.strip__item svg { width: 15px; height: 15px; color: var(--accent-fg); flex: none; }

/* ===========================================================================
   INTESTAZIONE DELLE PAGINE INTERNE
   Compatta di proposito: dice dove si è arrivati e lascia subito il posto al
   contenuto. Sotto la nav fissa serve un respiro in più, altrimenti l'H1
   comincia dietro la barra.
   =========================================================================== */
.pagehead {
  padding-top: calc(var(--sec-y-tight) + 84px);
  padding-bottom: var(--sec-y-tight);
  overflow: hidden;
  border-top: 0;
}
.pagehead__glow {
  width: 720px; height: 460px;
  right: -180px; top: -180px;
}
.pagehead__inner { position: relative; z-index: 2; max-width: 900px; }
.pagehead .lede { max-width: 64ch; }
/* La prima sezione dopo l'intestazione di pagina respira meno in alto: le due
   intestazioni sono gia' separate dal cambio di tono, e con il ritmo pieno di
   sezione fra un titolo e l'altro si aprivano quasi trecento pixel di vuoto —
   su una pagina che deve arrivare subito al punto, e' la prima cosa che si
   vede scorrendo. */
.pagehead + .sec { padding-top: var(--sec-y-tight); }

/* NON C'È PIÙ UN'INTESTAZIONE DI SECONDA SPECIE (31/08/2026).
   Esisteva una variante `.pagehead--compact` per la sola pagina «Simulazioni»:
   titolo a 2,15rem invece di 3, misure più larghe (34ch e 82 invece di 20 e
   64), respiro accorciato. Serviva a far entrare la scena nella prima
   schermata, e ci riusciva — ma il prezzo era che l'intestazione di quella
   pagina non somigliava a nessun'altra: arrivandoci da «Integrazioni» il
   titolo dimezzava di corpo e il paragrafo si allargava, e la differenza si
   legge come un errore di impaginazione, non come una scelta. Otto pagine con
   la stessa intestazione ne hanno sette uguali e una sbagliata.
   L'altezza che si guadagnava si ritrova dove non costa identità: la sezione
   sotto (`.sec--stage`, e la riga qui sotto) rinuncia al respiro pieno, e
   `--sim-body-h` accorcia il corpo del simulatore sugli schermi bassi.
   Se un giorno la scena tornasse a stare sotto la piega, si toglie altezza
   ALLA SCENA o al vuoto, mai al titolo: quello appartiene al sistema. */

/* SCHERMI BASSI: il riquadro del simulatore si accorcia.
   Un portatile da 1366x768 ha 130px in meno di un 1440x900, e sono
   esattamente quelli che decidono se la scena sta a schermo o no.
   STA QUI SOTTO E NON ACCANTO ALLA GUIDA: una media query non alza la
   specificità, quindi scritta prima della regola che deve correggere perdeva
   in silenzio — la stessa dichiarazione, e vince l'ultima. */
@media (min-width: 1100px) and (max-height: 980px) {
  .simstage--rail > .sim { --sim-body-h: clamp(280px, 38vh, 400px); }
}
/* Più specifico di `.pagehead + .sec` qui sopra, che altrimenti vincerebbe
   per specificità e rimetterebbe il respiro pieno sopra la scena. */
.pagehead + .sec--stage { padding-top: clamp(14px, 1.6vw, 22px); }

/* ===========================================================================
   FLUSSO  (par. 14.4) — cinque fasi. Impianto orizzontale, non a griglia.
   =========================================================================== */
.flow {
  display: grid;
  grid-template-columns: repeat(5, 1fr);
  gap: 0;
  position: relative;
  margin-top: 20px;
}
/* La linea che unisce le fasi: passa dietro i nodi. */
.flow::before {
  content: "";
  position: absolute;
  top: 23px; left: 10%; right: 10%;
  height: 1px;
  background: linear-gradient(90deg, transparent, var(--accent-line) 12%, var(--accent-line) 88%, transparent);
}
.flow__step { position: relative; padding: 0 12px; text-align: center; }
.flow__node {
  width: 48px; height: 48px;
  margin: 0 auto 20px;
  border-radius: 50%;
  display: grid; place-items: center;
  background: var(--surface-2);
  border: 1px solid var(--accent-line);
  color: var(--accent-fg);
  position: relative;
  z-index: 2;
  transition: background-color var(--t-slow) var(--ease), color var(--t-slow) var(--ease), transform var(--t-slow) var(--ease);
}
.flow__node svg { width: 20px; height: 20px; }
.flow__step:hover .flow__node { background: var(--accent-fg); color: var(--on-accent); transform: translateY(-3px); }
.flow__n {
  font-family: var(--f-mono); font-size: var(--fs-micro); letter-spacing: 0.12em;
  text-transform: uppercase; color: var(--accent-fg); margin-bottom: 7px;
}
.flow__t { font-family: var(--f-display); font-weight: 700; font-size: 1.06rem; margin-bottom: 7px; letter-spacing: -0.02em; }
.flow__d { font-size: var(--fs-small); line-height: 1.6; color: var(--text-2); max-width: 24ch; margin: 0 auto; }

/* ===========================================================================
   BENTO MODULI  (par. 14.5) — griglia asimmetrica: una cella domina.
   VibeCurb: sei celle identiche con icona+titolo+testo sono il default da
   evitare. La cella primaria è 2x2 e contiene un mockup, non un'icona.
   =========================================================================== */
.bento {
  display: grid;
  grid-template-columns: repeat(3, 1fr);
  grid-auto-rows: minmax(190px, auto);
  gap: 14px;
}
.bento__cell {
  padding: 26px;
  display: flex;
  flex-direction: column;
  overflow: hidden;
  transition: border-color var(--t-slow) var(--ease), transform var(--t-slow) var(--ease);
}
.bento__cell:hover { border-color: var(--accent-line); transform: translateY(-2px); }
.bento__cell--lead { grid-column: span 2; grid-row: span 2; }
.bento__cell--wide { grid-column: span 2; }

.bento__ico {
  width: 36px; height: 36px;
  border-radius: var(--r-sm);
  display: grid; place-items: center;
  background: var(--accent-soft);
  border: 1px solid var(--accent-line);
  color: var(--accent-fg);
  margin-bottom: 16px;
  flex: none;
}
.bento__ico svg { width: 17px; height: 17px; }
.bento__t { font-family: var(--f-display); font-weight: 700; font-size: 1.1rem; letter-spacing: -0.02em; margin-bottom: 8px; }
.bento__cell--lead .bento__t { font-size: clamp(1.3rem, 2vw, 1.68rem); }
.bento__d { font-size: 0.92rem; line-height: 1.62; color: var(--text-2); margin: 0; }
.bento__viz { margin-top: auto; padding-top: 24px; }

/* Mini-mockup dentro le celle: il documento chiede un mockup animato, non
   un'icona (par. 14.5). */
.mini {
  border-radius: var(--r-md);
  border: 1px solid var(--line);
  background: var(--inset-bg);
  padding: 12px;
  font-family: var(--f-mono);
  font-size: var(--fs-micro);
}
.mini__row {
  display: flex; align-items: center; gap: 8px;
  padding: 7px 0;
  color: var(--text-2);
  border-bottom: 1px solid var(--line);
}
.mini__row:last-child { border-bottom: 0; }
.mini__tag {
  padding: 2px 7px; border-radius: 3px;
  background: var(--accent-soft); color: var(--accent-fg);
  font-size: 0.7rem; font-weight: 700; letter-spacing: 0.04em;
  flex: none;
}
.mini__fill { margin-left: auto; color: var(--text-3); font-size: 0.72rem; flex: none; }
.mini__bar { height: 4px; border-radius: 2px; background: var(--line); flex: 1; overflow: hidden; }
.mini__bar i { display: block; height: 100%; background: var(--accent-fg); border-radius: 2px; }

/* ===========================================================================
   SPLIT  (knowledge base, governance, modulo...) — due colonne, non griglia.
   =========================================================================== */
.split {
  display: grid;
  grid-template-columns: minmax(0, 1fr) minmax(0, 1.12fr);
  gap: clamp(36px, 5vw, 72px);
  align-items: center;
}
.split--flip .split__visual { order: -1; }

/* Varianti di proporzione. Stanno QUI e non in un attributo `style` perché
   una dichiarazione in linea vince su ogni media query: scritta nel markup,
   la griglia a due colonne sopravvivrebbe anche a 390px. */
.split--code { align-items: start; grid-template-columns: minmax(0, 1.25fr) minmax(0, 0.85fr); }
.split--form { align-items: start; grid-template-columns: minmax(0, 0.82fr) minmax(0, 1.18fr); }

.srcgrid { display: grid; grid-template-columns: repeat(3, 1fr); gap: 10px; }
.srccard {
  padding: 15px;
  border-radius: var(--r-md);
  border: 1px solid var(--line);
  background: var(--surface-solid);
  transition: border-color var(--t-fast) var(--ease), transform var(--t-fast) var(--ease);
  cursor: default;
}
.srccard:hover { border-color: var(--accent-line); transform: translateY(-2px); }
.srccard__k {
  font-family: var(--f-mono); font-size: var(--fs-micro); font-weight: 700;
  letter-spacing: 0.05em; color: var(--accent-fg); margin-bottom: 9px;
}
.srccard__n { font-size: 0.9rem; font-weight: 600; color: var(--text); margin-bottom: 5px; line-height: 1.4; }
.srccard__m { font-family: var(--f-mono); font-size: var(--fs-micro); color: var(--text-2); }
.srccard__st {
  display: flex; align-items: center; gap: 6px; margin-top: 9px;
  font-family: var(--f-mono); font-size: var(--fs-micro); color: var(--text-2);
}
.srccard__st i { width: 6px; height: 6px; border-radius: 50%; background: var(--verified); flex: none; }
.srccard__st.is-sync i { background: var(--caution); }

/* ===========================================================================
   SELETTORE DI SCENARIO
   =========================================================================== */
.picker { display: flex; gap: 8px; flex-wrap: wrap; margin-bottom: 22px; }
.picker__btn {
  padding: 10px 18px;
  border-radius: var(--r-pill);
  border: 1px solid var(--line-2);
  background: transparent;
  color: var(--text-2);
  font-size: 0.92rem; font-weight: 500;
  cursor: pointer;
  transition: color var(--t-fast) var(--ease), border-color var(--t-fast) var(--ease),
              background-color var(--t-fast) var(--ease);
}
.picker__btn:hover { color: var(--text); border-color: var(--line-3); }
.picker__btn[aria-selected="true"] {
  background: var(--accent-fg);
  border-color: var(--accent-fg);
  color: var(--on-accent);
  font-weight: 600;
}

/* ===========================================================================
   CODICE API / MCP  (par. 14.12)
   La finestra non è più «scura e basta»: prende il tono del tema. In chiaro
   resta comunque una superficie a sé, distinta dal fondo della sezione, così
   continua a leggersi come una finestra di terminale e non come un paragrafo.
   =========================================================================== */
.code {
  border-radius: var(--r-lg);
  border: 1px solid var(--line);
  background: var(--code-bg);
  overflow: hidden;
}
.code__tabs {
  display: flex;
  gap: 2px;
  padding: 6px;
  border-bottom: 1px solid var(--line);
  background: var(--surface);
  overflow-x: auto;
  scrollbar-width: none;
}
.code__tabs::-webkit-scrollbar { display: none; }
.code__tab {
  flex: none;
  padding: 8px 14px;
  border: 0; background: transparent;
  border-radius: var(--r-xs);
  font-family: var(--f-mono); font-size: var(--fs-micro);
  color: var(--text-3);
  cursor: pointer;
  transition: background-color var(--t-fast) var(--ease), color var(--t-fast) var(--ease);
}
.code__tab:hover { color: var(--text); }
.code__tab[aria-selected="true"] { background: var(--surface-2); color: var(--accent-fg); }
.code__body { padding: 20px; overflow-x: auto; }
.code__pane { display: none; }
.code__pane.is-active { display: block; }
.code pre {
  margin: 0;
  font-family: var(--f-mono);
  font-size: 0.84rem;
  line-height: 1.75;
  color: var(--code-fg);
  white-space: pre;
}
/* Evidenziazione del codice: poche classi, applicate dal PHP che scrive il
   markup. I colori sono token, quindi hanno una versione per tema: le tinte
   chiare della slide 5 su fondo scuro, le loro controparti scure su chiaro.
   Le stesse tinte su tutti e due i fondi starebbero sotto 2:1 da una parte. */
.tk-key { color: var(--accent-fg); }
.tk-str { color: var(--tk-str); }
.tk-com { color: var(--tk-com); font-style: italic; }
.tk-fn  { color: var(--tk-fn); }
.tk-num { color: var(--tk-num); }

.code__note {
  display: none;
  margin: 16px 0 0;
  font-size: 0.92rem;
  line-height: 1.62;
  color: var(--text-2);
  padding-left: 14px;
  border-left: 2px solid var(--accent-line);
  max-width: none;
}
.code__note.is-active { display: block; }

/* ===========================================================================
   WHITE LABEL  (par. 14.13) — un interruttore cambia identità al widget.
   =========================================================================== */
.wl { display: grid; grid-template-columns: minmax(0, 0.9fr) minmax(0, 1.1fr); gap: clamp(36px, 5vw, 68px); align-items: center; }
.wl__switch { display: flex; gap: 8px; flex-wrap: wrap; margin-top: 30px; }
.wl__opt {
  display: inline-flex; align-items: center; gap: 9px;
  padding: 10px 17px;
  border-radius: var(--r-pill);
  border: 1px solid var(--line-2);
  background: transparent;
  color: var(--text-2);
  font-size: 0.9rem; font-weight: 500;
  cursor: pointer;
  transition: color var(--t-fast) var(--ease), border-color var(--t-fast) var(--ease), background-color var(--t-fast) var(--ease);
}
.wl__opt:hover { color: var(--text); border-color: var(--line-3); }
.wl__opt[aria-pressed="true"] { border-color: var(--text); color: var(--text); background: var(--surface); }
.wl__swatch { width: 13px; height: 13px; border-radius: 50%; flex: none; }

/* Il widget che cambia pelle.
   TUTTO ciò che un cliente può cambiare passa da una variabile: colore,
   fondo, superficie dei messaggi, testo, raggio e carattere. Serve alla terza
   opzione della sezione — quella «via API» — che deve poter uscire del tutto
   dall'estetica di ANTEX: fondo chiaro, angoli vivi, carattere con grazie.
   NON eredita i token del tema di proposito: il widget mostra l'identità del
   CLIENTE, e un widget che cambia colore insieme al tema del nostro sito
   dimostrerebbe l'esatto contrario di quello che la sezione afferma. */
.widget {
  --w-brand: var(--indigo);
  --w-ink: #FFFFFF;
  --w-bg: #140D33;
  --w-surface: #221A4A;
  --w-text: #F3F4FA;
  --w-radius: 20px;
  --w-font: var(--f-sans);
  max-width: 380px;
  margin-inline: auto;
  border-radius: var(--w-radius);
  overflow: hidden;
  border: 1px solid var(--line-2);
  background: var(--w-bg);
  color: var(--w-text);
  font-family: var(--w-font);
  box-shadow: var(--shadow-deep);
  transition: border-radius var(--t-slow) var(--ease),
              background-color var(--t-slow) var(--ease),
              color var(--t-slow) var(--ease);
}
/* Il carattere non arriva come stringa libera dal pannello: è una scelta fra
   tre famiglie note, così nel CSS non può finire niente di arbitrario. */
.widget[data-font="serif"] { --w-font: Georgia, "Times New Roman", serif; }
.widget[data-font="mono"]  { --w-font: var(--f-mono); }
.widget__bar {
  display: flex; align-items: center; gap: 10px;
  padding: 14px 16px;
  background: var(--w-brand);
  color: var(--w-ink);
  transition: background-color var(--t-slow) var(--ease), color var(--t-slow) var(--ease);
}
.widget__logo {
  /* Il raggio del logo segue quello del widget, con un tetto: a 999px un
     quadrato da 26px diventa un cerchio, a 0px resta uno spigolo netto. */
  width: 28px; height: 28px; flex: none;
  border-radius: min(var(--w-radius), 14px);
  display: grid; place-items: center;
  background: rgba(0, 0, 0, 0.16);
  font-family: inherit; font-weight: 800; font-size: 0.78rem;
  transition: border-radius var(--t-slow) var(--ease), background-color var(--t-slow) var(--ease);
}
/* CON UN'IMMAGINE SERVE UNA PIASTRA CHIARA, e solo qui.
   Il velo nero al 16% funziona dietro una lettera, che prende il colore del
   testo sulla barra ed è comunque leggibile. Un simbolo no: quello di ANTEX è
   a gradiente indigo→rosa su fondo trasparente, e la barra del widget è il
   colore del marchio del cliente — nella prima identità è indigo. Simbolo
   indigo su indigo scurito: il marchio sparisce proprio nella scheda che deve
   mostrarlo. La piastra è bianca e non una tinta del brand perché deve reggere
   QUALSIASI colore un cliente metta lì, e perché è il fondo su cui il simbolo
   è disegnato. Sotto la lettera resta il velo nero: cambiarlo sposterebbe
   anche i due casi che il logo non ce l'hanno. */
.widget__logo--img {
  background: rgba(255, 255, 255, 0.94);
  padding: 4px;
}
/* UNA MISURA SOLA, mai due: le brand guidelines vietano di alterare il
   rapporto d'aspetto del simbolo. Si fissa l'altezza e la larghezza segue. */
.widget__logo--img img {
  display: block;
  height: 18px;
  width: auto;
}
.widget__name { font-weight: 700; font-size: 0.94rem; letter-spacing: -0.01em; }
.widget__sub { font-size: 0.76rem; opacity: 0.8; }
.widget__body { padding: 16px; display: flex; flex-direction: column; gap: 10px; min-height: 168px; }
.widget__msg {
  align-self: flex-start;
  max-width: 88%;
  padding: 11px 14px;
  border-radius: min(var(--w-radius), 14px);
  border-bottom-left-radius: min(var(--w-radius), 5px);
  background: var(--w-surface);
  border: 1px solid rgba(127, 127, 127, 0.18);
  font-size: 0.88rem; line-height: 1.58;
  color: var(--w-text);
  transition: background-color var(--t-slow) var(--ease), border-radius var(--t-slow) var(--ease);
}
.widget__chips { display: flex; flex-wrap: wrap; gap: 6px; margin-top: auto; }
.widget__chip {
  padding: 7px 12px;
  border-radius: var(--w-radius);
  border: 1px solid var(--w-brand);
  color: var(--w-brand);
  font-size: 0.8rem; font-weight: 600;
  transition: border-radius var(--t-slow) var(--ease), color var(--t-slow) var(--ease), border-color var(--t-slow) var(--ease);
}
.widget__foot {
  margin: 0;
  padding: 10px 16px;
  border-top: 1px solid rgba(127, 127, 127, 0.2);
  font-size: 0.74rem;
  letter-spacing: 0.03em;
  color: var(--w-text);
  opacity: 0.7;
}

/* La frase che spiega cosa dimostra il caso scelto. Cambia con il widget: è
   la parte che trasforma tre pelli diverse in un ragionamento. */
.wl__note {
  max-width: 380px;
  margin: 20px auto 0;
  padding-left: 14px;
  border-left: 2px solid var(--accent-line);
  font-size: 0.92rem;
  line-height: 1.62;
  color: var(--text-2);
}

/* ===========================================================================
   CONTROLLO E ATTENDIBILITÀ  (par. 14.11) — mockup a tre colonne.
   Era il componente più «chiaro» del sito: fondo bianco scritto a mano,
   testo --ink, filetti --paper-line. Adesso è una superficie come le altre e
   segue il tema.
   =========================================================================== */
.trust {
  display: grid;
  grid-template-columns: 228px minmax(0, 1fr) 258px;
  border-radius: var(--r-lg);
  border: 1px solid var(--line);
  background: var(--surface-solid);
  overflow: hidden;
  min-height: 400px;
}
.trust__col { padding: 17px; min-width: 0; }
.trust__col + .trust__col { border-left: 1px solid var(--line); }
.trust__head {
  font-family: var(--f-mono); font-size: var(--fs-micro); letter-spacing: 0.13em;
  text-transform: uppercase; color: var(--text-3); margin-bottom: 13px;
}
.conv {
  padding: 11px;
  border-radius: var(--r-sm);
  margin-bottom: 6px;
  cursor: pointer;
  border: 1px solid transparent;
  transition: background-color var(--t-fast) var(--ease), border-color var(--t-fast) var(--ease);
}
.conv:hover { background: var(--surface-2); }
.conv.is-sel { background: var(--accent-soft); border-color: var(--accent-line); }
.conv__t { font-size: var(--fs-small); font-weight: 600; color: var(--text); margin-bottom: 4px; line-height: 1.4; }
.conv__m {
  font-family: var(--f-mono); font-size: var(--fs-micro); color: var(--text-3);
  display: flex; gap: 7px; align-items: center;
}
.conv__st { width: 6px; height: 6px; border-radius: 50%; flex: none; }
.conv__st--ok   { background: var(--verified); }
.conv__st--esc  { background: var(--caution); }
.conv__st--none { background: var(--absent); }

.tmsg { margin-bottom: 14px; }
.tmsg__who {
  font-family: var(--f-mono); font-size: var(--fs-micro); letter-spacing: 0.1em;
  text-transform: uppercase; color: var(--text-3); margin-bottom: 6px;
}
.tmsg__b { font-size: 0.9rem; line-height: 1.62; color: var(--text); }
.tmsg__b mark { background: var(--mark-bg); color: var(--mark-fg); padding: 1px 4px; border-radius: 3px; }

.tmeta { padding: 12px; border-radius: var(--r-sm); background: var(--surface-2); margin-bottom: 8px; }
.tmeta__k {
  font-family: var(--f-mono); font-size: var(--fs-micro); letter-spacing: 0.1em;
  text-transform: uppercase; color: var(--text-3); margin-bottom: 5px;
}
.tmeta__v { font-size: var(--fs-small); color: var(--text); line-height: 1.5; font-weight: 500; }
.tmeta--warn { background: var(--accent-soft); }
.tmeta--warn .tmeta__v { color: var(--accent-fg); }

/* ===========================================================================
   SETTORI  (par. 14.14) — un risultato alla volta, scelto per contesto.
   ---------------------------------------------------------------------------
   Il selettore sostituisce la griglia di otto card: tutte le scelte restano
   raggiungibili, ma il contenuto lungo ha un solo fuoco. Senza JavaScript i
   link funzionano come ancore: `:target` apre il pannello richiesto e il primo
   è il ripiego iniziale. Il motore aggiunge soltanto ruoli ARIA e stato.
   =========================================================================== */
.sectorexplorer {
  border: 1px solid var(--line);
  border-radius: var(--r-xl);
  background: var(--surface);
  overflow: hidden;
  box-shadow: var(--shadow-lift);
}
.sectorexplorer__nav {
  padding: 22px clamp(18px, 2.8vw, 34px) 24px;
  border-bottom: 1px solid var(--line);
  background: var(--surface-2);
}
.sectorexplorer__hint {
  margin: 0 0 13px;
  font-family: var(--f-mono);
  font-size: var(--fs-micro);
  letter-spacing: 0.1em;
  text-transform: uppercase;
  color: var(--text-3);
}
.sectorexplorer__scope {
  width: 100%;
  max-width: none;
  margin: 14px 0 0;
  color: var(--text-3);
  font-size: var(--fs-small);
  line-height: 1.55;
}
.sectorfilters {
  display: grid;
  grid-template-columns: repeat(4, minmax(0, 1fr));
  gap: 9px;
}
.sectorfilter {
  display: flex;
  align-items: center;
  gap: 10px;
  min-width: 0;
  min-height: 48px;
  padding: 9px 12px;
  border: 1px solid var(--line);
  border-radius: var(--r-md);
  background: var(--surface);
  color: var(--text-2);
  font-size: var(--fs-small);
  font-weight: 650;
  line-height: 1.3;
  text-decoration: none;
  cursor: pointer;
  transition: border-color var(--t-fast) var(--ease),
              background-color var(--t-fast) var(--ease),
              color var(--t-fast) var(--ease),
              transform var(--t-fast) var(--ease);
}
.sectorfilter:hover {
  border-color: var(--line-3);
  color: var(--text);
  transform: translateY(-1px);
}
.sectorfilter.is-active {
  border-color: var(--accent-line);
  background: var(--accent-soft);
  color: var(--text);
}
.sectorfilter:focus-visible {
  outline: 2px solid var(--accent-fg);
  outline-offset: 2px;
}
.sectorfilter__ico {
  flex: 0 0 30px;
  width: 30px;
  height: 30px;
  display: grid;
  place-items: center;
  border-radius: var(--r-sm);
  background: var(--surface-2);
  color: var(--text-3);
  transition: background-color var(--t-fast) var(--ease), color var(--t-fast) var(--ease);
}
.sectorfilter__ico svg { width: 17px; height: 17px; }
.sectorfilter.is-active .sectorfilter__ico {
  background: var(--accent-fg);
  color: var(--on-accent);
}
.sectorstories { position: relative; }
.sectorstory {
  display: none;
  grid-template-columns: minmax(0, 1.14fr) minmax(320px, 0.86fr);
  min-height: 460px;
  background: var(--bg-2);
  scroll-margin-top: 110px;
}
.sectorstory:first-child,
.sectorstory:target { display: grid; }
.sectorstories:has(.sectorstory:target) .sectorstory:first-child:not(:target) { display: none; }
.sectorstory[hidden] { display: none; }
.sectorexplorer.is-enhanced .sectorstory.is-current {
  display: grid;
  animation: sector-enter var(--t-slow) var(--ease) both;
}
@keyframes sector-enter {
  from { opacity: 0; transform: translateY(8px); }
  to   { opacity: 1; transform: none; }
}
.sectorstory__media {
  position: relative;
  min-width: 0;
  min-height: 460px;
  overflow: hidden;
  background: var(--inset-bg);
}
.sectorstory__media::after {
  content: "";
  position: absolute;
  inset: 0;
  border-right: 1px solid var(--line);
  pointer-events: none;
}
.sectorstory__media img {
  position: absolute;
  inset: 0;
  width: 100%;
  height: 100%;
  display: block;
  object-fit: cover;
}
/* Le due varianti occupano lo stesso identico riquadro. La selezione del tema
   cambia soltanto quale immagine è visibile, senza aggiungere una seconda
   altezza al flusso e quindi senza alterare l'aspect ratio della scena. */
.sectorstory__media .sectorstory__img--light { display: none; }
.sectorstory__count {
  position: absolute;
  left: 18px;
  top: 18px;
  z-index: 1;
  display: inline-flex;
  gap: 5px;
  padding: 7px 10px;
  border: 1px solid var(--line-2);
  border-radius: var(--r-pill);
  background: var(--bg);
  color: var(--text);
  box-shadow: var(--shadow-lift);
  font-family: var(--f-mono);
  font-size: var(--fs-micro);
  font-weight: 700;
  letter-spacing: 0.08em;
}
.sectorstory__count span { color: var(--text-3); }
.sectorstory__controls {
  position: absolute;
  right: 18px;
  bottom: 18px;
  z-index: 2;
  display: none;
  gap: 8px;
}
.sectorexplorer.is-enhanced .sectorstory__controls { display: flex; }
.sectorstory__control {
  width: 46px;
  height: 46px;
  display: grid;
  place-items: center;
  padding: 0;
  border: 1px solid var(--line-2);
  border-radius: var(--r-pill);
  background: var(--bg);
  color: var(--text);
  box-shadow: var(--shadow-lift);
  cursor: pointer;
  transition: border-color var(--t-fast) var(--ease),
              background-color var(--t-fast) var(--ease),
              color var(--t-fast) var(--ease),
              transform var(--t-fast) var(--ease);
}
.sectorstory__control:hover {
  border-color: var(--accent-line);
  background: var(--accent-soft);
  color: var(--accent-fg);
  transform: translateY(-1px);
}
.sectorstory__control:focus-visible {
  outline: 2px solid var(--accent-fg);
  outline-offset: 2px;
}
.sectorstory__control svg { width: 19px; height: 19px; }
.sectorstory__arrow--back { transform: rotate(180deg); }
.sectorstory__content {
  align-self: center;
  min-width: 0;
  padding: clamp(30px, 4.4vw, 58px);
}
.sectorstory__identity {
  display: flex;
  align-items: center;
  gap: 12px;
  margin-bottom: 22px;
}
.sectorstory__ico {
  flex: 0 0 44px;
  width: 44px;
  height: 44px;
  display: grid;
  place-items: center;
  border: 1px solid var(--accent-line);
  border-radius: var(--r-md);
  background: var(--accent-soft);
  color: var(--accent-fg);
}
.sectorstory__ico svg { width: 22px; height: 22px; }
.sectorstory__k {
  margin: 0;
  font-family: var(--f-mono);
  font-size: var(--fs-micro);
  font-weight: 650;
  letter-spacing: 0.11em;
  text-transform: uppercase;
  color: var(--accent-fg);
}
.sectorstory__t {
  margin: 0 0 15px;
  max-width: 20ch;
  font-family: var(--f-display);
  font-size: clamp(1.45rem, 2.7vw, 2.15rem);
  font-weight: 760;
  line-height: 1.14;
  letter-spacing: -0.035em;
}
.sectorstory__d {
  margin: 0;
  max-width: 54ch;
  color: var(--text-2);
  font-size: 0.96rem;
  line-height: 1.68;
}
.sectorstory__example {
  margin-top: clamp(24px, 3vw, 34px);
  padding: 17px 18px;
  border: 1px solid var(--line);
  border-radius: var(--r-md);
  background: var(--inset-bg);
}
.sectorstory__example .tlabel { margin-bottom: 8px; color: var(--text-3); }
.sectorstory__example p:last-child {
  margin: 0;
  color: var(--text);
  font-size: var(--fs-small);
  font-weight: 600;
  line-height: 1.55;
}
.sectorstory__example q { quotes: "“" "”" "‘" "’"; }

/* ===========================================================================
   CTA FINALE  (par. 14.16) — un titolo, un pulsante.
   =========================================================================== */
.close { position: relative; overflow: hidden; text-align: center; }
.close__glow { width: 700px; height: 460px; left: 50%; top: 50%; transform: translate(-50%, -50%); }

/* ===========================================================================
   MODULO  (par. 20.3)
   =========================================================================== */
.form { display: grid; grid-template-columns: repeat(2, minmax(0, 1fr)); gap: 16px; }
.field { display: flex; flex-direction: column; gap: 7px; min-width: 0; }
.field--full { grid-column: 1 / -1; }
.field__l { font-size: 0.9rem; font-weight: 500; color: var(--text-2); }
.field__l .req { color: var(--accent-fg); margin-left: 2px; }
.field__help { font-size: 0.82rem; color: var(--text-3); }

.input, .textarea, .select {
  width: 100%;
  padding: 13px 15px;
  border-radius: var(--r-sm);
  border: 1px solid var(--line-2);
  background: var(--surface);
  color: var(--text);
  font-family: var(--f-sans);
  font-size: 0.98rem;
  line-height: 1.5;
  transition: border-color var(--t-fast) var(--ease), background-color var(--t-fast) var(--ease);
}
.input::placeholder, .textarea::placeholder { color: var(--text-3); }
.input:hover, .textarea:hover, .select:hover { border-color: var(--line-3); }
.input:focus, .textarea:focus, .select:focus {
  outline: none;
  border-color: var(--accent-fg);
  box-shadow: 0 0 0 3px var(--accent-soft);
}
.textarea { resize: vertical; min-height: 118px; }
/* La freccia del select è un SVG in `background-image`, quindi il suo colore
   NON è currentColor e non segue il tema da solo: le due varianti si
   scambiano più in basso, con la regola sul tema chiaro. */
.select {
  appearance: none;
  background-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 12 12' fill='none' stroke='%23B7BBD6' stroke-width='1.6'%3E%3Cpath d='M2.5 4.5 6 8l3.5-3.5'/%3E%3C/svg%3E");
  background-repeat: no-repeat;
  background-position: right 14px center;
  background-size: 12px;
  padding-right: 38px;
}
/* Le opzioni le disegna il sistema operativo: `color-scheme` sulla radice fa
   già il grosso, ma il fondo esplicito evita il testo chiaro su menu chiaro
   che alcuni Chrome su Windows producono comunque. */
.select option { background: var(--surface-solid); color: var(--text); }

.check { display: flex; align-items: flex-start; gap: 11px; cursor: pointer; }
.check input {
  appearance: none;
  width: 20px; height: 20px; flex: none;
  margin-top: 2px;
  border-radius: 5px;
  border: 1px solid var(--line-3);
  background: var(--surface);
  cursor: pointer;
  transition: background-color var(--t-fast) var(--ease), border-color var(--t-fast) var(--ease);
}
.check input:checked {
  background: var(--accent-fg);
  border-color: var(--accent-fg);
  background-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 14 14' fill='none' stroke='%230B0718' stroke-width='2.4' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpath d='M3 7.4 5.9 10.3 11 4.6'/%3E%3C/svg%3E");
  background-repeat: no-repeat;
  background-position: center;
  background-size: 13px;
}
.check__t { font-size: 0.9rem; line-height: 1.58; color: var(--text-2); }
.check__t a { color: var(--accent-fg); border-bottom: 1px solid var(--accent-line); }

/* L'errore non è affidato al solo colore: c'è il testo sotto il campo. */
.field.has-error .input,
.field.has-error .textarea,
.field.has-error .select,
.field.has-error .check input { border-color: var(--absent); }
.field__err { font-size: 0.86rem; color: var(--absent); display: none; }
.field.has-error .field__err { display: block; }

.hp { position: absolute; left: -9999px; width: 1px; height: 1px; overflow: hidden; }

.form__note {
  grid-column: 1 / -1;
  font-size: 0.84rem;
  line-height: 1.62;
  color: var(--text-3);
}
.form__msg {
  grid-column: 1 / -1;
  padding: 14px 16px;
  border-radius: var(--r-sm);
  font-size: 0.94rem;
  line-height: 1.6;
  display: none;
}
.form__msg.is-ok {
  display: block;
  background: var(--ok-bg);
  border: 1px solid var(--ok-line);
  color: var(--verified);
}
.form__msg.is-ko {
  display: block;
  background: var(--ko-bg);
  border: 1px solid var(--ko-line);
  color: var(--absent);
}

/* ===========================================================================
   FOOTER  (par. 13.3) — strutturato, niente vetro (par. 8.3).
   =========================================================================== */
.foot {
  background: var(--footer-bg);
  border-top: 1px solid var(--footer-line);
  color: var(--footer-text);
  padding-block: clamp(52px, 6vw, 76px) 30px;
}
.foot__grid { display: grid; grid-template-columns: 1.6fr repeat(4, 1fr); gap: 34px; }
.foot__brand { max-width: 32ch; }
.foot .brand__name { color: var(--footer-text); }
.foot .brand__mark { filter: var(--footer-symbol-filter); }
.foot__tag { font-size: 0.9rem; line-height: 1.62; color: var(--footer-text-2); margin-top: 14px; }
/* Simbolo e firma DigiBite sono PNG trasparenti. Il filtro arriva dai token
   del footer: nel tema scuro conserva la resa corrente; nel tema chiaro li
   porta al bianco sul nuovo fondo indaco. */
/* `inline-block` e non `inline`: il margine sopra sta sull'immagine, e su un
   contenitore inline non avrebbe effetto. */
.foot__bylink { display: inline-block; }
.foot__by {
  margin-top: 26px; height: 34px; width: auto;
  opacity: var(--footer-logo-opacity); filter: var(--footer-by-filter);
  transition: opacity var(--t-fast) var(--ease);
}
.foot__bylink:hover .foot__by { opacity: 1; }
.foot__h {
  font-family: var(--f-mono); font-size: var(--fs-micro); letter-spacing: 0.13em;
  text-transform: uppercase; color: var(--footer-text-3); margin-bottom: 15px;
}
.foot__l { display: block; padding: 6px 0; font-size: 0.92rem; color: var(--footer-text-2); transition: color var(--t-fast) var(--ease); }
.foot__l:hover { color: var(--footer-text); }
/* La riga dei crediti occupa TUTTA la larghezza del contenitore, in tre zone:
   copyright a sinistra, ragione sociale e P. IVA al centro, telefono contro il
   bordo destro. Vedi il commento in `footer.php` per il perché di una griglia
   `1fr auto 1fr` al posto del `flex` con `margin-left: auto` che c'era prima:
   in flex il blocco centrale si centra nello spazio che avanza, non nel
   contenitore, e con due lati di larghezza diversa finisce fuori asse. */
.foot__bar {
  margin-top: 46px; padding-top: 22px;
  border-top: 1px solid var(--footer-line);
  display: grid;
  grid-template-columns: minmax(0, 1fr) auto minmax(0, 1fr);
  gap: 10px 26px;
  align-items: center;
  font-size: 0.84rem; color: var(--footer-text-3);
}
.foot__bar-c { text-align: center; }
.foot__bar-r { text-align: right; }
/* Sotto le tre zone e a tutta larghezza: dentro una di esse allargherebbe la
   sua colonna e sposterebbe il centro. */
.foot__bar-note { grid-column: 1 / -1; }
.foot__bar a { color: var(--footer-text-3); transition: color var(--t-fast) var(--ease); }
.foot__bar a:hover { color: var(--footer-text-2); }
/* CTA sticky su mobile (par. 20.1): presente ma non invasiva.
   `pointer-events: none` sul contenitore e `auto` solo sul pulsante: la banda
   è alta ~70px (padding + safe-area), ma solo il pulsante deve intercettare
   il tap. Senza questa distinzione, qualunque cosa scorra sotto il padding
   vuoto del contenitore — un tab, una chip — riceve un tap che non le è
   destinato: succedeva davvero con i pulsanti delle simulazioni e i
   suggerimenti dei simulatori (vedi anche antex.js, che spegne del tutto
   questa barra mentre un simulatore è a schermo). */
.stickycta {
  position: fixed;
  left: 0; right: 0; bottom: 0;
  z-index: 80;
  display: none;
  padding: 11px var(--shell-pad) calc(11px + env(safe-area-inset-bottom));
  background: var(--g1-bg);
  -webkit-backdrop-filter: blur(var(--g1-blur));
  backdrop-filter: blur(var(--g1-blur));
  border-top: 1px solid var(--g1-line);
  transform: translateY(110%);
  transition: transform var(--t-slow) var(--ease);
  pointer-events: none;
}
.stickycta.is-on { transform: translateY(0); }
.stickycta .btn { width: 100%; pointer-events: auto; }

/* ===========================================================================
   MATRICE DI CONFRONTO  (sezione assistenti, par. 14.7)
   Una tabella vera, non una griglia di div: le intestazioni di riga e colonna
   sono <th scope>, quindi uno screen reader annuncia "Tono, Assistente
   commerciale" invece di leggere una fila di celle scollegate.
   =========================================================================== */
.matrix-wrap { overflow-x: auto; scrollbar-width: thin; }
.matrix {
  width: 100%;
  min-width: 760px;
  border-collapse: separate;
  border-spacing: 0;
  font-size: 0.92rem;
  text-align: left;
}
.matrix th, .matrix td {
  padding: 16px 18px;
  vertical-align: top;
  border-bottom: 1px solid var(--line);
}
.matrix thead th {
  border-bottom: 1px solid var(--line-2);
  padding-bottom: 20px;
}
.matrix tbody th {
  font-family: var(--f-mono);
  font-size: var(--fs-micro);
  font-weight: 500;
  letter-spacing: 0.09em;
  text-transform: uppercase;
  color: var(--text-3);
  white-space: nowrap;
  width: 176px;
}
.matrix td { color: var(--text-2); line-height: 1.58; }
.matrix tbody tr:last-child th, .matrix tbody tr:last-child td { border-bottom: 0; }
.matrix tbody tr:hover td { color: var(--text); }

.matrix__who { display: flex; align-items: center; gap: 11px; }
.matrix__av {
  width: 34px; height: 34px; flex: none;
  border-radius: var(--r-sm);
  display: grid; place-items: center;
  background: var(--accent-soft);
  border: 1px solid var(--accent-line);
  color: var(--accent-fg);
  font-family: var(--f-display); font-weight: 800; font-size: 0.82rem;
}
.matrix__name { display: block; font-weight: 600; color: var(--text); font-size: 0.96rem; }
.matrix__sector { display: block; font-family: var(--f-mono); font-size: var(--fs-micro); color: var(--text-3); margin-top: 3px; }
.matrix__pill {
  display: inline-block;
  padding: 5px 11px;
  border-radius: var(--r-pill);
  border: 1px solid var(--line-2);
  font-family: var(--f-mono); font-size: var(--fs-micro); color: var(--text);
}
.matrix__act { display: inline-flex; align-items: center; gap: 7px; color: var(--accent-fg); font-weight: 600; font-size: var(--fs-small); }
.matrix__act svg { width: 13px; height: 13px; flex: none; }

/* --- La stessa matrice su telefono: una scheda per assistente ---
   La tabella a scorrimento orizzontale mostrava un assistente per volta, cioè
   nascondeva proprio il confronto per cui la sezione esiste. Impilata per
   assistente si legge senza scorrere di lato, nella stessa direzione del resto
   della pagina.
   Le due viste si escludono con `display: none`: nell'albero
   dell'accessibilità ce n'è sempre e solo una. */
.acards { display: none; }
.acard {
  border-radius: var(--r-lg);
  border: 1px solid var(--line);
  background: var(--surface-2);
  padding: 20px 18px;
}
.acard__who { padding-bottom: 16px; border-bottom: 1px solid var(--line); }
.acard__list { display: grid; gap: 14px; margin-top: 16px; }
.acard__row { display: grid; gap: 4px; }
.acard__row dt {
  font-family: var(--f-mono);
  font-size: var(--fs-micro);
  letter-spacing: 0.09em;
  text-transform: uppercase;
  color: var(--text-3);
}
.acard__row dd { margin: 0; font-size: 0.92rem; line-height: 1.58; color: var(--text-2); }

/* ===========================================================================
   COPPIE «QUANDO -> ALLORA»  (azioni contestuali, par. 14.10)
   =========================================================================== */
.pairs {
  display: grid;
  grid-template-columns: repeat(2, minmax(0, 1fr));
  gap: 1px;
  background: var(--line);
  border: 1px solid var(--line);
  border-radius: var(--r-lg);
  overflow: hidden;
}
.pair {
  display: grid;
  grid-template-columns: minmax(0, 1fr) 26px minmax(0, 0.9fr);
  align-items: center;
  gap: 12px;
  padding: 22px 24px;
  background: var(--bg-2);
  transition: background-color var(--t-fast) var(--ease);
}
.pair:hover { background: var(--bg-3); }
.pair__when { font-size: 0.94rem; color: var(--text-2); line-height: 1.55; }
.pair__when strong { color: var(--text); font-weight: 600; }
.pair__arrow { color: var(--accent-fg); display: grid; place-items: center; }
.pair__arrow svg { width: 18px; height: 18px; }
.pair__do {
  display: inline-flex; align-items: center;
  padding: 8px 14px;
  border-radius: var(--r-pill);
  border: 1px solid var(--accent-line);
  background: var(--accent-soft);
  color: var(--accent-fg);
  font-size: var(--fs-small); font-weight: 600;
  justify-self: start;
}

/* ===========================================================================
   LEAD CONVERSAZIONALE  (par. 14.9)
   =========================================================================== */
.leadchat { display: flex; flex-direction: column; gap: 12px; }
.leadchat__k {
  font-family: var(--f-mono); font-size: var(--fs-micro); letter-spacing: 0.13em;
  text-transform: uppercase; color: var(--text-3); margin: 0 0 4px;
}
.leadchat__msg {
  max-width: 92%;
  padding: 14px 17px;
  border-radius: var(--r-md);
  font-size: 0.94rem;
  line-height: 1.62;
}
.leadchat__msg--user {
  align-self: flex-end;
  background: var(--accent-fg);
  color: var(--on-accent);
  border-bottom-right-radius: var(--r-xs);
}
.leadchat__msg--bot {
  align-self: flex-start;
  background: var(--surface-solid);
  border: 1px solid var(--line);
  color: var(--text);
  border-bottom-left-radius: var(--r-xs);
}
.leadchat__cap {
  font-family: var(--f-mono); font-size: var(--fs-micro); letter-spacing: 0.13em;
  text-transform: uppercase; color: var(--text-3); margin: 28px 0 12px;
}
.taglist { display: flex; flex-wrap: wrap; gap: 7px; }
.tagpill {
  padding: 6px 12px;
  border-radius: var(--r-pill);
  border: 1px solid var(--line);
  background: var(--surface-solid);
  font-size: var(--fs-small);
  color: var(--text-2);
}

.leadcard { overflow: hidden; }
.leadcard__bar {
  display: flex; align-items: baseline; justify-content: space-between; gap: 12px;
  padding: 16px 18px;
  border-bottom: 1px solid var(--line);
}
.leadcard__t { font-weight: 700; font-size: 0.98rem; font-family: var(--f-display); letter-spacing: -0.02em; }
.leadcard__live { color: var(--accent-fg); }
.leadcard__body { padding: 6px 18px 14px; }
.leadcard__row {
  display: grid;
  grid-template-columns: 140px minmax(0, 1fr);
  gap: 12px;
  padding: 12px 0;
  border-bottom: 1px solid var(--line);
  font-size: 0.92rem;
}
.leadcard__row:last-child { border-bottom: 0; }
.leadcard__k {
  font-family: var(--f-mono); font-size: var(--fs-micro); letter-spacing: 0.07em;
  text-transform: uppercase; color: var(--text-3); padding-top: 3px;
}
/* Un campo non ancora dedotto resta grigio e in corsivo: si distingue da uno
   compilato senza doverlo leggere. */
.leadcard__v { color: var(--text-3); font-style: italic; }
.leadcard__row.is-filled .leadcard__v { color: var(--text); font-weight: 500; font-style: normal; }
.leadcard__foot {
  display: flex; align-items: center; gap: 9px;
  margin: 0; padding: 14px 18px;
  border-top: 1px solid var(--line);
  background: var(--ok-bg);
  color: var(--verified);
  font-size: var(--fs-small); font-weight: 600;
}
.leadcard__foot svg { width: 16px; height: 16px; flex: none; }

/* ===========================================================================
   GOVERNANCE  (par. 14.15) — elenco di definizioni, non card
   =========================================================================== */
.gov__title {
  font-family: var(--f-mono); font-size: var(--fs-micro); letter-spacing: 0.13em;
  text-transform: uppercase; color: var(--text-3); margin: 34px 0 16px;
}
.gov { margin: 0; }
.gov__row {
  padding: 18px 0;
  border-bottom: 1px solid var(--line);
}
.gov__row:first-child { padding-top: 0; }
.gov__row:last-child { border-bottom: 0; }
.gov__k {
  display: flex; align-items: center; gap: 9px;
  font-weight: 600; font-size: 0.98rem; color: var(--text);
  margin-bottom: 6px;
}
.gov__k svg { width: 16px; height: 16px; color: var(--accent-fg); flex: none; }
.gov__d { margin: 0 0 0 25px; font-size: 0.92rem; line-height: 1.62; color: var(--text-2); }

/* Passi numerati (colonna «cosa succede dopo» del modulo). */
.steps { display: grid; gap: 15px; }
.steps__i {
  display: grid; grid-template-columns: 30px minmax(0, 1fr); gap: 13px;
  align-items: start; font-size: 0.94rem; color: var(--text-2); line-height: 1.58;
}
.steps__n { font-family: var(--f-mono); font-size: var(--fs-small); color: var(--accent-fg); padding-top: 1px; }

/* ===========================================================================
   API / MCP  (par. 14.12)
   ---------------------------------------------------------------------------
   Qui c'era anche il diagramma a quattro riquadri, rimosso il
   30/08/2026 insieme al suo markup: base di conoscenza → biforcazione
   «Assistente + API» / «MCP» → nodo finale. Non diceva se quella relazione
   fosse un vincolo o un esempio, e messo sopra il codice si leggeva come «la
   base di conoscenza serve alle API» — l'opposto di quello che la sezione
   afferma. Le regole sono state tolte e non commentate: CSS morto che nessuno
   saprebbe più a cosa apparteneva. Il ragionamento sta in `apimcp.php`.

   La finestra del codice è larga quanto la sezione. Con 1120px utili la riga
   più lunga della scheda MCP (92 caratteri, ~790px di monospaziato) entra con
   margine; in una colonna stretta accanto al diagramma ne aveva 608 e usciva
   tagliata.
   =========================================================================== */
.apicode { min-width: 0; }
.apicode__cta { margin: 22px 0 0; }

/* ===========================================================================
   TESTO LUNGO (pagine legali, 404)
   =========================================================================== */
.prose { margin-top: 34px; }
.prose p { color: var(--text-2); }
.notice {
  margin: 30px 0;
  padding: 22px 24px;
  border-radius: var(--r-md);
  border: 1px solid var(--accent-line);
  background: var(--accent-soft);
}
.notice__t {
  display: flex; align-items: center; gap: 9px;
  font-weight: 700; font-family: var(--f-display); letter-spacing: -0.02em;
  color: var(--accent-fg); margin: 0 0 10px;
}
.notice__t svg { width: 18px; height: 18px; flex: none; }
.notice p { color: var(--text-2); font-size: 0.96rem; }

/* ===========================================================================
   CODICE DI INTEGRAZIONE
   Il riquadro è una superficie chiara del tema (--surface-solid) e non più un
   bianco scritto a mano: sta accanto alla finestra a schede di API e MCP, che
   usa --code-bg, e le due restano distinte in tutti e due i temi.
   =========================================================================== */
.embed {
  display: grid;
  grid-template-columns: minmax(0, 1.05fr) minmax(0, 0.95fr);
  gap: clamp(32px, 4vw, 64px);
  align-items: center;
}
.snippet {
  margin: 0;
  border-radius: var(--r-md);
  border: 1px solid var(--line);
  background: var(--surface-solid);
  overflow: hidden;
}
.snippet__bar {
  display: flex; align-items: center; gap: 9px;
  padding: 12px 16px;
  border-bottom: 1px solid var(--line);
  background: var(--surface-2);
  font-family: var(--f-mono); font-size: var(--fs-micro); letter-spacing: 0.05em;
  text-transform: uppercase; color: var(--text-2);
}
.snippet__bar svg { width: 15px; height: 15px; color: var(--accent-fg); flex: none; }
/* IL CODICE VA A CAPO, ed è l'opposto di quello che si faceva qui prima.
   La regola precedente diceva «non si manda a capo: si scorre», per non
   spezzare un tag a metà attributo. Ma questo riquadro contiene UN codice da
   copiare, non un listato da confrontare riga per riga: è uno `<script>` di
   una riga sola con dentro due URL, e la riga è più larga del riquadro in
   qualsiasi larghezza di schermo. L'unico modo di leggerlo tutto era la barra
   di scorrimento orizzontale — che questo progetto nasconde apposta (vedi il
   blocco «le finestre che scorrono» più in alto). Risultato: si leggeva
   tagliato, e un codice tagliato sembra sbagliato molto più di un codice
   mandato a capo. Il riquadro può diventare più alto: l'altezza qui non è
   vincolata da niente.

   Le righe di continuazione si leggono come continuazioni e non come righe
   nuove grazie al RIENTRO SPORGENTE: il respiro sinistro sta nel padding, e
   un `text-indent` negativo riporta la PRIMA riga a filo del bordo. Quello
   che va a capo resta quindi rientrato sotto l'inizio del codice.

   Serve anche lo spezzamento dentro le parole: gli URL non hanno spazi, e
   senza `overflow-wrap` una stringa sola sfonderebbe comunque il riquadro —
   cioè il difetto di prima, con in più l'impossibilità di scorrere. */
.snippet__code {
  margin: 0;
  padding: 20px 18px 20px 40px;
  font-family: var(--f-mono);
  font-size: 0.84rem;
  line-height: 1.78;
  color: var(--text);
  white-space: pre-wrap;
  text-indent: -22px;
  word-break: break-word;   /* ripiego per i motori vecchi */
  overflow-wrap: anywhere;  /* la regola vera, e va dichiarata per ultima */
}
.snippet__note {
  margin: 14px 0 0;
  font-size: 0.9rem;
  line-height: 1.65;
  color: var(--text-2);
}

.embed__points { display: grid; gap: 22px; }
.embed__p { display: grid; grid-template-columns: 36px minmax(0, 1fr); gap: 14px; align-items: start; }
.embed__ico {
  width: 36px; height: 36px;
  display: grid; place-items: center;
  border-radius: var(--r-sm);
  background: var(--accent-soft);
  border: 1px solid var(--accent-line);
  color: var(--accent-fg);
}
.embed__ico svg { width: 17px; height: 17px; }
.embed__k { font-size: 1.02rem; font-weight: 700; letter-spacing: -0.02em; margin-bottom: 6px; }
.embed__d { margin: 0; font-size: 0.92rem; line-height: 1.62; color: var(--text-2); }
.embed__note {
  margin: clamp(30px, 3.4vw, 44px) 0 0;
  max-width: 72ch;
  font-size: 0.92rem;
  line-height: 1.65;
  color: var(--text-2);
}

/* ===========================================================================
   PIANI
   Cinque colonne stanno solo su schermi larghi. Sotto, `auto-fit` le fa
   scendere a tre, due e infine una, senza soglie scritte a mano: con cinque
   piani le media query sarebbero quattro, e una si dimenticherebbe sempre.
   =========================================================================== */
/* Quattro colonne dichiarate, non `auto-fit`: i piani pubblici sono
   quattro e vanno letti come una scala, quindi devono stare sulla stessa
   riga. Con `auto-fit` bastava un titolo un po' piu' lungo perche'
   diventassero 3+1, e il quarto si legge come escluso dal confronto
   invece che come l'ultimo gradino. L'Enterprise non e' qui: e' la
   fascia orizzontale sotto. */
.billing {
  width: fit-content;
  max-width: 100%;
  margin: 0 auto clamp(24px, 3vw, 36px);
  padding: 10px;
  display: flex;
  align-items: center;
  justify-content: center;
  gap: 12px;
  border: 1px solid var(--line);
  border-radius: var(--r-pill);
  background: var(--surface);
  box-shadow: var(--shadow-lift);
}
.billing[hidden] { display: none; }
.billing__label {
  margin: 0 2px 0 8px;
  font-size: var(--fs-small);
  font-weight: 650;
  color: var(--text-2);
}
.billing__choices {
  display: flex;
  padding: 3px;
  border: 1px solid var(--line);
  border-radius: var(--r-pill);
  background: var(--surface-2);
}
.billing__choice {
  min-height: 38px;
  padding: 7px 15px;
  border: 0;
  border-radius: var(--r-pill);
  background: transparent;
  color: var(--text-2);
  font: inherit;
  font-size: var(--fs-small);
  font-weight: 700;
  cursor: pointer;
}
.billing__choice.is-active {
  background: var(--grad-cta);
  color: var(--on-cta);
  box-shadow: var(--shadow-lift);
}
.billing__choice:focus-visible {
  outline: 2px solid var(--accent-fg);
  outline-offset: 2px;
}
.billing__badge {
  margin: 0 8px 0 0;
  font-size: var(--fs-micro);
  font-weight: 700;
  color: var(--verified);
}
.billing__badge[hidden] { display: none; }
.pricing__tax {
  margin: -20px 0 24px;
  text-align: center;
  font-size: var(--fs-micro);
  color: var(--text-3);
}
.plans {
  display: grid;
  grid-template-columns: repeat(4, minmax(0, 1fr));
  gap: 14px;
  /* NON `start`. Con `start` ogni scheda finiva dove finiva il suo
     contenuto: quattro altezze diverse, cioe' una scaletta. `stretch`
     (il valore di partenza della griglia) le porta tutte all'altezza
     della piu' alta. Il vuoto che resta in fondo alle piu' corte non da'
     fastidio perche' le righe DENTRO sono allineate fra colonne: il
     blocco delle quote ha sei righe in tutti i piani. */
  align-items: stretch;
}
.plan {
  display: flex;
  flex-direction: column;
  padding: 26px 22px;
  border-radius: var(--r-lg);
  border: 1px solid var(--line);
  background: var(--surface);
  position: relative;
  min-width: 0;
}
/* Il piano in evidenza: bordo del brand e un alone, non una scala diversa.
   Ingrandirlo romperebbe l'allineamento delle righe fra le colonne. */
.plan--hot {
  border-color: var(--accent-line);
  background: var(--accent-soft);
  box-shadow: 0 0 0 1px var(--accent-line), var(--shadow-lift);
}
.plan__flag {
  position: absolute; top: -11px; left: 22px;
  margin: 0;
  padding: 4px 12px;
  border-radius: var(--r-pill);
  background: var(--grad-cta);
  color: var(--on-cta);
  font-family: var(--f-mono); font-size: 0.68rem; font-weight: 600; letter-spacing: 0.09em;
  text-transform: uppercase;
}
.plan__name { font-size: 1.22rem; font-weight: 700; letter-spacing: -0.02em; margin-bottom: 5px; }
.plan__tag { font-size: var(--fs-small); line-height: 1.5; color: var(--text-2); margin: 0 0 18px; min-height: 4.5em; }
.plan__price { min-height: 2.6rem; margin: 0 0 3px; display: flex; align-items: baseline; gap: 7px; flex-wrap: wrap; }
.plan__amount { font-family: var(--f-display); font-size: 2.1rem; font-weight: 800; letter-spacing: -0.03em; }
.plan__period { font-size: 0.82rem; color: var(--text-3); }
.plan__billing-note {
  min-height: 3em;
  margin: 0 0 16px;
  font-size: var(--fs-micro);
  line-height: 1.5;
  color: var(--text-3);
}
.plan__billing-note strong { color: var(--verified); font-weight: 750; }
.plan__billing-note strong.is-potential { color: var(--absent); }
.plan__custom { font-family: var(--f-display); font-size: 1.5rem; font-weight: 700; letter-spacing: -0.02em; color: var(--accent-fg); }
.plan__cta { width: 100%; min-height: 46px; padding-inline: 16px; font-size: 0.9rem; }
/* I due blocchi della scheda: prima le quote, poi le funzioni.
   Il filetto sopra ognuno fa il lavoro che faceva la vecchia riga
   «Aggiunge:»: separa il pulsante dagli elenchi e i due elenchi fra loro. */
.plan__block { margin-top: 20px; padding-top: 16px; border-top: 1px solid var(--line); }
.plan__lab {
  margin: 0 0 12px;
  font-family: var(--f-mono); font-size: var(--fs-micro); letter-spacing: 0.06em;
  text-transform: uppercase;
  color: var(--accent-fg);
  line-height: 1.45;
  /* Due righe in tutte le schede: «Quanto è compreso» sta su una,
     «Tutto quello che c'è in Business, piu» su due. Senza il minimo, gli
     elenchi sotto partirebbero da altezze diverse e il confronto in
     orizzontale — l'unico motivo per cui i blocchi esistono — salterebbe. */
  min-height: 2.9em;
}
.plan__list { display: grid; gap: 10px; }
/* Le quote non portano la spunta: una spunta dice «incluso», e un numero
   non è incluso o escluso, è tanto. Al suo posto un pallino, che tiene le
   due liste sullo stesso rientro di 16px. */
.plan__list--usage li { color: var(--text); }
.plan__list--usage li::before {
  content: "";
  width: 5px; height: 5px; border-radius: 50%;
  background: var(--accent-fg);
  margin: 8px 0 0 5px;
}
.plan__list li {
  display: grid; grid-template-columns: 16px 1fr; gap: 9px; align-items: start;
  font-size: var(--fs-small); line-height: 1.5; color: var(--text-2);
}
.plan__list svg { width: 14px; height: 14px; color: var(--verified); margin-top: 3px; }
.plans__note {
  margin: clamp(28px, 3vw, 40px) 0 0;
  font-size: 0.88rem;
  line-height: 1.65;
  color: var(--text-3);
}
/* ===========================================================================
   PIANI — IL RIQUADRO DEI CREDITI
   ---------------------------------------------------------------------------
   Largo quanto la riga delle quattro schede (niente `max-width` in `ch`: qui
   la misura di lettura la tengono i paragrafi dentro, non la scatola) e con
   dentro i quattro livelli dei modelli. Era un riquadrino di note largo 96
   caratteri sotto le schede, e i livelli erano una sezione a sé mezza pagina
   più giù: due metà della stessa spiegazione, lontane.
   =========================================================================== */
.credits {
  margin-top: 18px;
  padding: clamp(22px, 2.8vw, 34px);
  border: 1px solid var(--line);
  border-radius: var(--r-lg);
  background: var(--surface);
  color: var(--text-2);
  font-size: 0.88rem;
  line-height: 1.65;
}
.credits__t {
  margin: 0 0 14px;
  font-family: var(--f-display);
  font-size: 1.14rem;
  font-weight: 750;
  letter-spacing: -0.02em;
  color: var(--text);
}
/* I due paragrafi affiancati e non incolonnati: sono corti, e uno sotto
   l'altro a piena larghezza darebbero righe da centoventi caratteri — il
   difetto che il `max-width` di 96ch teneva a bada quando la scatola era
   stretta. Qui la scatola è larga, quindi la misura la fanno le colonne. */
.credits__say {
  display: grid;
  grid-template-columns: repeat(auto-fit, minmax(300px, 1fr));
  gap: 10px clamp(24px, 3vw, 44px);
}
.credits__d { margin: 0; max-width: 62ch; }
.credits__sub {
  margin: clamp(22px, 2.6vw, 32px) 0 14px;
  padding-top: clamp(20px, 2.4vw, 28px);
  border-top: 1px solid var(--line);
  max-width: 68ch;
  color: var(--text-2);
}
.credits__fine {
  margin: 18px 0 0;
  font-size: var(--fs-small);
  color: var(--text-3);
  max-width: 92ch;
}

/* ===========================================================================
   PIANI — ESTENSIONI MENSILI
   Tre quantità con lo stesso prezzo: schede parallele rendono immediato il
   confronto e tengono questi acquisti distinti dai servizi su preventivo.
   =========================================================================== */
.planaddons {
  display: grid;
  grid-template-columns: repeat(3, minmax(0, 1fr));
  gap: 14px;
}
.planaddon {
  min-width: 0;
  padding: clamp(24px, 3vw, 34px);
  border: 1px solid var(--line);
  border-radius: var(--r-lg);
  background: var(--surface);
  text-align: center;
}
.planaddon__name {
  min-height: 2.7em;
  margin: 0 0 22px;
  font-family: var(--f-display);
  font-size: 1.08rem;
  font-weight: 700;
  line-height: 1.35;
  letter-spacing: -0.02em;
}
.planaddon__price {
  display: flex;
  flex-wrap: wrap;
  align-items: baseline;
  justify-content: center;
  gap: 7px;
  margin: 0;
}
.planaddon__amount {
  font-family: var(--f-display);
  font-size: clamp(1.8rem, 3vw, 2.35rem);
  font-weight: 800;
  line-height: 1;
  letter-spacing: -0.04em;
  color: var(--accent-fg);
}
.planaddon__period { font-size: var(--fs-small); color: var(--text-3); }
.planaddons__note {
  margin: clamp(24px, 3vw, 34px) auto 0;
  max-width: 72ch;
  text-align: center;
  font-size: var(--fs-small);
  line-height: 1.65;
  color: var(--text-3);
}

/* ===========================================================================
   PIANI — LIVELLI DEI MODELLI
   =========================================================================== */
/* I quattro livelli stanno DENTRO il riquadro dei crediti (vedi `.credits`),
   non piu' in una sezione loro. Da qui due differenze rispetto a prima:
   il fondo e' `--inset-bg` e non `--surface`, perche' una superficie sopra
   un'altra superficie della stessa tinta non si stacca; e il respiro
   interno e' piu' contenuto, perche' quattro schede in un riquadro non
   devono pesare quanto le quattro schede dei piani sopra. */
.modeltiers {
  display: grid;
  grid-template-columns: repeat(4, minmax(0, 1fr));
  gap: 12px;
}
.modeltier {
  min-width: 0;
  padding: 20px 18px;
  border: 1px solid var(--line);
  border-radius: var(--r-md);
  background: var(--inset-bg);
}
.modeltier__cost {
  margin: 0 0 12px;
  font-family: var(--f-mono);
  font-size: var(--fs-micro);
  letter-spacing: 0.06em;
  text-transform: uppercase;
  color: var(--accent-fg);
}
.modeltier__name {
  margin: 0 0 14px;
  font-size: 1.08rem;
  font-weight: 700;
  letter-spacing: -0.02em;
  color: var(--text);
}
.modeltier__models { display: grid; gap: 9px; }
.modeltier__models li {
  padding: 8px 10px;
  border: 1px solid var(--line);
  border-radius: var(--r-sm);
  background: var(--surface-2);
  font-family: var(--f-mono);
  font-size: var(--fs-small);
  color: var(--text-2);
}

/* LA NOTA SUL PERIMETRO EUROPEO, subito sotto i quattro livelli.
   Non è una postilla: è la risposta alla domanda che nomi come GPT, Claude
   e Gemini fanno nascere in chi sta leggendo un listino. Per questo ha un
   riquadro suo con l'accento e lo scudo, e non il corpo delle note di
   servizio (`.credits__fine`, che sta appena sotto e dice un'altra cosa: che
   gli esempi sono esempi). Due note di seguito con lo stesso peso si
   leggerebbero come due postille, e la prima delle due andrebbe persa.
   Il colore lo fanno i token dell'accento: nei due temi cambiano da soli.

   LA SCATOLA E LA MISURA SONO DUE COSE DIVERSE, e qui si separano. Il tetto
   di 68ch che vale per ogni `<p>` del sito, applicato alla scatola, la
   fermava a poco più di metà riquadro: incassata fra una griglia a quattro
   colonne sopra e una nota a tutta larghezza sotto, si leggeva come un
   elemento rimasto indietro, non come una nota che conta. La scatola va
   quindi a tutta larghezza (`max-width: none`) e il tetto si sposta sul
   TESTO, agli stessi 92ch della nota qui sotto — così le due nate insieme
   vanno a capo nello stesso punto. */
.eunote {
  display: grid;
  grid-template-columns: auto minmax(0, 1fr);
  gap: 12px;
  align-items: start;
  max-width: none;
  margin: 18px 0 0;
  padding: 16px 18px;
  border: 1px solid var(--accent-line);
  border-radius: var(--r-md);
  background: var(--accent-soft);
  color: var(--text-2);
  font-size: var(--fs-small);
  line-height: 1.68;
}
/* `display: block` non è pleonastico: uno `<span>` è inline, e su un elemento
   inline un `max-width` non fallisce — semplicemente non succede niente. */
.eunote span { display: block; max-width: 92ch; }
/* Lo scudo si allinea alla PRIMA RIGA del testo, non al centro del blocco:
   un blocco di quattro righe con l'icona a metà altezza sembra staccata dal
   testo. I due pixel recuperano la differenza fra l'altezza dell'icona e
   quella della riga. */
.eunote svg { width: 18px; height: 18px; margin-top: 2px; color: var(--accent-fg); }

/* ===========================================================================
   PIANI — LA FASCIA ENTERPRISE
   ---------------------------------------------------------------------------
   Orizzontale, e non la quinta colonna. Il motivo sta in `pricing.php`: una
   scheda senza prezzo in fila con quattro che ce l'hanno viene letta come il
   gradino piu' caro di una scala, mentre e' un'altra conversazione.
   Il formato largo serve anche a far stare l'elenco per esteso: SSO,
   isolamento, SLA e data residency in una colonna stretta sarebbero un
   elenco troncato, cioe' esattamente cio' che chi valuta non puo' valutare.
   =========================================================================== */
.entband {
  display: grid;
  grid-template-columns: minmax(0, 0.95fr) minmax(0, 1.05fr);
  gap: clamp(24px, 3vw, 46px);
  align-items: center;
  margin-top: 18px;
  padding: clamp(24px, 3vw, 38px);
  border-radius: var(--r-lg);
  border: 1px solid var(--accent-line);
  background: var(--surface-2);
  position: relative;
  overflow: hidden;
}
/* Il filetto del brand sul bordo alto: e' la firma che dice «questo non e'
   una scheda come le altre» senza doverlo scrivere. Il gradiente vero
   (--grad) qui e' al posto giusto: e' decorazione e non porta testo. */
.entband::before {
  content: "";
  position: absolute; left: 0; right: 0; top: 0; height: 2px;
  background: var(--grad);
}
.entband__name {
  font-family: var(--f-mono); font-size: var(--fs-micro); letter-spacing: 0.13em;
  text-transform: uppercase; color: var(--accent-fg);
  margin: 0 0 12px;
}
.entband__t {
  font-size: clamp(1.34rem, 2vw, 1.7rem);
  line-height: 1.22; letter-spacing: -0.024em;
  margin: 0 0 14px;
  max-width: 22ch;
}
.entband__d {
  margin: 0 0 24px;
  font-size: var(--fs-small); line-height: 1.68; color: var(--text-2);
  max-width: 52ch;
}
/* Due colonne indipendenti: le CSS columns, a differenza della grid, non
   condividono l'altezza di riga. Una voce lunga nella colonna destra non crea
   quindi un vuoto artificiale fra due voci brevi nella colonna sinistra. */
.entband__list {
  column-count: 2;
  column-width: 220px;
  column-gap: 22px;
  margin: 0;
}
.entband__list li {
  display: grid; grid-template-columns: 15px 1fr; gap: 9px; align-items: start;
  break-inside: avoid;
  margin: 0 0 9px;
  font-size: var(--fs-small); line-height: 1.5; color: var(--text-2);
}
.entband__list svg { width: 13px; height: 13px; color: var(--verified); margin-top: 4px; }

/* ===========================================================================
   PIANI — LA MATRICE DI CONFRONTO
   ---------------------------------------------------------------------------
   Novantatre' righe: la prima colonna deve restare a schermo mentre si
   scorre in orizzontale, altrimenti a meta' tabella non si sa piu' quale
   funzione si sta guardando. `position: sticky` sulla cella, non sulla
   colonna: `<col>` non accetta sticky.

   La barra di scorrimento QUI RESTA (a differenza di simulatore e blocchi di
   codice, vedi il blocco piu' in alto): e' l'unico segnale che a destra c'e'
   una colonna in piu', e su una tabella di listino non vederla significa
   confrontare tre piani su cinque senza accorgersene.
   =========================================================================== */
.cmp-wrap { overflow-x: auto; scrollbar-width: thin; }
.cmp {
  width: 100%;
  min-width: 780px;
  border-collapse: collapse;
  text-align: left;
}
.cmp th, .cmp td {
  padding: 12px 14px;
  border-bottom: 1px solid var(--line);
  font-size: var(--fs-small);
  vertical-align: top;
}
/* L'intestazione resta in cima mentre si scorre la pagina: senza, dopo la
   terza riga non si sa piu' quale colonna e' quale, e la tabella diventa
   cinque elenchi di valori senza nome. */
.cmp thead th {
  position: sticky; top: 0; z-index: 3;
  background: var(--bg-2);
  font-family: var(--f-mono); font-size: var(--fs-micro); letter-spacing: 0.1em;
  text-transform: uppercase; color: var(--text-2);
  border-bottom-color: var(--line-2);
  white-space: nowrap;
}
.cmp tbody th {
  position: sticky; left: 0; z-index: 2;
  background: var(--bg-2);
  font-weight: 500; color: var(--text);
  min-width: 240px;
}
.cmp thead th:first-child { z-index: 4; left: 0; }
.cmp td { color: var(--text-2); line-height: 1.5; }
.cmp thead th:not(:first-child),
.cmp td { text-align: center; }
/* «Non incluso»: attenuato, mai vuoto. Una cella vuota si legge come un
   dato mancante; un trattino dice che quella riga e' stata considerata. */
.cmp__off { color: var(--text-3); text-align: center; }
/* L'intestazione di gruppo. `background` opaco perche' ci passa sotto la
   colonna appiccicata: senza, il testo della prima colonna la attraverserebbe
   durante lo scorrimento orizzontale. */
.cmp__grouprow th {
  position: sticky; left: 0;
  padding-top: 26px;
  background: var(--bg-2);
  font-family: var(--f-mono); font-size: var(--fs-micro); letter-spacing: 0.12em;
  text-transform: uppercase; color: var(--accent-fg);
  border-bottom-color: var(--accent-line);
}
.cmp tbody tr:hover td { color: var(--text); }

/* ===========================================================================
   PIANI — CONSUMI, ADD-ON E DEFINIZIONI
   =========================================================================== */
.meter {
  display: grid;
  grid-template-columns: repeat(3, minmax(0, 1fr));
  gap: 14px;
}
.meter__c {
  padding: 24px 22px;
  border-radius: var(--r-lg);
  border: 1px solid var(--line);
  background: var(--surface);
}
.meter__t { font-size: 1.04rem; font-weight: 700; letter-spacing: -0.02em; margin: 0 0 10px; }
.meter__d { margin: 0; font-size: var(--fs-small); line-height: 1.68; color: var(--text-2); }

.addons {
  display: grid;
  grid-template-columns: minmax(0, 0.6fr) minmax(0, 1.4fr);
  gap: clamp(20px, 3vw, 44px);
  align-items: start;
  margin-top: clamp(28px, 3vw, 44px);
  padding-top: clamp(28px, 3vw, 40px);
  border-top: 1px solid var(--line);
}
.addons__t { font-size: 1.04rem; font-weight: 700; letter-spacing: -0.02em; margin: 0 0 8px; }
.addons__d { margin: 0; font-size: var(--fs-small); line-height: 1.6; color: var(--text-3); }
.addons__list { display: flex; flex-wrap: wrap; gap: 8px; margin: 0; }
.addons__i {
  padding: 7px 13px;
  border-radius: var(--r-pill);
  border: 1px solid var(--line-2);
  font-size: var(--fs-small); color: var(--text-2);
}

.defs {
  margin-top: clamp(28px, 3vw, 44px);
  padding-top: clamp(28px, 3vw, 40px);
  border-top: 1px solid var(--line);
}
.defs__t { font-size: 1.04rem; font-weight: 700; letter-spacing: -0.02em; margin: 0 0 18px; }
.defs__l { display: grid; grid-template-columns: repeat(2, minmax(0, 1fr)); gap: 18px 34px; margin: 0; }
/* Termine e definizione in griglia e non uno sotto l'altro: il termine e'
   corto e ripetuto, e in colonna propria si scorre come un indice. */
.defs__row { display: grid; grid-template-columns: 200px minmax(0, 1fr); gap: 16px; align-items: start; }
.defs__row dt {
  font-family: var(--f-mono); font-size: var(--fs-micro); letter-spacing: 0.06em;
  text-transform: uppercase; color: var(--accent-fg);
  padding-top: 2px;
}
.defs__row dd { margin: 0; font-size: var(--fs-small); line-height: 1.65; color: var(--text-2); }

/* ===========================================================================
   CAROSELLO IN LOOP — componente generico
   ---------------------------------------------------------------------------
   Classi che non sanno COSA scorre: le usa il nastro dei benefici e le può
   usare chiunque altro abbia una lista che deve girare da sola. I fotogrammi
   li fa `@keyframes marquee` (definito con la fascia di fiducia, più su): è la
   stessa traslazione, e due copie della stessa animazione sarebbero due punti
   in cui sbagliare la prossima volta.

   CONTRATTO COL MARKUP — senza queste tre cose il giro non torna:
   1. la lista va emessa un numero PARI di volte dentro la stessa pista, con la
      seconda metà marcata `aria-hidden="true"`. L'animazione trasla del 50%:
      è la seconda metà che arriva dove stava la prima, ed è per questo che il
      ciclo non salta;
   2. le due metà devono essere IDENTICHE: se una è più corta il -50% non
      combacia più con niente;
   3. UNA metà deve essere più larga della finestra, altrimenti dopo la fine
      del contenuto resta del vuoto. Chi stampa il markup decide quante
      ripetizioni servono (vedi `benefits.php`).
   La durata la passa l'istanza con `--marquee-duration` — più voci ci sono,
   più lunga va messa, altrimenti a parità di durata la velocità apparente
   cambia — e il passo fra le voci con `--marquee-gap`. Entrambe hanno un
   ripiego qui.
   =========================================================================== */
.marquee {
  position: relative;
  width: 100%;
  overflow: hidden;
  /* `overflow: hidden` taglia anche in verticale: un'istanza le cui voci hanno
     un'ombra che sporge si dà un `--marquee-pad`, o il bordo della finestra la
     trancia. Di serie 0: il nastro dei benefici non ne ha. */
  padding-block: var(--marquee-pad, 0px);
  /* Dissolvenza ai due bordi. Senza, le voci entrano ed escono tagliate di
     netto e si legge come un difetto invece che come un nastro che continua.
     La maschera è decorazione: quello che sbiadisce sta uscendo comunque.
     Doppia dichiarazione perché Safari vuole ancora il prefisso. */
  -webkit-mask-image: linear-gradient(to right, transparent 0, #000 var(--marquee-fade, 56px), #000 calc(100% - var(--marquee-fade, 56px)), transparent 100%);
          mask-image: linear-gradient(to right, transparent 0, #000 var(--marquee-fade, 56px), #000 calc(100% - var(--marquee-fade, 56px)), transparent 100%);
}
.marquee__track {
  display: flex;
  /* max-content: la pista è larga quanto le due metà in fila, non quanto la
     finestra. Senza, il flex le comprimerebbe per farcele stare. */
  width: max-content;
  gap: var(--marquee-gap, 16px);
  animation: marquee var(--marquee-duration, 42s) linear infinite;
}
/* Le voci non si restringono mai: con lo shrink di partenza la pista larga
   max-content si sfalda. Vale per qualunque figlio, così il markup non deve
   ricordarsene. */
.marquee__track > * { flex: 0 0 auto; }
/*
  IL CONTO DEL GAP — è la parte che si sbaglia sempre, ed è lo stesso motivo
  per cui `.strip__list` si porta il proprio padding di coda.
  Con N voci per metà, la pista misura 2N*voce + (2N-1)*gap: i gap sono uno IN
  MENO delle voci, perché stanno solo FRA di loro. Il 50% di quella larghezza
  vale mezzo gap in meno di una metà intera, e ad ogni giro il nastro
  scatterebbe indietro di gap/2. Si aggiusta aggiungendo il gap come margine
  finale dell'ULTIMA voce della pista — non dell'ultima di ciascuna metà: in
  mezzo alle due il gap ce lo mette già `gap`.
*/
.marquee__track > :last-child { margin-inline-end: var(--marquee-gap, 16px); }
/* Pausa col mouse sopra e col fuoco da tastiera: un contenuto che scorre di
   continuo non si legge, e col fuoco chi naviga da tastiera si troverebbe il
   bersaglio che scappa. Vale finché a muovere la pista è questa animazione,
   cioè quando il JS non c'è; con il JS la pausa la fa lui, alle stesse due
   condizioni. */
.marquee:hover .marquee__track,
.marquee:focus-within .marquee__track { animation-play-state: paused; }

/* ---- SI AFFERRA E SI TRASCINA ----
   `.is-draggable` la mette antex.js quando prende in carico il movimento, e
   non compare mai nel markup: senza JS resta l'animazione qui sopra, che da
   sola funziona.
   L'animazione va SPENTA, non messa in pausa: sono due sorgenti della stessa
   proprietà, e una regola d'animazione vince sul `transform` che il JS scrive
   sull'elemento — convivendo, la pista tornerebbe indietro ad ogni fotogramma.
   `touch-action: pan-y` è la metà mobile della distinzione fra gesto
   orizzontale e verticale: il browser si tiene lo scorrimento verticale della
   pagina, che quindi non si rompe mai sopra il nastro, e lascia al JS quello
   orizzontale. Non è `none`, che bloccherebbe anche il verticale. */
.marquee.is-draggable { cursor: grab; touch-action: pan-y; }
.marquee.is-draggable .marquee__track { animation: none; will-change: transform; }
/* Mentre si trascina lo dice il cursore, e il testo non si seleziona: con la
   selezione attiva il gesto diventerebbe un evidenziatore. */
.marquee.is-dragging { cursor: grabbing; }
.marquee.is-dragging .marquee__track { -webkit-user-select: none; user-select: none; }

/* ===========================================================================
   HOME · COSA CAMBIA IN AZIENDA
   Benefici in nastro continuo. Non è la bento dei moduli: le celle sono pari,
   perché nessun beneficio conta più degli altri e la gerarchia sarebbe una
   bugia grafica. Il taglio è quello che le distingue: filetti fra le celle
   invece di card staccate, così la sezione si legge come un ragionamento
   continuo e non come sei riquadri — ed è il motivo per cui il gap del nastro
   è di UN pixel su fondo `--line` e non lo spazio fra schede che si vede di
   solito nei caroselli.
   Il nastro non ha bordo né raggio: comincia e finisce con la dissolvenza
   della `.marquee`, e un angolo arrotondato in mezzo a una fascia che esce
   dallo schermo sarebbe un riquadro senza i suoi due lati.
   =========================================================================== */
.bens {
  --marquee-gap: 1px;
  /* La dissolvenza è generosa sul desktop e piccola sul telefono. Non è una
     proporzione: a 390px si vede UNA scheda per volta, quindi c'è sempre una
     scheda a cavallo della sfumatura, e con 27px (7vw) le prime lettere del
     titolo uscivano sbiadite — su un desktop la stessa cosa succede solo a una
     scheda che sta comunque uscendo. Il tetto basso la tiene DENTRO il respiro
     della scheda (24px), dove non c'è testo da spegnere. */
  --marquee-fade: clamp(16px, 5vw, 96px);
  background: var(--line);
  border-block: 1px solid var(--line);
}
/* La cella sta UN TONO OLTRE la sua sezione, che dal 31/08/2026 è il tono 2:
   la scala --bg → --bg-2 → --bg-3 si allontana dal fondo della pagina nel
   verso giusto in tutti e due i temi (in scuro schiarisce, in chiaro scurisce),
   quindi «un tono oltre» vuol dire staccare, non solo cambiare colore. Se un
   giorno la sezione torna sul tono 1, queste due righe tornano a --bg-2 e
   --bg-3: con lo stesso tono di fondo e di cella il nastro sparisce.
   Rapporti sul fondo delle celle: testo 16,2:1 e testo-2 9,4:1 in scuro,
   17,4:1 e 6,8:1 in chiaro; sul fondo del passaggio del mouse 12,4:1 / 7,2:1
   e 16,5:1 / 6,4:1. */
.ben {
  /* Larghezza fissa: è quello che rende la pista misurabile. Su schermo
     stretto scende sotto la finestra, così si vede il bordo della scheda
     successiva e si capisce che il nastro continua. */
  width: min(340px, 82vw);
  background: var(--bg-3);
  padding: clamp(24px, 2.6vw, 32px);
  transition: background-color var(--t-slow) var(--ease);
}
.ben:hover { background: var(--surface-3); }
.ben__ico {
  width: 40px; height: 40px;
  border-radius: var(--r-sm);
  display: grid; place-items: center;
  background: var(--accent-soft);
  border: 1px solid var(--accent-line);
  color: var(--accent-fg);
  margin-bottom: 18px;
}
.ben__ico svg { width: 19px; height: 19px; }
.ben__t {
  font-family: var(--f-display); font-weight: 700;
  font-size: 1.1rem; letter-spacing: -0.02em; line-height: 1.3;
  margin-bottom: 10px;
}
.ben__d { margin: 0; font-size: 0.94rem; line-height: 1.68; color: var(--text-2); }
.bens__note {
  margin: clamp(26px, 3vw, 38px) 0 0;
  max-width: 76ch;
  font-size: 0.94rem;
  line-height: 1.68;
  color: var(--text-3);
  padding-left: 16px;
  border-left: 2px solid var(--accent-line);
}

/* ===========================================================================
   HOME · COME FUNZIONA, IN PAROLE SEMPLICI
   Tre passi a sinistra, le obiezioni a destra. Le obiezioni non sono un
   accessorio: sono la ragione per cui questa sezione esiste. Chi non conosce
   l'argomento non si blocca sul «come funziona» ma sul «e allora cosa devo
   fare io», e quella domanda va sciolta accanto ai passi, non tre schermate
   più in basso.
   =========================================================================== */
.simple {
  display: grid;
  grid-template-columns: minmax(0, 1.25fr) minmax(0, 0.85fr);
  gap: clamp(36px, 4.5vw, 68px);
  align-items: start;
}
.threesteps { display: grid; gap: 4px; }
.tstep {
  display: grid;
  grid-template-columns: 56px minmax(0, 1fr);
  gap: clamp(16px, 2vw, 26px);
  padding: 24px 0;
  border-bottom: 1px solid var(--line);
}
.threesteps .tstep:last-child { border-bottom: 0; }
.tstep__n {
  font-family: var(--f-mono);
  font-size: 1.4rem;
  font-weight: 600;
  line-height: 1;
  color: var(--accent-fg);
  padding-top: 4px;
}
.tstep__t {
  font-family: var(--f-display); font-weight: 700;
  font-size: 1.16rem; letter-spacing: -0.02em;
  margin-bottom: 8px;
}
.tstep__d { margin: 0; font-size: 0.96rem; line-height: 1.68; color: var(--text-2); max-width: 56ch; }
/* «Chi lo fa»: è la riga che toglie l'ansia da adozione, e va letta come una
   nota a margine, non come un altro paragrafo. */
.tstep__w {
  display: inline-flex; align-items: center; gap: 8px;
  margin-top: 12px;
  padding: 6px 13px;
  border-radius: var(--r-pill);
  background: var(--accent-soft);
  border: 1px solid var(--accent-line);
  color: var(--accent-fg);
  font-size: var(--fs-small); font-weight: 600;
}
.tstep__w svg { width: 14px; height: 14px; flex: none; }

.faqbox {
  padding: clamp(24px, 2.6vw, 32px);
  border-radius: var(--r-lg);
  border: 1px solid var(--line);
  background: var(--surface);
}
.faqbox__t {
  font-family: var(--f-display); font-weight: 700;
  font-size: 1.06rem; letter-spacing: -0.02em;
  margin-bottom: 18px;
}
.faqbox__list { display: grid; gap: 16px; }
.faqbox__list li {
  font-size: 0.94rem;
  line-height: 1.62;
  color: var(--text-2);
  padding-left: 18px;
  position: relative;
}
.faqbox__list li::before {
  content: "";
  position: absolute; left: 0; top: 0.62em;
  width: 7px; height: 7px; border-radius: 50%;
  background: var(--accent-fg);
}

/* ===========================================================================
   HOME · SICUREZZA E PRIVACY
   Il riquadro UE è il fatto principale e usa l'accento come superficie. Le
   altre garanzie restano schede sobrie: devono argomentare, non simulare una
   certificazione che il prodotto non dichiara.
   =========================================================================== */
.home-sec {
  display: grid;
  grid-template-columns: minmax(0, 1.08fr) minmax(0, 0.92fr);
  gap: clamp(40px, 5vw, 76px);
  align-items: start;
}
.home-sec__lead .lede { max-width: 58ch; }
.home-sec__eu {
  display: grid;
  grid-template-columns: auto minmax(0, 1fr);
  gap: 20px;
  align-items: center;
  margin-top: 30px;
  padding: clamp(22px, 2.8vw, 32px);
  border-radius: var(--r-lg);
  background: var(--accent-fg);
  color: var(--on-accent);
}
.home-sec__eu-mark {
  display: grid;
  place-items: center;
  width: 66px;
  height: 66px;
  border: 2px solid currentColor;
  border-radius: 50%;
  font-family: var(--f-mono);
  font-size: 1.06rem;
  font-weight: 800;
  letter-spacing: 0.08em;
}
.home-sec__eu-title {
  margin: 0 0 7px;
  color: inherit;
  font-family: var(--f-display);
  font-size: 1.2rem;
  font-weight: 750;
  letter-spacing: -0.02em;
}
.home-sec__eu-body {
  margin: 0;
  color: inherit;
  font-size: 0.94rem;
  line-height: 1.62;
}
.home-sec__cta { margin: 22px 0 0; }
.home-sec__facts { display: grid; gap: 14px; }
.home-sec__fact {
  display: grid;
  grid-template-columns: auto minmax(0, 1fr);
  gap: 18px;
  padding: clamp(22px, 2.4vw, 28px);
  border: 1px solid var(--line);
  border-radius: var(--r-lg);
  background: var(--surface);
}
.home-sec__fact-icon {
  display: grid;
  place-items: center;
  width: 42px;
  height: 42px;
  border-radius: 50%;
  background: var(--accent-soft);
  color: var(--accent-fg);
}
.home-sec__fact-icon svg { width: 20px; height: 20px; }
.home-sec__fact-title {
  margin: 1px 0 8px;
  font-family: var(--f-display);
  font-size: 1.04rem;
  font-weight: 700;
  line-height: 1.35;
  letter-spacing: -0.02em;
}
.home-sec__fact-body {
  margin: 0;
  color: var(--text-2);
  font-size: 0.94rem;
  line-height: 1.68;
}

/* ===========================================================================
   HOME · OGNI RISPOSTA HA UNA FONTE
   Tre affermazioni in colonna, numerate. È la sezione più «argomentativa»
   della home e non ha mockup: quello sta nelle simulazioni, e il rimando ce
   lo porta.
   =========================================================================== */
.proof { display: grid; grid-template-columns: repeat(3, minmax(0, 1fr)); gap: clamp(24px, 3vw, 44px); }
.proof__p { border-top: 2px solid var(--accent-line); padding-top: 20px; }
.proof__k {
  font-family: var(--f-display); font-weight: 700;
  font-size: 1.06rem; letter-spacing: -0.02em; line-height: 1.32;
  margin-bottom: 10px;
}
.proof__d { margin: 0; font-size: 0.94rem; line-height: 1.68; color: var(--text-2); }
/* La precisazione non è una quarta affermazione: sta sotto le tre, in
   corpo minore, come una nota a margine che corregge una lettura
   sbagliata. Se avesse lo stesso peso delle altre diventerebbe una
   funzione da vendere, e non è: è un limite che qualcuno teme e che qui
   si toglie di mezzo.
   Giustificata e larga quanto la sezione (vedi `.longnote`): cinque righe
   centrate sono cinque inizi di riga diversi da cercare. */
.proof__note {
  margin: clamp(28px, 3vw, 40px) 0 0;
  font-size: 0.9rem;
  line-height: 1.7;
  color: var(--text-3);
}

/* ===========================================================================
   HOME · DIGIBITE TI ACCOMPAGNA
   ---------------------------------------------------------------------------
   È l'unica sezione della home che parla di CHI vende invece che di cosa si
   vende, e deve suonare diversa senza urlare. Il segno distintivo è uno solo:
   un filetto con il gradiente del brand lungo il bordo sinistro. Il gradiente
   qui è decorazione e non porta testo, quindi si usa quello vero (--grad),
   non la versione scurita del pulsante.
   =========================================================================== */
.dgb {
  display: grid;
  grid-template-columns: minmax(0, 1fr) minmax(0, 1fr);
  gap: clamp(36px, 4.5vw, 72px);
  align-items: start;
}
.dgb__quote {
  position: relative;
  margin: 28px 0 0;
  padding: 4px 0 4px 26px;
  font-family: var(--f-display);
  font-size: clamp(1.14rem, 1.6vw, 1.34rem);
  font-weight: 600;
  line-height: 1.5;
  letter-spacing: -0.015em;
  color: var(--text);
  max-width: 46ch;
}
.dgb__quote::before {
  content: "";
  position: absolute; left: 0; top: 0; bottom: 0;
  width: 3px; border-radius: 3px;
  background: var(--grad);
}
.dgb__points { display: grid; gap: 2px; }
.dgb__p {
  display: grid;
  grid-template-columns: 40px minmax(0, 1fr);
  gap: 16px;
  align-items: start;
  padding: 20px 0;
  border-bottom: 1px solid var(--line);
}
.dgb__points .dgb__p:last-child { border-bottom: 0; }
.dgb__ico {
  width: 40px; height: 40px;
  display: grid; place-items: center;
  border-radius: var(--r-sm);
  background: var(--accent-soft);
  border: 1px solid var(--accent-line);
  color: var(--accent-fg);
}
.dgb__ico svg { width: 18px; height: 18px; }
.dgb__k { font-size: 1.04rem; font-weight: 700; letter-spacing: -0.02em; margin-bottom: 7px; }
.dgb__d { margin: 0; font-size: 0.94rem; line-height: 1.66; color: var(--text-2); }

/* ===========================================================================
   PAGINA · IL METODO DIGIBITE
   =========================================================================== */
.origin {
  margin: clamp(34px, 4vw, 54px) 0;
  padding: clamp(26px, 3vw, 38px);
  border-radius: var(--r-lg);
  border: 1px solid var(--line);
  background: var(--surface);
}
.origin__t {
  font-family: var(--f-display); font-weight: 700;
  font-size: clamp(1.2rem, 1.8vw, 1.44rem); letter-spacing: -0.02em;
  margin-bottom: 14px;
}
.origin p { font-size: 1rem; line-height: 1.72; color: var(--text-2); max-width: 74ch; }

.phases { display: grid; gap: 0; counter-reset: phase; }
.phase {
  display: grid;
  grid-template-columns: 58px minmax(0, 1fr) minmax(0, 0.72fr);
  gap: clamp(18px, 2.4vw, 34px);
  padding: clamp(24px, 2.6vw, 34px) 0;
  border-bottom: 1px solid var(--line);
  align-items: start;
}
.phases .phase:last-child { border-bottom: 0; }
.phase__n {
  width: 46px; height: 46px;
  display: grid; place-items: center;
  border-radius: 50%;
  border: 1px solid var(--accent-line);
  background: var(--accent-soft);
  color: var(--accent-fg);
}
.phase__n svg { width: 19px; height: 19px; }
.phase__step {
  font-family: var(--f-mono); font-size: var(--fs-micro); letter-spacing: 0.12em;
  text-transform: uppercase; color: var(--accent-fg); margin-bottom: 8px;
}
.phase__t {
  font-family: var(--f-display); font-weight: 700;
  font-size: 1.2rem; letter-spacing: -0.02em; margin-bottom: 9px;
}
.phase__d { margin: 0; font-size: 0.96rem; line-height: 1.68; color: var(--text-2); max-width: 56ch; }
/* «Cosa resta all'azienda»: senza questa colonna le fasi sono un elenco di
   riunioni. Sta a destra e non sotto, così si può leggere SOLO quella
   colonna e capire lo stesso il percorso. */
.phase__out {
  padding: 14px 16px;
  border-radius: var(--r-md);
  background: var(--surface);
  border: 1px solid var(--line);
}
.phase__outk {
  font-family: var(--f-mono); font-size: var(--fs-micro); letter-spacing: 0.1em;
  text-transform: uppercase; color: var(--text-3); margin-bottom: 6px;
}
.phase__outv { font-size: var(--fs-small); line-height: 1.55; color: var(--text); font-weight: 500; margin: 0; }

.promises { display: grid; grid-template-columns: repeat(auto-fit, minmax(260px, 1fr)); gap: 14px; }
.promise {
  padding: 24px 22px;
  border-radius: var(--r-lg);
  border: 1px solid var(--line);
  background: var(--surface);
}
.promise__k {
  display: flex; align-items: center; gap: 10px;
  font-size: 1.02rem; font-weight: 700; letter-spacing: -0.02em;
  margin-bottom: 9px;
}
.promise__k svg { width: 17px; height: 17px; color: var(--accent-fg); flex: none; }
.promise__d { margin: 0; font-size: 0.92rem; line-height: 1.62; color: var(--text-2); }

/* ===========================================================================
   MOVIMENTO
   Solo transform e opacity: sono le uniche proprietà composte dalla GPU.
   Animare top/left/width/height ricalcola il layout ad ogni frame.
   =========================================================================== */
[data-reveal] {
  opacity: 0;
  transform: translateY(22px);
  filter: blur(6px);
  transition: opacity var(--t-slow) var(--ease),
              transform var(--t-slow) var(--ease),
              filter var(--t-slow) var(--ease);
  transition-delay: var(--d, 0ms);
}
[data-reveal].is-in { opacity: 1; transform: none; filter: none; }

/* ===========================================================================
   RESPONSIVE  (par. 22.4: 360 / 390 / 768 / 1024 / 1280 / 1440 / 1920)
   Su mobile scala il TIPO, non il vuoto: il ritmo verticale resta.
   =========================================================================== */
/* SEI VOCI, e sotto i 1340px non ci stanno con il respiro pieno.
   Prima erano cinque e il margine bastava; con «Affidabilità» in più — che è
   diventata una voce di primo livello da quando non sta più nel sottomenu —
   fra i 1181px (dove compare l'hamburger) e i 1340 la barra si affollava e le
   etichette di due parole andavano a capo. Si stringe il respiro, che è
   spazio vuoto, invece di rimpicciolire il testo, che è contenuto. */
@media (max-width: 1340px) {
  .nav__inner { gap: 14px; }
  .nav__links { gap: 0; }
  .nav__link { padding-inline: 9px; }
}

@media (max-width: 1180px) {
  .nav__links { display: none; }
  .nav__burger { display: inline-flex; }
  .nav__cta .btn--ghost { display: none; }
  .foot__grid { grid-template-columns: 1fr 1fr 1fr; }
  .foot__brand { grid-column: 1 / -1; max-width: 46ch; }
}

@media (max-width: 1024px) {
  .hero { min-height: 0; padding-top: 118px; }
  .hero__grid { grid-template-columns: minmax(0, 1fr); gap: 46px; }
  .hero__copy { max-width: 660px; }
  /* In colonna unica il tetto e l'ancoraggio a destra non servono più e anzi
     fanno danno: il simulatore si staccherebbe dal bordo sinistro, cioè da
     dove comincia il testo appena sopra. */
  .hero__sim { justify-self: stretch; max-width: none; }
  /* I tre segni della hero senza cornice spariscono: a colonna unica non c'è
     nessun confine verticale da segnare, e il filo cadrebbe in mezzo al testo.
     Le squadre resterebbero appese ai bordi dello schermo, i cerchi
     occuperebbero mezza schermata dietro il titolo. */
  .hero__seam,
  .hero__mark,
  .hero__rings { display: none; }
  .flow { grid-template-columns: repeat(2, 1fr); gap: 34px 16px; }
  .flow::before { display: none; }
  .bento { grid-template-columns: repeat(2, 1fr); }
  .bento__cell--lead { grid-column: span 2; grid-row: span 1; }
  /* Le varianti si nominano esplicitamente: senza, avrebbero la stessa
     specificità di `.split` e vincerebbe la regola scritta più in basso. */
  .split,
  .split--code,
  .split--form,
  .embed,
  .simple,
  .home-sec,
  .dgb,
  .wl { grid-template-columns: minmax(0, 1fr); gap: 40px; }
  .split--flip .split__visual { order: 0; }
  .trust { grid-template-columns: minmax(0, 1fr); min-height: 0; }
  .trust__col + .trust__col { border-left: 0; border-top: 1px solid var(--line); }
  .proof { grid-template-columns: minmax(0, 1fr); gap: 28px; }
  /* Il racconto di settore passa sotto l'immagine prima che la colonna di
     testo scenda sotto una misura leggibile. */
  .sectorstory { grid-template-columns: minmax(0, 1fr); min-height: 0; }
  .sectorstory__media { min-height: 0; aspect-ratio: 16 / 9; }
  .sectorstory__media::after { border-right: 0; border-bottom: 1px solid var(--line); }
  .sectorstory__content { max-width: 720px; }
  /* Quattro piani in riga sotto i 1024px darebbero colonne da 220px: il
     prezzo ci sta, l'elenco delle funzioni no. Due e due. */
  .plans { grid-template-columns: repeat(2, minmax(0, 1fr)); }
  .modeltiers { grid-template-columns: repeat(2, minmax(0, 1fr)); }
  .entband { grid-template-columns: minmax(0, 1fr); }
  .meter { grid-template-columns: minmax(0, 1fr); }
  .addons { grid-template-columns: minmax(0, 1fr); }
  .defs__l { grid-template-columns: minmax(0, 1fr); }
  .phase { grid-template-columns: 52px minmax(0, 1fr); }
  .phase__out { grid-column: 2; }
  /* La guida del simulatore: passi sopra, spiegazione sotto. Affiancati
     sotto i 1024px la spiegazione resterebbe una colonna da venti caratteri. */
  /* Cinque colonne sotto i 1024px sarebbero larghe 150px scarsi: si passa a
     due, e su telefono a una. Restano in griglia, quindi allineate. */
  .simguide__steps { grid-template-columns: repeat(2, minmax(0, 1fr)); }
  /* IL PIEDE TORNA IN COLONNA, e il numero non è arbitrario: la ragione
     sociale con la P. IVA è una riga da ~550px che non si spezza volentieri,
     e con il copyright e il telefono ai lati le tre zone chiedono ~890px di
     contenitore. Sotto, le due colonne elastiche si stringono sotto la loro
     misura e copyright e telefono vanno a capo in mezzo — «ANTEX © 2026 /
     DigiBite» su due righe, che è peggio di tre righe intere.
     Impilate tornano tutte a sinistra: centrarne una e spingerne un'altra a
     destra in una colonna stretta dà tre righe che cominciano in tre punti
     diversi. */
  .foot__bar { grid-template-columns: minmax(0, 1fr); gap: 8px; }
  .foot__bar-c,
  .foot__bar-r { text-align: left; }
}

@media (max-width: 860px) {
  /* Il pannello laterale del simulatore va sotto la chat (par. 15.1):
     nessun pannello sovrapposto che riduca la leggibilità.
     Impilati, i due riquadri hanno ciascuno la propria altezza: l'altezza
     fissa del desktop qui non serve più e va tolta, altrimenti chat e
     pannello dovrebbero dividersi 420px in due. */
  .sim__body { grid-template-columns: minmax(0, 1fr); height: auto; }
  .sim__chat { height: 330px; }
  .sim__side { border-left: 0; border-top: 1px solid var(--line); }
  .sim__panel { max-height: 240px; }

  /* -------------------------------------------------------------------------
     SOTTO GLI 860px IL SIMULATORE NON C'È.
     -------------------------------------------------------------------------
     860px è la soglia in cui chat e pannello smettono di stare affiancati, ed
     è esattamente il punto in cui la dimostrazione smette di dimostrare: sei
     riquadri in fila, una risposta e la fonte che la sostiene a due schermate
     di distanza, e per confrontarle bisogna scorrere avanti e indietro a
     memoria. Meglio non mostrarla e dire dove guardarla.

     Con il simulatore se ne vanno le cose che senza di lui non hanno senso:
     il cartello di avvio (non c'è niente da avviare), la visita guidata (non
     c'è niente da illuminare), la fila dei casi (non c'è dove mostrarli) e
     l'avviso «è una simulazione» (non c'è nessuna simulazione a schermo). Al
     loro posto resta `.simoff`, uno solo per pagina.

     È il CSS a deciderlo e non il PHP: dal server la larghezza non si sa, e
     dedurla dallo user agent significa sbagliarla su ogni tablet. Il costo è
     che il markup viene comunque scaricato — poche decine di KB di testo già
     compresso, in cambio di una decisione presa dove l'informazione c'è.
     ------------------------------------------------------------------------- */
  .simstage > .sim,
  .simstage > .simguide,
  .simstart,
  .pickerbar,
  .sim__disclaimer { display: none; }
  .simoff { display: flex; }
  .stickycta { display: block; }
  /* La CTA sticky non deve coprire l'ultima riga del footer. */
  .foot { padding-bottom: 96px; }

  /* Con la chat e il pannello IMPILATI, spegnere una delle due zone la manda
     comunque fuori schermo mentre si legge l'altra: la guida deve quindi
     anche PORTARCI. Lo scroll lo fa il JavaScript; qui si aumenta solo lo
     stacco, perché su colonna stretta un'opacità al 38% accanto a un blocco
     acceso si legge peggio che su due colonne affiancate. */
  .sim[data-focus="chat"] .sim__side,
  .sim[data-focus="actions"] .sim__side,
  .sim[data-focus="sources"] .sim__chat,
  .sim[data-focus="conf"] .sim__chat,
  .sim[data-focus="lead"] .sim__chat { opacity: 0.6; }
}

@media (max-width: 760px) {
  .pairs { grid-template-columns: minmax(0, 1fr); }
  .planaddons { grid-template-columns: minmax(0, 1fr); }
  .planaddon__name { min-height: 0; }
  .sectorfilters { grid-template-columns: repeat(2, minmax(0, 1fr)); }
}

@media (max-width: 640px) {
  /* Sotto i 640px giustificare vuol dire distribuire lo spazio su una
     riga da ~40 caratteri: non ce n'è abbastanza, e i buchi fra le parole
     si vedono tutti. Si torna allineati a sinistra. */
  .longnote { text-align: left; }

  .billing {
    width: 100%;
    padding: 12px;
    border-radius: var(--r-lg);
    flex-direction: column;
    align-items: stretch;
  }
  .billing__label,
  .billing__badge { margin-inline: 0; text-align: center; }
  .billing__choices { width: 100%; }
  .billing__choice { flex: 1 1 50%; }

  /* --- Su colonna stretta il testo va a sinistra ---
     Centrare un paragrafo di sei righe larghe 40 caratteri significa dare a
     ogni riga un punto d'inizio diverso: l'occhio deve ritrovare il margine a
     ogni capo, e la lettura rallenta. Su schermo largo il problema non c'è
     (le righe sono poche e il blocco è un'isola in mezzo al vuoto), quindi
     `.sec-head--center` resta centrato di là e passa a sinistra qui.
     Chi ha bisogno del centro anche sul telefono — perché il contenuto sotto
     è centrato a sua volta — usa `.sec-head--center-all`. */
  /* `--center` torna a sinistra sul telefono: allora anche le scatole devono
     tornare ancorate a sinistra, altrimenti resterebbero centrate con dentro
     del testo allineato a sinistra — che è il difetto di prima al contrario.
     `--center-all` non è toccato: quello resta centrato ovunque, apposta. */
  .sec-head--center { margin-inline: 0; text-align: left; }
  .sec-head--center :where(h1, h2, h3, h4, p, ul, ol) { margin-inline: 0; }
  .sec-head--center .eyebrow { justify-content: flex-start; }
  .sec-head--center .lede { margin-inline: 0; }

  .bento { grid-template-columns: minmax(0, 1fr); }
  .bento__cell--lead, .bento__cell--wide { grid-column: span 1; }
  /* I filtri non diventano otto righe prima della storia: restano una pista
     orizzontale, con una porzione del successivo visibile come invito allo
     scorrimento. Il traboccamento è confinato alla pista, non alla pagina. */
  .sectorexplorer__nav { padding-inline: 16px; }
  .sectorfilters {
    display: flex;
    gap: 9px;
    overflow-x: auto;
    scrollbar-width: thin;
    scroll-snap-type: x proximity;
    padding: 2px 2px 8px;
  }
  .sectorfilter {
    flex: 0 0 min(230px, 78vw);
    scroll-snap-align: start;
  }
  .sectorstory__media { aspect-ratio: 4 / 3; }
  .sectorstory__content { padding: 28px 22px 34px; }
  .sectorstory__t { max-width: none; }
  /* «Come funziona»: cinque fasi in colonna, allineate a sinistra.
     `text-align: left` sul contenitore non basta — `.flow__step` dichiara
     `center` per conto suo, e una dichiarazione sull'elemento batte sempre
     l'ereditarietà dal genitore. Va scritto QUI, sul passo. */
  .flow { grid-template-columns: minmax(0, 1fr); gap: 28px; text-align: left; }
  .flow__step {
    padding: 0;
    display: grid;
    grid-template-columns: 48px minmax(0, 1fr);
    gap: 16px;
    align-items: start;
    text-align: left;
  }
  .flow__node { margin: 0; }
  .flow__d { max-width: none; margin: 0; }
  .srcgrid { grid-template-columns: repeat(2, 1fr); }
  .form { grid-template-columns: minmax(0, 1fr); }
  .foot__grid { grid-template-columns: 1fr 1fr; }
  .btn-row .btn { width: 100%; }
  /* Stessa ragione dei titoli di sezione: è una nota di quattro righe, e
     centrata su colonna stretta ognuna comincia in un punto diverso. */
  .plans__note { margin-inline: 0; text-align: left; }
  /* Le fasi del metodo: numero e testo, il risultato sotto. */
  .phase { grid-template-columns: 44px minmax(0, 1fr); gap: 14px; }
  .phase__n { width: 40px; height: 40px; }
  .tstep { grid-template-columns: 40px minmax(0, 1fr); gap: 14px; }
  .tstep__n { font-size: 1.2rem; }
}

/* ===========================================================================
   MOBILE STRETTO — correzioni di traboccamento
   ---------------------------------------------------------------------------
   Tutto quello che sta qui sotto nasce da difetti VISTI a 390px, non previsti
   a tavolino. La regola generale che li unisce: un `max-width` in pixel e una
   traccia di griglia `1fr` sono entrambi più larghi del viewport quando il
   viewport è piccolo, e `overflow-x: hidden` sul body non li ripara — li
   NASCONDE, che a schermo si vede come testo tagliato a metà parola.
   =========================================================================== */
@media (max-width: 720px) {
  /* Un tetto in pixel non deve mai superare lo spazio disponibile. */
  .widget,
  .wl__note   { max-width: min(380px, 100%); }
  .hero__copy { max-width: none; }
  .sec-head   { max-width: none; }
  .pagehead__inner { max-width: none; }

  /* La barra del simulatore: su schermo stretto il nome dell'assistente e la
     pastiglia del modello si contendevano la stessa riga. Il modello passa
     sotto, dove ha spazio, invece di sovrapporsi. */
  /* LA BARRA VA A CAPO: nome e settore sulla prima riga accanto all'avatar,
     stato e modello sulla seconda.
     La base di `.sim__who` è calcolata e non `auto` per una ragione precisa:
     con `auto` la dimensione ipotetica del blocco è quella del suo contenuto
     — il settore per esteso, «Manifattura, materiali e vendita tecnica»,
     ~360px — e l'algoritmo di riga la confronta con lo spazio rimasto accanto
     all'avatar PRIMA di applicare il troncamento. Non ci sta, quindi va a capo
     intera, e l'avatar resta da solo su una riga con il nome sotto e il
     modello su una terza. Con base 0, all'opposto, il blocco non chiede
     niente: stato e modello restano sulla stessa riga e il nome si riduce a
     «A…».
     `100% - 60px` è la larghezza che avanza accanto all'avatar (32 o 40px a
     seconda del modo, più il vuoto): il blocco riempie la prima riga esatta,
     e stato e modello non ci stanno più e scendono. Un solo numero, e vale in
     tutti e due i modi del simulatore. */
  .sim__bar { flex-wrap: wrap; row-gap: 8px; }
  .sim__who { flex: 1 1 calc(100% - 60px); }
  .sim__status { order: 2; margin-left: 0; }
  .sim__model { order: 3; margin-left: auto; }

  /* La matrice di confronto lascia il posto alle schede per assistente.
     Prima restava una tabella a scorrimento orizzontale con la colonna delle
     etichette fissa: leggibile, ma mostrava un assistente per volta — cioè
     nascondeva il confronto, che è l'unica ragione per cui la sezione esiste,
     e chiedeva l'unico gesto che il resto della pagina non chiede mai.
     Il markup delle due viste sta in `sections/assistants.php` e nasce dalla
     stessa struttura di dati: `display: none` e non `visibility`, così nel
     DOM accessibile ce n'è sempre una sola. */
  .matrix-wrap { display: none; }
  .acards { display: grid; gap: 14px; }
}

@media (max-width: 560px) {
  /* Nella barra non ci stanno insieme marchio, interruttore del tema,
     pulsante e menu: il pulsante esce. Non si perde niente — la stessa
     azione è nella barra fissa in fondo e come prima voce del menu.
     L'interruttore del tema RESTA: è l'unico modo di raggiungerlo, e sul
     telefono è anche dove serve di più. */
  .nav__cta .btn--primary { display: none; }
  .nav__inner { padding-left: 16px; padding-right: 8px; gap: 10px; }
  .brand__name { font-size: 1.08rem; }

  /* Il titolo della hero: sotto i 360px `22ch` supera comunque la colonna. */
  .h-hero { max-width: none; }

  .home-sec__eu { grid-template-columns: minmax(0, 1fr); }
  .home-sec__eu-mark { width: 58px; height: 58px; }
  .home-sec__fact { grid-template-columns: minmax(0, 1fr); }

  /* Il vetro costa: su telefono con molte superfici sfocate lo scorrimento
     perde frame. I livelli 1 e 3 restano (sono pochi elementi), il livello 2
     — che sono le decine di card della pagina — diventa tinta piena. */
  .g2 {
    -webkit-backdrop-filter: none;
            backdrop-filter: none;
    background: var(--surface-solid);
  }
  .proof { gap: 24px; }
  .plans { grid-template-columns: minmax(0, 1fr); align-items: start; }
  .modeltiers { grid-template-columns: minmax(0, 1fr); }
  .plan__lab { min-height: 0; }
  .plan__tag { min-height: 0; }
  .plan__billing-note { min-height: 0; }
  /* Il termine sopra la definizione: 200px di colonna su un telefono
     lascerebbero alla spiegazione una misura da due parole per riga. */
  .defs__row { grid-template-columns: minmax(0, 1fr); gap: 6px; }
  .cmp tbody th { min-width: 170px; }
  .simguide { padding: 14px 15px; }
  .simguide__steps { grid-template-columns: minmax(0, 1fr); }
  /* Su una colonna il testo va a capo quanto serve: un minimo pensato per
     tre righe larghe qui bloccherebbe uno spazio vuoto. */
  .simguide__say { min-height: 0; }
}

@media (max-width: 400px) {
  .srcgrid { grid-template-columns: minmax(0, 1fr); }
  .sim__body { min-height: 0; }
}

/* ===========================================================================
   TEMA CHIARO — le poche cose che i token da soli non risolvono
   ---------------------------------------------------------------------------
   Sono due, e sono entrambi casi in cui il colore NON arriva da una proprietà
   CSS che possa leggere una variabile: un SVG dentro un `background-image`,
   usato dalla select e dalla checkbox. Due eccezioni sono poche
   abbastanza da poterle tenere insieme e vederle tutte in una volta.
   =========================================================================== */
@media (prefers-color-scheme: light) {
  :root:not([data-theme="dark"]) .sectorstory__media.has-light .sectorstory__img--dark { display: none; }
  :root:not([data-theme="dark"]) .sectorstory__media.has-light .sectorstory__img--light { display: block; }
  :root:not([data-theme="dark"]) .select {
    background-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 12 12' fill='none' stroke='%234C5170' stroke-width='1.6'%3E%3Cpath d='M2.5 4.5 6 8l3.5-3.5'/%3E%3C/svg%3E");
  }
  :root:not([data-theme="dark"]) .check input:checked {
    background-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 14 14' fill='none' stroke='%23FFFFFF' stroke-width='2.4' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpath d='M3 7.4 5.9 10.3 11 4.6'/%3E%3C/svg%3E");
  }
}
:root[data-theme="light"] .sectorstory__media.has-light .sectorstory__img--dark { display: none; }
:root[data-theme="light"] .sectorstory__media.has-light .sectorstory__img--light { display: block; }
:root[data-theme="light"] .select {
  background-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 12 12' fill='none' stroke='%234C5170' stroke-width='1.6'%3E%3Cpath d='M2.5 4.5 6 8l3.5-3.5'/%3E%3C/svg%3E");
}
:root[data-theme="light"] .check input:checked {
  background-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 14 14' fill='none' stroke='%23FFFFFF' stroke-width='2.4' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpath d='M3 7.4 5.9 10.3 11 4.6'/%3E%3C/svg%3E");
}

/* ===========================================================================
   MOVIMENTO RIDOTTO  (par. 12.3 / 22.3)
   Non "meno animazioni": nessuna. Gli elementi con reveal devono restare
   VISIBILI, altrimenti la pagina resta vuota per chi ha l'impostazione attiva.
   =========================================================================== */
@media (prefers-reduced-motion: reduce) {
  html { scroll-behavior: auto; }
  *, *::before, *::after {
    animation-duration: 0.001ms !important;
    animation-iteration-count: 1 !important;
    transition-duration: 0.001ms !important;
    scroll-behavior: auto !important;
  }
  [data-reveal] { opacity: 1; transform: none; filter: none; }
  .strip__track { animation: none; }

  /* IL NASTRO SI FERMA E VA A CAPO.
     Un giro infinito è esattamente il movimento che questa impostazione chiede
     di togliere: non si rallenta, si spegne. Al posto dello scorrimento le
     voci vanno a capo, e non si scorrono a mano — uno scorrimento manuale
     lascerebbe in pagina una barra sotto la fascia (che viene scambiata per un
     difetto) e obbligherebbe comunque a un gesto per leggere metà del
     contenuto, in una sezione che è informativa e non merita fatica.
     Le ripetizioni servivano solo a far combaciare il ciclo: ferma la pista
     sono contenuto detto due volte, e il markup le marca già `aria-hidden`. */
  .marquee {
    overflow: visible;
    /* Fuori dal nastro non c'è più la finestra a tagliare: la fascia rientra
       nel guscio delle altre sezioni, o le schede toccherebbero i bordi dello
       schermo. */
    max-width: var(--shell);
    margin-inline: auto;
    padding-inline: var(--shell-pad);
    -webkit-mask-image: none;
            mask-image: none;
  }
  .marquee__track {
    animation: none;
    width: auto;
    flex-wrap: wrap;
    justify-content: center;
    /* Il trascinamento qui non è agganciato (antex.js non aggancia niente
       sotto questa impostazione), ma se l'impostazione cambia a pagina aperta
       il JS può aver già scritto una traslazione sulla pista: senza questo
       azzeramento le voci andate a capo resterebbero spostate di lato. È
       inline, quindi per toglierla ci vuole !important. */
    transform: none !important;
  }
  .marquee__track > [aria-hidden="true"] { display: none; }
  /* Senza animazione il margine di raccordo lascerebbe un vuoto in coda. */
  .marquee__track > :last-child { margin-inline-end: 0; }
  /* Il filetto da un pixel su fondo --line regge finché la pista è una riga
     sola: andando a capo l'ultima riga resta parziale e quel fondo si vedrebbe
     come un rettangolo grigio in coda. Le celle tornano quindi schede
     staccate, con il loro bordo. */
  .bens { --marquee-gap: 16px; background: none; border-block: 0; }
  .bens .ben { max-width: 100%; border: 1px solid var(--line); border-radius: var(--r-lg); }
  .btn:hover, .bento__cell:hover, .flow__step:hover .flow__node { transform: none; }

  /* LA GUIDA NON SPEGNE PIÙ NIENTE.
     Attenuare una zona è un cambio di stato che avviene da solo mentre si
     legge: è esattamente ciò che l'impostazione chiede di non fare. Qui i
     passi restano cliccabili — chi vuole essere accompagnato lo fa a mano —
     ma tutte le zone restano accese insieme. */
  .sim[data-focus] .sim__chat,
  .sim[data-focus] .sim__side,
  .sim[data-focus] [data-zone] { opacity: 1 !important; filter: none !important; }
}

/* ===========================================================================
   STAMPA — la pagina deve restare leggibile su carta.
   Su carta il tema non esiste: si stampa sempre in chiaro, perché stampare
   un fondo scuro significa svuotare una cartuccia per niente.
   =========================================================================== */
@media print {
  .nav, .drawer, .stickycta, .grain, .sim__foot, .glow, .themetoggle,
  .hero__seam, .hero__mark, .hero__rings, .sectorexplorer__nav { display: none !important; }
  body { background: #FFFFFF; color: #000000; }
  .sec, .sec--t1, .sec--t2, .sec--t3, .hero, .foot { background: #FFFFFF !important; color: #000000 !important; }
  .sectorstory,
  .sectorstory[hidden] { display: grid !important; break-inside: avoid; }
  .sim[data-focus] .sim__chat,
  .sim[data-focus] .sim__side,
  .sim[data-focus] [data-zone] { opacity: 1 !important; filter: none !important; }
}
