/* ============================================================================
   SISTEMA DI DESIGN — "SEGNALETICA"
   ============================================================================
   Riscritto da zero. Il foglio precedente ("Cruscotto") è stato sostituito,
   non modificato: questo è un sistema completo, dai token alle ventidue pagine.

   ----------------------------------------------------------------------------
   DA DOVE VIENE LA DIREZIONE

   Il mestiere che l'app esercita è l'orientamento: cartelli, mappe di
   trasporto, segnavia, numeri civici. Da lì vengono tre regole, e tutto il
   resto discende da queste.

   1. SI LEGGE IN PIEDI, AL SOLE, CON UNA MANO.
      Contrasti alti, corpi grandi, bersagli generosi. Nessun grigio chiaro su
      fondo chiaro, nessuna informazione affidata al solo colore.

   2. LA STRUTTURA È FATTA DI LINEE, NON DI OMBRE.
      Un cartello non ha ombre morbide: ha bordi. Le ombre qui esistono solo
      per gli oggetti che galleggiano davvero — navigazione, lettore audio,
      avvisi — perché lì dicono una cosa vera.

   3. IL COLORE È UN SEGNALE, NON UNA DECORAZIONE.
      Un solo rosso, e vuol dire "questa è l'azione". Un solo oro, e vuol dire
      "questo te lo sei conquistato". Le famiglie di luoghi hanno un colore
      perché serve a distinguerle in una lista di cento voci.

   ----------------------------------------------------------------------------
   IL PROBLEMA CHE HA DETERMINATO IL DISEGNO DELLA LISTA

   Il catalogo ha cento luoghi e ZERO fotografie: il campo `immagine` è vuoto
   su tutti. La lista precedente lasciava comunque lo spazio della foto e ci
   metteva un riquadro grigio con un'icona sbiadita — cento buchi in fila.

   Qui lo spazio della foto non viene più promesso. Al suo posto c'è una
   tessera piena del colore della famiglia del luogo, e accanto le informazioni
   che il catalogo ha già e non mostrava: zona, riconoscimento UNESCO, ingresso
   libero o a pagamento, durata della visita. Più bello e più utile, senza
   dipendere da fotografie che potrebbero non arrivare mai.
   ========================================================================== */

:root {
  /* --- Carta e superfici ---------------------------------------------------
     v64 — DA CARTA CALDA A LUCE FREDDA.

     Fino a v63 il fondo era carta (#F2F1EC): caldo, stampato, giusto per un
     sistema nato dai cartelli stradali. Ma un'app che si apre accanto a
     Instagram e a Maps veniva letta come vecchia prima ancora di essere usata,
     e «vecchia» è un giudizio che si dà in mezzo secondo e non si ritira.

     Il meccanismo però resta ESATTAMENTE quello di prima, ed è la ragione per
     cui questo è un cambio di tavolozza e non di impianto: il fondo è appena
     più scuro delle schede, e quella differenza minima (1,06:1) basta a far
     staccare una scheda senza ombre. Cambia la temperatura, non la regola.

     Perché non il bianco pieno anche sul fondo: con fondo e scheda dello
     stesso bianco, quarantacinque regole che oggi separano le superfici con un
     filo dovrebbero passare a un'ombra, una per una. Sarebbe la riscrittura
     che questo rilascio ha promesso di non fare. */
  /* v73 — LA CARTA TORNA CALDA.
     v64 aveva portato il fondo al bianco freddo per far brillare i colori
     delle famiglie. Funzionava, e faceva un'app pulita: il rendering nuovo
     chiede un'altra cosa — una rivista, non un pannello di controllo. Crema
     per la pagina, avorio per le superfici, e una fascia più calda per le
     sezioni che devono staccarsi.

     Le tre misure che contano, rifatte da capo su questi tre fondi, stanno
     accanto agli inchiostri qui sotto. */
  --pt-paper:    #F6F3ED;
  --pt-paper-2:  #F1ECE3;
  --pt-card:     #FFFDF9;

  /* --- Inchiostro ----------------------------------------------------------
     v64 — Contrasti misurati TRE volte, non più due: su bianco (le schede),
     sul fondo pagina, e sulla superficie quieta `--pt-paper-2` (le pastiglie
     spente, i fondi delle icone, i contatori). Il terzo fondo mancava, e
     l'audit nuovo ci ha trovato subito un difetto vero: il contatore delle
     sezioni stava a 4,21:1, sotto soglia, da quando esiste.

       --pt-ink      18,7:1 · 17,6:1 · 16,0:1
       --pt-ink-70    7,7:1 ·  7,3:1 ·  6,6:1
       --pt-ink-55    5,6:1 ·  5,3:1 ·  4,8:1   <- passa su tutti e tre

     `--pt-ink-45` e `--pt-ink-25` NON reggono come testo piccolo su nessuno
     dei tre fondi: sono per icone, filetti e stati disattivati. Erano usati
     come testo in tre punti — l'audit li ha trovati e sono passati a `-55`. */
  --pt-ink:      #18202D;
  --pt-ink-70:   #4A5464;
  --pt-ink-55:   #5C6675;
  --pt-ink-45:   #8B93A0;
  --pt-ink-25:   #C4C7CC;

  /* v73 — rimisurati sui tre fondi caldi (avorio · crema · fascia):
       --pt-ink      16,1:1 · 15,0:1 · 13,9:1
       --pt-ink-70    7,5:1 ·  7,0:1 ·  6,5:1
       --pt-ink-55    5,9:1 ·  5,5:1 ·  5,1:1   <- passa su tutti e tre
     Il grigio del rendering (#667085) è più chiaro e cade a **4,23:1** sulla
     fascia calda: sarebbe passato sulle prime due schermate e fallito sulla
     terza. Questo è lo stesso grigio, un gradino più scuro. */

  /* --- Segnale: l'azione ---------------------------------------------------
     Un solo rosso in tutta l'app, e vuol dire "premi qui". v64 lo accende:
     4,9:1 su bianco, e 4,9:1 per il bianco sopra — funziona in entrambi i
     versi, come prima, con un po' di luce in più.

     IL CORALLO CHE NON C'È. La proposta grafica mostrava un #F2542D molto più
     acceso. Misurato, regge 3,45:1 con il bianco sopra: sotto la soglia per il
     testo normale. Un bottone lo si legge, quindi il bottone prende #CE3A22 —
     che a occhio è quasi lo stesso e sta dentro le regole. Il corallo pieno
     resta disponibile per ciò che non porta testo piccolo: code di gradienti e
     superfici decorative. Un colore che non si può leggere non è più brillante,
     è solo più difficile. */
  /* v79 — LA TERRACOTTA ACCESSIBILE.

     Richiesta di Aldo, con i valori già scelti e una regola sul metodo che è
     la parte più importante: «non aggiusterei il problema pagina per pagina,
     metterei questi token direttamente nel sistema». È esattamente quello che
     succede qui: cambiano i VALORI in questo blocco, non i nomi — rinominare
     in `--voce-*` vorrebbe dire toccare migliaia di riferimenti per ottenere
     la stessa cosa, e tenere i due nomi insieme sarebbe il debito delle due
     testate appena pagato a v77.

     IL CAMBIO CHE CONTA È L'ACCENTO: #CE3A22 → #A93F2B. Il rosso di v64 stava
     appeso alla soglia (4,53:1 sulla carta, 4,46 sul fondo nuovo — cioè sotto)
     e ogni rilascio doveva rimisurarlo. Questo fa **5,52:1**: per la prima
     volta l'accento ha margine invece di essere un caso limite.

       accento   #A93F2B   5,52 sul fondo · 6,02 sulla scheda · bianco sopra 6,12
       scuro     #8F3424   7,06 · 7,70
       grigio    #5C6675   5,25 · 5,72
       fondo     #F6F3ED   la crema del prototipo V2

     E UN SECONDO ROSSO CHE NON È UN SECONDO ACCENTO. `--pt-sg-visivo`
     (#C94A32) è il rosso del prototipo, che come TESTO fa 4,21 e non passa:
     vive solo come RIEMPIMENTO di superfici grandi, dove quello che conta è il
     bianco sopra (4,66 ✓). C'è una prova che pretende che non compaia mai come
     `color:`. */
  --pt-sg:        #A93F2B;
  --pt-sg-dark:   #8F3424;
  --pt-sg-visivo: #C94A32;   /* solo riempimenti grandi: come testo fa 4,21 */
  --pt-sg-200:    #E4BDB3;
  --pt-sg-tint:   #FAEDE9;
  /* v79 — `soft`: il fondo di un elemento SCELTO, e del blocco citazione.
     Il bordo chiaro (1,37:1 sul fondo) è decorazione e non può essere l'unico
     segnale di «questo è selezionato»: chi lo distingue è questo fondo più il
     colore dell'accento sopra (4,54 ✓).
     ATTENZIONE, misurato: su questo fondo passano solo `--pt-ink` (12,15),
     `--pt-ink-70` (5,69) e `--pt-sg` (4,54). Il grigio `--pt-ink-55` fa 4,32
     e NON ci va — come non ci vanno il verde, l'oro e l'avviso. */
  --pt-sg-soft:   #F1D9D2;

  /* --- Oro: la ricompensa --------------------------------------------------
     Solo passaporto, sigilli, UNESCO. Se compare dove non c'è niente da
     conquistare, il passaporto smette di essere una ricompensa. L'oro pieno
     non regge come testo piccolo (3,9:1): per il testo c'è `--pt-oro-testo`. */
  --pt-oro:       #A87718;
  --pt-oro-testo: #8A6111;
  --pt-oro-200:   #E8D5A6;
  --pt-oro-tint:  #FAF2E0;

  /* --- Stati ---------------------------------------------------------------
     Il pericolo è molto più cupo del segnale: non deve mai somigliare a un
     invito. 10,1:1 contro i 5,6:1 dell'azione. */
  --pt-ok:         #0E7A57;
  --pt-ok-tint:    #E2F4EC;
  --pt-danger:     #7E1D14;
  --pt-danger-tint:#F7E7E5;
  --pt-warn:       #8A6111;
  --pt-warn-tint:  #FAF2E0;

  /* --- Scelto: quello che è acceso ----------------------------------------
     Fino a v37 tutto ciò che era selezionato — la sezione corrente, le
     pastiglie del tempo, le categorie scelte, i numeri delle tappe, «Invita
     amici» — era nero pieno. Funzionava, ma il nero pieno su ventinove
     superfici fa un'app severa: segnalato così, «il nero mette tristezza».

     Questo è il blu della maiolica siciliana, che con la terracotta
     dell'azione fa la coppia che si vede sulle ceramiche di Caltagirone. Non
     contende il rosso (che vuol dire «premi qui») né il verde (che vuol dire
     «fatto»), ed è la tinta con il contrasto più alto fra quelle provate:
     8,86:1 su bianco, 7,83:1 sulla carta. Il nero resta dov'è davvero
     struttura — il lettore audio, la barra fissa, i toast.

     v64 — LO STESSO BLU, ACCESO. Il #0F4C81 era il blu di una maiolica vista
     in ombra: giusto sulla carta calda, cupo sul bianco freddo. Il nuovo è la
     stessa tinta con la luce sopra, e regge 5,4:1 col bianco sopra.

     Quello che NON cambia è il significato, ed è la ragione per cui questo
     rilascio è sicuro: il rosso resta «premi qui», il blu resta «questo,
     adesso». Le proposte grafiche che facevano blu l'azione invertivano la
     regola su ventinove superfici — quello non è un tema, è un'altra app. */
  /* v73 — UN ACCENTO SOLO.
     Il blu se n'è andato, e non è una tinta cambiata: è una regola cambiata.
     Fino a v72 il colore distingueva i due mestieri — rosso «premi qui», blu
     «questo, adesso». Da qui li distingue il PESO:

         azione   →  terracotta PIENA, testo bianco
         scelto   →  contorno, tinta chiara, e un segno (spunta o filetto)

     Il segno non è un vezzo: senza il colore che separava i due mestieri,
     resta lui a dire «questo è acceso» a chi i colori non li distingue. È la
     regola di sempre — «il colore da solo non basta» — che diventa
     obbligatoria invece che prudente.

     Misure: bianco su terracotta 4,94:1 · terracotta su avorio 4,86:1 ·
     terracotta scura sulla tinta 6,49:1. */
  /* FASE B — «scelto» e «azione» sono LO STESSO rosso per regola (v73, qui
     sopra: un accento solo, e i due mestieri li distingue il peso). Fino a
     v100 erano quattro valori copiati: identici, ma liberi di divergere il
     giorno che qualcuno avesse ritoccato uno dei due. Adesso la regola e'
     scritta nel valore. NON e' lo stesso caso di `--pt-warn` qui sopra, che
     coincide con l'oro per caso e non per regola: legarli creerebbe una
     dipendenza che nessuno ha deciso. */
  --pt-scelto:      var(--pt-sg);
  --pt-scelto-dark: var(--pt-sg-dark);
  --pt-scelto-200:  var(--pt-sg-200);
  --pt-scelto-tint: var(--pt-sg-tint);

  /* --- Famiglie di luoghi --------------------------------------------------
     Sei colori per tredici categorie: raggruppate, non una tinta a testa.
     Tredici colori non sono un codice, sono un arcobaleno — nessuno li impara.
     Sei si riconoscono dopo un paio di schermate.

     v64 — Le stesse sei famiglie, accese. Sono la fonte di luce principale
     dell'app: cento luoghi senza fotografia, e la tessera colorata è tutto
     quello che c'è al posto dell'immagine. Portare il fondo al bianco freddo
     senza accendere anche queste avrebbe fatto una lista sbiadita.

     Ognuna è misurata **con il bianco sopra**, perché è così che vengono
     usate — tessera piena, icona e testo bianchi. Tutte sopra 4,5:1:
     patrimonio 5,51 · sacro 4,63 · cultura 4,86 · strada 4,59 · natura 4,95 ·
     città 5,43. */
  --pt-fam-patrimonio: #6C4BE8;   /* arabo-normanno, palazzi         */
  --pt-fam-sacro:      #D0348A;   /* chiese e oratori                */
  --pt-fam-cultura:    #0E7C93;   /* musei, teatri                   */
  --pt-fam-strada:     #C25417;   /* mercati, gusto, street art      */
  --pt-fam-natura:     #0F8055;   /* parchi, natura e mare           */
  --pt-fam-citta:      #1B62E0;   /* piazze, memoria civile, dintorni */
  --pt-fam: var(--pt-fam-citta);  /* ripiego se la categoria è ignota */

  /* --- Filetti ------------------------------------------------------------- */
  --pt-line:      #D7D1C8;
  --pt-line-2:    #CFC9BE;

  /* --- Il buio -------------------------------------------------------------
     FASE B — TRE NERI CHE NON AVEVANO UN NOME.

     Erano scritti a mano diciotto volte, e ognuno faceva un mestiere suo e
     sempre quello:

       --pt-targa     la lastra scura dei luoghi senza fotografia, la testata
                      di una scheda, il tema scuro — sette regole, un colore.
       --pt-su-targa  quello che ci si scrive sopra (11,4:1).
       --pt-velo      il velo sulle fotografie che fa leggere il testo sopra:
                      solo i canali, perche' si usa sempre con una trasparenza
                      diversa — `rgb(var(--pt-velo) / 0.58)`.
       --pt-notte     l'ombra degli oggetti che stanno sopra una mappa e il
                      fondo del visore: piu' freddo dell'inchiostro, ed e'
                      giusto — sta su tessere grigie, non sull'avorio.

     Sono diventati gettoni con i loro valori di sempre: nessun pixel si e'
     spostato, e da adesso cambiarli e' una riga. */
  --pt-targa:    #1E242E;
  --pt-su-targa: #D7DBE2;
  --pt-velo:     11 15 22;
  --pt-notte:    17 22 25;

  /* --- Ombre --------------------------------------------------------------
     v64 — Le ombre restano poche e restano vere, ma da qui in avanti sono
     FREDDE: un'ombra grigio-caldo sopra un fondo azzurrino si vede come una
     macchia gialla. È lo stesso errore del testo terziario, spostato.

     `--pt-shadow-card` è nuova ed è l'unica aggiunta: appena percettibile,
     serve a far galleggiare le schede vere — quelle che si toccano e portano
     altrove — adesso che il fondo è più chiaro e il filo da solo pesa meno. */
  /* v73 — restano fredde, e diventano l'INCHIOSTRO. Il quasi-nero di prima
     (13,18,32) era più freddo del testo che stava sopra: sulla crema faceva
     un alone grigio-azzurro che non apparteneva a niente. Adesso l'ombra è
     esattamente `--pt-ink`, più larga e più bassa di opacità — la stessa
     tinta della pagina, solo diluita. Un'ombra non è un colore nuovo: è meno
     luce sullo stesso colore. */
  --pt-shadow-lift: 0 8px 28px rgba(24, 32, 45, 0.13);
  --pt-shadow-pop:  0 2px 6px rgba(24, 32, 45, 0.06), 0 14px 32px rgba(24, 32, 45, 0.10);
  --pt-shadow-card: 0 1px 2px rgba(24, 32, 45, 0.04), 0 8px 22px rgba(24, 32, 45, 0.06);

  /* --- Raggi ---------------------------------------------------------------
     Squadrato è segnaletica, tondo si tocca. La regola si impara in tre
     secondi senza che nessuno la spieghi.

     v64 li allarga di due o quattro pixel ciascuno. Non è una moda: è la
     conseguenza dell'aver tolto il calore al fondo. Un angolo stretto su carta
     avorio legge come stampa; lo stesso angolo su bianco freddo legge come
     modulo da compilare. */
  --pt-r-xs:   8px;
  --pt-r-sm:   12px;
  --pt-r:      16px;
  --pt-r-lg:   20px;
  --pt-r-xl:   26px;
  --pt-r-pill: 999px;

  /* --- Quanto spazio si prende la barra in basso ---------------------------
     v69 — la barra non galleggia piu': sta attaccata al fondo. La sua altezza
     serve in sette punti (il respiro della pagina, il lettore audio, il
     banner, «anche qui intorno», la barra del costruttore, il toast e la barra
     stessa), e finora era il numero 84 scritto a mano in quattro di quelli.
     Un numero magico ripetuto e' un numero che prima o poi diverge: qui si
     dichiara una volta, e chi sta sopra la barra dice `--pt-sopra-nav` invece
     di indovinare.                                                          */
  --pt-nav-h: 68px;

  /* v84 — DUE MISURE CHE LE SCRIVE IL BROWSER, non il foglio.
     `--pt-strumenti-h` e' l'altezza vera del blocco appiccicato degli
     strumenti, `--pt-mappa-top` la distanza fra il bordo alto dello schermo e
     il bordo alto della mappa. Dipendono dalla lingua, dalla larghezza e dal
     pannello delle categorie aperto o chiuso: `scopri.html` le misura e le
     riaggiorna. I valori qui sono quelli di un telefono da 390, e servono a
     due cose — che la regola sia completa anche prima che il JavaScript parta,
     e che un token usato sia un token dichiarato. */
  --pt-strumenti-h: 177px;
  --pt-mappa-top: 250px;
  /* FASE H — l'altezza del comando appiccicato sopra la barra in basso (il
     tour, il luogo, l'evento), per `scroll-padding-bottom`: la scrive
     `app.js` (`misuraFondo`) dove quel comando c'è; altrove vale zero. */
  --pt-fondo-h: 0px;
  --pt-sopra-nav: calc(var(--pt-nav-h) + env(safe-area-inset-bottom) + 10px);

  /* v64 — LA FORMA DEI CONTENITORI DELLE ICONE, IN UN POSTO SOLO.
     La tessera di un luogo, l'icona di una riga del profilo, il disco di un
     sigillo, il numero di una tappa: erano sei regole con quattro raggi
     diversi, decisi uno alla volta. Adesso sono tondi, e sono tondi da qui.
     Il giorno in cui si vorranno quadrati si cambia questa riga — non sei. */
  --pt-r-icona: 50%;

  /* v25 — L'ALTEZZA DELL'INTESTAZIONE APPICCICATA.
     Chi deve appiccicarsi SOTTO di lei ha bisogno di sapere quanto è alta, e
     non può indovinarlo: dipende dal contenuto, dalla lingua e dalla safe-area
     del dispositivo. Qui c'è il valore di partenza — quello vero lo misura
     `misuraIntestazione()` in app.js e lo riscrive, anche a ogni rotazione.
     Senza questa riga il valore esisterebbe solo a JavaScript acceso. */
  --pt-header-h: 71px;

  /* --- Caratteri -----------------------------------------------------------
     Una sola famiglia, Archivo, con la LARGHEZZA come secondo asse: è così che
     lavorano i sistemi di segnaletica — non due caratteri diversi, ma lo stesso
     disegno in larghezze diverse. Un solo file da scaricare, e in una PWA che
     deve funzionare offline conta. */
  --pt-font: "Archivo", system-ui, -apple-system, "Segoe UI", Roboto, sans-serif;

  /* v73 — I TITOLI PRENDONO LE GRAZIE, E NON COSTANO UN BYTE.
     Il rendering nuovo è editoriale: i titoli con le grazie sono metà di
     quell'effetto. Ma un secondo carattere da scaricare sarebbe 30-60 KB su
     ogni pagina, e v57 ne aveva tolti 761 per usarne 23.

     Georgia sta su ogni Mac, ogni Windows e ogni iPhone; su Android non c'è e
     cade su Noto Serif, che è disegnata per lo stesso mestiere. Il ripiego non
     è un compromesso: è la stessa idea con un altro disegno. */
  --pt-font-titolo: Georgia, "Iowan Old Style", "Times New Roman", "Noto Serif", serif;
  --pt-wide: 112%;

  /* FASE B — LA SCALA E' SCRITTA UNA VOLTA SOLA, QUI.
     Fino a v100 questi quattro gettoni erano dichiarati DUE volte: qui con i
     valori di prima di v93 (15px/1,55 e compagnia), e novemila righe piu'
     sotto con quelli veri. Vinceva la seconda, la prima non faceva niente — e
     chi apriva il foglio dall'inizio leggeva un corpo del testo che l'app non
     usava. v93 aveva scritto la regola giusta, «si cambiano i token, non le
     regole»: l'aveva applicata ridichiarandoli invece che cambiandoli. Qui ci
     sono i valori in vigore, e la seconda dichiarazione non c'e' piu'. */
  --pt-t-body:   400 16px/1.6 var(--pt-font);
  --pt-t-small:  400 14px/1.5 var(--pt-font);
  --pt-t-strong: 700 15px/1.35 var(--pt-font);
  --pt-t-label:  800 11px/1.2 var(--pt-font);

  /* --- Ritmo: scala di quattro --------------------------------------------- */
  --pt-1: 4px;  --pt-2: 8px;  --pt-3: 12px; --pt-4: 16px;
  --pt-5: 24px; --pt-6: 32px; --pt-7: 48px; --pt-8: 64px;

  /* --- Griglia -------------------------------------------------------------
     v75 — LA COLONNA SI ALLARGA, E NASCE UNA SECONDA MISURA.

     Fino a v74 tutta l'app viveva dentro 760px anche su uno schermo da 1280:
     una colonna sola, uguale per il catalogo e per un modulo. Il prototipo
     chiede una rivista, e una rivista su schermo largo usa lo schermo — il
     catalogo con 101 luoghi ne mostrava venti in una colonna stretta con
     mezzo schermo vuoto ai lati.

     Ma «largo» non vale per tutto, e qui sta la sola cosa che aggiungo al
     prototipo: **un testo lungo su 1180px non si legge.** Oltre i settanta
     caratteri per riga l'occhio perde il capo della riga successiva — è la
     misura che la tipografia conosce da cinque secoli, non un'opinione.

     Quindi due misure, e ognuna fa un mestiere:

       --pt-col      1180px   quanto è larga la PAGINA: griglie, file, liste
       --pt-lettura    68ch   quanto è larga una RIGA DI TESTO: prose, testi
                              dei luoghi, descrizioni

     Dove c'è da guardare si usa la prima, dove c'è da leggere la seconda. */
  /* FASE B — 1240 e non 1180: era ridichiarata da v93 a fondo foglio («il
     brief chiede 1200–1280 e 1180 stava sotto»). Il valore vero sta qui. */
  --pt-col: 1240px;
  --pt-lettura: 68ch;
  --pt-gutter: 16px;
  --pt-align: var(--pt-gutter);

  /* --- Movimento: corto ---------------------------------------------------- */
  --pt-ease: cubic-bezier(0.2, 0.7, 0.3, 1);
  --pt-fast: 140ms;
  --pt-med:  240ms;

  /* --- Ponte verso Bootstrap ----------------------------------------------
     Bootstrap è caricato prima di questo foglio e alcune sue classi sono usate
     nei template (dropdown, badge, form-control, alert). Riportarle sui token
     qui evita di inseguirle una per una più avanti.

     FASE B — IL PONTE NON ERA SUI TOKEN. Il commento qui sopra diceva la cosa
     giusta e le righe sotto facevano il contrario: nove colori scritti a
     mano, e sei su nove erano ancora quelli della tavolozza fredda di
     v64 — un fondo #F6F8FC azzurrino, un inchiostro #0D1220, un filo #E3E9F3
     — che v73 aveva tolto dall'app e nessuno aveva tolto da qui.

     Misurato prima di cambiarli, dipingendoli di magenta, verde e blu uno per
     uno: su 48 fotografie (20 pagine da anonimi e 4 con l'account, telefono e
     desktop) NON compare nessuno dei sei. Quindi nessun pixel cambia. Ma il
     giorno che un componente di Bootstrap li usasse — un avviso, un menu a
     tendina, un campo con l'errore — avrebbe mostrato la tavolozza sbagliata.
     Adesso mostra quella giusta.

     Le terne `-rgb` restano numeri perche' Bootstrap le usa dentro `rgba()`:
     una prova controlla che coincidano col gettone da cui vengono. */
  --bs-primary: var(--pt-sg);
  --bs-primary-rgb: 169, 63, 43;
  --bs-secondary: var(--pt-ink-70);
  --bs-secondary-rgb: 74, 84, 100;
  --bs-body-font-family: var(--pt-font);
  --bs-body-color: var(--pt-ink);
  --bs-body-bg: var(--pt-paper);
  --bs-border-color: var(--pt-line);
  --bs-border-radius: var(--pt-r-sm);
  --bs-link-color: var(--pt-sg);
  --bs-link-color-rgb: 169, 63, 43;
  --bs-link-hover-color: var(--pt-sg-dark);
  --bs-emphasis-color: var(--pt-ink);
  --bs-secondary-color: var(--pt-ink-70);
}


/* ============================================================================
   1. BASE
   ========================================================================== */

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

html { -webkit-text-size-adjust: 100%; }

body {
  margin: 0;
  font: var(--pt-t-body);
  color: var(--pt-ink);
  background: var(--pt-paper);
  -webkit-font-smoothing: antialiased;
  text-rendering: optimizeLegibility;
  /* Spazio per la navigazione fissa più il pulsante della guida. */
  padding-bottom: 136px;
}

/* v73 — I TITOLI GRANDI HANNO LE GRAZIE, I TITOLINI NO.
   La divisione non è estetica, è funzionale: un titolo con le grazie a 34 px
   si legge come una rivista, lo stesso disegno a 15 px in una lista di cento
   voci si legge peggio del bastone. Quindi h1 e h2 — che in quest'app sono
   sempre titoli di pagina o di sezione — prendono Georgia; h3 e h4, che sono
   nomi di luogo dentro le schede, restano Archivo.

   Il peso scende da 800 a 400: una grazia in nero pieno è un manifesto, non un
   titolo. La larghezza (`font-stretch`) resta solo dove c'è Archivo, che è
   l'unico dei due ad averla. */
h1, h2 {
  margin: 0;
  font-family: var(--pt-font-titolo);
  font-weight: 400;
  letter-spacing: -0.02em;
  line-height: 1.1;
  color: var(--pt-ink);
  text-wrap: balance;
}

h3, h4 {
  margin: 0;
  font-family: var(--pt-font);
  font-stretch: var(--pt-wide);
  font-weight: 800;
  letter-spacing: -0.035em;
  line-height: 1.14;
  color: var(--pt-ink);
  text-wrap: balance;
}

p { margin: 0; }
ul, ol { margin: 0; }

a { color: var(--pt-sg); text-decoration: none; }


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

button { font-family: var(--pt-font); }

/* I numeri non devono ballare da una riga all'altra in una lista. */
.pt-section-count, .pt-stat-value, .pt-nav-count, .pt-passport-pct,
.pt-distance-badge, .pt-reviews-score-num, .pt-riprendi-conta,
.pt-lampo-badge-time, .pt-gruppo-count, .pt-passport-count,
.pt-bacheca-giorno, .pt-tempo, .pt-community-copie { font-variant-numeric: tabular-nums; }

/* Messa a fuoco visibile ovunque, sempre: chi naviga da tastiera non deve mai
   chiedersi dove si trova. */
:focus-visible {
  outline: 3px solid var(--pt-sg);
  outline-offset: 2px;
  border-radius: var(--pt-r-xs);
}

@media (prefers-reduced-motion: reduce) {
  *, *::before, *::after {
    animation-duration: 0.01ms !important;
    animation-iteration-count: 1 !important;
    transition-duration: 0.01ms !important;
    scroll-behavior: auto !important;
  }
}

.pt-skip {
  position: absolute;
  left: -9999px;
  z-index: 100;
  padding: 12px 18px;
  background: var(--pt-ink);
  color: #fff;
  font: var(--pt-t-strong);
  border-radius: 0 0 var(--pt-r-sm) 0;
}
.pt-skip:focus { left: 0; top: 0; color: #fff; }

/* Le poche utilità Bootstrap usate nei template. */
.text-muted, .text-secondary { color: var(--pt-ink-55) !important; }
.text-center { text-align: center; }
.mt-2 { margin-top: var(--pt-2); }
.mt-3 { margin-top: var(--pt-3); }
.mt-4 { margin-top: var(--pt-4); }
.py-2 { padding-block: var(--pt-2); }
.d-flex { display: flex; }


/* ============================================================================
   2. TESTATA E NAVIGAZIONE
   ============================================================================
   Testata e navigazione stanno nello STESSO contenitore appiccicato in alto.
   Erano due elementi posizionati in modo indipendente e allineati con numeri
   fissi: poiché l'altezza reale della testata dipende dal contenuto e dalla
   safe-area del dispositivo, quei numeri erano sbagliati su metà dei telefoni
   e i due blocchi si sovrapponevano. Impilandoli non può più succedere.

   La navigazione resta IN BASSO sul telefono — è la fascia che il pollice
   raggiunge — e va IN ALTO sul desktop, dove il pollice non esiste.
   ========================================================================== */

.pt-header {
  position: sticky;
  top: 0;
  z-index: 30;
  background: var(--pt-paper);
}

.pt-topbar {
  display: flex;
  align-items: center;
  justify-content: space-between;
  gap: var(--pt-3);
  padding: 14px var(--pt-gutter) 12px;
  border-bottom: 1px solid var(--pt-line);
}

/* v100 — era `.pt-topbar h1`. Il titolo della barra non è più un `<h1>`
   (vedi il commento in `base/base.html`): è un `<p>` con questa classe, e la
   regola è la stessa riga per riga perché la resa non doveva cambiare. */
.pt-topbar .pt-topbar-titolo {
  /* Le cinque righe che arrivavano dalla regola `h1, h2` e che un `<p>` non
     eredita: senza, il titolo della barra cambierebbe carattere e colore. La
     resa deve restare identica al pixel — è una correzione di semantica, non
     di grafica. */
  font-family: var(--pt-font-titolo);
  font-weight: 400;
  /* -0.035em e 0.98, non -0.02em e 1.1: da `<h1>` questo titolo prendeva la
     scala editoriale (`h1, .pt-testata-titolo`), non la regola `h1, h2`.
     Con gli altri valori la barra cresceva di quattro pixel in altezza e di
     tre in larghezza su ogni pagina — misurato, non dedotto. */
  letter-spacing: -0.035em;
  line-height: 0.98;
  color: var(--pt-ink);
  font-size: 17px;
  min-width: 0;
  overflow: hidden;
  text-overflow: ellipsis;
  white-space: nowrap;
}
/* v73 — il marchio non si taglia. Il titolo della barra si taglia con i
   puntini perché su una scheda luogo può essere lungo quanto vuole; il nome
   del prodotto no: «Voce…» è la prima cosa che si legge aprendo l'app, e un
   nome tagliato è un nome sbagliato. Qui il titolo si stringe intorno al
   marchio e il sottotitolo, se non ci sta, sparisce da solo. */
.pt-topbar .pt-topbar-titolo:has(.pt-marchio) {
  display: flex;
  align-items: baseline;
  gap: 8px;
  overflow: visible;
  text-overflow: clip;
}
.pt-topbar .pt-topbar-titolo:has(.pt-marchio) .pt-marchio { flex: 0 0 auto; }
.pt-marchio-sotto {
  min-width: 0;
  overflow: hidden;
}

.pt-topbar-right {
  display: flex;
  align-items: center;
  gap: var(--pt-2);
  flex: 0 0 auto;
}

.pt-account-btn {
  display: grid;
  place-items: center;
  width: 38px;
  height: 38px;
  border: 1px solid var(--pt-line-2);
  border-radius: 50%;
  background: var(--pt-card);
  color: var(--pt-ink-70);
  font-size: 19px;
  cursor: pointer;
  transition: border-color var(--pt-fast) var(--pt-ease), color var(--pt-fast) var(--pt-ease);
}


.pt-lang-btn {
  display: inline-flex;
  align-items: center;
  gap: 5px;
  height: 38px;
  padding: 0 13px;
  border: 1px solid var(--pt-line-2);
  border-radius: var(--pt-r-pill);
  background: var(--pt-card);
  color: var(--pt-ink);
  font: var(--pt-t-label);
  font-size: 12px;
  letter-spacing: 0.06em;
  cursor: pointer;
  transition: border-color var(--pt-fast) var(--pt-ease);
}
.pt-lang-btn i { font-size: 17px; color: var(--pt-ink-70); }

/* v91 — IL BOTTONE DELLA RICERCA.

   Tondo come quello dell'account, perché gli sta accanto e sono la stessa
   famiglia: comandi della barra, non azioni della pagina. Nessun colore
   pieno — un rosso quassù competerebbe con il comando della pagina, e il
   secondo rosso ha già un mestiere da v85.

   Sul telefono è un'icona sola: la barra a 390 px è piena (44 di casa, 138 di
   titolo, 168 di comandi) e una parola in più la farebbe andare a capo. Da
   800 px in su lo spazio in quella riga avanza — misurato, ne restano oltre
   ottocento pixel vuoti — e allora il bottone dice anche che cos'è. È lo
   stesso bottone: cambia la forma, non il componente. */
.pt-cerca-btn {
  display: grid;
  place-items: center;
  /* 44 e non 38 come il tondo dell'account: quello si allarga con un'area
     sensibile invisibile, questo è un collegamento e l'audit mobile misura il
     riquadro vero. Misurato: `a.pt-cerca-btn 38×44` fra i bersagli piccoli. */
  width: 44px;
  height: 44px;
  border: 1px solid var(--pt-line-2);
  border-radius: 50%;
  background: var(--pt-card);
  color: var(--pt-ink-70);
  font-size: 19px;
  text-decoration: none;
  transition: border-color var(--pt-fast) var(--pt-ease), color var(--pt-fast) var(--pt-ease);
}
.pt-cerca-btn-parola { display: none; }

/* Sulla pagina della ricerca il bottone dice di esserci già. Il bordo e
   l'inchiostro della segnaletica, non il pieno: un tondo rosso pieno quassù
   sarebbe il comando più forte della pagina, e il comando della pagina è
   un'altra cosa. */
.pt-cerca-btn[aria-current="page"] {
  border-color: var(--pt-sg);
  color: var(--pt-sg);
}

@media (min-width: 800px) {
  .pt-cerca-btn {
    grid-auto-flow: column;
    gap: 6px;
    width: auto;
    height: 38px;
    padding: 0 14px;
    border-radius: var(--pt-r-pill);
    font-size: 17px;
  }
  .pt-cerca-btn-parola {
    display: inline;
    color: var(--pt-ink);
    font: var(--pt-t-label);
    font-size: 12px;
    letter-spacing: 0.06em;
  }
}


/* --- La barra delle sezioni ---------------------------------------------- */

/* --- LA BARRA IN BASSO ------------------------------------------------------
   v69 — era una tavoletta che galleggiava a dieci pixel dal fondo, con bordo,
   angoli tondi e un'ombra sollevata: sotto le restava una striscia di pagina
   che scorreva, e la barra sembrava un oggetto appoggiato sopra l'app invece
   di un bordo dell'app. Adesso e' ancorata al fondo e larga quanto lo schermo,
   con un filo sopra e niente ombra.

   IL FONDO E' OPACO, E NON E' UNA RINUNCIA. La versione col vetro smerigliato
   (`backdrop-filter`) e' piu' bella su una pagina bianca e diventa illeggibile
   su «Scopri» in mappa, dove sotto la barra scorrono le tessere colorate di
   Leaflet: il contrasto di un fondo trasparente vale quanto vale cio' che ci
   passa sotto, cioe' non si puo' garantire. Qui l'eleganza la fanno
   l'ancoraggio, il respiro e il segno dell'attivo — tutte cose misurabili.  */
.pt-bottom-nav {
  position: fixed;
  left: 0;
  right: 0;
  bottom: 0;
  z-index: 40;
  display: flex;
  gap: 0;
  padding: 7px 6px calc(7px + env(safe-area-inset-bottom));
  background: var(--pt-card);
  border: 0;
  border-top: 1px solid var(--pt-line);
  border-radius: 0;
  box-shadow: none;
}

.pt-bottom-nav a {
  flex: 1;
  display: flex;
  flex-direction: column;
  align-items: center;
  gap: 4px;
  padding: 3px 2px 2px;
  border-radius: var(--pt-r-sm);
  font: var(--pt-t-label);
  font-size: 10.5px;
  letter-spacing: 0.02em;
  color: var(--pt-ink-55);
  text-align: center;
  transition: color var(--pt-fast) var(--pt-ease);
}

/* IL SEGNO DELL'ATTIVO STA SULL'ICONA, NON SU TUTTA LA VOCE.
   Prima l'intera voce diventava un rettangolo blu pieno: pesava quanto un
   comando primario — piu' del rosso-segnale che genera un tour — per dire una
   cosa che non e' un'azione ma una posizione («sei qui»). La pastiglia chiara
   sotto l'icona lo dice con la stessa chiarezza e un quinto dell'inchiostro,
   ed e' il posto dove l'occhio guarda gia'. Misurato: blu su tinta 4,66:1,
   sopra il 3:1 che serve a un segno, e l'etichetta blu su bianco 5,43:1.   */
.pt-bottom-nav a i {
  display: grid;
  place-items: center;
  /* v70 — con cinque voci su uno schermo da 320 la colonna e' larga 62 px e
     una pastiglia da 58 la riempiva da bordo a bordo: due pastiglie vicine
     sembravano toccarsi. `min()` la fa stringere insieme alla colonna e la
     lascia com'era ovunque ci sia posto. */
  width: min(58px, 90%);
  height: 30px;
  border-radius: var(--pt-r-pill);
  font-size: 22px;
  line-height: 1;
  transition: background-color var(--pt-fast) var(--pt-ease);
}

.pt-bottom-nav a.active { background: none; color: var(--pt-scelto); font-weight: 800; }
.pt-bottom-nav a.active i { background: var(--pt-scelto-tint); }


main { display: block; padding-top: var(--pt-2); }

/* --- Menu a tendina (account e lingua) ------------------------------------ */

.dropdown-menu {
  padding: 6px;
  border: 1px solid var(--pt-line-2);
  border-radius: var(--pt-r);
  background: var(--pt-card);
  box-shadow: var(--pt-shadow-pop);
}

.dropdown-item {
  display: flex;
  align-items: center;
  gap: 10px;
  padding: 10px 11px;
  border-radius: var(--pt-r-sm);
  font: var(--pt-t-strong);
  font-weight: 600;
  color: var(--pt-ink);
}
.dropdown-item i { font-size: 18px; color: var(--pt-ink-55); }
/* v67 — era `--pt-paper`, il fondo della PAGINA, dipinto sopra un menu bianco:
   dopo v64 i due colori distano 1,06:1, cioe' il passaggio del dito o del
   cursore non si vede. Un evidenziato invisibile e' un evidenziato che non
   c'e'. `--pt-paper-2` e' la superficie quieta, che esiste per questo. */
.dropdown-item:focus { background: var(--pt-paper-2); color: var(--pt-ink); }


.dropdown-item-text { padding: 8px 11px; font: var(--pt-t-small); color: var(--pt-ink-55); }
.dropdown-divider { margin: 5px 4px; border-top: 1px solid var(--pt-line); }

.pt-account-email { font-weight: 700; color: var(--pt-ink); word-break: break-all; }

.pt-logout-item { width: 100%; border: 0; background: none; text-align: start; cursor: pointer; }



.pt-lang-menu { min-width: 208px; max-height: 62vh; overflow-y: auto; }

/* v67 — DA `pt-lang-*` A `pt-menu-*`.

   Il titolino e la voce di un menu a tendina erano nati per le lingue, e il
   menu delle citta' li aveva presi in prestito: `.pt-lang-voce` vestiva
   «Palermo» e «Roma». Non si vedeva — le due tendine si somigliano — ma era la
   stessa cosa chiamata con il nome di un'altra, e il giorno in cui si ritocca
   l'elenco delle lingue cambierebbe anche quello delle citta'.

   E' l'errore che v17 aveva gia' nominato: raggruppare per somiglianza di NOME
   invece che di RUOLO. Il ruolo qui e' «voce di un menu»: l'etichetta a
   sinistra, il segno a destra, e quando e' quella corrente si riempie di blu.
   Le lingue tengono solo cio' che e' loro: `.pt-lang-spenta`, per una lingua
   che sta arrivando e non si puo' ancora scegliere. */
.pt-menu-titolo {
  display: block;
  padding: 8px 11px 5px;
  font: var(--pt-t-label);
  letter-spacing: 0.16em;
  text-transform: uppercase;
  color: var(--pt-ink-55);
}

.pt-menu-voce { justify-content: space-between; font-size: 15px; font-weight: 600; }
.pt-menu-voce.active { background: var(--pt-scelto); color: #fff; }
.pt-menu-voce.active i { color: #fff; }

/* Una lingua non ancora accesa è testo, non un comando: niente sfondo al
   passaggio, niente cursore a mano, niente collegamento. */
.pt-lang-spenta { color: var(--pt-ink-45); cursor: default; pointer-events: none; }


/* ============================================================================
   3. PRIMITIVI
   ============================================================================
   I pezzi che compaiono su tutte e ventidue le pagine. Ogni pagina più avanti
   usa questi e aggiunge il minimo indispensabile: se un blocco di pagina
   ridefinisce un colore o un raggio, è un errore, non una scelta.
   ========================================================================== */

/* --- Testata di sezione ---------------------------------------------------
   Il conteggio è un dato, quindi è squadrato e in inchiostro pieno: non è un
   bottone e non deve sembrarlo. */

/* v77 — IL CONTEGGIO STA ACCANTO AL TITOLO, NON ALL'ALTRO CAPO DELLA PAGINA.
   Era `space-between`, che sul telefono lasciava 207 px fra la parola e il suo
   numero e su schermo largo — misurato sul passaporto a 1280 — ne lasciava
   **mille**. «Chiese e oratori» a sinistra e «1/20» a un metro di distanza non
   si leggono insieme: sono due informazioni, e invece sono una sola.

   Chi ha davvero diritto al bordo destro e' il collegamento «Vedi tutti», che
   e' un'uscita dalla sezione e non un dato. FASE D: l'unico che stava in una
   `.pt-section-head` era quello del centro Tour, che adesso ha la testa dei
   rail di Scopri (`.pt-sezione-testa`, dove il bordo destro glielo dà lo
   `space-between` fra un titolo e un'uscita, non fra un'etichetta e il suo
   numero). La regola che glielo dava qui se n'è andata con lui. */
.pt-section-head {
  display: flex;
  align-items: center;
  justify-content: flex-start;
  gap: var(--pt-3);
  margin: var(--pt-6) var(--pt-align) var(--pt-3);
}

.pt-section-head h2,
.pt-section-head h3 { font-size: 20px; letter-spacing: -0.04em; }
/* FASE C — la riga dei risultati diventa un `<h2>` (è il titolo della sezione,
   non il nome di una scheda) e prende le grazie di tutti gli `<h2>`: il corpo
   resta quello della riga di servizio, lo stesso della testata compatta che le
   sta sopra, e la spaziatura è quella delle grazie, non dell'Archivo largo.
   Figlio DIRETTO, e non è pignoleria: la pagina degli eventi ha un `<h2>`
   dentro una `.pt-section-head.pt-sezione-testa`, un livello più giù, e la
   prima stesura di questa regola lo spostava di sei pixel — l'ha visto il
   confronto al pixel, su una pagina che questa fase non doveva toccare. */
.pt-section-head > h2 { line-height: 1.2; letter-spacing: -0.01em; }

/* FASE F — IL NUMERINO ACCANTO A UN TITOLO È UN DATO, NON UN'AZIONE.
   Era `--pt-scelto` pieno con il testo bianco, cioè il disegno dell'azione, che
   nel sistema è uno per schermata: sul passaporto ce n'erano quattordici,
   sulla ricerca tre accanto al comando «Cerca». Non era una scelta: il commento
   di `.pt-gruppo-count` lo dice — «i dati sono pastiglie squadrate in
   inchiostro pieno» — ed è stato scritto quando lo scelto aveva un colore suo;
   da v73 lo scelto è il rosso dell'azione, e i numeri sono diventati rossi con
   lui. Adesso hanno il fondo quieto della carta calda e l'inchiostro al 70%,
   come il conto dentro una linguetta spenta (`.pt-sezione-conta`). La forma
   resta quella di prima: squadrata, lo stesso corpo, lo stesso posto. */
.pt-section-count {
  flex: 0 0 auto;
  padding: 4px 9px;
  border-radius: var(--pt-r-xs);
  background: var(--pt-paper-2);
  color: var(--pt-ink-70);
  font: var(--pt-t-label);
  font-size: 11px;
  letter-spacing: 0.04em;
}

/* v73 — L'OCCHIELLO PRENDE LA TERRACOTTA SCURA, E NON È UN VEZZO.
   Misurato dall'audit sulla pagina vera: `--pt-sg` su `--pt-paper-2` — la
   fascia calda di «vicino a te» — fa 4,20:1 con un testo da 10,5px in
   grassetto, sotto soglia. Sul bianco passava (4,86) e sulla carta appena
   (4,53): è il difetto che si vede solo sul terzo fondo, esattamente come il
   contatore delle sezioni a v64. La versione scura regge su tutti e tre —
   6,80 · 6,35 · 5,88 — e a occhio è lo stesso colore. */
.pt-occhio {
  display: block;
  font: var(--pt-t-label);
  letter-spacing: 0.18em;
  text-transform: uppercase;
  color: var(--pt-sg-dark);
}

/* --- Pulsanti -------------------------------------------------------------
   Uno solo pieno di segnale per schermata. Se ce ne sono due, l'utente si
   ferma a decidere quale sia quello giusto. */

.pt-btn, .btn {
  display: inline-flex;
  align-items: center;
  justify-content: center;
  gap: 8px;
  padding: 13px 18px;
  border: 1px solid transparent;
  border-radius: var(--pt-r-sm);
  font: var(--pt-t-strong);
  font-weight: 800;
  cursor: pointer;
  transition: background-color var(--pt-fast) var(--pt-ease),
              border-color var(--pt-fast) var(--pt-ease),
              transform var(--pt-fast) var(--pt-ease);
}
.pt-btn:active, .btn:active { transform: scale(0.985); }
.pt-btn i, .btn i { font-size: 18px; }

.pt-btn-primario, .btn.btn-primary {
  background: var(--pt-sg);
  border-color: var(--pt-sg);
  color: #fff;
}


.pt-btn-ink { background: var(--pt-scelto); border-color: var(--pt-scelto); color: #fff; }


.pt-btn-secondario, .btn.btn-outline-secondary {
  background: var(--pt-card);
  border-color: var(--pt-line-2);
  color: var(--pt-ink);
}


/* Il distruttivo non è mai pieno: un bottone pieno è un invito, e cancellare
   non si invita. Contorno cupo, testo cupo, nessuna tentazione. */
.pt-btn-danger {
  background: var(--pt-card);
  border-color: var(--pt-danger);
  color: var(--pt-danger);
}


.pt-btn-blocco { width: 100%; }

/* --- Pastiglie di filtro --------------------------------------------------
   Tonde perché si toccano. Attive in inchiostro pieno, non nel colore del
   segnale: il segnale è dell'azione, e un filtro non è un'azione. */

/* --- Il costruttore: una categoria alla volta --- v27 ---------------------
   Quattordici sezioni aperte insieme facevano 9.364 px e ventidue comandi
   nella prima schermata. Le caselle restano nel modulo anche da sezione
   chiusa: `<details>` non toglie i figli dal documento, quindi le selezioni si
   inviano e il conteggio non cambia. */
.pt-builder-section > summary {
  display: flex;
  align-items: center;
  gap: var(--pt-2);
  min-height: 44px;
  cursor: pointer;
  list-style: none;
}
.pt-builder-section > summary::-webkit-details-marker { display: none; }
.pt-builder-section > summary h4 { flex: 1; margin: 0; }
.pt-builder-section > summary::after {
  content: "\ea5f";                    /* ti-chevron-down */
  content: "\ea5f" / "";            /* FASE H — la stessa icona, senza nome: il lettore di schermo non la legge */
  font-family: "tabler-icons";
  font-size: 17px;
  color: var(--pt-ink-45);
  transition: transform var(--pt-fast) var(--pt-ease);
}
.pt-builder-section[open] > summary::after { transform: rotate(180deg); }
.pt-builder-conta {
  padding: 2px 9px;
  border-radius: var(--pt-r-pill);
  background: var(--pt-paper-2);
  font: var(--pt-t-small);
  font-weight: 800;
  color: var(--pt-ink-55);
}

/* ===========================================================================
   TOUR LAMPO E COSTRUTTORE — la rifinitura --- v30

   Segnalato: «le trovo grossolane, poco accattivanti ed eleganti».
   Misurando, tre difetti tipografici e due strutturali, gli stessi in
   entrambe le schermate:

   1. LA GERARCHIA ERA ROVESCIATA. Gli `h4` delle sezioni non avevano una
      dimensione dichiarata e prendevano quella di serie del browser: 21,57 px
      contro i 20 del titolo di pagina. Le domande gridavano più del titolo, e
      nel costruttore quattordici nomi di categoria erano quattordici manifesti.

   2. UN PESO SOLO PER TUTTO. Titolo, sezioni, voci: tutti a 800. Quando tutto
      è grassetto, niente è grassetto — e non resta nessun modo di dire che una
      cosa conta più di un'altra.

   3. LE VOCI GALLEGGIAVANO. Nessun contenitore, nessuna linea: elementi
      appoggiati sul fondo pagina, senza una struttura che li tenesse.

   4. LE PASTIGLIE DELLE CATEGORIE ANDAVANO A CAPO A LARGHEZZE DIVERSE,
      producendo un mosaico frastagliato: una riga con una voce lunga, poi due
      corte, poi una lunga. Adesso è la stessa griglia a due colonne di
      «Scopri», che è anche una coerenza in più fra due schermate che fanno
      cose parenti.

   5. LA BARRA FISSA COPRIVA IL CONTENUTO. Su entrambe nascondeva una o due
      righe: il corpo non riservava spazio per lei.

   La scala: occhiello 10,5/800 spaziato per le sezioni — quello che l'eroe
   della home usa già — nome di voce 15/700, titolo di pagina 20/800. Tre
   livelli distinguibili invece di uno solo ripetuto.
   =========================================================================== */

/* --- L'occhiello di sezione, condiviso dalle due schermate --- */
.pt-lampo-section > h4,
.pt-lampo-personalizza > summary h4,
.pt-builder-section > summary h4 {
  font: var(--pt-t-label);
  font-stretch: normal;
  letter-spacing: 0.16em;
  text-transform: uppercase;
  color: var(--pt-ink-55);
}
.pt-lampo-section > h4 {
  display: flex;
  align-items: center;
  gap: 7px;
  margin-bottom: var(--pt-3);
}
.pt-lampo-section > h4 i { font-size: 14px; color: var(--pt-ink-45); }

/* --- Le sezioni del lampo diventano schede --- */
.pt-lampo-section {
  margin: var(--pt-3) var(--pt-align);
  padding: var(--pt-4);
  border: 1px solid var(--pt-line);
  border-radius: var(--pt-r);
  background: var(--pt-card);
}
.pt-lampo-section:first-of-type { margin-top: var(--pt-4); }

/* --- Le pastiglie del tempo: una riga sola, larghezze uguali --- */
.pt-lampo-chips {
  display: grid;
  grid-template-columns: repeat(2, 1fr);
  gap: var(--pt-2);
  margin-top: 0;
}
/* v98 — sei durate, non piu' quattro. A quattro colonne le ultime due
   restavano sole in una seconda riga monca; a tre stanno in due righe
   piene, e da 900px in su in una riga sola — che e' la figura giusta,
   perche' i tempi sono una SCALA e una scala si legge in fila. */
@media (min-width: 520px) { .pt-lampo-chips { grid-template-columns: repeat(3, 1fr); } }
@media (min-width: 900px) { .pt-lampo-chips { grid-template-columns: repeat(6, 1fr); } }
/* --- Le categorie: la griglia di «Scopri», non un mosaico --- */
.pt-lampo-cats {
  display: grid;
  grid-template-columns: repeat(2, 1fr);
  gap: var(--pt-2);
  margin-top: 0;
}
@media (min-width: 700px) { .pt-lampo-cats { grid-template-columns: repeat(3, 1fr); } }
.pt-lampo-cat > span {
  display: flex;
  align-items: center;
  gap: 7px;
  min-height: 46px;
  padding: 0 var(--pt-3);
  font: var(--pt-t-small);
  font-weight: 700;
  line-height: 1.25;
}
.pt-lampo-cat > span i { flex: 0 0 auto; font-size: 16px; color: var(--pt-ink-45); }
.pt-lampo-cat input:checked + span i,
.pt-lampo-cat.active > span i { color: currentColor; }


/* --- Il menu di sistema, vestito come gli altri comandi --- */
.pt-lampo-select {
  width: 100%;
  min-height: 44px;
  padding: 0 34px 0 var(--pt-3);
  border: 1px solid var(--pt-line);
  border-radius: var(--pt-r-sm);
  background: var(--pt-card);
  color: var(--pt-ink);
  font: var(--pt-t-strong);
  font-weight: 600;
  appearance: none;
  -webkit-appearance: none;
  /* La freccia disegnata da noi: quella di sistema era l'unico pezzo di
     interfaccia del browser in una pagina interamente disegnata. */
  background-image: url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='%2385827a' stroke-width='2.5' stroke-linecap='round'%3E%3Cpath d='M6 9l6 6 6-6'/%3E%3C/svg%3E");
  background-repeat: no-repeat;
  background-position: right 10px center;
  background-size: 18px;
}
.pt-lampo-select:disabled { opacity: 0.45; }

/* v30 — La parola sopra il menu: dice che cosa si sta scegliendo. Si spegne
   insieme al menu quando la riga non è quella selezionata, così le due parti
   della stessa scelta restano una cosa sola. */
.pt-lampo-radio-etichetta {
  display: block;
  margin-bottom: 6px;
  font: var(--pt-t-small);
  font-weight: 600;
  color: var(--pt-ink-55);
}
/* FASE H — la parola resta accesa, si spegne solo il menu. Al 45% faceva 1,93:1
   sul bianco — e la si legge proprio quando la riga NON è scelta, per
   decidere se sceglierla. Il menu spento è un comando inattivo, esente dalla
   soglia; la parola è il nome di un pallino attivo, e non lo è. */
/* Con l'etichetta sopra il menu la riga è alta due piani: il pallino, centrato,
   finiva in mezzo al nulla fra i due. Sale accanto alla parola che sceglie. */
.pt-lampo-radio:has(.pt-lampo-radio-etichetta) { align-items: flex-start; }
.pt-lampo-radio:has(.pt-lampo-radio-etichetta) .pt-lampo-radio-dot { margin-top: 1px; }

/* --- FASE D: «Personalizza il giro» ----------------------------------------
   La terza sezione del giro lampo è un `<details>`: la stessa scheda delle
   altre due, e la riga che la apre è la sua testata — l'occhiello, la frase
   che dice che cosa c'è dentro, e la freccia. Chiusa porta a destra il conto
   di quello che ci hai scelto, nel tinto dello scelto: una scelta dentro una
   sezione chiusa deve restare visibile da fuori. */
.pt-lampo-personalizza > summary {
  display: flex;
  align-items: center;
  gap: var(--pt-3);
  min-height: 44px;
  cursor: pointer;
  list-style: none;
}
.pt-lampo-personalizza > summary::-webkit-details-marker { display: none; }
.pt-lampo-personalizza > summary::after {
  content: "\ea5f";                    /* ti-chevron-down */
  content: "\ea5f" / "";            /* FASE H — la stessa icona, senza nome: il lettore di schermo non la legge */
  flex: 0 0 auto;
  margin-left: auto;
  font-family: "tabler-icons";
  font-size: 17px;
  color: var(--pt-ink-45);
  transition: transform var(--pt-fast) var(--pt-ease);
}
.pt-lampo-personalizza[open] > summary::after { transform: rotate(180deg); }
.pt-lampo-personalizza[open] > summary { margin-bottom: var(--pt-3); }
.pt-lampo-personalizza-testo { display: grid; gap: 5px; min-width: 0; }
.pt-lampo-personalizza > summary h4 { display: flex; align-items: center; gap: 7px; margin: 0; }
.pt-lampo-personalizza > summary h4 i { font-size: 14px; color: var(--pt-ink-45); }
.pt-lampo-personalizza-testo small { font: var(--pt-t-small); color: var(--pt-ink-55); }
.pt-lampo-personalizza-conta {
  flex: 0 0 auto;
  padding: 3px 9px;
  border-radius: var(--pt-r-pill);
  background: var(--pt-scelto-tint);
  color: var(--pt-scelto);
  font: var(--pt-t-small);
  font-weight: 700;
  white-space: nowrap;
}

/* --- Il costruttore: un elenco, non quattordici manifesti --- */
.pt-builder-section {
  margin: 0 var(--pt-align);
  border-bottom: 1px solid var(--pt-line);
}
.pt-builder-section:last-of-type { border-bottom: 0; }
.pt-builder-section > summary {
  min-height: 52px;
  padding: var(--pt-2) 0;
}
.pt-builder-section > summary h4 {
  display: flex;
  align-items: center;
  gap: 9px;
  font: var(--pt-t-strong);
  font-size: 15px;
  font-weight: 700;
  font-stretch: normal;
  letter-spacing: -0.01em;
  text-transform: none;
  color: var(--pt-ink);
}
.pt-builder-section > summary h4 i { font-size: 18px; color: var(--pt-ink-45); }
.pt-builder-section[open] > summary h4 i { color: var(--pt-sg); }

/* v99 — QUI C'ERANO 180 PIXEL DI VUOTO IN FONDO A OGNI PAGINA CON LA BARRA,
   e una SECONDA regola `.pt-builder-bar` che ne rifaceva il `padding`.

   I 180 px servivano a non far restare l'ultima voce dell'elenco sotto la
   barra che galleggiava: adesso non galleggia, e lo spazio riservato a
   qualcosa che non c'è più sarebbe una schermata mezza vuota da scorrere in
   fondo a tre pagine.

   La regola doppia era peggio: `padding: var(--pt-3)` qui e
   `padding: var(--pt-3) var(--pt-4)` alla sezione 26. Vinceva la seconda, la
   prima non faceva niente — e una prova che cercasse «la regola della barra»
   trovava questa, cioè quella sbagliata. È successo davvero, scrivendo le
   prove di questo rilascio. Adesso la regola è una sola. */

.pt-builder-bar .pt-conta-inline { font: var(--pt-t-small); color: rgb(255 255 255 / 0.7); }

/* --- SCOPRI: due sezioni e le categorie in griglia --- v29 -----------------
   Le categorie erano una riga che scorre di lato: misurata su uno schermo da
   390 px, larga 2413 px con DUE categorie visibili su quattordici. Per
   trovarne una bisognava trascinare alla cieca per sei schermate.

   Adesso un pannello che si apre e le mostra tutte, in due colonne. Da chiuso
   dice quale filtro e' attivo. */
.pt-sezioni {
  display: flex;
  gap: var(--pt-2);
  margin-bottom: var(--pt-3);
}
.pt-sezione-btn {
  display: inline-flex;
  align-items: center;
  justify-content: center;
  gap: 7px;
  flex: 1;
  min-height: 44px;
  padding: 0 var(--pt-3);
  border: 1px solid var(--pt-line);
  border-radius: var(--pt-r-sm);
  background: var(--pt-card);
  color: var(--pt-ink-55);
  font: var(--pt-t-strong);
  font-size: 14px;
  text-decoration: none;
}
.pt-sezione-btn.active {
  border-color: var(--pt-scelto);
  background: var(--pt-scelto);
  color: #fff;
}
.pt-sezione-btn i { font-size: 17px; }
/* v70 — IL NUMERO SULLA SEZIONE ACCESA.
   Era bianco su una velatura bianca al 22% sopra il blu: 3,62:1, sotto la
   soglia di 4,5 che serve a un testo. E' la stessa trappola che v64 aveva
   trovato altrove — una velatura non e' un colore, e' una promessa che vale
   quanto il fondo su cui cade. Qui la pastiglia si riempie e il numero prende
   il blu: 5,43:1, ed e' anche piu' leggibile da lontano. */
.pt-sezione-conta {
  padding: 1px 7px;
  border-radius: var(--pt-r-pill);
  background: #fff;
  color: var(--pt-scelto);
  font-size: 12px;
}
.pt-sezione-btn:not(.active) .pt-sezione-conta {
  background: var(--pt-paper-2);
  color: var(--pt-ink-55);
}

.pt-cat-pannello { margin-top: var(--pt-2); }
.pt-cat-pannello > summary {
  display: flex;
  align-items: center;
  gap: var(--pt-2);
  min-height: 44px;
  padding: 0 var(--pt-3);
  border: 1px solid var(--pt-line);
  border-radius: var(--pt-r-sm);
  background: var(--pt-card);
  font: var(--pt-t-strong);
  font-size: 14px;
  cursor: pointer;
  list-style: none;
}
.pt-cat-pannello > summary::-webkit-details-marker { display: none; }
.pt-cat-pannello > summary::after {
  content: "\ea5f";                     /* ti-chevron-down */
  content: "\ea5f" / "";            /* FASE H — la stessa icona, senza nome: il lettore di schermo non la legge */
  margin-left: auto;
  font-family: "tabler-icons";
  font-size: 17px;
  color: var(--pt-ink-45);
  transition: transform var(--pt-fast) var(--pt-ease);
}
.pt-cat-pannello[open] > summary::after { transform: rotate(180deg); }
.pt-cat-pannello-stato { min-width: 0; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }

.pt-cat-griglia {
  display: grid;
  grid-template-columns: repeat(2, 1fr);
  gap: var(--pt-2);
  margin-top: var(--pt-2);
}
.pt-cat-voce {
  display: flex;
  align-items: center;
  gap: 7px;
  min-height: 44px;
  padding: 0 var(--pt-3);
  border: 1px solid var(--pt-line);
  border-radius: var(--pt-r-sm);
  background: var(--pt-card);
  color: var(--pt-ink);
  font: var(--pt-t-small);
  font-weight: 700;
  text-decoration: none;
  line-height: 1.25;
}
.pt-cat-voce.active { border-color: var(--pt-scelto); background: var(--pt-scelto); color: #fff; }
.pt-cat-voce i { flex: 0 0 auto; font-size: 17px; }

/* Su schermo largo lo spazio c'e': tre colonne invece di due. */
@media (min-width: 700px) { .pt-cat-griglia { grid-template-columns: repeat(3, 1fr); } }

.pt-eventi-elenco { display: grid; gap: var(--pt-3); margin: var(--pt-4) var(--pt-align); }

/* --- Il viaggio di gruppo in un tocco --- v28 ------------------------------
   Prima l'invito era un modulo di 627 px dentro una sezione chiusa a 1132 px
   dall'alto: quattro pastiglie e un numero da decidere prima che succedesse
   qualcosa. Adesso e' un invito con un comando, e le impostazioni stanno
   dietro una riga che si apre — dove servono, cioe' dopo. */
.pt-gruppo-invito {
  margin: var(--pt-4) var(--pt-align);
  padding: var(--pt-4);
  border: 1px solid var(--pt-line);
  border-radius: var(--pt-r);
  background: var(--pt-card);
}
.pt-gruppo-invito-testa {
  display: flex;
  align-items: flex-start;
  gap: var(--pt-3);
  margin-bottom: var(--pt-4);
}
.pt-gruppo-invito-testa > i { font-size: 22px; color: var(--pt-sg); flex: 0 0 auto; }
.pt-gruppo-invito-testa strong { display: block; font: var(--pt-t-strong); font-size: 16px; }
.pt-gruppo-invito-testa small { display: block; margin-top: 2px; font: var(--pt-t-small); color: var(--pt-ink-55); }

/* Le impostazioni: una riga che si apre, non un modulo aperto. */
.pt-gruppo-invito .pt-gruppo-attiva {
  margin: var(--pt-4) 0 0;
  padding: var(--pt-3) 0 0;
  border: 0;
  border-top: 1px solid var(--pt-line);
  border-radius: 0;
  background: none;
}
.pt-gruppo-invito .pt-gruppo-attiva-head {
  min-height: 44px;
  font: var(--pt-t-small);
  color: var(--pt-ink-55);
}
.pt-gruppo-invito .pt-gruppo-attiva-head strong { font-weight: 700; }

/* --- «Sei stato invitato»: la decisione prima del resto --- v28 --- */
.pt-gruppo-join-occhio { display: block; margin-bottom: var(--pt-1); color: var(--pt-sg); }

/* --- I ponti dalla scheda di un luogo --- v27 --- */
.pt-poi-ponti { display: grid; gap: var(--pt-2); margin-bottom: var(--pt-3); }
.pt-poi-collegati { display: grid; gap: var(--pt-2); margin: 0 var(--pt-align) var(--pt-4); }

.pt-preferiti-tour { width: calc(100% - var(--pt-gutter) * 2); margin: var(--pt-4) var(--pt-align) var(--pt-2); }

/* --- TU: le cose della persona --- v26 -------------------------------------
   Quattro righe, la stessa forma delle schede di navigazione dei tour: sono la
   stessa cosa — un elenco di posti dove andare — e non c'e' ragione perche' si
   vedano diverse. Il numero accanto al nome e' quello che invita a entrare:
   una riga che dice "12 luoghi" e' un invito, una che non dice niente e' un
   indirizzo. */
.pt-tu-elenco { display: grid; gap: var(--pt-3); margin: var(--pt-4) var(--pt-align); }
/* v77 — Il contenitore delle schede dei giri salvati. Sul telefono non fa
   niente: le schede hanno già i loro margini e stanno in colonna. Esiste
   perché su schermo largo ci sia qualcosa da mettere in due colonne che non
   contenga anche il comando «crea un tour» e la porta della ricerca. */
.pt-tour-lista { display: grid; }

.pt-tu-riga {
  display: flex;
  align-items: center;
  gap: var(--pt-3);
  padding: var(--pt-4);
  border: 1px solid var(--pt-line);
  border-radius: var(--pt-r);
  background: var(--pt-card);
  color: var(--pt-ink);
  text-decoration: none;
}
.pt-tu-riga > div:nth-child(2) { flex: 1; min-width: 0; }
.pt-tu-riga h3 { margin: 0; font: var(--pt-t-strong); font-size: 16px; }
.pt-tu-riga p { margin: 2px 0 0; font: var(--pt-t-small); color: var(--pt-ink-55); }
.pt-tu-riga > .ti-chevron-right { color: var(--pt-ink-45); font-size: 18px; }

/* Da anonimo le stesse quattro righe restano, spente: dicono che cosa si
   guadagna, il che e' piu' onesto e piu' convincente di una frase. */
.pt-tu-riga.is-spenta { opacity: 0.55; }

.pt-tu-accedi { width: calc(100% - var(--pt-gutter) * 2); margin: var(--pt-5) var(--pt-align); }

.pt-tu-account {
  margin: var(--pt-6) var(--pt-align) var(--pt-4);
  padding-top: var(--pt-4);
  border-top: 1px solid var(--pt-line);
}
.pt-tu-email {
  display: flex; align-items: center; gap: var(--pt-2);
  margin: 0 0 var(--pt-3);
  font: var(--pt-t-small); color: var(--pt-ink-55);
}

/* --- SCOPRI: due viste della stessa cosa --- v26 ---------------------------
   Elenco e mappa non sono due sezioni: sono due modi di guardare lo stesso
   contenuto. L'interruttore sta accanto alla ricerca, dentro il blocco che si
   appiccica, cosi' resta a portata mentre si scorre — e porta con se' filtro e
   ricerca, perche' cambiare vista non deve far ricominciare da capo chi aveva
   gia' ristretto il campo. */
.pt-scopri-riga {
  display: flex;
  align-items: center;
  gap: var(--pt-2);
}
.pt-scopri-riga .pt-search { flex: 1; min-width: 0; margin: 0; }

/* v65 — L'INTERRUTTORE DI VISTA NON C'È PIÙ.

   Le sue due voci sono diventate due delle tre pastiglie di `.pt-tre-viste`
   (sezione 27): elenco e mappa non erano un *modo* di guardare la stessa cosa
   accanto a una scelta di *che cosa* guardare — erano due posti dove andare,
   come gli eventi. Tenerli in due controlli diversi obbligava a capire la
   differenza prima di poter usare la pagina.

   Le regole se ne vanno con lui invece di restare orfane: una classe senza
   markup non dà errore, si limita a occupare il foglio finché qualcuno la
   ricopia credendo che serva ancora. */

/* Gli eventi in cima all'elenco: una striscia, non una sezione. */
.pt-section-head-mini { margin-bottom: var(--pt-1); }
.pt-eventi-striscia { display: grid; gap: var(--pt-2); margin-bottom: var(--pt-5); }

/* --- Gli strumenti dell'elenco, sempre a portata --- v25 -------------------
   Ricerca e filtri erano gia' subito sopra le schede, ma su una pagina che
   comincia con l'eroe "subito sopra" voleva dire 708 px dall'alto: per usarli
   bisognava scorrere una schermata intera, e per riusarli tornare su. Su un
   elenco di centouno luoghi e' l'unico modo di arrivare a quel che si cerca.

   `top` e' l'altezza reale dell'intestazione, che e' anch'essa appiccicata:
   senza, il blocco si fermerebbe SOTTO di lei e resterebbe invisibile. Lo
   z-index sta sotto quello dell'intestazione (30) e sopra le schede.

   FASE C — IL MARGINE LATERALE STA NEL CONTENITORE, NON NEI FIGLI.
   La fascia è a tutta larghezza di proposito: quando si appiccica, il fondo
   carta deve coprire l'elenco che le scorre sotto da bordo a bordo. Ma il
   margine laterale non l'aveva nessuno — né la fascia né i suoi tre figli — e
   i comandi arrivavano al bordo dello schermo. Misurato a 390: le tre
   pastiglie, la ricerca e il pannello delle categorie da x=0 a x=390, contro il
   titolo della pagina a 16; su desktop a 20 contro 36. Su Scopri, sulla mappa
   e sul catalogo: dieci comandi, e nessun'altra pagina dell'app ne ha uno
   (lo dice `S08` della baseline, che guarda tutte e venti).
   Il padding e non il margine: così il fondo resta largo quanto lo schermo e
   il contenuto comincia dove comincia il resto della pagina. */
.pt-lista-strumenti {
  position: sticky;
  top: var(--pt-header-h);
  z-index: 20;
  padding: var(--pt-2) var(--pt-align);
  background: var(--pt-paper);
}

.pt-chip-row-wrap { position: relative; }

.pt-chip-row {
  display: flex;
  gap: var(--pt-2);
  padding: var(--pt-1) var(--pt-align) var(--pt-2);
  overflow-x: auto;
  scrollbar-width: none;
}
.pt-chip-row::-webkit-scrollbar { display: none; }

/* v30 — La fila di scelte rapide scorre di lato, ma l'ultima voce visibile
   veniva tagliata netta dal bordo: sembrava un errore di impaginazione, non
   un invito a scorrere. La sfumatura dice che sotto continua. Sparisce da
   sola quando si arriva in fondo alla fila. */
/* v66 — DA CLASSE DI QUELLA FILA A COMPORTAMENTO DI QUALUNQUE FILA.
   La sfumatura si chiedeva con `.pt-chip-row-sfuma`, cioè con il nome del
   componente che l'aveva inventata. La fila delle categorie della home (v65)
   scorre allo stesso modo e il taglio netto sul bordo c'era di nuovo, identico:
   ho ripetuto in un posto nuovo un difetto che v30 aveva già corretto in un
   altro. Adesso si chiede con `data-sfuma`, che descrive quello che fa e non
   dove è nato, e la logica sta in `app.js` invece che dentro un template. */
[data-sfuma] {
  -webkit-mask-image: linear-gradient(to right, #000 calc(100% - 34px), transparent 100%);
          mask-image: linear-gradient(to right, #000 calc(100% - 34px), transparent 100%);
}
[data-sfuma]:not([data-scorre="si"]) {
  -webkit-mask-image: none;
          mask-image: none;
}

.pt-chip {
  flex: 0 0 auto;
  display: inline-flex;
  align-items: center;
  gap: 6px;
  padding: 9px 14px;
  border: 1px solid var(--pt-line-2);
  border-radius: var(--pt-r-pill);
  background: var(--pt-card);
  color: var(--pt-ink-70);
  font: var(--pt-t-strong);
  font-size: 13.5px;
  white-space: nowrap;
  transition: all var(--pt-fast) var(--pt-ease);
}
.pt-chip i { font-size: 16px; }

.pt-chip.active { background: var(--pt-scelto); border-color: var(--pt-scelto); color: #fff; }

.pt-chip-spento { color: var(--pt-ink-55); border-style: dashed; cursor: default; }   /* v64 — era -45: 3,58:1 */

/* --- Etichette passive: squadrate, sono targhette ------------------------- */

.pt-badge-cat, .badge {
  display: inline-flex;
  align-items: center;
  gap: 5px;
  padding: 4px 8px;
  border-radius: var(--pt-r-xs);
  background: var(--pt-paper-2);
  color: var(--pt-ink-70);
  font: var(--pt-t-label);
  letter-spacing: 0.11em;
  text-transform: uppercase;
}

.pt-badge-unesco {
  background: var(--pt-oro-tint);
  border: 1px solid var(--pt-oro-200);
  color: var(--pt-oro-testo);
}
.pt-badge-libero { background: var(--pt-ok-tint); color: var(--pt-ok); }

/* --- Dati in riga ---------------------------------------------------------
   Zona, durata, ingresso. Sempre con icona: il colore da solo non è
   un'informazione per chi non lo distingue. */

.pt-fatti {
  display: flex;
  flex-wrap: wrap;
  gap: 4px 13px;
  font: var(--pt-t-label);
  font-size: 11px;
  letter-spacing: 0.07em;
  text-transform: uppercase;
  color: var(--pt-ink-55);
}
.pt-fatti > span { display: inline-flex; align-items: center; gap: 5px; }
.pt-fatti i { font-size: 14px; }
.pt-fatti .is-oro { color: var(--pt-oro-testo); }
.pt-fatti .is-ok { color: var(--pt-ok); }

/* --- Schede e righe -------------------------------------------------------
   Contenitore bianco con un filo di bordo, niente ombra: la scheda sta sulla
   carta, non sopra di essa. */

.pt-card, .pt-itin-card, .pt-tour-card, .pt-evento-card, .pt-community-card,
.pt-bacheca-card, .pt-gruppo-card, .pt-proposta-card, .pt-map-card {
  display: block;
  margin: 0 var(--pt-align) var(--pt-2);
  padding: var(--pt-4);
  border: 1px solid var(--pt-line);
  border-radius: var(--pt-r);
  background: var(--pt-card);
  color: var(--pt-ink);
  transition: border-color var(--pt-fast) var(--pt-ease);
}


/* Riga con freccia: una destinazione, non un contenuto. */
.pt-altro-riga {
  display: flex;
  align-items: center;
  gap: var(--pt-3);
  margin: 0 var(--pt-align) var(--pt-2);
  padding: 14px var(--pt-4);
  border: 1px solid var(--pt-line);
  border-radius: var(--pt-r);
  background: var(--pt-card);
  color: var(--pt-ink);
  font: var(--pt-t-strong);
  transition: border-color var(--pt-fast) var(--pt-ease);
}

.pt-altro-riga > i:first-child { flex: 0 0 auto; font-size: 20px; color: var(--pt-ink-70); }
.pt-altro-riga span { flex: 1; min-width: 0; }
.pt-altro-riga small { display: block; font: var(--pt-t-small); font-size: 12.5px; color: var(--pt-ink-55); }
.pt-altro-riga .ti-chevron-right { margin-left: auto; flex: 0 0 auto; font-size: 18px; color: var(--pt-ink-45); }

/* --- Campi ---------------------------------------------------------------- */

.pt-search { margin: 0 var(--pt-align) var(--pt-2); }

/* v32 — `.pt-campo > input` entra in questo elenco perché i moduli di allauth
   li costruisce allauth: i suoi campi arrivano senza la classe, e ricordarsi
   di aggiungerla a ognuno è esattamente il genere di promessa che non regge un
   aggiornamento della libreria. Dentro un campo, un controllo si veste da solo. */
.pt-search input, .form-control, .pt-campo-input, .pt-propose-input, .pt-propose-textarea,
.pt-campo > input:not([type="checkbox"]):not([type="radio"]),
.pt-campo > select, .pt-campo > textarea,
.pt-publish-input, .pt-publish-textarea, .pt-review-textarea, .pt-uscita-input,
/* v30 — `select.pt-lampo-select` stava anche qui, e questa riga viene dopo:
   la scorciatoia `background:` azzerava la freccia disegnata più su, e il menu
   restava l'unico comando della pagina senza segno che si apre. Il componente
   si veste già da solo, non ha bisogno di essere anche in questo elenco. */
.pt-endpoint-field select, input[type="datetime-local"] {
  width: 100%;
  padding: 13px 15px;
  border: 1px solid var(--pt-line-2);
  border-radius: var(--pt-r-sm);
  background: var(--pt-card);
  color: var(--pt-ink);
  font: var(--pt-t-body);
  transition: border-color var(--pt-fast) var(--pt-ease), box-shadow var(--pt-fast) var(--pt-ease);
}
.pt-search input::placeholder, .form-control::placeholder, .pt-campo-input::placeholder,
.pt-propose-input::placeholder, .pt-propose-textarea::placeholder { color: var(--pt-ink-45); }

.pt-search input:focus, .form-control:focus, .pt-campo-input:focus, .pt-propose-input:focus,
.pt-propose-textarea:focus, .pt-publish-input:focus, .pt-publish-textarea:focus,
.pt-review-textarea:focus, .pt-uscita-input:focus {
  border-color: var(--pt-ink);
  outline: none;
  box-shadow: 0 0 0 3px var(--pt-sg-200);
}

.pt-propose-label, .pt-publish-label, .pt-uscita-label, .pt-review-form-label,
.form-label, .pt-etichetta {
  display: block;
  margin-bottom: 6px;
  font: var(--pt-t-label);
  letter-spacing: 0.15em;
  text-transform: uppercase;
  color: var(--pt-ink-55);
}

.pt-propose-hint, .pt-publish-nota, .pt-review-form-sub, .pt-nota,
.pt-propose-vicini-nota, .pt-tour-salva-nota, .pt-tour-avvia-nota,
.pt-uscita-programma-sub, .pt-gruppo-privacy, .pt-accesso-nota {
  font: var(--pt-t-small);
  font-size: 12.5px;
  color: var(--pt-ink-55);
}

/* --- Azioni in riga (vicino a te, preferiti) ------------------------------ */

.pt-action-row {
  display: flex;
  flex-wrap: wrap;
  gap: var(--pt-2);
  padding: var(--pt-1) var(--pt-align) var(--pt-3);
}

.pt-action-btn {
  display: inline-flex;
  align-items: center;
  gap: 7px;
  padding: 9px 14px;
  border: 1px solid var(--pt-line-2);
  border-radius: var(--pt-r-pill);
  background: var(--pt-card);
  color: var(--pt-ink-70);
  font: var(--pt-t-strong);
  font-size: 13.5px;
  cursor: pointer;
  transition: all var(--pt-fast) var(--pt-ease);
}
.pt-action-btn i { font-size: 16px; }

.pt-action-btn.active { background: var(--pt-scelto); border-color: var(--pt-scelto); color: #fff; }
.pt-action-btn.loading { opacity: 0.55; pointer-events: none; }

/* --- Avvisi --------------------------------------------------------------- */

.pt-flash-wrap { display: grid; gap: var(--pt-2); margin: var(--pt-3) var(--pt-align) 0; }

.pt-flash, .alert {
  display: flex;
  align-items: flex-start;
  gap: 10px;
  padding: 13px 15px;
  border: 1px solid var(--pt-line-2);
  border-radius: var(--pt-r-sm);
  background: var(--pt-card);
  font: var(--pt-t-small);
  color: var(--pt-ink);
}
.pt-flash i, .alert i { flex: 0 0 auto; font-size: 18px; }
.pt-flash.is-ok { border-color: var(--pt-ok); background: var(--pt-ok-tint); color: var(--pt-ok); }
.pt-flash.is-warn { border-color: var(--pt-oro-200); background: var(--pt-warn-tint); color: var(--pt-warn); }
.pt-flash.is-danger, .alert-danger {
  border-color: var(--pt-danger); background: var(--pt-danger-tint); color: var(--pt-danger);
}

/* --- Toast ---------------------------------------------------------------- */

#pt-toast {
  position: fixed;
  left: 50%;
  /* Sopra la barra, e con la stessa misura di tutto il resto: era 98, cioe' un
     numero suo che non seguiva nessuno. */
  bottom: calc(var(--pt-sopra-nav) + var(--pt-3));
  z-index: 60;
  max-width: calc(100vw - 40px);
  padding: 12px 18px;
  border-radius: var(--pt-r-pill);
  background: var(--pt-ink);
  color: #fff;
  font: var(--pt-t-strong);
  text-align: center;
  box-shadow: var(--pt-shadow-lift);
  opacity: 0;
  pointer-events: none;
  transform: translate(-50%, 14px);
  transition: opacity var(--pt-med) var(--pt-ease), transform var(--pt-med) var(--pt-ease);
}
#pt-toast.pt-toast-visible { opacity: 1; transform: translate(-50%, 0); }
#pt-toast.pt-toast-warning { background: var(--pt-danger); }
#pt-toast.pt-toast-badge { background: var(--pt-oro); color: #fff; font-weight: 800; }

/* --- Stato vuoto ---------------------------------------------------------- */

.pt-vuoto, .pt-edit-vuoto, .pt-passport-empty, .pt-reviews-empty, .pt-bacheca-vuota {
  margin: var(--pt-4) var(--pt-align);
  padding: var(--pt-6) var(--pt-4);
  border: 1px dashed var(--pt-line-2);
  border-radius: var(--pt-r);
  text-align: center;
  color: var(--pt-ink-55);
  font: var(--pt-t-small);
}
.pt-vuoto i { display: block; margin-bottom: 10px; font-size: 30px; color: var(--pt-ink-25); }


/* ============================================================================
   4. SCHEDA LUOGO
   ============================================================================
   Il pezzo più importante dell'app: compare in lista cento volte di fila, su
   esplora, preferiti e guida.

   La tessera colorata NON è un ripiego per la fotografia mancante: è la
   fotografia che non arriverà. Il campo `immagine` è vuoto su tutti i luoghi
   del catalogo, quindi promettere quello spazio e riempirlo di grigio era il
   difetto più visibile della lista. Un colore pieno con l'icona della famiglia
   è leggibile a distanza, si riconosce scorrendo, e dice qualcosa di vero.
   ========================================================================== */

.pt-list { display: grid; gap: var(--pt-2); }

.pt-poi-card {
  display: flex;
  align-items: flex-start;
  gap: var(--pt-3);
  margin: 0 var(--pt-align);
  padding: var(--pt-3);
  border: 1px solid var(--pt-line);
  border-radius: var(--pt-r);
  background: var(--pt-card);
  color: var(--pt-ink);
  transition: border-color var(--pt-fast) var(--pt-ease);
}


.pt-poi-tessera {
  flex: 0 0 auto;
  display: grid;
  place-items: center;
  width: 54px;
  height: 54px;
  border-radius: var(--pt-r-icona);
  background: var(--pt-fam);
  background-size: cover;
  background-position: center;
  color: #fff;
  font-size: 25px;
}

.pt-poi-info { flex: 1; min-width: 0; }

.pt-poi-riga1 {
  display: flex;
  align-items: center;
  gap: 6px;
  margin-bottom: 5px;
}

/* Il nome della categoria prende il colore della famiglia: è l'unico posto in
   cui il colore porta l'informazione anche in forma di testo, così chi non
   distingue le tinte non perde niente. */
.pt-poi-cat {
  font: var(--pt-t-label);
  letter-spacing: 0.13em;
  text-transform: uppercase;
  color: var(--pt-fam);
  overflow: hidden;
  text-overflow: ellipsis;
  white-space: nowrap;
}

.pt-poi-riga1 .pt-badge-unesco { flex: 0 0 auto; padding: 2px 6px; font-size: 9.5px; }
.pt-poi-riga1 .pt-fav-star { margin-left: auto; flex: 0 0 auto; }

.pt-poi-card h3 {
  font-size: 17px;
  font-stretch: var(--pt-wide);
  letter-spacing: -0.033em;
  line-height: 1.15;
}

.pt-poi-breve {
  margin-top: 4px;
  font: var(--pt-t-small);
  font-size: 13px;
  color: var(--pt-ink-70);
  display: -webkit-box;
  -webkit-line-clamp: 2;
  -webkit-box-orient: vertical;
  overflow: hidden;
}

.pt-poi-card .pt-fatti { margin-top: 9px; }

/* --- Le sei famiglie -----------------------------------------------------
   Tredici categorie, sei colori. Tredici tinte non sono un codice, sono un
   arcobaleno: nessuno le impara. Il raggruppamento si legge dopo due
   schermate — patrimonio, sacro, cultura, strada, natura, città. */

[data-cat="arabo_normanno"], [data-cat="palazzi"],
[data-cat="roma_antica"]                                 { --pt-fam: var(--pt-fam-patrimonio); }
[data-cat="chiese_oratori"]                              { --pt-fam: var(--pt-fam-sacro); }
[data-cat="musei"], [data-cat="teatri"]                  { --pt-fam: var(--pt-fam-cultura); }
[data-cat="mercati"], [data-cat="gusto"],
[data-cat="street_art"]                                  { --pt-fam: var(--pt-fam-strada); }
[data-cat="parchi_giardini"], [data-cat="natura_mare"]   { --pt-fam: var(--pt-fam-natura); }
[data-cat="piazze_monumenti"], [data-cat="memoria_civile"],
[data-cat="dintorni"]                                    { --pt-fam: var(--pt-fam-citta); }

/* --- Il cuore dei preferiti ---------------------------------------------- */

.pt-fav-star {
  /* v66 — IL BERSAGLIO ERA 19 px, E NESSUNO LO SAPEVA.
     Il cuore disegnato resta di 19 px; quello che cambia e' la SCATOLA che
     riceve il dito, che adesso e' 44 come pretende il sistema di design da
     sempre. Il riempimento non si vede: serve solo a fare superficie.

     Perche' non l'aveva trovato nessuno: `tools/audit_mobile.py` misura
     `a[href], button, summary, [role=button], select, input` — e la stella,
     per chi ha fatto l'accesso, e' un `<svg>` nudo con un gestore attaccato
     dal JavaScript. Non e' nessuna di quelle cose. Per chi NON ha fatto
     l'accesso e' invece uno `<span role="button">`, quindi sarebbe stata vista
     — ma l'audit fa l'accesso, e quella pagina non l'ha mai guardata.
     Due buchi diversi che nascondevano lo stesso difetto. */
  box-sizing: border-box;
  width: 44px;
  height: 44px;
  padding: 12px;
  overflow: visible;
  fill: none;
  stroke: var(--pt-ink-45);
  stroke-width: 1.7;
  cursor: pointer;
  transition: fill var(--pt-fast) var(--pt-ease), stroke var(--pt-fast) var(--pt-ease),
              transform var(--pt-fast) var(--pt-ease);
}

.pt-fav-star.is-fav { fill: var(--pt-sg); stroke: var(--pt-sg); }
/* La versione per chi non ha l'account e' uno `<span>` che avvolge il disegno:
   la scatola da 44 px sta sul contenitore, il cuore resta della sua misura. */
span.pt-fav-star {
  display: inline-grid;
  place-items: center;
  box-sizing: border-box;
  width: 44px;
  height: 44px;
  padding: 0;
}
span.pt-fav-star svg { width: 19px; height: 19px; fill: none; stroke: var(--pt-ink-45); stroke-width: 1.7; }

/* --- Distanza, quando "vicino a te" è attivo ----------------------------- */

.pt-distance-badge {
  display: inline-block;
  margin-top: 7px;
  padding: 3px 8px;
  border-radius: var(--pt-r-xs);
  background: var(--pt-scelto);
  color: #fff;
  font: var(--pt-t-label);
  font-size: 10.5px;
  letter-spacing: 0.05em;
}

/* v90 — LO STESSO NUMERO IN TRE POSTI, CON TRE PESI DIVERSI.

   Nelle schede di Scopri resta la targhetta piena che esiste da v49: quella
   non si tocca. Nelle righe di `/luoghi/` e nel blocco grande di Scopri il
   numero sta invece dentro una fila di fatti gia' fatta — zona, durata,
   categoria — e una pastiglia piena in mezzo a tre scritte grigie sarebbe un
   bottone finto. Qui e' una scritta come le altre, con due differenze:

   - il colore e' quello della segnaletica, perche' e' l'unico fatto della
     fila che non viene dalla scheda ma da chi guarda, e cambia se ci si
     sposta;
   - viene per primo, perche' la fila va a capo su due righe sul telefono e il
     fatto appena arrivato non puo' finire sotto; nelle righe e' anche il
     criterio con cui l'elenco si e' appena riordinato. Ma «per primo» e' nel
     documento — il template lo scrive prima, il JavaScript lo infila prima —
     e non con `order: -1`, che sposterebbe solo il disegno e lascerebbe la
     distanza in fondo a chi ascolta la pagina.

   L'icona e' `ti-map-pin-share`, non `ti-walk`: il conto e' in linea d'aria
   (haversine, v68) e un omino che cammina prometterebbe un percorso a piedi
   che nessuno ha misurato. */
.pt-riga-fatti .pt-distance-badge,
.pt-evidenza-lontano {
  margin-top: 0;
  padding: 0;
  border-radius: 0;
  background: none;
  color: var(--pt-sg);
  font: var(--pt-t-strong);
  font-size: 12.5px;
  letter-spacing: 0;
}
.pt-riga-fatti .pt-distance-badge::before,
.pt-evidenza-lontano::before {
  content: "\f795";                       /* ti-map-pin-share */
  content: "\f795" / "";            /* FASE H — la stessa icona, senza nome: il lettore di schermo non la legge */
  margin-inline-end: 3px;
  font-family: "tabler-icons";
  font-weight: normal;
}

/* Nella scheda di un luogo la distanza e' la prima delle caselle dei fatti
   veloci, e la casella e' identica alle altre: stessa cornice, stessa
   etichetta piccola sopra. Cambia solo il colore del valore, per la stessa
   ragione delle righe e del blocco grande — «zona», «visita» e «ingresso» sono
   scritti sul luogo, questo e' scritto su chi guarda. */
.pt-poi-lontano dd { color: var(--pt-sg); }

/* Il bottone «vicino a te» accanto al menu dell'ordinamento: stessa pastiglia
   dei filtri di Scopri — e' lo stesso componente — ma qui sta in una barra di
   strumenti e non in una fila di filtri, quindi non si allarga. */
/* FASE C — il bottone sta dentro `.pt-lista-scelte`, che non ha margini
   laterali perché i suoi altri due figli se li portano da soli. Lui no: a 390
   cominciava a x=0, e sul largo finiva a 1260 invece che a 1244, sedici pixel
   oltre il bordo di tutto il resto. */
.pt-ordina-vicino { flex: 0 0 auto; margin-inline: var(--pt-align); }
@media (min-width: 800px) {
  /* In fila, lo spazio a sinistra lo dà già il `gap`: il margine serve solo
     verso il bordo, altrimenti fra il menu e il bottone ci sarebbero 44 px
     invece dei 28 di prima. */
  .pt-lista-scelte .pt-ordina-vicino { margin-inline-start: 0; }
}


/* ============================================================================
   5. HOME
   ============================================================================
   Quattro zone in ordine di urgenza: si riprende, si parte, ci si orienta, si
   legge. Una sola di queste è piena di colore per schermata — se c'è un tour in
   corso quel posto è suo, altrimenti è dell'invito a partire. Due blocchi pieni
   sarebbero due primi posti, cioè nessuno.
   ========================================================================== */

/* --- Riprendi ------------------------------------------------------------- */

.pt-riprendi { display: block; margin: var(--pt-3) var(--pt-align) 0; }

/* v39 — «Questo nero non mi piace.»

   Era l'ultima lastra nera rimasta, e la più grande: apre la home a tutta
   larghezza, in una pagina fatta di schede bianche su carta calda. Una lastra
   scura lì non è enfasi, è un buco.

   Adesso è una scheda azzurra chiara. Non perde nulla di quello che deve fare
   — resta la prima cosa della pagina, l'unica con il pallino che pulsa e
   l'unica con il bottone rosso — ma smette di pesare come un lutto. E il rosso
   di «Riprendi», che sul nero era l'unica cosa viva, su questo fondo respira
   invece di gridare. */
.pt-riprendi-attivo {
  padding: var(--pt-4) var(--pt-5) var(--pt-5);
  border: 1px solid var(--pt-scelto-200);
  border-radius: var(--pt-r-lg);
  background: var(--pt-scelto-tint);
  color: var(--pt-ink);
}

.pt-riprendi-stato {
  display: inline-flex;
  align-items: center;
  gap: 8px;
  font: var(--pt-t-label);
  letter-spacing: 0.18em;
  text-transform: uppercase;
  color: var(--pt-scelto);
}

/* L'unica animazione della pagina, e dice una cosa sola: questo è vivo adesso.

   FASE B — L'ALONE ERA DI UN ALTRO ROSSO. Il pallino e' `--pt-sg`, cioe'
   #A93F2B; l'alone che gli pulsa intorno era `rgba(192, 52, 28, …)`, cioe'
   #C0341C — un rosso di prima di v64, che non e' piu' nessun gettone. Un
   pallino che respira un colore diverso dal suo. E' l'unico cambiamento
   VISIBILE di questa fase, ed e' dichiarato: il confronto al pixel non lo
   vede, perche' ferma le animazioni e a riposo l'alone e' largo zero; si vede
   nelle due fotografie a meta' pulsazione in `docs/img/`. */
.pt-riprendi-pulse {
  width: 8px; height: 8px;
  border-radius: 50%;
  background: var(--pt-sg);
  box-shadow: 0 0 0 0 color-mix(in srgb, var(--pt-sg) 70%, transparent);
  animation: pt-pulse 2s var(--pt-ease) infinite;
}
@keyframes pt-pulse {
  0%   { box-shadow: 0 0 0 0 color-mix(in srgb, var(--pt-sg) 70%, transparent); }
  70%  { box-shadow: 0 0 0 9px color-mix(in srgb, var(--pt-sg) 0%, transparent); }
  100% { box-shadow: 0 0 0 0 color-mix(in srgb, var(--pt-sg) 0%, transparent); }
}

.pt-riprendi-attivo h2 {
  margin-top: var(--pt-2);
  font-size: clamp(22px, 5.8vw, 27px);
  letter-spacing: -0.038em;
  color: var(--pt-ink);
}

.pt-riprendi-barra {
  height: 7px;
  margin-top: var(--pt-4);
  border-radius: var(--pt-r-pill);
  /* Su fondo chiaro il binario dev'essere più scuro del fondo, non più
     chiaro: il bianco al 22% su azzurro chiaro sarebbe invisibile. */
  background: #FFFFFF;
  overflow: hidden;
}
.pt-riprendi-barra > span {
  display: block;
  height: 100%;
  border-radius: var(--pt-r-pill);
  background: var(--pt-sg);
  transition: width var(--pt-med) var(--pt-ease);
}

.pt-riprendi-conta {
  margin-top: var(--pt-2);
  font: var(--pt-t-small);
  color: var(--pt-ink-70);
}

.pt-riprendi-azione {
  display: inline-flex;
  align-items: center;
  gap: 8px;
  margin-top: var(--pt-4);
  padding: 12px 20px;
  border-radius: var(--pt-r-sm);
  background: var(--pt-sg);
  color: #fff;
  font: var(--pt-t-strong);
  font-weight: 800;
  transition: background-color var(--pt-fast) var(--pt-ease);
}


/* Programmato e pronto sono promemoria, non urgenze: una riga quieta, che non
   compete con l'invito a partire subito sotto. */
/* --- v63 — la × che chiude il richiamo, e i due comandi dei percorsi pronti ---

   Il contenitore esiste perché la × deve stare FUORI dal link: un <button>
   dentro un <a> non è HTML valido, e su alcuni browser il tocco finisce a chi
   non deve. `min-width: 0` sul link perché il nome di un tour lungo, dentro un
   flex, non si accorcia da solo e spingerebbe la × fuori dallo schermo. */
.pt-riprendi-con-chiudi {
  display: flex;
  align-items: stretch;
  gap: var(--pt-2);
  margin: 0 var(--pt-align);
}
.pt-riprendi-con-chiudi > .pt-riprendi { flex: 1 1 auto; min-width: 0; margin: 0; }
.pt-riprendi-chiudi-form { flex: 0 0 auto; display: flex; }
.pt-riprendi-chiudi {
  /* 44px: il bersaglio minimo del sistema di design. Una × piccola accanto a
     un link grande è una × che si preme per sbaglio o non si preme affatto. */
  width: 44px;
  min-height: 44px;
  display: grid;
  place-items: center;
  border: 1px solid var(--pt-line);
  border-radius: var(--pt-r);
  background: var(--pt-card);
  color: var(--pt-ink-55);
  cursor: pointer;
  transition: color var(--pt-fast) var(--pt-ease),
              border-color var(--pt-fast) var(--pt-ease);
}
.pt-riprendi-chiudi i { font-size: 18px; }

/* I due comandi di un percorso del catalogo. Impilati e non affiancati: a
   390 px due bottoni in fila diventano due bersagli stretti, e il primo dei
   due porta un sottotitolo che a metà larghezza andrebbe a capo. */
.pt-pronto-azioni { display: grid; gap: var(--pt-2); }
.pt-pronto-azioni form { display: block; }

.pt-riprendi-quieto {
  display: flex;
  align-items: center;
  gap: var(--pt-3);
  padding: 13px var(--pt-4);
  border: 1px solid var(--pt-line);
  border-radius: var(--pt-r);
  background: var(--pt-card);
  color: var(--pt-ink);
  transition: border-color var(--pt-fast) var(--pt-ease);
}

.pt-riprendi-quieto > i:first-child { flex: 0 0 auto; font-size: 21px; color: var(--pt-ink-70); }
.pt-riprendi-testo { flex: 1; min-width: 0; }
.pt-riprendi-testo small {
  display: block;
  font: var(--pt-t-label);
  letter-spacing: 0.12em;
  text-transform: uppercase;
  color: var(--pt-ink-55);
}
.pt-riprendi-testo strong {
  display: block;
  margin-top: 2px;
  font: var(--pt-t-strong);
  font-size: 15px;
  overflow: hidden;
  text-overflow: ellipsis;
  white-space: nowrap;
}
.pt-riprendi-quieto .ti-chevron-right { flex: 0 0 auto; font-size: 18px; color: var(--pt-ink-45); }

/* --- L'invito a partire ---------------------------------------------------
   Non è più una domanda in grande: il titolo dice che cosa fa il prodotto, e
   la domanda sul tempo è diventata l'etichetta del campo che la risolve. */

.pt-avvio {
  /* v65 — VIA LA CORNICE.

     L'invito a partire era una scheda dentro una pagina di schede: una cornice
     attorno alla cosa principale la fa sembrare uno dei tanti blocchi invece
     che il motivo per cui la pagina esiste. Adesso sta direttamente sulla
     pagina, e le schede restano ciò che si tocca per andare altrove.

     I margini laterali restano quelli di sempre (`--pt-align`): tutto quello
     che c'è in home — fila delle categorie, invito, «intorno a te» — deve
     stare sulla stessa colonna, o si vede che sono stati scritti in momenti
     diversi. */
  margin: var(--pt-4) var(--pt-align) 0;
  padding: 0;
  border: 0;
  background: none;
}

.pt-avvio h1 {
  margin: var(--pt-2) 0 var(--pt-3);
  font-size: clamp(27px, 7.4vw, 34px);
  line-height: 1.03;
  letter-spacing: -0.042em;
}

.pt-avvio > p {
  max-width: 34ch;
  font: var(--pt-t-body);
  font-size: 14.5px;
  color: var(--pt-ink-70);
}

.pt-avvio-campo { margin-top: var(--pt-5); }

.pt-avvio-etichetta {
  display: block;
  margin-bottom: var(--pt-2);
  font: var(--pt-t-label);
  letter-spacing: 0.16em;
  text-transform: uppercase;
  color: var(--pt-ink-55);
}

.pt-avvio-scelte { display: flex; flex-wrap: wrap; gap: var(--pt-2); }

/* Radio e checkbox veri, non finti pulsanti: la tastiera e i lettori di schermo
   li attraversano da soli, e il modulo funziona anche senza JavaScript. Il
   controllo nativo è nascosto alla vista, non all'accessibilità. */
/* `position: relative` NON è decorativo: senza, il checkbox nascosto qui sotto
   (che è `position: absolute`) prende come riferimento un antenato lontano
   invece dell'etichetta. Un elemento assoluto non viene ritagliato dai
   `overflow` che stanno *sopra* il suo contenitore di riferimento: gli input
   delle ultime chip finivano quindi a 1180px dal bordo sinistro, fuori dal
   carosello, e allargavano l'intera pagina a 1030px su uno schermo da 390.
   Effetto per chi usa il telefono: la home si sposta lateralmente e a destra
   c'è una fascia vuota. Una riga di CSS, l'unica pagina rotta dell'app. */
.pt-avvio-scelta { position: relative; margin: 0; cursor: pointer; }

/* v100 — QUELLO CHE SI SENTE E NON SI VEDE.
   La vista mappa di Scopri rinuncia alla testata per dare alla mappa tutto lo
   schermo: giusto, ma con la testata spariva anche l'unico titolo della
   pagina, e chi naviga per titoli arrivava su una schermata senza nome.
   Questa classe tiene il nome nel documento e fuori dalla vista.
   Il modo di farlo — non `display: none`, che toglie l'elemento anche alla
   voce — era gia' ripetuto a mano in cinque punti del foglio: qui ha un nome
   e si puo' riusare. */
.pt-solo-voce {
  /* SENZA `position: absolute`, e non per gusto.
     La ricetta classica del testo-solo-per-la-voce e' `absolute` + `clip`, ed
     e' quella ripetuta a mano nei cinque punti qui sopra. Ma una prova di
     questo progetto — `test_ogni_controllo_nascosto_ha_un_contenitore_dichiarato`
     — chiede che chi ospita un `absolute` si dichiari riferimento, perche' un
     assoluto senza contenitore dentro un carosello rompe la pagina intera.
     Questa e' una classe di servizio: il contenitore non si sa, quindi la
     promessa non si puo' fare. Allora si toglie il rischio invece di
     eccepirlo: l'elemento resta nel flusso, occupa un pixel per un pixel, e
     `clip-path` lo ritaglia via. Un pixel in un titolo o dentro un bottone non
     si vede — misurato — e non c'e' nessun assoluto da ancorare.
     `clip-path` e non `clip`: `clip` e' deprecato da anni. */
  display: inline-block;
  width: 1px; height: 1px;
  padding: 0; margin: 0;
  overflow: hidden;
  clip-path: inset(50%);
  white-space: nowrap;
  border: 0;
}

.pt-avvio-scelta input {
  position: absolute;
  width: 1px; height: 1px;
  padding: 0; margin: -1px;
  overflow: hidden;
  clip: rect(0, 0, 0, 0);
  white-space: nowrap;
  border: 0;
}

.pt-avvio-scelta span {
  display: inline-flex;
  align-items: center;
  gap: 7px;
  padding: 10px 15px;
  border: 1px solid var(--pt-line-2);
  border-radius: var(--pt-r-pill);
  background: var(--pt-card);
  color: var(--pt-ink-70);
  font: var(--pt-t-strong);
  font-size: 13.5px;
  transition: all var(--pt-fast) var(--pt-ease);
}
.pt-avvio-scelta i { font-size: 16px; }
/* v71 — LO SCELTO SI VEDE, NON GRIDA.
   Era una pastiglia blu piena: pesava quanto un comando, in una schermata dove
   il comando e' uno solo e sta in fondo. Adesso e' la stessa lingua della barra
   in basso di v69 — tinta chiara e bordo del colore scelto — e il segno resta
   doppio, perche' il colore da solo non basta: cambia il fondo E il peso. */
.pt-avvio-scelta input:checked + span {
  background: var(--pt-scelto-tint);
  border-color: var(--pt-scelto);
  color: var(--pt-scelto);
  font-weight: 800;
}
/* Il controllo nativo è fuori dalla vista: senza questa regola la navigazione
   da tastiera attraverserebbe il modulo senza dare alcun segnale. */
.pt-avvio-scelta input:focus-visible + span {
  outline: 3px solid var(--pt-sg);
  outline-offset: 2px;
}

/* Gli interessi scorrono invece di andare a capo: con sei nomi lunghi
   l'incolonnamento spingeva i pulsanti del tempo — l'azione vera — sotto la
   piega dello schermo. La sfumatura sul bordo dichiara che la fila continua. */
.pt-avvio-interessi {
  display: flex;
  gap: var(--pt-2);
  overflow-x: auto;
  scrollbar-width: none;
  padding-block: 3px;
  margin-inline: calc(var(--pt-5) * -1);
  padding-inline: var(--pt-5);
  -webkit-mask-image: linear-gradient(to right, #000 89%, transparent 100%);
  mask-image: linear-gradient(to right, #000 89%, transparent 100%);
}
.pt-avvio-interessi::-webkit-scrollbar { display: none; }
.pt-avvio-interessi .pt-avvio-scelta { flex: 0 0 auto; }
.pt-avvio-interessi .pt-avvio-scelta span { white-space: nowrap; }

.pt-avvio-nota {
  margin-top: var(--pt-2);
  font: var(--pt-t-small);
  font-size: 12.5px;
  color: var(--pt-sg);
}
.pt-avvio-nota:empty { display: none; }

/* I quattro tempi sono l'oggetto più visibile dello schermo: quattro tessere
   piene del colore del segnale, il numero grande e l'unità sotto. È la forma
   di un cartello, ed è l'unica azione primaria della pagina. */
/* ===========================================================================
   v73 — LA HOME COME UNA RIVISTA
   ---------------------------------------------------------------------------
   Stessa conversazione di v71 — quanto tempo, da dove, via — ma adesso la
   pagina risponde prima di essere premuta, e sotto il pianificatore c'è la
   città invece del vuoto.

   Le regole di forma, tutte e tre conseguenze del tema caldo di v73:

     · le superfici sono AVORIO su CREMA, separate da un filo caldo e da
       un'ombra appena percettibile. Niente riquadri dentro riquadri;
     · un accento solo, la terracotta: PIENA vuol dire «premi qui», con
       CONTORNO e TINTA vuol dire «scelto»;
     · le file che non ci stanno scorrono di lato invece di andare a capo —
       i tempi, le tappe, le categorie, le schede. `data-sfuma` mette la
       sfumatura sul bordo che dichiara che la fila continua (v30).
   =========================================================================== */

/* Il marchio nella barra, solo sulla home: il nome con le grazie e sotto, in
   due righe piccole, che cosa è. Su schermo stretto il sottotitolo sparisce —
   la barra ha già tre comandi a destra, e il nome da solo basta. */
.pt-marchio {
  font-family: var(--pt-font-titolo);
  font-size: 26px;
  font-weight: 400;
  letter-spacing: -0.02em;
  color: var(--pt-sg);
}
.pt-marchio-sotto {
  display: none;
  /* La spaziatura stretta del titolo (-0.02em a 17px) si eredita in PIXEL, non
     in em: dentro un testo da 11,5px diventa -0.03em e chiude gli spazi fra le
     parole — «Latuaguidaper Palermo». Misurato, e azzerato qui. */
  letter-spacing: 0;
  word-spacing: 0.08em;
  color: var(--pt-ink-55);
  font: var(--pt-t-small);
  font-size: 11.5px;
  line-height: 1.15;
  white-space: nowrap;
}
/* Sotto i 430 px la barra ha già tre comandi a destra: il nome da solo basta,
   e il sottotitolo che si taglierebbe non aggiunge niente. */
@media (min-width: 430px) {
  .pt-marchio-sotto { display: block; }
}

/* --- L'EROE ---------------------------------------------------------------
   Nessuna fotografia in catalogo: al suo posto una velatura calda che scende
   dal bordo alto. Quando la fotografia ci sarà entrerà qui dietro, e il testo
   continuerà a leggersi perché la velatura c'è già. */
/* v80 — L'EROE A DUE COLONNE, E IL PIANIFICATORE DENTRO.

   Il numero che ha deciso questo blocco: a 1280 su una piega di 900 il comando
   principale stava a **967 px**, cioè fuori dalla prima schermata. Mettendo il
   pianificatore nella colonna del testo e la fotografia accanto, sale dentro.

   Sul telefono le due colonne diventano una e la fotografia va SOPRA il testo,
   corta: lì lo schermo è tutto, e un'immagine alta mezza pagina rimanderebbe
   il comando dove stava. La regola delle due colonne vive solo sopra gli 800.

   Il velo rosato non è più scritto a mano: era `rgba(206, 58, 34, .10)`, cioè
   l'accento di v64 copiato dentro una regola, sopravvissuto al cambio di
   tavolozza perché la prova di v79 cercava gli esadecimali e non le `rgba`.
   Adesso è `color-mix` sul token, e la prova conta anche queste.

   v85 — E IL TOKEN È IL SECONDO ROSSO, NON IL PRIMO.

   `--pt-sg-visivo` (#C94A32) è il rosso del marchio: v79 lo ha dichiarato, ha
   misurato che come testo non passa (4,21) e ha scritto la prova che gli
   vieta di portare parole. Poi non lo ha usato per niente — zero occorrenze
   in ottomilatrecento righe. Un colore dichiarato e mai usato non è un colore
   del sistema, è una riga di documentazione.

   Questa velatura è il suo mestiere, ed è l'unico: una superficie grande,
   senza significato, dove il contrasto non porta informazione. Il rosso che
   decide — comandi, stati accesi, collegamenti — resta `--pt-sg`. Due rossi
   con due mestieri sono un sistema; due rossi con lo stesso mestiere sono un
   secondo accento, che è la cosa che v79 aveva deciso di non avere. */
.pt-eroe {
  position: relative;
  display: grid;
  gap: var(--pt-4);
  margin: 0;
  padding: var(--pt-4) var(--pt-align) var(--pt-5);
  background:
    radial-gradient(120% 90% at 100% 0%,
      color-mix(in srgb, var(--pt-sg-visivo) 12%, transparent) 0%,
      color-mix(in srgb, var(--pt-sg-visivo) 0%, transparent) 60%),
    linear-gradient(180deg, var(--pt-paper-2) 0%, var(--pt-paper) 100%);
  border-bottom: 1px solid var(--pt-line);
}

/* LA COLONNA DELLA FOTOGRAFIA.
   Corta sul telefono (190px) e alta su desktop: è la stessa immagine, ed è la
   proporzione dello schermo che cambia, non l'importanza della fotografia.
   Quando un luogo con la fotografia non c'è, questa colonna non compare
   affatto — un riquadro vuoto accanto al testo sarebbe peggio di niente. */
.pt-eroe-foto {
  position: relative;
  min-height: 190px;
  border-radius: var(--pt-r-lg);
  background: var(--pt-paper-2) center/cover no-repeat;
  box-shadow: var(--pt-shadow-card);
}
.pt-eroe-foto:empty { display: none; }
/* Il velo in basso, come sulle copertine dei luoghi (v75): la didascalia è
   bianca e la fotografia può essere chiara. Stessi valori, stesso conto. */
.pt-eroe-foto::after {
  content: "";
  position: absolute;
  inset: 0;
  border-radius: inherit;
  background: linear-gradient(to top, rgba(0, 0, 0, 0.55) 0%, rgba(0, 0, 0, 0) 52%);
  pointer-events: none;
}
.pt-eroe-didascalia {
  position: absolute;
  z-index: 1;
  inset-inline: var(--pt-3);
  bottom: var(--pt-3);
  display: flex;
  align-items: center;
  gap: var(--pt-2);
  min-height: 44px;          /* la soglia di v16 vale anche qui */
  color: #fff;
  font: var(--pt-t-strong);
  font-size: 15px;
  text-decoration: none;
  text-shadow: 0 1px 3px rgba(0, 0, 0, 0.45);
}
.pt-eroe-didascalia > i { font-size: 17px; }
/* Il credito della fotografia dell'eroe vive nella sua colonna: niente
   margini laterali propri, ce li ha l'eroe. L'altezza da bersaglio RESTA —
   la prima stesura la tolse qui, e ha fatto cadere la prova di v78 che la
   pretende: il dito non sa che questo collegamento è dentro un eroe. */
.pt-eroe .pt-credito { margin: var(--pt-2) 0 0; }

/* v85 — SUL TELEFONO LA FOTOGRAFIA STA SOPRA IL TESTO.

   Lo diceva il commento di v73, lo dice il prototipo («IMMAGINE HERO → titolo
   → descrizione»), e non lo faceva nessuno: misurato a 390 px, il testo
   cominciava a 95 e la fotografia a 266. In tutto il foglio non esisteva
   **nessuna** regola `order:` — la colonna scendeva nell'ordine del documento,
   che su desktop è quello giusto e sul telefono è quello sbagliato.

   Perché non si risolve spostando il markup: su desktop il testo deve stare in
   colonna uno. Invertire il documento vorrebbe dire due regole `order` invece
   di una, e la fotografia prima del titolo anche per chi legge con la voce —
   dove l'ordine giusto è sempre «di che cosa parliamo», poi l'immagine.

   IL CREDITO VIAGGIA CON LA SUA FOTOGRAFIA. Senza questa seconda riga
   resterebbe al suo posto nel flusso, cioè sotto il testo, a mezza pagina
   dalla cosa che attribuisce: è lo stesso difetto che v80.1 ha già pagato una
   volta, in un'altra forma. Stesso `order`, e fra pari vince l'ordine del
   documento: prima la fotografia, poi il suo credito.

   E LA PROPORZIONE DIVENTA UNA SCELTA. Era 358×190, cioè 1,9:1 — non una
   decisione ma il risultato di un `min-height` scritto per riempire la colonna
   accanto su schermo largo. Il prototipo chiede circa 4:3, e su 390 px fa 268:
   settantotto pixel in più, che il comando non paga perché da v80 è
   appiccicato al fondo. */
@media (max-width: 799px) {
  .pt-eroe-foto { order: -1; aspect-ratio: 4 / 3; min-height: 0; }
  .pt-eroe .pt-credito { order: -1; }
}

/* v80 — SUL TELEFONO IL COMANDO RESTA IN VISTA.

   La fotografia costa schermo: misurato, il comando è passato da 799 a 1027 px
   su una piega di 844. Il documento di V2 lo aveva previsto e la soluzione la
   scrive lui — «CTA full-width persistente».

   `sticky` e non `fixed`: il comando resta appiccicato al fondo **finché il
   pianificatore è sullo schermo**, e se ne va con lui. Un comando fisso per
   tutta la pagina coprirebbe l'anteprima, i luoghi vicini e gli eventi — cioè
   tutto quello che questa home ha appena finito di mettere in ordine.

   `--pt-sopra-nav` è la stessa misura che usano il richiamo dell'audioguida e
   il pannello della mappa: sopra la barra, con la safe-area contata. */
/* A-bis — IL COMANDO DEL PIANIFICATORE NON È PIÙ APPICCICATO SUL TELEFONO,
   ED È UNA DECISIONE, NON UNA SEMPLIFICAZIONE.

   Qui c'era `position: sticky; bottom: var(--pt-sopra-nav)`. Funzionava: il
   comando si agganciava a 78 px dal fondo e restava in vista mentre si
   sceglieva. Il problema è **dove** cadeva quella riga di aggancio.

   Misurato con `elementFromPoint` al centro di ogni scelta — cioè chiedendo
   chi riceve il tocco, non confrontando due rettangoli:

       390×568   «01 ora» e «02 ore»      rispondevano IL COMANDO
       390×664   «03 ore» e «Giornata»    ← l'iPhone 12
       390×844   «Dal centro»

   Su un telefono il pianificatore è alto quanto lo schermo, quindi la riga di
   aggancio cade **esattamente sulle sue risposte**. Chi toccava «03 ore»
   faceva partire il giro da due ore, e niente glielo diceva.

   Non è un difetto di taratura: è il conflitto fra due cose che si vogliono
   tutte e due, e su uno schermo alto 664 non stanno insieme.

       un comando sempre in vista   →   galleggia sopra le risposte
       nessuna risposta coperta     →   il comando si raggiunge scorrendo

   La seconda vince, e il motivo è che le due perdite non si equivalgono: la
   prima costa **un gesto**, la seconda costa **una scelta sbagliata senza
   accorgersene**. Adesso il comando sta in fondo al modulo, dove il modulo
   finisce: chi ha risposto alle due domande se lo trova sotto le risposte.

   È stato provato anche un contenitore che limitava lo sticky alle sole righe
   finali. Misurato: il comando smetteva di agganciarsi del tutto, perché un
   elemento appiccicato può salire al massimo fino al bordo del contenitore e
   lì il viaggio era zero. Due modi diversi di ottenere lo stesso risultato,
   uno con un involucro in più: tenuto quello senza.

   `--pt-sopra-nav` resta in uso altrove (audioguida, pannello mappa), dove la
   riga di aggancio non cade sulle scelte di nessuno.

   v80 aveva aggiunto lo sticky per tenere il comando dentro la prima
   schermata. Quel bisogno era vero e resta vero: è la sezione 36-37 di v96 a
   rispondergli, alzando il pianificatore di cento pixel invece di far
   galleggiare il comando sopra di esso. */
@media (max-width: 799px) {
  /* A-bis, seconda passata — LA FASCIA CHE NON C'ERA.
     Tolto lo sticky, il comando è rimasto con `background: var(--pt-card)`
     sopra un `.pt-piano` che è ANCH'ESSO `var(--pt-card)`: due volte lo stesso
     rgb(255, 253, 249). Una dichiarazione che non disegna niente — e la prova
     che avevo appena scritto la accettava, perché controllava che la parola
     «background» ci fosse, non che si vedesse. È lo stesso errore dell'audit:
     certificare una cosa senza misurarla. `tools/audit_interazione.py` l'ha
     trovata al primo giro («piatte»: fondo uguale, filo assente).

     Quello che serve non è un fondo: è un CONFINE. Un filo sopra dice che le
     domande finiscono lì e sotto c'è la risposta da dare — il lavoro che
     faceva lo sticky staccando il comando dal flusso, senza coprire niente.
     Il fondo va via perché non faceva niente. */
  .pt-piano-via {
    margin-inline: calc(var(--pt-4) * -1);
    padding: var(--pt-3) var(--pt-4) var(--pt-2);
    border-top: 1px solid var(--pt-line);
  }
}
.pt-eroe .pt-occhio { margin-bottom: var(--pt-2); }
/* v100 — `:not(.pt-evento-titolo)` SU TUTTE E TRE LE REGOLE DELL'EROE.
   Il titolo dell'evento vive dentro `.pt-eroe` ed era un `<h2>`: queste regole
   non lo toccavano. Diventato `<h1>` le ha prese tutte, e da 56 px e una riga
   e' passato a 74 px e tre righe. Invece di combattere la specificita' con un
   selettore piu' lungo, lo si esclude: cosi' la regola dice quello che ha
   sempre fatto, cioe' vestire il titolo dell'eroe della home e non ogni
   titolo che capiti dentro un eroe. */
.pt-eroe h1:not(.pt-evento-titolo) {
  font-size: clamp(32px, 9vw, 44px);
  line-height: 1.06;
}
/* Il contenitore del testo dell'eroe: oggi non porta regole proprie, ma esiste
   perché quando ci sarà la fotografia il testo dovrà stare sopra di lei — e
   allora questo è il pezzo che si posiziona. */
.pt-eroe-testo { position: relative; z-index: 1; }

/* La distanza dentro la scheda: la scrive il JavaScript, e allinea le cifre
   perché una colonna di «26 m / 120 m / 1,2 km» si legge male se ballano. */
.pt-scheda-dist { font-variant-numeric: tabular-nums; }

.pt-eroe-sub {
  max-width: 34ch;
  margin-top: var(--pt-3);
  color: var(--pt-ink-70);
  font-size: 16.5px;
  line-height: 1.45;
}

/* --- IL PIANIFICATORE ----------------------------------------------------- */
.pt-piano-riga { margin: 0; }

.pt-piano {
  /* Sale sull'eroe di ventiquattro pixel: e' il gesto che dice «la risposta
     comincia qui». `position: relative` non e' decorativo — senza, la scheda
     passa SOTTO il fondo dell'eroe e il primo titolo si taglia a meta'. */
  position: relative;
  z-index: 1;
  margin: calc(var(--pt-5) * -1) var(--pt-align) 0;
  padding: var(--pt-4) var(--pt-4) var(--pt-5);
  border: 1px solid var(--pt-line);
  border-radius: var(--pt-r-xl);
  background: var(--pt-card);
  box-shadow: var(--pt-shadow-card);
}

.pt-passo { margin: 0 0 var(--pt-5); padding: 0; border: 0; min-width: 0; }
.pt-passo:last-of-type { margin-bottom: var(--pt-4); }

.pt-passo-titolo {
  display: flex;
  align-items: center;
  gap: var(--pt-2);
  padding: 0;
  margin-bottom: var(--pt-3);
  font-family: var(--pt-font-titolo);
  font-size: 19px;
  line-height: 1.2;
  color: var(--pt-ink);
}
/* Il numero del passo: dice che è una sequenza, e lo dice senza parole. */
.pt-passo-num {
  flex: 0 0 auto;
  display: grid;
  place-items: center;
  width: 26px;
  height: 26px;
  border-radius: var(--pt-r-icona);
  background: var(--pt-sg);
  color: #fff;
  font: 800 13px/1 var(--pt-font);
}

/* --- le quattro durate ---------------------------------------------------- */
.pt-tempi {
  display: flex;
  gap: var(--pt-2);
  margin: 0;
  padding: 2px 0;
  list-style: none;
  overflow-x: auto;
  scrollbar-width: none;
}
.pt-tempi::-webkit-scrollbar { display: none; }
.pt-tempi > li { flex: 0 0 auto; }

.pt-tempo {
  position: relative;
  display: block;
  width: 132px;
  min-height: 150px;
  padding: 14px;
  border: 1px solid var(--pt-line);
  border-radius: var(--pt-r);
  background: var(--pt-card);
  cursor: pointer;
  transition: border-color var(--pt-fast) var(--pt-ease),
              box-shadow var(--pt-fast) var(--pt-ease),
              transform var(--pt-fast) var(--pt-ease);
}
.pt-tempo input {
  position: absolute;
  width: 1px; height: 1px;
  padding: 0; margin: -1px;
  overflow: hidden;
  clip: rect(0, 0, 0, 0);
  white-space: nowrap;
  border: 0;
}
.pt-tempo-icona { display: block; font-size: 20px; color: var(--pt-sg); }
.pt-tempo-cifra {
  display: block;
  margin-top: 8px;
  font: 800 28px/1 var(--pt-font);
  font-stretch: var(--pt-wide);
  letter-spacing: -0.04em;
  font-variant-numeric: tabular-nums;
  color: var(--pt-ink);
}
/* «Giornata» non è un numero: sta sulla stessa riga di base ma con il corpo
   di una parola, o coprirebbe mezza scheda. */
.pt-tempo-parola { font-size: 17px; letter-spacing: 0.01em; margin-top: 18px; }
.pt-tempo-unita {
  display: block;
  margin-top: 3px;
  font: var(--pt-t-label);
  font-size: 11px;
  letter-spacing: 0.12em;
  text-transform: uppercase;
  color: var(--pt-ink-70);
}
.pt-tempo-ritmo {
  display: block;
  margin-top: 12px;
  color: var(--pt-ink-55);
  font: var(--pt-t-small);
  font-size: 12px;
  line-height: 1.35;
}

/* Il segno dello scelto: contorno, tinta e spunta. Tre segnali, di cui due
   non cromatici — perché senza il blu che separava «scelto» da «azione», il
   colore da solo non basta più (e non bastava nemmeno prima). */
.pt-tempo-segno,
.pt-partenza-segno {
  position: absolute;
  top: 10px;
  right: 10px;
  display: grid;
  place-items: center;
  width: 20px;
  height: 20px;
  border-radius: var(--pt-r-icona);
  background: var(--pt-sg);
  color: #fff;
  font-size: 13px;
  opacity: 0;
  transform: scale(0.5);
  transition: opacity var(--pt-fast) var(--pt-ease), transform 220ms var(--pt-ease);
}
.pt-tempo:has(input:checked),
.pt-partenza:has(input:checked) {
  border-color: var(--pt-sg);
  background: var(--pt-scelto-tint);
  box-shadow: inset 0 0 0 1px var(--pt-sg);
}
.pt-tempo:has(input:checked) .pt-tempo-cifra { color: var(--pt-sg-dark); }
.pt-tempo:has(input:checked) .pt-tempo-unita { color: var(--pt-sg-dark); }
.pt-tempo:has(input:checked) .pt-tempo-ritmo { color: var(--pt-ink); }
.pt-tempo:has(input:checked) .pt-tempo-segno,
.pt-partenza:has(input:checked) .pt-partenza-segno { opacity: 1; transform: none; }
.pt-tempo:has(input:focus-visible),
.pt-partenza:has(input:focus-visible) {
  outline: 3px solid var(--pt-sg);
  outline-offset: 2px;
}

/* --- le tre partenze ------------------------------------------------------ */
.pt-partenze { display: grid; gap: var(--pt-2); }

.pt-partenza {
  position: relative;
  display: flex;
  align-items: center;
  gap: var(--pt-3);
  min-height: 66px;
  padding: 12px 44px 12px 14px;
  border: 1px solid var(--pt-line);
  border-radius: var(--pt-r);
  background: var(--pt-card);
  cursor: pointer;
  transition: border-color var(--pt-fast) var(--pt-ease),
              box-shadow var(--pt-fast) var(--pt-ease);
}
.pt-partenza input {
  position: absolute;
  width: 1px; height: 1px;
  padding: 0; margin: -1px;
  overflow: hidden;
  clip: rect(0, 0, 0, 0);
  white-space: nowrap;
  border: 0;
}
.pt-partenza > i:first-of-type { flex: 0 0 auto; font-size: 22px; color: var(--pt-sg); }
.pt-partenza-testo { min-width: 0; }
.pt-partenza-testo strong {
  display: block;
  font: var(--pt-t-strong);
  font-size: 14.5px;
  color: var(--pt-ink);
}
.pt-partenza-testo small {
  display: block;
  margin-top: 2px;
  color: var(--pt-ink-55);
  font-size: 12px;
}

/* La mappa della terza partenza: compare solo quando la si sceglie, e occupa
   quello che serve a riconoscere una strada, non di più. */
.pt-mappa-scelta {
  height: 220px;
  margin-top: var(--pt-2);
  border: 1px solid var(--pt-line);
  border-radius: var(--pt-r);
  overflow: hidden;
  display: grid;
  place-items: center;
  color: var(--pt-ink-55);
  font: var(--pt-t-small);
  background: var(--pt-paper-2);
}

/* --- il comando ----------------------------------------------------------- */
.pt-piano-via { margin-top: var(--pt-5); }

.pt-parti {
  display: block;
  width: 100%;
  min-height: 54px;
  padding: 12px var(--pt-4) 14px;
  border: 0;
  border-radius: var(--pt-r-pill);
  background: var(--pt-sg);
  color: #fff;
  text-align: center;
  cursor: pointer;
  transition: background-color var(--pt-fast) var(--pt-ease),
              transform var(--pt-fast) var(--pt-ease);
}
/* La riga piccola dentro il comando dice la scelta corrente — «2 ore · dal
   centro». Bianca PIENA, e la prima scrittura la velava al 92%: misurata sul
   nuovo rosso fa 4,39:1, sotto soglia. È il difetto di v64 che si ripresenta
   identico — accendere una tinta la avvicina al bianco e si mangia il margine
   su cui la velatura viveva. La gerarchia la fanno il corpo e la spaziatura,
   che non costano contrasto. */
.pt-parti small {
  display: block;
  font: var(--pt-t-label);
  font-size: 11px;
  letter-spacing: 0.14em;
  text-transform: uppercase;
  color: #fff;
}
.pt-parti-riga {
  display: inline-flex;
  align-items: center;
  gap: var(--pt-2);
  margin-top: 3px;
  font: 700 17px/1.2 var(--pt-font);
  letter-spacing: -0.01em;
}
.pt-parti-riga i { font-size: 19px; }
.pt-parti-riga i:last-child { transition: transform var(--pt-fast) var(--pt-ease); }
.pt-parti:active { transform: scale(0.99); }

.pt-piano-altro {
  display: flex;
  align-items: center;
  justify-content: center;
  flex-wrap: wrap;
  gap: 6px;
  margin-top: var(--pt-3);
  color: var(--pt-ink-55);
  font-size: 13px;
}
/* Il bersaglio: un collegamento dentro una riga di testo è alto quanto la
   riga — venti pixel — e l'audit lo trova a tutte le larghezze. Qui non si
   può ingrandire il testo (è una nota, non un comando), quindi si allarga
   l'AREA: il collegamento diventa una cassetta alta 44px con il testo in
   mezzo, e a occhio non cambia niente. */
.pt-piano-altro a {
  display: inline-flex;
  align-items: center;
  min-height: 44px;
  color: var(--pt-sg-dark);
  font-weight: 700;
  text-decoration: underline;
  text-underline-offset: 3px;
}

/* --- L'ANTEPRIMA DEL PERCORSO --------------------------------------------- */
.pt-percorso {
  margin: var(--pt-4) var(--pt-align) 0;
  padding: var(--pt-4);
  border: 1px solid var(--pt-line);
  border-radius: var(--pt-r-lg);
  background: var(--pt-paper-2);
  transition: opacity var(--pt-med) var(--pt-ease);
}
/* Mentre il server ricalcola, l'anteprima sbiadisce appena: dice «sto
   cambiando» senza sparire, perché sparire e tornare fa saltare la pagina. */
.pt-percorso.is-attesa { opacity: 0.45; }

.pt-percorso-testa {
  display: flex;
  align-items: baseline;
  justify-content: space-between;
  gap: var(--pt-3);
}
.pt-percorso-testa h2 { font-size: 22px; }
.pt-percorso-tutto {
  flex: 0 0 auto;
  display: inline-flex;
  align-items: center;
  min-height: 44px;
  color: var(--pt-sg-dark);
  font: var(--pt-t-strong);
  font-size: 13px;
}
.pt-percorso-dati {
  display: flex;
  flex-wrap: wrap;
  gap: var(--pt-3);
  margin-top: 2px;
  color: var(--pt-ink-55);
  font-size: 12.5px;
}
.pt-percorso-dati span { display: inline-flex; align-items: center; gap: 5px; }
.pt-percorso-dati i { font-size: 15px; color: var(--pt-ink-45); }

/* LE TAPPE SONO UNA COLONNA, A QUALUNQUE LARGHEZZA (v97).

   Erano una fila orizzontale da scorrere, e su desktop v94 le aveva già
   raddrizzate in colonna — ma dentro un `@media (min-width: 800px)`, quindi
   sul telefono restava la fila. Due disposizioni per la stessa cosa, e la
   correzione di v94 non arrivava dove serviva di più.

   Il dettaglio del componente sta nella sezione 38; qui c'è la struttura. */
.pt-percorso-tappe {
  display: flex;
  flex-direction: column;
  gap: var(--pt-1);
  margin: var(--pt-3) 0 0;
  padding: 0;
  list-style: none;
}
.pt-percorso-tappe > li { min-width: 0; }
.pt-percorso-tappe a {
  display: grid;
  grid-template-columns: var(--pt-tappa-foto) 1fr;
  align-items: center;
  gap: var(--pt-3);
  padding: var(--pt-1) 0;
  color: var(--pt-ink);
  text-decoration: none;
}
.pt-percorso-tappe small {
  min-width: 0;
  font-size: 15px;
  line-height: 1.3;
  color: var(--pt-ink);
}

/* --- v86: L'ANTEPRIMA MOSTRA IL GIRO, NON LO ELENCA ------------------------

   Tre aggiunte a un blocco che c'era già, e nessuna regola vecchia toccata:
   la miniatura dentro la tessera, la mini mappa, e il comando in fondo. */

/* LA MINIATURA. È lo stesso ramo del catalogo da v75: quando il luogo ha una
   fotografia, la tessera diventa quella fotografia e l'icona di famiglia esce
   di scena — ha fatto il suo mestiere, che era dire di che cosa si tratta
   finché non c'era altro. Il numero resta, perché quello dice l'ordine. */
.pt-percorso-tessera.is-foto {
  background-size: cover;
  background-position: center;
}

/* LA MINI MAPPA.
   Un'altezza dichiarata, e non «quella che viene»: Leaflet misura il
   contenitore quando si accende, e un contenitore alto zero produce una mappa
   alta zero — senza errori, senza niente da vedere.

   Prima di accendersi il riquadro porta la sua frase, centrata: uno spazio
   vuoto che poi si riempie sposta la pagina sotto le dita di chi sta
   leggendo. */
.pt-percorso-mappa {
  display: grid;
  place-items: center;
  height: 150px;
  margin: var(--pt-3) 0 0;
  border: 1px solid var(--pt-line);
  border-radius: var(--pt-r);
  background: var(--pt-paper);
  color: var(--pt-ink-55);
  font-size: 12.5px;
  overflow: hidden;
}
/* Leaflet mette il proprio fondo bianco sulle tessere: qui sotto c'è la carta
   dell'app, e quando la rete non risponde è quella che si vede. */
.pt-percorso-mappa .leaflet-container { background: var(--pt-paper); }

/* I SEGNI DEL GIRO. Leaflet disegna i `divIcon` dentro `.leaflet-div-icon`,
   che di suo è un quadratino bianco col bordo: senza queste due righe i numeri
   starebbero dentro dei francobolli. */
/* v97 — IL SELETTORE NON HA MAI CORRISPOSTO A NIENTE, DA v86.

   Qui c'era scritto `.leaflet-div-icon.pt-mini-segno`, e `leaflet-div-icon` su
   questi segni **non c'è**. Il motivo sta in Leaflet e vale la pena saperlo:
   `L.divIcon({className: "..."})` SOSTITUISCE la classe di serie invece di
   aggiungersi a essa, e poi `Icon._setIconStyles` mette `leaflet-marker-icon`.
   L'elemento che nasce ha `pt-mini-segno leaflet-marker-icon`, e la regola non
   lo toccava.

   Effetto, misurato: fondo trasparente, nessun bordo, nessun raggio, testo
   grigio 12×12. Cioè i numeri delle tappe sulla mappa dell'anteprima erano
   **cifre nude appoggiate sulla linea**, non segnaposto — e si vedono così
   nello screenshot che ha mandato Aldo. Undici versioni con una regola scritta
   bene e mai applicata: niente errore, niente avviso, solo una mappa che dice
   meno di quello che avrebbe potuto.

   Adesso i cinque numeri della mappa e i cinque numeri della colonna qui sotto
   sono lo stesso segno: stessa terracotta, stessa cifra bianca, stesso anello.
   Si guarda la forma del giro, si legge l'elenco, e i due si rispondono. */
.leaflet-marker-icon.pt-mini-segno {
  display: grid;
  place-items: center;
  border: 2px solid #fff;
  border-radius: var(--pt-r-icona);
  background: var(--pt-sg);
  box-shadow: 0 1px 4px rgba(0, 0, 0, 0.3);
  color: #fff;
  font: 800 11px/1 var(--pt-font);
}
/* La partenza non è una tappa, e si distingue per FORMA prima che per colore:
   più piccola, vuota, senza numero. La regola di v16 vale anche per i segni. */
.leaflet-marker-icon.pt-mini-segno.is-partenza {
  border-width: 3px;
  background: var(--pt-ink);
}

/* IL COMANDO IN FONDO.
   Stessa famiglia di `.pt-evidenza-vai` (v84) — un blocco che mostra qualcosa
   deve dire dove porta — ma qui è a tutta larghezza, perché è l'unico modo di
   partire senza risalire al pianificatore. */
.pt-percorso-via {
  display: flex;
  align-items: center;
  justify-content: center;
  gap: 8px;
  margin: var(--pt-4) 0 0;
  min-height: 48px;
  padding: 0 var(--pt-4);
  border-radius: var(--pt-r-pill);
  background: var(--pt-sg);
  color: #fff;
  font: var(--pt-t-strong);
  font-size: 15px;
  text-decoration: none;
}
.pt-percorso-via > i { font-size: 18px; }
.pt-percorso-via > i:last-child { margin-inline-start: auto; }
.pt-percorso-via > i:first-child { margin-inline-end: 0; }
@media (hover: hover) {
  .pt-percorso-via:hover { background: var(--pt-sg-dark); }
}

/* --- v86: LA SCHEDA DI «A DUE PASSI» DICE SEI COSE -------------------------
   Categoria, tempo e audio si aggiungono alle tre che c'erano. Ogni posto
   vuoto si spegne da solo: un trattino al posto di un dato che non c'è è la
   cosa che v82 ha deciso di non fare. */
.pt-scheda-cat {
  display: block;
  margin-bottom: 3px;
  font: var(--pt-t-label);
  font-size: 10px;
  letter-spacing: 0.12em;
  text-transform: uppercase;
  color: var(--pt-fam, var(--pt-ink-55));
  overflow: hidden;
  text-overflow: ellipsis;
  white-space: nowrap;
}
.pt-scheda-cat:empty { display: none; }
/* Il punto separatore appartiene alla seconda cosa, non alla prima: così
   quando la seconda non c'è non resta un punto appeso al nulla. */
.pt-scheda-tempo:not(:empty)::before { content: "·"; margin: 0 5px; }
.pt-scheda-audio {
  display: inline-flex;
  align-items: center;
  gap: 4px;
  margin-top: 6px;
  padding: 2px 7px;
  border-radius: var(--pt-r-pill);
  background: var(--pt-scelto-tint);
  color: var(--pt-sg);
  font: var(--pt-t-label);
  font-size: 10px;
  letter-spacing: 0.08em;
  text-transform: uppercase;
}
.pt-scheda-audio i { font-size: 12px; }

/* --- VICINO A TE ---------------------------------------------------------- */
.pt-vicino-blocco {
  margin: var(--pt-6) 0 0;
  padding: var(--pt-6) var(--pt-align);
  background: var(--pt-paper-2);
  border-block: 1px solid var(--pt-line);
}
/* Una variante locale dell'intestazione comune, non una seconda intestazione:
   qui la fascia è a tutta larghezza e il collegamento sta sotto, con un
   contorno, perché a destra di un titolo da 30px sparirebbe. */
.pt-vicino-blocco .pt-sezione-testa { display: block; }
.pt-vicino-blocco .pt-sezione-testa h2 { font-size: 30px; }
.pt-vicino-blocco .pt-sezione-sub { font-size: 14px; }

.pt-occhio-riga {
  display: inline-flex;
  align-items: center;
  gap: 6px;
}
.pt-occhio-riga i { font-size: 15px; }

/* Il collegamento della fascia: stesso componente delle altre sezioni, con un
   contorno intorno. Sotto un titolo grande, un collegamento senza bordo non si
   distingue dal sottotitolo che gli sta sopra. */
.pt-sezione-tutto-btn {
  min-height: 44px;
  margin-top: var(--pt-3);
  padding: 0 var(--pt-4);
  border: 1px solid var(--pt-line-2);
  border-radius: var(--pt-r-pill);
  color: var(--pt-ink);
}
.pt-sezione-tutto-btn i { font-size: 17px; }

/* --- le schede dei luoghi (vicini, evidenza) ------------------------------ */
.pt-vicini-elenco,
.pt-evidenza-elenco {
  display: flex;
  gap: var(--pt-3);
  margin: var(--pt-4) 0 0;
  padding: 2px 0;
  list-style: none;
  overflow-x: auto;
  scrollbar-width: none;
}
.pt-vicini-elenco::-webkit-scrollbar,
.pt-evidenza-elenco::-webkit-scrollbar { display: none; }
.pt-vicini-elenco > li,
.pt-evidenza-elenco > li { flex: 0 0 auto; width: 168px; }
.pt-evidenza-elenco > li { width: 250px; }

.pt-scheda {
  display: block;
  height: 100%;
  border: 1px solid var(--pt-line);
  border-radius: var(--pt-r);
  background: var(--pt-card);
  color: var(--pt-ink);
  overflow: hidden;
  transition: transform var(--pt-fast) var(--pt-ease),
              box-shadow var(--pt-fast) var(--pt-ease);
}
.pt-scheda:active { transform: scale(0.99); }
.pt-scheda-tessera {
  position: relative;
  display: grid;
  place-items: center;
  height: 96px;
  background: var(--pt-fam, var(--pt-sg));
  background-size: cover;
  background-position: center;
  color: #fff;
  font-size: 30px;
}
.pt-scheda-grande .pt-scheda-tessera { height: 132px; font-size: 38px; }
.pt-scheda-sigillo {
  position: absolute;
  left: 8px;
  top: 8px;
  display: inline-flex;
  align-items: center;
  gap: 4px;
  padding: 3px 8px;
  border-radius: var(--pt-r-pill);
  background: var(--pt-card);
  color: var(--pt-oro-testo);
  font: var(--pt-t-label);
  font-size: 10px;
  font-style: normal;
  letter-spacing: 0.06em;
}
.pt-scheda-sigillo i { font-size: 12px; }
.pt-scheda-corpo { display: block; padding: 10px 12px 12px; }
/* Il nome lungo si taglia invece di sfondare: `min-width: 0` su ogni anello,
   che e' la lezione misurata in v68 — senza, una voce di elenco parte da
   «larga quanto il contenuto» e porta fuori tutta la fila. */
.pt-vicini-elenco > li,
.pt-evidenza-elenco > li,
.pt-scheda,
.pt-scheda-corpo { min-width: 0; }
.pt-scheda-corpo strong {
  display: block;
  overflow: hidden;
  text-overflow: ellipsis;
  white-space: nowrap;
  font-family: var(--pt-font-titolo);
  font-weight: 400;
  font-size: 15px;
  line-height: 1.25;
  color: var(--pt-ink);
}
.pt-scheda-corpo small {
  display: inline-flex;
  align-items: center;
  gap: 4px;
  margin-top: 5px;
  color: var(--pt-ink-55);
  font-size: 12px;
}
.pt-scheda-corpo small i { font-size: 13px; }

/* --- v75: LA TESTATA EDITORIALE DI UNA PAGINA -----------------------------
   Occhiello, titolo, sommario: le tre righe con cui ogni pagina del prototipo
   dice che cos'è prima di mostrare i propri strumenti.

   SI CHIAMA `pt-testata` E NON `pt-pagina-testa` PER UN MOTIVO PRECISO.
   `pt-pagina-testa` esiste già, da prima, ed è la testatina piccola — icona
   nel titolo, 20px, una riga di spiegazione — usata da undici pagine che
   questo rilascio non ridisegna. Riusarne il nome voleva dire cambiare quelle
   undici senza guardarle: l'ho scoperto misurando, perché il titolo nuovo
   usciva a 20px invece che a 40 e la colpa era della regola vecchia che
   vinceva per specificità.

   È la stessa collisione di nomi di v73 (`.pt-vicino`, `.pt-tappa`), e la
   soluzione è la stessa: un nome nuovo, e la fusione delle due testate messa
   in conto per v77 — quando le pagine personali verranno ridisegnate davvero
   e si potrà guardare che cosa succede. Due testate che si somigliano sono un
   debito; due testate che si somigliano PER SEMPRE sono un difetto.

   v77 — IL DEBITO È PAGATO, E LA FUSIONE NON È «UNA TESTATA SOLA».
   Portare le dodici pagine rimaste alla testata editoriale avrebbe messo un
   titolo da 44px in serif sopra «Modifica le tappe» e «Pubblica il tour», che
   sono PASSAGGI DI UN GESTO, non pagine che si aprono per leggerle. Una
   copertina sopra un modulo non è più bella: è più lenta.

   Quindi un componente solo con due misure. `.is-compatta` riproduce
   esattamente i numeri della vecchia `.pt-pagina-testa` — titolo 20px con
   l'icona accanto, sommario 13,5px — così la fusione **non cambia un pixel**
   su quelle pagine, e si può dimostrare misurando prima e dopo. Quello che
   sparisce è il secondo nome, non il secondo formato. */
.pt-testata {
  margin: 0 var(--pt-align);
  padding: var(--pt-5) 0 var(--pt-4);
}
.pt-testata-titolo {
  margin: var(--pt-2) 0 0;
  /* Sul telefono 30px, su schermo largo 44: un gradino sotto il titolo della
     home (46px), che resta la voce più alta dell'app. */
  font-size: clamp(30px, 6vw, 44px);
  line-height: 1.04;
}
.pt-lead {
  margin: var(--pt-3) 0 0;
  color: var(--pt-ink-70);
  font-size: 16px;
  line-height: 1.45;
}
/* Sul telefono la testata costa schermo, e lo schermo qui è il catalogo.
   Misurato: con la testata a corpo pieno il primo luogo cominciava a 605 px su
   844 — dentro la prima schermata, ma con centocinquanta pixel in meno di
   margine di quanti ne aveva prima (455). Su un telefono più corto quel
   margine è la differenza fra vedere un luogo e vedere solo un titolo.
   Restringere la testata costa meno che rinunciarci: la pagina dice ancora
   che cos'è, e il catalogo comincia prima. */
@media (max-width: 799px) {
  .pt-testata { padding: var(--pt-3) 0 var(--pt-2); }
  .pt-testata-titolo { font-size: clamp(25px, 7.2vw, 32px); }
  .pt-lead { margin-top: var(--pt-2); font-size: 15px; }
}

/* LA MISURA COMPATTA (v77): la testatina che stava in `.pt-pagina-testa`.
   Stesse identiche misure di prima, su un componente solo. Il corpo resta
   fisso alle due larghezze — una pagina di passaggio non guadagna niente a
   crescere su schermo largo, e questa regola pesa tre classi apposta, per
   vincere sul `clamp()` del blocco qui sopra senza dipendere dall'ordine.
   (v76 ha insegnato che l'ordine decide solo a parità di peso.) */
/* Margini e non padding, come la vecchia `.pt-pagina-testa`: e' la stessa
   spaziatura, ma il riquadro misura quello che misurava — la prova di v77
   confronta prima e dopo su ventiquattro schermate, e un box alto 77 invece
   di 46 avrebbe detto «e' cambiato qualcosa» su una pagina identica. */
.pt-testata.is-compatta { margin: var(--pt-4) var(--pt-align) var(--pt-3); padding: 0; }
.pt-testata.is-compatta .pt-testata-titolo {
  display: flex;
  align-items: center;
  gap: var(--pt-2);
  margin: 0 0 var(--pt-1);
  font-size: 20px;
  /* 1.1 e' l'interlinea dei titoli del sistema (`h1, h2`), che questa testata
     ereditava quando si chiamava `.pt-pagina-testa`. Va riscritta perche' la
     regola di v75 su `.pt-testata-titolo` la porta a 1.04 per il corpo grande:
     senza questa riga il blocco misurava un pixel in meno di prima, e un
     pixel su ventiquattro schermate e' il modo in cui le fusioni si mangiano
     le decisioni vecchie una alla volta. */
  line-height: 1.1;
  letter-spacing: -0.04em;   /* il peso resta quello dei titoli: 800 */
}
.pt-testata.is-compatta .pt-testata-titolo > .ti {
  flex: 0 0 auto;
  font-size: 21px;
  color: var(--pt-ink-70);
}
.pt-testata.is-compatta .pt-lead {
  margin: 0;
  max-width: 44rem;
  font: var(--pt-t-small);
  font-size: 13.5px;
  line-height: 1.5;
  color: var(--pt-ink-55);
}
/* Il corpo di una pagina-modulo (proponi un luogo, pubblica un tour). Prima
   stava DENTRO la testata e ne ereditava i margini laterali: quando la testata
   si è chiusa dove doveva chiudersi, il modulo è rimasto senza. Questa riga
   non è un componente nuovo, è il margine che c'era. */
.pt-modulo-corpo { margin: 0 var(--pt-align); }

/* ============================================================================
   v81 — LA RIVISTA DI SCOPRI, E L'ELENCO CHE LE STA ACCANTO
   ============================================================================
   Misurato prima di toccare niente: Scopri metteva CENTOUNO schede una dopo
   l'altra — 4477 px di scorrimento sul telefono — e la prima cosa che un
   turista vedeva dopo la testata era il catalogo.

   Due pagine invece di una, e non e' una duplicazione: sono due modi di
   cercare. Scopri risponde a «che cosa c'e' qui?» con quello che non si deve
   perdere e tre angoli; «Tutti i luoghi» risponde a «dov'e' la Martorana?» con
   righe compatte, filtri e ordinamento.
   ========================================================================== */

/* IL BLOCCO GRANDE: una fotografia e un nome, larghi quanto la pagina. */
.pt-evidenza-grande {
  display: grid;
  gap: 0;
  margin: var(--pt-5) var(--pt-align) 0;
  border: 1px solid var(--pt-line);
  border-radius: var(--pt-r-lg);
  overflow: hidden;
  background: var(--pt-card);
  box-shadow: var(--pt-shadow-card);
  color: inherit;
  text-decoration: none;
}
.pt-evidenza-foto {
  display: grid;
  place-items: center;
  min-height: 190px;
  background: var(--pt-fam, var(--pt-ink-70)) center/cover no-repeat;
  color: #fff;
  font-size: 46px;
}
/* v82 — SENZA FAMIGLIA, NIENTE COLORE DI FAMIGLIA.
   `--pt-fam` ripiega su `--pt-fam-citta` quando la categoria e' ignota, ed e'
   giusto su una tessera da 88 px. Un evento diffuso — «Le Vie dei Tesori» e'
   tutta la citta' — non ha un luogo e quindi non ha una categoria: il riquadro
   grande diventava un rettangolo blu da 570x280, la cosa piu' forte della
   pagina, e non voleva dire niente. */
.pt-evidenza-foto.is-neutra {
  background: var(--pt-paper-2);
  color: var(--pt-ink-45);
  box-shadow: inset 0 0 0 1px var(--pt-line);
}

.pt-evidenza-corpo { padding: var(--pt-4); }
.pt-evidenza-corpo strong {
  display: block;
  margin: var(--pt-2) 0 var(--pt-1);
  font-family: var(--pt-font-titolo);
  font-weight: 400;
  font-size: clamp(24px, 5.4vw, 32px);
  line-height: 1.06;
  letter-spacing: -0.03em;
}
.pt-evidenza-corpo small {
  display: block;
  max-width: var(--pt-lettura);
  color: var(--pt-ink-70);
  font-size: 14.5px;
  line-height: 1.45;
}
.pt-evidenza-fatti {
  display: flex;
  flex-wrap: wrap;
  gap: var(--pt-3);
  margin-top: var(--pt-3);
  color: var(--pt-ink-55);
  font: var(--pt-t-small);
  font-size: 12.5px;
}
.pt-evidenza-fatti i { margin-inline-end: 4px; }

/* v84 — LA STESSA SCHEDA, IN FORMA DI RIGA.
   Il prototipo chiede, per la lista di Scopri sul telefono, «immagine 88x70,
   titolo, distanza e tempo». Misurato: la scheda e' alta 163 px con una
   tessera da 54, e dodici ne fanno quasi duemila.

   Non e' un componente nuovo: e' `.pt-poi-card` con una forma diversa sotto gli
   800 px. Due markup per la stessa cosa divergono alla prima correzione — e'
   la lezione pagata quattro volte sui nomi delle classi.

   Sopra gli 800 px non cambia niente: li' lo spazio c'e' e la descrizione fa il
   suo mestiere. «Desktop ricompone, non scala», e qui ricompone tornando
   quello che era. */
@media (max-width: 799px) {
  .pt-list.is-compatta .pt-poi-card {
    align-items: center;
    padding: var(--pt-2) var(--pt-3);
  }
  .pt-list.is-compatta .pt-poi-tessera {
    width: 88px;
    height: 70px;
    border-radius: var(--pt-r-sm);
  }
  /* La descrizione breve e' quello che fa alta una scheda: e' prosa, e qui si
     sta scorrendo, non leggendo. La categoria se ne va con lei — il colore
     della tessera la dice gia'. */
  .pt-list.is-compatta .pt-poi-breve,
  .pt-list.is-compatta .pt-poi-cat { display: none; }
  /* Il cuore passa a DESTRA del nome invece di stare su una riga sua: da solo
     costava trenta pixel su ogni riga, cioe' un terzo dell'altezza guadagnata.
     E' la stessa disposizione delle righe di v81. */
  .pt-list.is-compatta .pt-poi-info {
    display: grid;
    grid-template-columns: minmax(0, 1fr) auto;
    align-items: center;
    column-gap: var(--pt-2);
  }
  .pt-list.is-compatta .pt-poi-riga1 {
    grid-column: 2;
    grid-row: 1 / 3;
    justify-content: flex-end;
  }
  .pt-list.is-compatta .pt-poi-info h3 { grid-column: 1; margin-top: 0; }
  .pt-list.is-compatta .pt-fatti { grid-column: 1; }
}

/* v84 — IL BLOCCO GRANDE DICE CHE COSA SUCCEDE SE LO TOCCHI.
   Il prototipo ci mette un bottone («Ascolta la storia», «Inizia il tour»,
   «Scopri l'evento») e ha ragione: un riquadro grande con dentro una
   fotografia e un titolo si guarda, non si tocca, finche' non dichiara dove
   porta.

   NON E' UN <a> DENTRO UN <a> — sarebbe HTML non valido, e il browser lo
   spezzerebbe in due. Il blocco intero e' gia' il collegamento; questo e' uno
   <span> che ne dichiara la destinazione, e prende il rilievo del comando
   restando parte del bersaglio. */
.pt-evidenza-vai {
  display: inline-flex;
  align-items: center;
  gap: 7px;
  align-self: start;
  margin-top: var(--pt-4);
  min-height: 44px;                /* la soglia di v16 vale anche da finto */
  padding: 0 var(--pt-4);
  border-radius: var(--pt-r-sm);
  background: var(--pt-sg);
  color: #fff;
  font: var(--pt-t-strong);
  font-size: 13.5px;
}
.pt-evidenza-vai > i { font-size: 16px; }

@media (hover: hover) {
  .pt-evidenza-grande:hover .pt-evidenza-vai { background: var(--pt-sg-dark); }
}

/* L'ORDINAMENTO. Un menu e non una fila di pastiglie: sono alternative, non
   interruttori — se ne accende una sola, e una fila di quattro pastiglie in
   cui solo una puo' essere accesa promette una somma che non si puo' fare. */
.pt-ordina {
  display: flex;
  align-items: center;
  gap: var(--pt-2);
  margin: 0 var(--pt-align) var(--pt-3);
  color: var(--pt-ink-55);
  font: var(--pt-t-small);
  font-size: 12.5px;
}
.pt-ordina select {
  min-height: 44px;          /* la soglia di v16 */
  padding: 0 var(--pt-3);
  border: 1px solid var(--pt-line);
  border-radius: var(--pt-r-sm);
  background: var(--pt-card);
  color: var(--pt-ink);
  font: var(--pt-t-strong);
  /* SEDICI, e non tredici e mezzo come vorrebbe la scala.
     Trovato dall'audit mobile a tutte e quattro le larghezze: sotto i 16 px
     Safari su iPhone **ingrandisce la pagina** quando si tocca un campo, e non
     la rimpicciolisce piu'. Si sceglie l'ordine e ci si ritrova l'elenco
     zoomato. E' la stessa soglia che vale per la ricerca da v25. */
  font-size: 16px;
}

/* v81 — LE SCELTE CHE NON RESTANO APPICCICATE.
   `pt-lista-strumenti` e' `sticky` da v25, ed e' giusto: su centouno luoghi la
   ricerca deve restare a portata mentre si scorre. Ma mettendoci dentro anche
   le pastiglie e l'ordinamento il blocco appiccicato passava da 177 px a 281, e
   su un telefono da 844 con la barra in basso restavano 428 px di elenco:
   cinque righe. Lo strumento mangiava la cosa che serviva a trovare.
   Qui stanno le scelte che si fanno una volta, e che scorrono via. */
.pt-lista-scelte { padding-top: var(--pt-2); }

@media (min-width: 800px) {
  /* Sul largo ci stanno in fila, e la riga di comandi diventa una sola. */
  .pt-lista-scelte {
    display: flex;
    flex-wrap: wrap;
    align-items: center;
    gap: var(--pt-3);
  }
  .pt-lista-scelte .pt-ordina { margin-inline-start: auto; }
}

/* LE RIGHE COMPATTE.
   Tre dati e un cuore: il nome e' quello che si cerca, la zona dice se e' di
   strada, la durata dice se ci sta nel tempo che si ha. La descrizione no: e'
   quella che fa una scheda alta 163 px, e qui si sta scorrendo, non leggendo. */
.pt-righe { margin: 0 var(--pt-align); padding: 0; list-style: none; }
.pt-riga {
  display: flex;
  align-items: center;
  gap: var(--pt-3);
  border-bottom: 1px solid var(--pt-line);
}
.pt-riga:last-child { border-bottom: 0; }
/* SI CHIAMA `pt-riga-apri` E NON `pt-riga-vai` PER UN MOTIVO PRECISO.
   `.pt-riga-vai` esiste dal v65 — è la riga «icona, testo, freccia» delle liste
   dei tour — e porta `> span { flex: 1 }`. La prima stesura di v81 riusò quel
   nome, e la miniatura da 88 px usciva larga **395**: il suo `flex` la
   allargava a riempire la riga.

   È la terza volta (v73 `.pt-vicino` e `.pt-tappa`, v75 `.pt-pagina-testa`), e
   la regola è sempre la stessa: **prima di usare un nome, cercarlo nel
   foglio**. Costa dieci secondi e li ha fatti perdere tre volte. */
.pt-riga-apri {
  flex: 1;
  min-width: 0;
  display: flex;
  align-items: center;
  gap: var(--pt-3);
  padding: var(--pt-2) 0;
  color: inherit;
  text-decoration: none;
}
.pt-riga-foto {
  flex: 0 0 auto;
  display: grid;
  place-items: center;
  width: 88px;
  height: 70px;
  border-radius: var(--pt-r-xs);
  background: var(--pt-fam, var(--pt-paper-2)) center/cover no-repeat;
  color: #fff;
  font-size: 24px;
}
.pt-riga-corpo { flex: 1; min-width: 0; }
.pt-riga-corpo strong {
  display: block;
  font: var(--pt-t-strong);
  font-size: 15px;
  line-height: 1.25;
}
.pt-riga-unesco { color: var(--pt-oro-testo); font-size: 14px; }
.pt-riga-corpo small {
  display: flex;
  flex-wrap: wrap;
  gap: var(--pt-2) var(--pt-3);
  margin-top: 3px;
  color: var(--pt-ink-55);
  font: var(--pt-t-small);
  font-size: 12.5px;
}
.pt-riga-corpo small i { margin-inline-end: 3px; }
.pt-riga-corpo small .is-ok { color: var(--pt-ok); }
.pt-riga > .pt-fav-star { flex: 0 0 auto; margin-inline-end: 2px; }

/* --- SCOPRI, e le categorie ----------------------------------------------- */
.pt-scopri-blocco,
.pt-evidenza,
.pt-eventi-blocco { margin: var(--pt-6) var(--pt-align) 0; }

.pt-sezione-testa {
  display: flex;
  align-items: flex-end;
  justify-content: space-between;
  gap: var(--pt-3);
  margin-bottom: var(--pt-3);
}
.pt-sezione-testa h2 { font-size: 27px; margin-top: 4px; }
.pt-sezione-sub { margin-top: 5px; color: var(--pt-ink-55); font-size: 13px; }
.pt-sezione-tutto {
  flex: 0 0 auto;
  display: inline-flex;
  align-items: center;
  gap: 5px;
  min-height: 44px;
  color: var(--pt-sg-dark);
  font: var(--pt-t-strong);
  font-size: 13px;
  white-space: nowrap;
}

/* --- EVENTI --------------------------------------------------------------- */
.pt-eventi-elenco {
  display: flex;
  gap: var(--pt-2);
  margin: 0;
  padding: 2px 0;
  list-style: none;
  overflow-x: auto;
  scrollbar-width: none;
}
.pt-eventi-elenco::-webkit-scrollbar { display: none; }
.pt-eventi-elenco > li { flex: 0 0 auto; width: 270px; }

.pt-evento {
  display: flex;
  align-items: center;
  gap: var(--pt-3);
  height: 100%;
  padding: 12px 14px;
  border: 1px solid var(--pt-line);
  border-radius: var(--pt-r);
  background: var(--pt-card);
  color: var(--pt-ink);
}
.pt-evento-data {
  flex: 0 0 auto;
  display: grid;
  justify-items: center;
  min-width: 42px;
  color: var(--pt-sg-dark);
}
.pt-evento-data b {
  font: 800 21px/1 var(--pt-font);
  font-variant-numeric: tabular-nums;
}
.pt-evento-data small {
  font: var(--pt-t-label);
  font-size: 10px;
  letter-spacing: 0.1em;
  text-transform: uppercase;
}
.pt-evento-corpo { min-width: 0; }
.pt-evento-corpo strong {
  display: block;
  font: var(--pt-t-strong);
  font-size: 14px;
}
.pt-evento-corpo small {
  display: inline-flex;
  align-items: center;
  gap: 4px;
  margin-top: 3px;
  color: var(--pt-ink-55);
  font-size: 12px;
}

/* --- la riga «vicino a me», che resta lo stato di partenza ---------------- */
.pt-intorno {
  display: flex;
  align-items: center;
  gap: var(--pt-3);
  width: 100%;
  margin-top: var(--pt-4);
  padding: 12px var(--pt-4);
  border: 1px solid var(--pt-line);
  border-radius: var(--pt-r);
  background: var(--pt-card);
  color: var(--pt-ink);
  text-align: start;
  cursor: pointer;
}
.pt-intorno > i:first-child {
  flex: 0 0 auto;
  display: grid;
  place-items: center;
  width: 42px;
  height: 42px;
  border-radius: var(--pt-r-icona);
  background: var(--pt-scelto-tint);
  color: var(--pt-sg);
  font-size: 20px;
}
.pt-intorno-testo { flex: 1; min-width: 0; }
.pt-intorno-testo strong { display: block; font: var(--pt-t-strong); font-size: 14.5px; }
.pt-intorno-testo small { display: block; margin-top: 2px; color: var(--pt-ink-55); font-size: 12.5px; }
.pt-intorno.is-nota > i:first-child { background: var(--pt-sg); color: #fff; }


/* (Qui stava `.pt-tempo-altro`, la quinta pastiglia in coda ai tempi di v65.
   v73 l'ha sostituita con `.pt-piano-altro`, sotto il comando. La regola è
   stata TOLTA e non lasciata: una regola senza più un elemento è una trappola
   per chi la legge il mese prossimo — sembra che qualcosa la usi.) */

/* --- Intorno a te ---------------------------------------------------------
   La riga sta nel blocco della home (v73): è lo stato di partenza di «vicino a
   te», e vive lì insieme alle schede che compaiono quando la posizione si sa.
   Qui restano i due stati che il JavaScript accende. */
.pt-intorno .ti-chevron-right { flex: 0 0 auto; font-size: 18px; color: var(--pt-ink-45); }
.pt-intorno.is-nota { border-color: var(--pt-line-2); }
.pt-intorno.is-nota .pt-intorno-testo small { color: var(--pt-ink); font-weight: 700; }
.pt-intorno.is-loading { opacity: 0.55; pointer-events: none; }


/* --- LA HOME SU SCHERMO LARGO --------------------------------------------
   Il telefono è la forma di partenza e resta quella giusta: una colonna, e le
   file che scorrono. Su schermo largo cambiano DUE cose, e nessuna delle due
   è «più roba».

   1. IL PIANIFICATORE E L'ANTEPRIMA STANNO AFFIANCATI. Sul telefono
      l'anteprima è la conseguenza, e sta sotto; qui c'è posto perché sia la
      RISPOSTA, visibile mentre si cambia idea. È l'unica ragione per cui
      questa pagina merita due colonne: non per riempire, ma perché la domanda
      e la risposta si guardino.

   2. LE FILE CHE SCORREVANO SI APRONO. Quattro tempi in due file da due, le
      categorie a capo, le schede in griglia. Uno scorrimento orizzontale col
      mouse è un gesto che non esiste: sul telefono il pollice lo fa da solo,
      qui bisognerebbe cercare una barra.

   La colonna resta `--pt-col` (760px) come in tutta l'app. Allargare la sola
   home l'avrebbe fatta sembrare un'altra applicazione. */
@media (min-width: 800px) {
  /* v80 — meno aria sopra e sotto: ogni pixel qui è un pixel che il comando
     principale guadagna verso la prima schermata, e l'eroe non ne perde di
     forza — il titolo resta 46px, che è la voce più alta dell'app. */
  .pt-eroe { padding-block: var(--pt-5) var(--pt-5); }
  .pt-eroe h1:not(.pt-evento-titolo) { font-size: 46px; }
  .pt-eroe-sub { font-size: 17px; }

  /* v80 — LE DUE COLONNE DELL'EROE: 45% il testo, 55% la fotografia.
     Sono le proporzioni chieste da V2, e non sono arbitrarie — la colonna del
     testo porta anche il pianificatore, cioè tre passaggi e un comando: sotto
     il 45% le quattro schede del tempo tornerebbero una sopra l'altra.
     `align-items: stretch` perché la fotografia deve arrivare in fondo alla
     colonna accanto, non fermarsi a metà. */
  .pt-eroe {
    grid-template-columns: minmax(0, 45fr) minmax(0, 55fr);
    align-items: stretch;
    gap: var(--pt-6);
  }
  .pt-eroe-foto { min-height: 100%; }
  .pt-eroe-didascalia { font-size: 17px; }
  /* Il credito va sotto la SUA fotografia, non sotto il titolo: nella griglia
     finirebbe da solo in colonna uno, a mezza pagina dalla cosa che attribuisce. */
  .pt-eroe .pt-credito { grid-column: 2; }

  /* v80 — I DUE PASSI AFFIANCATI, e il comando che li attraversa.
     È questa riga a riportare il comando dentro la prima schermata: da 963 px
     a quota utile, senza togliere una parola al modulo. A tutta larghezza
     ognuno dei due passi ha ~560 px, cioè più di quanti ne avesse prima da
     solo — le schede del tempo restano due per riga e le partenze due per
     riga, nessuna si stringe. */
  .pt-piano {
    display: grid;
    grid-template-columns: 1fr 1fr;
    column-gap: var(--pt-6);
    align-items: start;
  }
  .pt-passo { margin-bottom: 0; }
  /* Il comando attraversa le due colonne ma NON si allarga a 1112 px: è la
     misura dei comandi a blocco di v75, e la ragione è la stessa — un bottone
     largo uno schermo non dice «premi qui», dice «non so dove metterti». */
  .pt-piano-via,
  .pt-piano-altro { grid-column: 1 / -1; justify-self: center; width: 100%; max-width: 520px; }

  /* I quattro tempi: due file da due, senza scorrimento. */
  .pt-tempi { flex-wrap: wrap; overflow-x: visible; }
  .pt-tempi > li { flex: 1 1 calc(50% - var(--pt-2) / 2); }
  /* v80 — e senza l'altezza minima. I 150px servono sul telefono, dove le
     schede sono larghe 132 e il ritmo va su tre righe: qui sono larghe il
     doppio, il ritmo sta su una, e 150 diventano aria. Misurato, il passo del
     tempo passa da 350 a 252 px — e sono i pixel che riportano il comando
     dentro la prima schermata. Il contenuto non cambia di una parola. */
  .pt-tempo { width: auto; min-height: 0; }
  .pt-passo { margin-bottom: var(--pt-4); }

  /* v80 — LE TRE PARTENZE IN DUE COLONNE.
     Il commento di v71 diceva di lasciarle impilate «perché affiancate in una
     colonna da 360px diventano tre riquadri da 110px». Vero allora: la colonna
     era 360. Adesso è 500, e due colonne fanno riquadri da 240 — dove «La mia
     posizione» ci sta su una riga. La regola vecchia non era sbagliata: era
     misurata su una larghezza che non c'è più. */
  .pt-partenze {
    display: grid;
    grid-template-columns: 1fr 1fr;
    gap: var(--pt-2);
  }
  .pt-partenze > li:last-child:nth-child(odd) { grid-column: 1 / -1; }

  /* Le tre partenze restano una sotto l'altra anche qui: affiancate in una
     colonna da 360px diventano tre riquadri da 110px, e «La mia posizione» ci
     va a capo tre volte. Una riga larga si legge meglio di tre colonne strette
     — la stessa lezione delle tessere del tempo di v71, al contrario. */

  /* Qui c'era `.pt-percorso-tappe { flex-wrap: wrap; overflow-x: visible; }`,
     che faceva andare a capo la fila orizzontale perché «nella colonna di
     destra la quarta restava tagliata a metà senza niente che lo dicesse».
     v97 ha tolto la fila: una colonna non va a capo e non scorre, e la regola
     rimediava a un difetto che non esiste più. */

  /* Le file di schede diventano griglie: niente da cercare col mouse. */
  .pt-vicini-elenco,
  .pt-evidenza-elenco,
  .pt-eventi-elenco {
    display: grid;
    grid-template-columns: repeat(auto-fill, minmax(200px, 1fr));
    overflow-x: visible;
  }
  .pt-vicini-elenco > li,
  .pt-evidenza-elenco > li,
  .pt-eventi-elenco > li { width: auto; }

  .pt-fila-cat { overflow-x: visible; }
  .pt-fila-cat ul { flex-wrap: wrap; }
}

/* --- Chiedi alla guida ----------------------------------------------------
   Sta nel template di base, non nella home: la domanda "che cos'è questa
   cosa?" nasce quando l'utente è davanti alla cosa. Questo resta vero.

   v23 — NON PIÙ GALLEGGIANTE.

   Era `position: fixed` con `z-index: 39` e un'ombra: l'unico elemento
   dell'app sopra al contenuto, cioè il segnale più forte dell'intera
   interfaccia, su tutte e ventidue le schermate. Portava a una pagina che
   dice «in costruzione», e nel frattempo copriva il testo delle schede — il
   contenuto non riservava spazio per lui e nessuno se n'era accorto.

   Adesso è una riga in fondo alla pagina, dopo `</main>`: raggiungibile da
   ovunque esattamente come prima, ma senza pretendere di essere la cosa più
   importante dello schermo. Resta scura perché è un invito, non un avviso.

   (Il nome della classe dice ancora "fab" — floating action button — e non lo
   è più. Si rinomina in v24, insieme al resto della migrazione dei comandi:
   una correzione tocca solo ciò che è rotto, e qui a essere rotto era lo
   strato, non il nome.) */

/* v48 — E ADESSO NEMMENO PIENO.
   v23 aveva corretto lo STRATO — da flottante sopra a tutto, a riga in fondo
   alla pagina — e aveva scritto: «resta scura perche' e' un invito, non un
   avviso». La forma pero' e' rimasta quella di un comando: fondo pieno,
   larghezza intera, peso 800.
   Misurato: su Scopri e su Tour «Chiedi alla guida» e' **l'unico comando pieno
   e largo della pagina**, cioe' il segnale piu' forte dello schermo. E sulla
   home convive con i quattro riquadri rossi del tempo, che sono l'azione vera:
   due candidati per «la cosa da fare».
   Dove porta, poi, e' scritto nella pagina stessa: l'occhiello dice «In
   costruzione». Il segnale piu' forte dell'app promette la cosa che l'app
   ancora non fa.
   Adesso e' un invito anche nella forma: il contorno resta blu — si vede, si
   trova, si tocca — ma il pieno torna a chi ha qualcosa da far fare. Quando il
   chatbot rispondera' si riprendera' anche quello. */
.pt-guida-fab {
  display: flex;
  align-items: center;
  justify-content: center;
  gap: 7px;
  width: calc(100% - var(--pt-gutter) * 2);
  min-height: 44px;
  margin: var(--pt-6) var(--pt-align) var(--pt-4);
  padding: 12px 17px;
  border: 1px solid var(--pt-scelto-200);
  border-radius: var(--pt-r-sm);
  background: var(--pt-card);
  color: var(--pt-scelto);
  font: var(--pt-t-strong);
  font-weight: 700;
  transition: transform var(--pt-fast) var(--pt-ease);
}
.pt-guida-fab i { font-size: 18px; }

.pt-guida-fab:active { transform: scale(0.99); }

/* --- Pagina della guida --------------------------------------------------- */

/* FASE F — `.pt-guida-testa`, il riquadro con il titolo dentro, non c'è più:
   la pagina ha la testata di tutte le altre (`.pt-testata`). Il titolo stava
   a x=41 sul telefono, con il resto della pagina a 16. */
.pt-guida-lingue { margin: 0 var(--pt-align) var(--pt-5); }
.pt-guida-lingue .pt-avvio-etichetta { margin-top: var(--pt-4); }
.pt-guida-lingue-riga { display: flex; flex-wrap: wrap; gap: var(--pt-2); }
.pt-guida-nota { margin-top: var(--pt-3); font: var(--pt-t-small); font-size: 12.5px; color: var(--pt-ink-55); }


/* ============================================================================
   6. DETTAGLIO DEL LUOGO
   ============================================================================
   La testata non è un riquadro in attesa di una fotografia che non esiste: è
   una fascia piena del colore della famiglia, con l'icona della categoria in
   grande. Vale la stessa scelta della lista — lo spazio della foto non viene
   promesso — ma qui la fascia serve anche a dare respiro sopra il titolo.
   ========================================================================== */

.pt-poi { display: block; }

.pt-indietro {
  display: inline-grid;
  place-items: center;
  width: 38px;
  height: 38px;
  margin-inline-start: -8px;
  border-radius: 50%;
  color: var(--pt-ink);
  font-size: 21px;
}


.pt-poi-testa,
.pt-hero {
  /* v65 — DA FASCIA A COPERTINA.

     Era alta 132 px, rientrata nei margini e con dentro un'icona centrata; il
     nome del luogo cominciava sotto, su fondo bianco. Due blocchi per dire una
     cosa sola.

     Adesso arriva ai bordi dello schermo e tiene dentro il nome: è la
     copertina che questo catalogo non ha, e non avrà — il campo `immagine` è
     vuoto su tutti e cento i luoghi. Gli angoli sono arrotondati solo in
     basso, perché in alto la fascia continua sotto l'intestazione dell'app:
     arrotondarli lì lascerebbe due spicchi di fondo pagina.

     `position: relative` non è decorazione: senza, la filigrana della categoria
     — che è in `absolute` — non verrebbe ritagliata da questa scatola e
     uscirebbe dallo schermo. È lo stesso difetto di v16, la classe di errore
     che questo progetto ha già pagato con l'unica pagina rotta dell'app. */
  position: relative;
  display: flex;
  flex-direction: column;
  justify-content: space-between;
  min-height: 178px;
  margin: 0;
  padding: var(--pt-4) var(--pt-align) var(--pt-4);
  overflow: hidden;
  border-radius: 0 0 var(--pt-r-xl) var(--pt-r-xl);
  background: var(--pt-fam);
  background-size: cover;
  background-position: center;
  /* v64 — era bianco al 92%. Con le famiglie accese scendeva a 4,12:1 su
     quattro delle sei: la velatura costava proprio il margine che l'aver
     acceso i colori aveva già speso. */
  color: #fff;
  font-size: 54px;
}

/* v75 — LA VELATURA SOTTO IL NOME, MESSA PRIMA CHE SERVA.

   Oggi la copertina è una tinta piena e il nome bianco si legge da sé. Domani
   ci sarà una fotografia, e un nome bianco sopra una fotografia chiara non si
   legge più: è il difetto che si scopre il giorno del caricamento, con le foto
   già in archivio e la fretta addosso.

   La velatura scende dal basso, dove sta il nome, e su una tinta piena non si
   vede quasi — scurisce il fondo del riquadro di un soffio. Quando arriverà la
   fotografia sarà già lì, e non ci sarà niente da correggere.

   `::after` e non un gradiente nel `background`: il fondo lo occupa già
   l'immagine, e due valori nella stessa proprietà si pestano i piedi. */
.pt-poi-testa::after {
  content: "";
  position: absolute;
  inset: 0;
  /* DUE VELATURE, E I NUMERI SONO MISURATI SUL CASO PEGGIORE — una fotografia
     BIANCA, che è quello che una facciata al sole produce davvero.

       velo basso 0,55 → il nome bianco regge **4,74:1**
                         (a 0,42, la prima scrittura, faceva 3,03: passava per
                         un titolo grande e cadeva per qualunque altra cosa)
       velo alto  0,30 → da solo la stella bianca farebbe 2,12:1, sotto la
                         soglia di 3 per un segno grafico. Per questo la stella
                         e la targhetta hanno il proprio disco scuro qui sotto,
                         e non si affidano al velo.

     Questi conti l'audit del contrasto non li fa: salta gli elementi su fondo
     a immagine, e li conta a parte invece di indovinare. Li fa una prova. */
  background:
    linear-gradient(to top, rgba(0, 0, 0, 0.55) 0%, rgba(0, 0, 0, 0) 58%),
    linear-gradient(to bottom, rgba(0, 0, 0, 0.30) 0%, rgba(0, 0, 0, 0) 34%);
  pointer-events: none;
}
/* Il nome e le targhette stanno già sopra (`z-index: 1` nelle loro regole); la
   filigrana della categoria sta sotto, e va bene così — è l'unica cosa nella
   copertina che non deve leggersi.

   Una regola `> *` che alzasse tutto avrebbe anche rimesso in `relative` la
   filigrana, che è in `absolute`: il modo più rapido di correggere una cosa e
   romperne un'altra nella stessa riga. */

/* `.pt-hero` è la stessa fascia su altre pagine, ma senza niente dentro: lì
   l'icona centrata resta il contenuto, e va rimessa al centro. */
.pt-hero { display: grid; place-items: center; }

/* v78 — IL CREDITO DI UNA FOTOGRAFIA.
   Sta SOTTO la copertina e non sopra di essa: sovrapposto alla fotografia
   sarebbe l'unico testo dell'app a non avere un contrasto garantito — dipende
   da che cosa c'e' sotto — e v75 quel conto l'ha gia' fatto per il nome del
   luogo, con il velo doppio. Un credito non merita un secondo velo: merita di
   stare sulla carta, dove si legge sempre.

   Piccolo e grigio di proposito. E' un obbligo di licenza, non un contenuto:
   deve esserci, essere leggibile e non competere con il nome del monumento.
   `--pt-ink-55` e' il grigio misurato che passa la soglia (5,07:1). */
.pt-credito {
  display: flex;
  align-items: center;
  flex-wrap: wrap;
  gap: 6px;
  /* Niente margine sopra: l'altezza della riga (44px, vedi sotto) fa gia' da
     respiro fra la copertina e l'occhiello. */
  margin: 0 var(--pt-align);
  min-height: 44px;
  font: var(--pt-t-small);
  font-size: 12.5px;
  color: var(--pt-ink-55);
}
.pt-credito > i { font-size: 14px; color: var(--pt-ink-45); }
/* v78 — IL BERSAGLIO DA 44, ANCHE QUI. Trovato da `audit_mobile`, che l'ha
   misurato 141x18 su tutte e quattro le larghezze: il testo e' piccolo di
   proposito, ma il dito non lo sa. E' lo stesso difetto della stella dei
   preferiti a v75 — si corregge una cosa (il credito c'e') e se ne rompe
   un'altra nella stessa riga (la soglia di v16).
   Il corpo del testo NON cambia: cresce l'area che risponde al tocco. */
.pt-credito a {
  display: inline-flex;
  align-items: center;
  min-height: 44px;
  color: inherit;
  text-decoration: underline;
  text-underline-offset: 2px;
}
.pt-credito-licenza {
  padding: 1px 6px;
  border: 1px solid var(--pt-line);
  border-radius: var(--pt-r-xs);
  font: var(--pt-t-label);
  font-size: 10.5px;
  letter-spacing: 0.04em;
  color: var(--pt-ink-55);
}

.pt-poi-intestazione { padding: var(--pt-4) var(--pt-align) 0; }
/* v65 — la riga delle targhette è salita dentro la copertina: qui sotto resta
   l'occhiello, e il margine che la separava non ha più niente da separare. */
.pt-poi-intestazione .pt-poi-occhiello { margin-top: 0; }

.pt-poi-intestazione .pt-poi-riga1 { margin-bottom: var(--pt-2); }

.pt-poi-title {
  font-size: clamp(24px, 6.6vw, 30px);
  letter-spacing: -0.042em;
  line-height: 1.06;
}

.pt-poi-occhiello {
  margin-top: var(--pt-3);
  font: var(--pt-t-body);
  font-size: 15.5px;
  font-weight: 600;
  color: var(--pt-ink-70);
}

/* v65 — `.pt-poi-fatti` non esiste più: i tre fatti sono diventati le tessere
   `.pt-poi-veloci`. Una classe senza markup non dà errore, si limita a restare
   nel foglio finché qualcuno la ricopia credendo che serva. */

/* L'ascolto è l'azione primaria: è ciò che l'app fa e che una ricerca sul
   telefono non fa. Sta prima del testo, non dopo.

   v24 — era il SEDICESIMO alias, e l'inventario dei quindici non l'aveva
   preso perché stava per conto suo invece che nell'elenco. Ripeteva parola per
   parola i valori del ruolo primario. L'ha trovato la prova nuova, non io:
   è la dimostrazione che serviva. Qui resta solo la sua impaginazione. */
.pt-listen-btn {
  width: calc(100% - var(--pt-gutter) * 2);
  margin: var(--pt-4) var(--pt-align) 0;
  padding: 15px;
  gap: 9px;
  font-size: 15px;
}
.pt-listen-btn i { font-size: 21px; }

.pt-listen-btn.speaking { background: var(--pt-scelto); border-color: var(--pt-scelto); }

/* v75 → v76 — L'ARTICOLO: testo a sinistra, fatti a destra.
   Nato per la scheda di un luogo, si chiamava `.pt-poi-corpo`. Da v76 lo usa
   anche la pagina di un evento, e il nome è stato tolto di mezzo prima che
   diventasse una bugia: un componente che si chiama «poi» e vive su due pagine
   diverse è il modo in cui nasce la seconda copia. */
.pt-articolo { padding: var(--pt-5) var(--pt-align) 0; }
/* Sul telefono i due blocchi sono uno sotto l'altro e non portano regole
   proprie: esistono perché su schermo largo diventano due colonne. */
.pt-articolo-testo,
.pt-articolo-lato { min-width: 0; }

.pt-poi-descrizione {
  font: var(--pt-t-body);
  font-size: 15.5px;
  line-height: 1.62;
  color: var(--pt-ink-70);
}

/* --- Curiosità e consiglio ------------------------------------------------
   Erano nel catalogo per tutti e cento i luoghi, tradotti, e non comparivano
   da nessuna parte. Sono ciò che distingue una guida da un elenco, quindi
   hanno una forma propria e non si confondono con la descrizione. */

.pt-nota-card {
  display: block;
  margin-top: var(--pt-4);
  padding: var(--pt-4);
  border-radius: var(--pt-r);
  border: 1px solid var(--pt-line);
  background: var(--pt-card);
}

.pt-nota-testa {
  display: flex;
  align-items: center;
  gap: 7px;
  margin-bottom: var(--pt-2);
  font: var(--pt-t-label);
  letter-spacing: 0.14em;
  text-transform: uppercase;
}
.pt-nota-testa i { font-size: 16px; }

.pt-nota-card p { font: var(--pt-t-small); font-size: 14px; line-height: 1.55; color: var(--pt-ink-70); }

.pt-nota-curiosita { border-color: var(--pt-oro-200); background: var(--pt-oro-tint); }
.pt-nota-curiosita .pt-nota-testa { color: var(--pt-oro-testo); }

/* v65 — era `--pt-paper`, cioè il fondo della pagina: da quando il fondo è
   passato al bianco freddo (v64) questo riquadro aveva la stessa superficie
   dello sfondo su cui sta, ed esisteva solo grazie al filo. È lo stesso
   difetto che v62 aveva tolto dalle schede dei preferiti. */
.pt-nota-consiglio { border-color: var(--pt-line-2); background: var(--pt-paper-2); }
.pt-nota-consiglio .pt-nota-testa { color: var(--pt-ink-70); }

/* --- Dati pratici --------------------------------------------------------- */

/* v65 — LA GRIGLIA STA ALTROVE, E QUESTO RESTA UN ELENCO.

   La griglia da due l'avevo messa qui, ed era sbagliata: questi quattro campi
   sono PROSA di lunghezza qualunque — «Corso Vittorio Emanuele 490, 90134
   Palermo», tre righe di orari, cinque di prezzi. Misurato, la cella dei
   prezzi diventava alta il doppio delle altre e lasciava mezzo schermo vuoto
   accanto. Una griglia serve a cose corte e confrontabili.

   Le tessere del mockup erano infatti gli ALTRI dati — zona, visita, ingresso —
   che sono tre parole ciascuno: quelli sono diventati `.pt-poi-veloci`. Qui
   resta l'elenco, che per la prosa è la forma giusta. */
.pt-dati { margin: var(--pt-5) 0 var(--pt-4); }
.pt-dati > div {
  display: grid;
  gap: 3px;
  padding: 13px 0;
  border-top: 1px solid var(--pt-line);
}
.pt-dati dt {
  display: flex;
  align-items: center;
  gap: 6px;
  font: var(--pt-t-label);
  letter-spacing: 0.14em;
  text-transform: uppercase;
  color: var(--pt-ink-55);
}
.pt-dati dt i { font-size: 15px; }
.pt-dati dd { margin: 0; font: var(--pt-t-small); font-size: 14px; color: var(--pt-ink); }

/* FASE C — «Verifica eventuali variazioni». Chiude l'elenco dei fatti, sotto
   l'ultimo filetto: vale per tutti quelli sopra, non per uno solo. Il grigio
   del secondario e il corpo piccolo, perché è un'avvertenza e non un dato —
   e l'icona dell'informazione, non quella del pericolo: non c'è niente di
   sbagliato, c'è una cosa che può cambiare. */
.pt-dati-nota {
  display: flex;
  align-items: flex-start;
  gap: 6px;
  /* Il margine negativo annulla quello sotto l'elenco (i due si sommano, e
     fanno zero): il filetto cade dove cadrebbe quello di una riga in più, e
     il passo è lo stesso delle righe (13 px). */
  margin: calc(var(--pt-4) * -1) 0 var(--pt-4);
  padding-top: 13px;
  border-top: 1px solid var(--pt-line);
  font: var(--pt-t-small);
  font-size: 13px;
  color: var(--pt-ink-55);
}
.pt-dati-nota i { flex: 0 0 auto; margin-top: 2px; font-size: 15px; }
/* v108 — «Ultima verifica: 30 settembre 2026», a capo sotto l'avvertenza di
   cui è la data: stesso corpo, stesso grigio. */
.pt-dati-nota-data { display: block; margin-top: var(--pt-1); }

/* --- FASE C — LA SECONDA METÀ DELLA SCHEDA DI UN LUOGO ----------------------
   Sotto l'articolo la pagina aveva quattro bordi sinistri diversi (misurati a
   390): il testo a 16, le tessere dei tour e dell'evento a 32, lo stato vuoto
   delle recensioni a 32, «Apri in mappe» a 32 dentro un riquadro che ne stava
   già a 16. Stessa causa ogni volta: un componente pensato per stare a tutta
   larghezza, che si porta il proprio margine (`--pt-align`), messo dentro un
   contenitore che il margine l'ha già. Il margine resta a chi contiene. */
/* Due classi e non una: `.pt-racconto-titolo`, che dà corpo e voce, sta più in
   basso nel foglio e azzera i margini laterali — dentro la colonna del racconto
   sono giusti a zero, qui fuori no. Misurato alla prima stesura: il titolo a
   x=0, l'unica cosa della pagina attaccata al bordo. */
.pt-poi .pt-poi-altro-titolo { margin: var(--pt-6) var(--pt-align) var(--pt-3); }
.pt-poi-collegati > * { margin-inline: 0; }
.pt-reviews .pt-reviews-empty { margin-inline: 0; }
.pt-articolo-lato .pt-uscita-esterna { width: auto; margin-inline: 0; }


/* ============================================================================
   7. RECENSIONI
   ========================================================================== */

.pt-reviews { padding: 0 var(--pt-align); margin-top: var(--pt-6); }

.pt-reviews-head {
  display: flex;
  align-items: center;
  justify-content: space-between;
  gap: var(--pt-3);
  flex-wrap: wrap;
  margin-bottom: var(--pt-3);
}
/* FASE C — il titolo è un `<h2>` con `.pt-racconto-titolo`, come gli altri
   titoli di sezione della scheda: il corpo e la spaziatura li danno loro.
   Qui resta solo quello che la fila dell'intestazione chiede — niente margine
   sotto, perché lo spazio lo mette già l'intestazione. */
.pt-reviews-head .pt-reviews-title { margin: 0; }

.pt-reviews-score { display: flex; align-items: center; gap: 9px; }
.pt-reviews-score-num { font: 800 26px/1 var(--pt-font); font-stretch: var(--pt-wide); letter-spacing: -0.04em; }
.pt-reviews-score-stars { color: var(--pt-oro); font-size: 15px; letter-spacing: 1px; }
.pt-reviews-score-count { font: var(--pt-t-small); font-size: 12.5px; color: var(--pt-ink-55); }

.pt-review {
  padding: var(--pt-4) 0;
  border-top: 1px solid var(--pt-line);
}
.pt-review-head { display: flex; align-items: center; gap: 10px; margin-bottom: var(--pt-2); }
.pt-review-avatar,
.pt-racconto-avatar,
.pt-gruppo-avatar,
.pt-tour-autore-avatar {
  display: grid;
  place-items: center;
  flex: 0 0 auto;
  width: 34px;
  height: 34px;
  border-radius: 50%;
  background: var(--pt-paper-2);
  color: var(--pt-ink-70);
  font: var(--pt-t-label);
  font-size: 13px;
  letter-spacing: 0;
}
.pt-review-author { font: var(--pt-t-strong); }
.pt-review-meta { display: flex; align-items: center; gap: 8px; flex-wrap: wrap; }
.pt-review-date { font: var(--pt-t-small); font-size: 12px; color: var(--pt-ink-55); }
.pt-review-stars { color: var(--pt-oro); font-size: 14px; letter-spacing: 1px; }
.pt-review-text { font: var(--pt-t-small); font-size: 14px; line-height: 1.55; color: var(--pt-ink-70); }
.pt-review-mine { border-inline-start: 3px solid var(--pt-ink); padding-inline-start: var(--pt-3); }

.pt-review-badge,
.pt-review-pending,
.pt-review-rejected,
.pt-proposta-stato,
.pt-tour-stato,
.pt-uscita-stato,
.pt-badge-aperto,
.pt-shared-badge,
.pt-gruppo-badge,
.pt-badge-gruppo {
  display: inline-flex;
  align-items: center;
  gap: 5px;
  padding: 3px 8px;
  border-radius: var(--pt-r-xs);
  background: var(--pt-paper-2);
  color: var(--pt-ink-70);
  font: var(--pt-t-label);
  font-size: 10px;
  letter-spacing: 0.1em;
  text-transform: uppercase;
}
.pt-review-pending, .pt-proposta-attesa { background: var(--pt-warn-tint); color: var(--pt-warn); }
.pt-review-rejected, .pt-proposta-no { background: var(--pt-danger-tint); color: var(--pt-danger); }
.pt-proposta-ok, .pt-badge-aperto { background: var(--pt-ok-tint); color: var(--pt-ok); }

.pt-review-delete {
  border: 0;
  background: none;
  color: var(--pt-ink-45);
  font: var(--pt-t-small);
  font-size: 12px;
  cursor: pointer;
  padding: 4px 0;
}


.pt-review-photo, .pt-review-thumb {
  border-radius: var(--pt-r-sm);
  border: 1px solid var(--pt-line);
  cursor: pointer;
}
.pt-review-photo { margin-top: var(--pt-3); max-width: 100%; }
.pt-review-thumb { width: 84px; height: 84px; object-fit: cover; flex: 0 0 auto; }

/* v74 — LA TESSERA AL POSTO DELLA FOTO CHE NON ARRIVA.
   Un riquadro rotto sembra un difetto della pagina; questa tessera dice che
   cos'e' successo. Non e' un avviso — non e' colpa di chi guarda e non c'e'
   niente da fare — quindi e' quieta: la superficie spenta, l'inchiostro
   terziario, nessun rosso. */
.pt-review-photo.is-mancante,
.pt-review-thumb.is-mancante {
  display: grid;
  place-items: center;
  gap: 4px;
  padding: var(--pt-2);
  background: var(--pt-paper-2);
  color: var(--pt-ink-55);
  cursor: default;
}
.pt-review-photo.is-mancante { min-height: 84px; }
.pt-foto-mancante {
  display: grid;
  justify-items: center;
  gap: 3px;
  text-align: center;
  line-height: 1.2;
}
/* L'icona è il segnale principale della tessera, quindi si misura come tale:
   soglia 3:1, non quella dei filetti. `--pt-ink-45` sulla superficie quieta fa
   **2,63:1** — sotto. È la prima scrittura di questa regola, corretta prima di
   arrivare in pagina: l'audit del contrasto guarda le pagine vere, e questa
   tessera in una pagina vera non c'è finché una foto non fallisce. */
.pt-foto-mancante i { font-size: 20px; color: var(--pt-ink-55); }
.pt-foto-mancante small { font-size: 11px; }

.pt-reviews-photos { margin: var(--pt-4) 0; }
.pt-reviews-photos-label {
  display: block;
  margin-bottom: var(--pt-2);
  font: var(--pt-t-label);
  letter-spacing: 0.15em;
  text-transform: uppercase;
  color: var(--pt-ink-55);
}
.pt-reviews-photos-strip { display: flex; gap: var(--pt-2); overflow-x: auto; scrollbar-width: none; }
.pt-reviews-photos-strip::-webkit-scrollbar { display: none; }

.pt-review-form {
  margin-top: var(--pt-4);
  padding: var(--pt-4);
  border: 1px solid var(--pt-line);
  border-radius: var(--pt-r);
  background: var(--pt-card);
}
.pt-review-form-title { font-size: 17px; letter-spacing: -0.035em; }
.pt-review-form-sub { margin-top: 3px; margin-bottom: var(--pt-3); }
.pt-review-textarea { min-height: 96px; resize: vertical; }
.pt-review-submit { width: 100%; margin-top: var(--pt-3); }

/* Le stelle sono radio veri: si arriva dalla tastiera e il modulo funziona
   anche senza JavaScript. */
.pt-star-input { display: inline-flex; flex-direction: row-reverse; gap: 3px; }
.pt-star-input input { position: absolute; opacity: 0; width: 1px; height: 1px; }
.pt-star-input label { font-size: 27px; color: var(--pt-ink-25); cursor: pointer; line-height: 1; }.pt-star-input input:checked ~ label{ color: var(--pt-oro); }
.pt-star-input input:focus-visible + label { outline: 3px solid var(--pt-sg); outline-offset: 2px; }

.pt-review-login {
  display: block;
  margin-top: var(--pt-3);
  padding: var(--pt-4);
  border: 1px dashed var(--pt-line-2);
  border-radius: var(--pt-r);
  text-align: center;
  font: var(--pt-t-small);
  color: var(--pt-ink-55);
}

/* --- Foto della recensione ------------------------------------------------ */

.pt-photo-drop {
  display: grid;
  place-items: center;
  min-height: 108px;
  margin-bottom: var(--pt-3);
  border: 1px dashed var(--pt-line-2);
  border-radius: var(--pt-r-sm);
  background: var(--pt-paper-2);   /* v65 — vedi la nota qui sopra */
  cursor: pointer;
  overflow: hidden;
}

.pt-photo-drop-empty { text-align: center; color: var(--pt-ink-55); font: var(--pt-t-small); font-size: 12.5px; }
.pt-photo-drop-empty i { display: block; font-size: 26px; margin-bottom: 5px; color: var(--pt-ink-45); }
.pt-photo-preview { width: 100%; max-height: 220px; object-fit: cover; display: block; }
.pt-photo-change { display: block; margin-top: 6px; font: var(--pt-t-small); font-size: 12px; color: var(--pt-sg); }

/* --- Lightbox ------------------------------------------------------------- */

.pt-lightbox {
  position: fixed;
  inset: 0;
  z-index: 80;
  display: grid;
  place-items: center;
  padding: var(--pt-4);
  background: rgb(var(--pt-notte) / 0.94);
}
.pt-lightbox[hidden] { display: none; }
.pt-lightbox img { max-width: 100%; max-height: 76vh; border-radius: var(--pt-r-sm); }
.pt-lightbox-caption { margin-top: var(--pt-3); text-align: center; color: #fff; font: var(--pt-t-small); }
.pt-lightbox-caption strong { display: block; font-weight: 700; }
.pt-lightbox-close {
  position: absolute;
  top: 14px;
  inset-inline-end: 14px;
  display: grid;
  place-items: center;
  width: 42px;
  height: 42px;
  border: 0;
  border-radius: 50%;
  background: rgba(255, 255, 255, 0.16);
  color: #fff;
  font-size: 23px;
  cursor: pointer;
}



/* ============================================================================
   8. ITINERARI
   ========================================================================== */

/* --- Le due porte in cima alla lista --------------------------------------
   Il tour lampo è l'azione forte (segnale pieno), creare il proprio tour è
   l'alternativa (contorno). Due tessere piene sarebbero due primi posti. */

.pt-cta-card {
  display: flex;
  align-items: center;
  gap: var(--pt-3);
  margin: 0 var(--pt-align) var(--pt-2);
  padding: var(--pt-4);
  border: 1px solid var(--pt-line-2);
  border-radius: var(--pt-r);
  background: var(--pt-card);
  color: var(--pt-ink);
  transition: border-color var(--pt-fast) var(--pt-ease);
}

.pt-cta-card h3 { font-size: 16.5px; letter-spacing: -0.03em; }
/* FASE F — la freccia in fondo alla riga, come in ogni altra riga che porta
   altrove (`.pt-tu-riga`, `.pt-altro-riga`). Stava attaccata al testo: a 1280
   a x=328, in una scheda che finisce a 1244. */
.pt-cta-card > .ti-chevron-right { margin-inline-start: auto; }
.pt-cta-card p { margin-top: 2px; font: var(--pt-t-small); font-size: 13px; color: var(--pt-ink-55); }

.pt-cta-icon {
  display: grid;
  place-items: center;
  flex: 0 0 auto;
  width: 44px;
  height: 44px;
  border-radius: var(--pt-r-icona);
  background: var(--pt-paper-2);
  color: var(--pt-ink-70);
  font-size: 22px;
}

/* v24 — LA SCHEDA CHE INDOSSAVA IL COSTUME DELL'AZIONE PRINCIPALE.

   `.pt-cta-lampo` era 358x92 px di rosso pieno: il segnale piu' forte che
   questa app possieda, addosso a una SCHEDA DI NAVIGAZIONE. Non e' un'azione —
   e' un `<a>` con il suo chevron, identico ai quattro fratelli che le stanno
   sotto: porta a un modulo, non fa niente.

   Il colore d'accento e' una risorsa finita: vale perche' e' raro. Speso per
   dire "questa voce di elenco e' piu' importante delle altre", non e' piu'
   disponibile quando serve dire "premi qui e parte".

   Se va promossa, la si promuove dove gia' e': prima delle altre. La posizione
   e' un modo di dire "comincia da qui" che non consuma niente.

   L'icona resta accesa: un accento piccolo su un elemento piccolo dichiara
   "questa e' la scorciatoia" senza pretendere di essere il comando. */
.pt-cta-lampo .pt-cta-icon { background: var(--pt-sg-tint); color: var(--pt-sg); }

.pt-itin-card h3 { font-size: 16.5px; letter-spacing: -0.03em; }
.pt-itin-card p { margin-top: 3px; font: var(--pt-t-small); font-size: 13px; color: var(--pt-ink-55); }
.pt-itin-card .pt-badge-cat { margin-top: var(--pt-2); }

/* --- Statistiche del percorso --------------------------------------------
   Tre numeri in fila: distanza, durata, tappe. È il dato che conta prima di
   partire, quindi è grande e squadrato. */

.pt-route-stats {
  display: grid;
  grid-template-columns: repeat(3, 1fr);
  gap: var(--pt-2);
  margin: var(--pt-4) var(--pt-align);
}

.pt-stat-card {
  padding: var(--pt-3) var(--pt-2);
  border: 1px solid var(--pt-line);
  border-radius: var(--pt-r-sm);
  background: var(--pt-card);
  text-align: center;
}
.pt-stat-card > i { display: block; font-size: 19px; color: var(--pt-ink-45); margin-bottom: 5px; }
.pt-stat-value {
  display: block;
  font: 800 21px/1.05 var(--pt-font);
  font-stretch: var(--pt-wide);
  letter-spacing: -0.04em;
}
.pt-stat-label {
  display: block;
  margin-top: 4px;
  font: var(--pt-t-label);
  font-size: 9.5px;
  letter-spacing: 0.13em;
  text-transform: uppercase;
  color: var(--pt-ink-55);
}

.pt-duration-breakdown {
  margin: calc(var(--pt-2) * -1) var(--pt-align) var(--pt-3);
  text-align: center;
  font: var(--pt-t-small);
  font-size: 12.5px;
  color: var(--pt-ink-55);
}

/* v38 — Il giro è finito: la riga che lo dice, e il comando che si accende.
   Finché mancavano sei tappe, «Concludi il tour» era un bottone qualunque con
   la stessa forma discreta; quando non manca più niente diventa l'unica cosa
   sensata da fare, e lo si vede. */
.pt-nav-finito {
  display: flex;
  align-items: center;
  gap: 8px;
  margin: 0 0 var(--pt-3);
  padding: 10px 13px;
  border-radius: var(--pt-r-sm);
  background: var(--pt-ok-tint);
  color: var(--pt-ok);
  font: var(--pt-t-strong);
  font-size: 14px;
}
.pt-nav-finito i { flex: 0 0 auto; font-size: 17px; }
.pt-nav-stop.is-principale {
  background: var(--pt-ok);
  border-color: var(--pt-ok);
  color: #fff;
}
.pt-percorso-nota.is-finito { color: var(--pt-ok); }

/* v34 — La riga che dichiara da dove sono misurati i tre numeri. Compare solo
   quando lo sono davvero: una nota sempre presente diventerebbe arredamento e
   smetterebbe di essere letta proprio quando conta. */
.pt-percorso-nota {
  display: flex;
  align-items: center;
  justify-content: center;
  gap: 6px;
  margin: 0 var(--pt-align) var(--pt-2);
  font: var(--pt-t-small);
  font-size: 12.5px;
  color: var(--pt-ok);
}
.pt-percorso-nota i { font-size: 14px; }

.pt-map-card { padding: 0; overflow: hidden; }
.pt-map-card > div { border-radius: var(--pt-r); }

/* ---------------------------------------------------------------------------
   L'USCITA DALL'APP — v23

   `.pt-open-route-btn` mandava su Google Maps ma era disegnato come le azioni
   che restano dentro: misurato, 358x47 px bianco a tutta larghezza, identico a
   "Modifica selezione" tranne il peso del carattere. Due conseguenze opposte,
   un peso tipografico di differenza.

   Un'uscita e' piu' debole di qualunque azione interna, e lo dichiara: la
   freccia in fondo e la riga sotto. Non e' meno raggiungibile — e' meno
   somigliante a ciò che non è.
   ------------------------------------------------------------------------- */
.pt-uscita-esterna {
  display: flex;
  align-items: center;
  justify-content: space-between;
  gap: var(--pt-3);
  width: calc(100% - var(--pt-gutter) * 2);
  min-height: 44px;
  margin: var(--pt-2) var(--pt-align);
  padding: 11px var(--pt-4);
  border: 1px solid var(--pt-line);
  border-radius: var(--pt-r-sm);
  background: var(--pt-card);
  color: var(--pt-ink-70);
  text-decoration: none;
  transition: border-color var(--pt-fast) var(--pt-ease);
}
.pt-uscita-esterna-testo {
  display: flex;
  flex-direction: column;
  gap: 2px;
  font: var(--pt-t-strong);
  font-weight: 600;
}
.pt-uscita-esterna-testo small {
  font: var(--pt-t-small);
  font-size: 12px;
  /* v64 — era `--pt-ink-45`, che il foglio dichiara NON adatto al testo: 3,58:1.
     Trovato dall'audit del contrasto, non a occhio. */
  color: var(--pt-ink-55);
  font-weight: 400;
}
.pt-uscita-esterna > .ti-external-link { font-size: 17px; color: var(--pt-ink-45); flex: 0 0 auto; }

/* ---------------------------------------------------------------------------
   IL GIRO PARTITO SENZA ACCOUNT — v23

   Prende il posto del bottone "Avvia": una volta acceso, ripremere non ha
   senso. Dice che è in corso e cosa aspettarsi, che è la sola cosa che serve
   sapere mentre si cammina.
   ------------------------------------------------------------------------- */
.pt-giro-stato {
  display: flex;
  flex-wrap: wrap;
  align-items: baseline;
  gap: 4px var(--pt-2);
  margin: 0;
  padding: var(--pt-3) var(--pt-4);
  border: 1px solid var(--pt-ok);
  border-radius: var(--pt-r-sm);
  background: var(--pt-ok-tint);
  color: var(--pt-ok);
  font: var(--pt-t-strong);
}
.pt-giro-stato i { font-size: 17px; }
.pt-giro-stato small {
  flex: 1 0 100%;
  font: var(--pt-t-small);
  color: var(--pt-ink-70);
}

/* L'invito a registrarsi, dopo il valore e non prima. */
.pt-ospite-traccia {
  margin-top: var(--pt-5);
  padding-top: var(--pt-4);
  border-top: 1px solid var(--pt-line);
}
.pt-ospite-traccia-titolo {
  margin: 0 0 4px;
  font: var(--pt-t-strong);
  font-weight: 800;
  color: var(--pt-ink);
}
.pt-ospite-traccia-testo {
  margin: 0 0 var(--pt-3);
  font: var(--pt-t-small);
  color: var(--pt-ink-70);
}

.pt-open-route-btn,
/* v33 — Qui c'erano le regole di `.pt-locate-btn`: un bottone pieno che,
   acceso, diventava nero. Ma il nero pieno è l'aspetto di un comando da
   premere, non di uno acceso — la stessa forma diceva due cose opposte.
   «Mostra dove sono» adesso è la stessa levetta dell'audioguida
   (`.pt-audio-toggle`, più sotto): stesso mestiere, stesso componente, una
   forma sola. Il nome resta solo come id per il JavaScript. */

.pt-locate-status, .pt-audio-status, .pt-lampo-gps-status {
  margin: 0 var(--pt-align) var(--pt-2);
  font: var(--pt-t-small);
  font-size: 12.5px;
  color: var(--pt-ink-55);
}

/* --- Tappe ---------------------------------------------------------------- */

.pt-tappa {
  display: flex;
  align-items: flex-start;
  gap: var(--pt-3);
  margin: 0 var(--pt-align) var(--pt-2);
  padding: var(--pt-3);
  border: 1px solid var(--pt-line);
  border-radius: var(--pt-r);
  background: var(--pt-card);
  color: var(--pt-ink);
  transition: border-color var(--pt-fast) var(--pt-ease);
}


.pt-tappa-num, .pt-edit-num, .pt-order-badge {
  display: grid;
  place-items: center;
  flex: 0 0 auto;
  width: 30px;
  height: 30px;
  border-radius: var(--pt-r-icona);
  background: var(--pt-scelto);
  color: #fff;
  font: 800 14px/1 var(--pt-font);
  font-variant-numeric: tabular-nums;
}

/* --- v76: LE TAPPE SONO UNA LINEA, NON UN ELENCO --------------------------

   Un percorso è una sequenza, e la differenza fra un elenco e una sequenza si
   vede invece di spiegarsi: un filo che scende dietro i numeri.

   Il filo sta sul contenitore e non su ogni tappa (`::before` su
   `.pt-tappe-linea`), per due motivi: una tappa non sa se è l'ultima, e il
   JavaScript della navigazione aggiunge e toglie classi sulle tappe di
   continuo — un filo fatto di pezzi si spezzerebbe a ogni spunta.

   Comincia e finisce dentro il primo e l'ultimo numero: una linea che sbuca
   sopra la prima tappa promette una tappa che non c'è. */
.pt-tappe-linea { position: relative; }
.pt-tappe-linea::before {
  content: "";
  position: absolute;
  left: calc(var(--pt-align) + var(--pt-3) + 15px);
  top: 27px;
  bottom: 27px;
  width: 2px;
  background: var(--pt-line-2);
  pointer-events: none;
}
/* Il numero sta SOPRA il filo, e ha un anello del colore della pagina: senza,
   il filo gli passa dietro e si vede spuntare ai lati del disco. */
.pt-tappe-linea .pt-tappa-num {
  position: relative;
  z-index: 1;
  box-shadow: 0 0 0 4px var(--pt-paper);
}
/* La scheda della tappa perde il proprio riquadro: dentro una sequenza i
   bordi fanno sei scatole in fila, che è esattamente la figura da cui si
   voleva uscire. Il filetto in basso basta a separarle. */
.pt-tappe-linea .pt-tappa {
  margin-bottom: 0;
  border: 0;
  border-radius: 0;
  border-bottom: 1px solid var(--pt-line);
  background: none;
  align-items: center;
}
.pt-tappe-linea .pt-tappa:last-child { border-bottom: 0; }
/* GLI STATI VANNO RIDICHIARATI QUI, E QUESTO È IL PUNTO PIÙ DELICATO DI v76.

   La prima stesura di questo blocco riportava «fatta» e «sei qui» a
   `var(--pt-card)` «perché sopra un fondo trasparente non si vedevano più»:
   cancellava il verde e il blu, cioè le due sole cose che quelle classi
   esistono per dire. L'ho tolta, e ho scritto nel commento che gli stati
   vincevano da soli «perché arrivano dopo nel foglio».

   Era falso, e il browser l'ha dimostrato: l'ordine decide solo A PARITÀ DI
   PESO. `.pt-tappe-linea .pt-tappa` sono due classi, `.pt-tappa-visited` è
   una: `background: none` e `border: 0` vincevano, e dentro il percorso la
   tappa raggiunta era **identica** a una non raggiunta — proprio la pagina che
   si guarda camminando, e proprio il difetto che v59 era nato per correggere.

   Non l'ha visto nessuna prova sul testo del foglio (il verde c'è, scritto
   dov'era): l'ha visto `collaudo_coerenza`, che apre un browser e legge il
   colore CALCOLATO. Da qui la prova nuova di v76, che il peso dei selettori lo
   conta invece di fidarsi dell'ordine.

   I colori sono quelli di v59, non altri, e l'ordine fra i due è quello di
   v59: `nearby` sta sotto, quindi una tappa già fatta davanti a cui ripassi
   dice «sei qui». Il bordo colorato si vede solo in basso, perché gli altri
   tre lati qui sono a zero: è la stessa informazione, nella forma di questa
   pagina. */
.pt-tappe-linea .pt-tappa-visited {
  background: var(--pt-ok-tint);
  border-bottom-color: var(--pt-ok);
}
.pt-tappe-linea .pt-tappa-nearby {
  background: var(--pt-scelto-tint);
  border-bottom-color: var(--pt-scelto);
}

.pt-tappe-testa { margin: var(--pt-6) var(--pt-align) var(--pt-3); }

.pt-tappa-info { flex: 1; min-width: 0; }
.pt-tappa-info h3 { font-size: 15.5px; letter-spacing: -0.028em; }
.pt-tappa-info p { margin-top: 3px; font: var(--pt-t-small); font-size: 12.5px; color: var(--pt-ink-55); }

.pt-tappa-listen {
  flex: 0 0 auto;
  display: grid;
  place-items: center;
  width: 40px;
  height: 40px;
  border: 0;
  /* v65 — tondo, e nel colore dell'azione: è l'unica cosa che si preme su una
     riga di tappa, e con il bordo grigio si confondeva con il numero. */
  border-radius: var(--pt-r-icona);
  background: var(--pt-sg-tint);
  color: var(--pt-sg);
  font-size: 19px;
  cursor: pointer;
}


/* --- v42 — «Visitato in precedenza» -----------------------------------------
   Due difetti in una riga sola, e il commento era il primo: parlava della
   tappa che il GPS ha appena raggiunto, che e' `.pt-tappa-nearby`, un'altra
   classe. Con il commento sbagliato sopra, la regola aveva preso in prestito
   il trattamento di quell'altra: bordo rosso e alone.

   Ma il rosso, in quest'app, vuol dire una cosa sola — «premi qui» — e questa
   riga non e' un'azione: e' un'informazione che non chiede niente. Con
   l'alone, per giunta, era la cosa piu' vistosa della tappa, piu' del nome del
   luogo.

   (`border-color` non faceva nemmeno quello che prometteva: il div non ha
   `border-style`, quindi il bordo non c'era e restava solo l'alone.)

   Adesso e' quello che dice di essere: una riga piccola, grigia, con l'icona
   della cronologia accanto. Si legge se la si cerca, non si impone. */
.pt-tappa-vista-prima {
  display: flex;
  align-items: center;
  gap: 5px;
  margin-top: 3px;
  font: var(--pt-t-small);
  font-size: 12px;
  color: var(--pt-ink-55);
}
.pt-tappa-vista-prima > i { font-size: 14px; color: var(--pt-ink-45); }


/* --- v59 — LE DUE CLASSI CHE IL JAVASCRIPT SCRIVEVA E IL FOGLIO NON CONOSCEVA
   Dal v42 `itinerario_detail.html` e `itinerario_custom.html` aggiungono
   `.pt-tappa-visited` quando una tappa viene spuntata e `.pt-tappa-nearby`
   quando il GPS dice che sei arrivato. Nessuna delle due aveva una regola.
   Il risultato in strada: cammini fin sotto il monumento, il telefono lo sa,
   e la riga non fa niente.

   Perche' nessuno se n'era accorto: la guardia sulle classi orfane guardava
   solo gli attributi `class="..."` dei template, e queste due non compaiono
   li' — le scrive il JavaScript a mano, a schermo acceso. Da v59 la guardia
   guarda anche `classList.add/toggle`, e queste due non possono piu' restare
   mute (`test_nessuna_classe_orfana`).

   I COLORI NON SONO A CASO, e in particolare non sono rossi. Il v42 aveva gia'
   sbagliato qui: il rosso `--pt-sg`, in quest'app, vuol dire «premi qui», e
   una tappa non e' un bottone.
     · fatta  -> verde `--pt-ok`, lo stesso verde di ogni «e' andata bene»
     · qui    -> blu `--pt-scelto`, lo stesso blu di ogni «questa, adesso»
                 (la voce attiva nel menu, il filtro scelto, la vista corrente)
   L'anello attorno alla tappa vicina serve perche' il numero della tappa e'
   GIA' blu di suo: senza, «sei qui» non si distinguerebbe da «sei altrove».

   L'ORDINE DELLE DUE REGOLE E' LA REGOLA: `nearby` sta sotto, quindi vince.
   Una tappa gia' fatta davanti a cui ripassi dice «sei qui», non «fatta»:
   l'informazione utile e' quella che riguarda adesso. */
.pt-tappa-visited {
  border-color: var(--pt-ok);
  background: var(--pt-ok-tint);
}
.pt-tappa-visited .pt-tappa-num {
  background: var(--pt-ok);
}

.pt-tappa-nearby {
  border-color: var(--pt-scelto);
  background: var(--pt-scelto-tint);
  box-shadow: 0 0 0 3px var(--pt-scelto-200);
}
.pt-tappa-nearby .pt-tappa-num {
  background: var(--pt-scelto-dark);
}

.pt-visited-toggle {
  flex: 0 0 auto;
  display: grid;
  place-items: center;
  width: 40px;
  height: 40px;
  border: 1px solid var(--pt-line-2);
  /* v65 — era l'ultimo contenitore d'icona rimasto squadrato: v64 aveva reso
     tondi la tessera di un luogo, l'icona di una riga del profilo e il numero
     di una tappa, e questo — che sta ACCANTO a un numero tondo, sulla stessa
     riga — era rimasto indietro. Due forme sulla stessa riga per due comandi
     che si somigliano è il difetto che la regola serviva a togliere. */
  border-radius: var(--pt-r-icona);
  background: var(--pt-card);
  color: var(--pt-ink-45);
  font-size: 18px;
  cursor: pointer;
  transition: all var(--pt-fast) var(--pt-ease);
}

/* v38 — IL SEGNO DI SPUNTA NON ERA UN SEGNO DI SPUNTA.

   Il markup è `<path d="M4 12.5l5 5L20 6.5">`: una spezzata APERTA, fatta per
   essere disegnata con un tratto. Ma qui non c'era nessuna regola per l'SVG,
   quindi valeva il default — `fill: black`, `stroke: none` — e il browser
   riempiva l'area racchiusa chiudendo il tracciato da sé. Il risultato non era
   una spunta: era un cuneo nero pieno.

   Ed era lo stesso cuneo, identico nella forma, sia da spenta sia da accesa:
   cambiava solo il colore dello sfondo. Segnalato così: «la check viene sempre
   attivata anche quando viene spenta. Se così deve funzionare tanto vale
   togliere il button». Aveva ragione: due stati che si distinguono solo per
   una sfumatura di sfondo, con dentro un segno che dice comunque «fatto»,
   sono un comando che non dice niente.

   Adesso il tracciato è un tratto. Da spenta è un segno leggero — «questa
   ancora no»; da accesa è bianco su verde pieno. */
.pt-visited-toggle svg {
  width: 21px;
  height: 21px;
  fill: none;
  stroke: currentColor;
  stroke-width: 2.6;
  stroke-linecap: round;
  stroke-linejoin: round;
}
.pt-visited-toggle.is-visited { background: var(--pt-ok); border-color: var(--pt-ok); color: #fff; }

.pt-visited-counter {
  margin: 0 var(--pt-align) var(--pt-2);
  font: var(--pt-t-small);
  font-size: 12.5px;
  color: var(--pt-ink-55);
}

/* v89 — UNA PAROLA CHE MANCAVA DA SEMPRE, E SI VEDE SOLO MISURANDO.

   `.pt-progress-track` è scritto come `<span>` nel dettaglio di un percorso e
   nel tour personalizzato. Un `<span>` è una scatola IN LINEA: l'altezza di
   7 px non la applica, e la barra veniva **alta zero e larga zero**.

   Misurato su un percorso in corso: `display: inline, h: 0, w: 0`. Il conto
   accanto («2/6 tappe visitate») si leggeva, la barra no — in nessuna delle
   due pagine, da quando esiste. Nessun errore, nessun avviso: una regola che
   dà un'altezza a una scatola che non può averla non protesta.

   `.pt-passport-track` funzionava per caso, perché lì il markup è un `<div>`.

   La parola sta QUI e non in una regola mia: un componente che ha bisogno che
   sia chi lo usa a dargli una forma è una trappola, e la prossima persona che
   lo riusa ci cade uguale. Sulle scatole che erano già blocchi non cambia
   niente — misurato prima e dopo. */
.pt-progress-track, .pt-passport-track, .pt-nav-progress {
  display: block;
  height: 7px;
  border-radius: var(--pt-r-pill);
  background: var(--pt-paper-2);
  overflow: hidden;
}
.pt-progress-fill, .pt-passport-fill {
  display: block;
  height: 100%;
  border-radius: var(--pt-r-pill);
  background: var(--pt-ok);
  transition: width var(--pt-med) var(--pt-ease);
}

/* --- v89: I PERCORSI IN «TU» ----------------------------------------------

   La voce e' un collegamento solo: nome, barra, e sotto la barra i due fatti
   che contano — a che punto sei e dove porta. Il comando e' uno `<span>`
   perche' la voce intera e' gia' il bersaglio (v84), e la barra e' quella che
   c'era gia': una terza barra in questo progetto diverge alla prima
   correzione. */
.pt-tu-tour {
  display: grid;
  gap: var(--pt-2);
  margin: var(--pt-3) var(--pt-align) 0;
  padding: 0;
  list-style: none;
}
.pt-tu-tour-voce {
  display: block;
  padding: var(--pt-3);
  border: 1px solid var(--pt-line);
  border-radius: var(--pt-r);
  background: var(--pt-card);
  color: var(--pt-ink);
  text-decoration: none;
}
.pt-tu-tour-voce > strong {
  display: block;
  margin-bottom: var(--pt-2);
  font-family: var(--pt-font-titolo);
  font-weight: 400;
  font-size: 17px;
  line-height: 1.2;
}
.pt-tu-tour-riga {
  display: flex;
  align-items: center;
  justify-content: space-between;
  gap: var(--pt-2);
  margin-top: var(--pt-2);
  min-height: 32px;
}
.pt-tu-tour-riga > small {
  color: var(--pt-ink-55);
  font: var(--pt-t-small);
  font-size: 12.5px;
  font-variant-numeric: tabular-nums;
}
.pt-tu-tour-via {
  display: inline-flex;
  align-items: center;
  gap: 5px;
  color: var(--pt-sg);
  font: var(--pt-t-strong);
  font-size: 13.5px;
}
.pt-tu-tour-via > i { font-size: 15px; }
@media (hover: hover) {
  .pt-tu-tour-voce:hover { border-color: var(--pt-line-2); }
}

/* --- Audioguida ----------------------------------------------------------- */

.pt-audio-toggle {
  display: flex;
  align-items: center;
  gap: var(--pt-3);
  /* v33 — Un <button> si stringe sul contenuto anche da flex: la levetta
     dell'audioguida era larga 191px e quella della posizione 234, due misure
     a caso per lo stesso componente. La larghezza la decide la colonna, non
     la lunghezza dell'etichetta. */
  width: calc(100% - var(--pt-gutter) * 2);
  margin: var(--pt-3) var(--pt-align);
  padding: var(--pt-3) var(--pt-4);
  border: 1px solid var(--pt-line-2);
  border-radius: var(--pt-r);
  background: var(--pt-card);
  cursor: pointer;
}
.pt-audio-toggle-main { flex: 1; min-width: 0; font: var(--pt-t-strong); }
.pt-audio-toggle-main small { display: block; font: var(--pt-t-small); font-size: 12.5px; color: var(--pt-ink-55); font-weight: 400; }

.pt-audio-switch {
  flex: 0 0 auto;
  position: relative;
  width: 46px;
  height: 27px;
  border-radius: var(--pt-r-pill);
  background: var(--pt-line-2);
  transition: background-color var(--pt-fast) var(--pt-ease);
}
.pt-audio-switch::after {
  content: "";
  position: absolute;
  top: 3px;
  left: 3px;
  width: 21px;
  height: 21px;
  border-radius: 50%;
  background: #fff;
  transition: transform var(--pt-fast) var(--pt-ease);
}
/* LA LEVETTA NON SI MUOVEVA MAI.
   Il JavaScript mette `.active` sul BOTTONE (`#pt-audio-toggle`), il foglio la
   cercava solo sulla levetta (`.pt-audio-switch.active`) — un selettore che
   nessuno scrive mai. Risultato: l'audioguida si accendeva davvero (la frase
   sotto diceva "Audioguida attiva"), ma la levetta restava grigia a sinistra.
   Due indicatori della stessa cosa che si contraddicevano, e quello che si
   guarda per primo è la levetta. Serviva il selettore discendente. */
input:checked + .pt-audio-switch,
.pt-audio-switch.active,
.pt-audio-toggle.active .pt-audio-switch { background: var(--pt-ok); }
input:checked + .pt-audio-switch::after,
.pt-audio-switch.active::after,
.pt-audio-toggle.active .pt-audio-switch::after { transform: translateX(19px); }

/* Acceso, anche il riquadro lo dice: un bordo verde invece del filetto neutro.
   Il colore non è l'unico segnale — la levetta si sposta e la frase sotto
   spiega — ma sono tre indizi concordi invece di due che litigano. */
.pt-audio-toggle.active { border-color: var(--pt-ok); }

/* Il banner "vuoi ascoltare la storia di X?": la narrazione non parte mai da
   sola, serve sempre un tocco. Che poi è anche il gesto utente che iOS
   richiede per far partire l'audio. */
.pt-audio-banner {
  position: fixed;
  left: 10px;
  right: 10px;
  bottom: var(--pt-sopra-nav);
  z-index: 45;
  display: flex;
  align-items: center;
  gap: var(--pt-3);
  padding: var(--pt-3) var(--pt-4);
  border-radius: var(--pt-r);
  background: var(--pt-ink);
  color: #fff;
  box-shadow: var(--pt-shadow-lift);
}
.pt-audio-banner[hidden] { display: none; }
.pt-audio-banner-icon { flex: 0 0 auto; font-size: 24px; color: var(--pt-sg); }
.pt-audio-banner-text { flex: 1; min-width: 0; font: var(--pt-t-strong); }
.pt-audio-banner-actions { display: flex; gap: var(--pt-2); flex: 0 0 auto; }
.pt-audio-banner-actions button {
  padding: 9px 14px;
  border: 0;
  border-radius: var(--pt-r-xs);
  font: var(--pt-t-strong);
  font-weight: 800;
  font-size: 13px;
  cursor: pointer;
}
#pt-audio-banner-yes { background: var(--pt-sg); color: #fff; }
#pt-audio-banner-no { background: rgba(255, 255, 255, 0.16); color: #fff; }

.pt-audio-player {
  position: fixed;
  left: 10px;
  right: 10px;
  bottom: var(--pt-sopra-nav);
  z-index: 45;
  display: flex;
  align-items: center;
  gap: var(--pt-3);
  padding: var(--pt-3) var(--pt-4);
  border-radius: var(--pt-r);
  background: var(--pt-ink);
  color: #fff;
  box-shadow: var(--pt-shadow-lift);
}
.pt-audio-player[hidden] { display: none; }
.pt-audio-player-info { display: flex; align-items: center; gap: 10px; flex: 1; min-width: 0; }
.pt-audio-player-info > .ti { font-size: 22px; color: var(--pt-sg); flex: 0 0 auto; }
.pt-audio-player-text { min-width: 0; }
.pt-audio-player-label {
  display: block;
  font: var(--pt-t-label);
  letter-spacing: 0.14em;
  text-transform: uppercase;
  color: rgba(255, 255, 255, 0.72);
}
.pt-audio-player-title {
  display: block;
  font: var(--pt-t-strong);
  overflow: hidden;
  text-overflow: ellipsis;
  white-space: nowrap;
}
.pt-audio-player-controls { display: flex; gap: 6px; flex: 0 0 auto; }
.pt-audio-player-controls button {
  display: grid;
  place-items: center;
  width: 36px;
  height: 36px;
  border: 0;
  border-radius: var(--pt-r-xs);
  background: rgba(255, 255, 255, 0.14);
  color: #fff;
  font-size: 18px;
  cursor: pointer;
}


/* "Anche qui intorno": quando più luoghi hanno le sfere di prossimità
   sovrapposte, uno solo fa partire l'audio. Gli altri finiscono qui. */
.pt-anche-qui {
  position: fixed;
  left: 10px;
  right: 10px;
  bottom: var(--pt-sopra-nav);
  z-index: 44;
  display: flex;
  align-items: center;
  gap: var(--pt-2);
  padding: 10px var(--pt-3);
  border-radius: var(--pt-r);
  background: var(--pt-card);
  border: 1px solid var(--pt-line-2);
  box-shadow: var(--pt-shadow-lift);
  overflow-x: auto;
  scrollbar-width: none;
}
.pt-anche-qui::-webkit-scrollbar { display: none; }
.pt-anche-qui-label {
  flex: 0 0 auto;
  font: var(--pt-t-label);
  letter-spacing: 0.13em;
  text-transform: uppercase;
  color: var(--pt-ink-55);
}
.pt-anche-qui-item {
  flex: 0 0 auto;
  padding: 6px 11px;
  border-radius: var(--pt-r-pill);
  background: var(--pt-paper-2);
  color: var(--pt-ink);
  font: var(--pt-t-strong);
  font-size: 13px;
  white-space: nowrap;
}


/* --- Azioni sul tour generato --------------------------------------------
   Una sola azione primaria, e la secondaria dichiarata ma non nascosta.
   Quando due comandi hanno lo stesso peso l'utente si ferma a decidere. */

.pt-tour-actions { margin: var(--pt-4) var(--pt-align); display: grid; gap: var(--pt-3); }
/* FASE D — IL MARGINE LO PORTA CHI STA IN `main` (la regola della FASE C).
   I due riquadri stanno direttamente in `main`, che margini non ne ha, e non
   se li mettevano: misurato sul giro generato, «Avvia il tour» andava da x=0
   a x=390 sul telefono — un riquadro con gli angoli tondi tagliati dal bordo
   dello schermo — e da 20 a 1260 sul largo, fuori dalla colonna della pagina
   (36–1244). */
.pt-save-tour-box, .pt-save-copy-box {
  margin: var(--pt-4) var(--pt-align);
  padding: var(--pt-4);
  border: 1px solid var(--pt-line);
  border-radius: var(--pt-r);
  background: var(--pt-card);
}
/* v24 — QUI C'ERANO QUINDICI NOMI PER UN RUOLO SOLO.
   
   Il ruolo "questa è l'azione principale" non era scritto da nessuna parte:
   era l'ELENCO a deciderlo. Ogni funzione nuova inventava la sua classe e
   qualcuno doveva ricordarsi di aggiungerla qui dentro. Quando non se lo
   ricordava, il comando cadeva fuori dal sistema in silenzio — è successo a
   "Invita amici" (`.pt-gruppo-invita`), che per versioni ha mostrato il
   rettangolo grigio di serie del browser senza che nessuno se ne accorgesse.
   Non era una distrazione: era il modo in cui il sistema era costruito a
   renderla inevitabile.

   Due delle quindici — `.pt-edit-cta` e `.pt-publish-cta` — venivano poi
   sovrascritte tre righe sotto per diventare secondarie: l'elenco dei primari
   conteneva due secondari.

   Il sistema giusto esisteva già, in questo stesso foglio: `.pt-btn` con i suoi
   ruoli (sezione 3). Era usato da otto comandi su venticinque. Adesso da tutti:
   il ruolo si dichiara nel markup, una volta, e chi legge il template sa che
   cosa sta guardando senza aprire il CSS.

   Le classi specifiche sopravvivono solo dove portano IMPAGINAZIONE propria
   (larghezza, margine) o servono da aggancio al JavaScript. Nessuna porta più
   l'aspetto. */

/* "Salva per dopo" è una sezione che si apre, non un bottone: era finita
   nell'elenco dei bottoni e da lì prendeva `display: inline-flex`, che
   stringeva a 38px tutto il suo contenuto. Un errore invisibile finché non si
   misura la larghezza di ciò che sta dentro. */
.pt-tour-salva-dopo {
  display: block;
  margin-top: var(--pt-3);
  padding: var(--pt-4);
  border: 1px solid var(--pt-line);
  border-radius: var(--pt-r);
  background: var(--pt-card);
}
.pt-tour-salva-dopo summary {
  cursor: pointer;
  gap: 8px;
  font: var(--pt-t-strong);
  font-weight: 800;
  list-style: none;
}
.pt-tour-salva-dopo summary::-webkit-details-marker { display: none; }
.pt-tour-salva-dopo input { margin-block: var(--pt-3); }

.pt-share-btn, .pt-tour-share {
  display: inline-flex;
  align-items: center;
  justify-content: center;
  gap: 8px;
  padding: 12px 16px;
  border: 1px solid var(--pt-line-2);
  border-radius: var(--pt-r-sm);
  background: var(--pt-card);
  color: var(--pt-ink);
  font: var(--pt-t-strong);
  cursor: pointer;
}


.pt-tour-delete, .pt-gruppo-esci, .pt-gruppo-rimuovi, .pt-uscita-annulla {
  border: 1px solid var(--pt-danger);
  border-radius: var(--pt-r-xs);
  background: var(--pt-card);
  color: var(--pt-danger);
  font: var(--pt-t-strong);
  font-size: 13px;
  padding: 8px 12px;
  cursor: pointer;
}


.pt-savings-note, .pt-min-warning, .pt-banner-min-poi {
  margin: 0 var(--pt-align) var(--pt-3);
  padding: 11px 14px;
  border: 1px solid var(--pt-ok);
  border-radius: var(--pt-r-sm);
  background: var(--pt-ok-tint);
  font: var(--pt-t-small);
  font-size: 13px;
  color: var(--pt-ok);
}
.pt-savings-note-neutral, .pt-min-warning {
  border-color: var(--pt-line-2);
  background: var(--pt-paper-2);
  color: var(--pt-ink-70);
}

.pt-optimize-toggle {
  display: flex;
  align-items: center;
  gap: var(--pt-3);
  margin: 0 var(--pt-align) var(--pt-3);
  padding: var(--pt-3) var(--pt-4);
  border: 1px solid var(--pt-line);
  border-radius: var(--pt-r);
  background: var(--pt-card);
  cursor: pointer;
}

.pt-acquire-banner, .pt-propose-cta {
  display: flex;
  align-items: center;
  gap: var(--pt-3);
  margin: var(--pt-4) var(--pt-align);
  padding: var(--pt-4);
  border: 1px solid var(--pt-line-2);
  border-radius: var(--pt-r);
  background: var(--pt-card);
  color: var(--pt-ink);
}
.pt-acquire-icon {
  display: grid;
  place-items: center;
  flex: 0 0 auto;
  width: 42px;
  height: 42px;
  border-radius: var(--pt-r-icona);
  background: var(--pt-paper-2);
  color: var(--pt-ink-70);
  font-size: 21px;
}
.pt-acquire-text { flex: 1; min-width: 0; font: var(--pt-t-strong); }
.pt-acquire-text small { display: block; font: var(--pt-t-small); font-size: 12.5px; font-weight: 400; color: var(--pt-ink-55); }

/* Non è un bottone: è uno <span> dentro un banner che è già tutto un link.
   Prendeva l'aspetto dall'elenco dei quindici primari — e ci stava per errore,
   perché un elemento non interattivo non può indossare la forma dell'azione
   principale. Adesso ha la sua: un invito leggibile, non un finto comando. */
.pt-acquire-cta {
  flex: 0 0 auto;
  padding: 8px 14px;
  border-radius: var(--pt-r-pill);
  background: var(--pt-sg-tint);
  color: var(--pt-sg);
  font: var(--pt-t-small);
  font-weight: 800;
  white-space: nowrap;
}

.pt-racconto {
  margin: var(--pt-4) var(--pt-align);
  padding: var(--pt-4);
  border: 1px solid var(--pt-line);
  border-radius: var(--pt-r);
  background: var(--pt-card);
}
.pt-racconto-head { display: flex; align-items: center; gap: 10px; margin-bottom: var(--pt-2); }
.pt-racconto-text { font: var(--pt-t-small); font-size: 14px; line-height: 1.55; color: var(--pt-ink-70); }
.pt-racconto-tip { margin-top: var(--pt-2); font: var(--pt-t-small); font-size: 12.5px; color: var(--pt-ink-55); }
.pt-racconto-good { color: var(--pt-ok); }
.pt-racconto-bad { color: var(--pt-danger); }

/* --- Barra di selezione del builder --------------------------------------- */

.pt-builder-section { margin-bottom: var(--pt-4); }
.pt-builder-item {
  display: flex;
  align-items: center;
  gap: var(--pt-3);
  margin: 0 var(--pt-align) 6px;
  padding: 12px var(--pt-3);
  border: 1px solid var(--pt-line);
  border-radius: var(--pt-r-sm);
  background: var(--pt-card);
  cursor: pointer;
  transition: border-color var(--pt-fast) var(--pt-ease);
}

/* La regola dello stato scelto sta più in basso, una volta sola: v65 ne ha
   tolta la copia che stava qui e diceva esattamente la stessa cosa. */
.pt-builder-item-text { flex: 1; min-width: 0; font: var(--pt-t-strong); }
.pt-builder-item-text small { display: block; font: var(--pt-t-small); font-size: 12px; font-weight: 400; color: var(--pt-ink-55); }
.pt-builder-checkbox { width: 21px; height: 21px; accent-color: var(--pt-sg); flex: 0 0 auto; }

/* v99 — LA BARRA NON GALLEGGIA PIÙ. È LA TERZA VOLTA CHE SI VEDE, LA PRIMA
   CHE SI TOGLIE.

   Qui sotto c'era il commento di v30, e vale la pena rileggerlo prima di
   cancellarlo, perché descriveva **esattamente questo difetto**:

     «la barra galleggiava in mezzo al contenuto e ci copriva sotto una riga
      di scelte. Qui scende al fondo, dove è sola.»

   v30 l'ha abbassata. La cura di un elemento che copre il contenuto non è
   spostarlo di ottantaquattro pixel: `fixed` copre quello che ha sotto a
   qualunque altezza lo si metta. È lo stesso errore che `position: sticky`
   ha fatto fare per tre rilasci sul comando della home — sembra la soluzione
   ed è la causa — e A-bis l'ha chiuso togliendolo, non abbassandolo.

   MISURATO PRIMA DI TOGLIERLO, su iPhone 12 a 568, 664 e 844, scorrendo
   tutta la pagina e contando solo quello che si vede davvero (niente dentro
   i pannelli chiusi, che è l'errore in cui ero cascato registrando B04):

     giro lampo      2-5 righe di categoria coperte
     costruttore     3-6 righe coperte
     modifica tappe  4 elementi, fra cui le frecce «sposta su» e «sposta giù»

   E il danno non è che una riga non si veda: è **che cosa succede se la si
   tocca**. Sotto il dito non c'è la riga, c'è il comando della barra. Chi
   voleva spuntare un luogo genera il percorso; chi voleva spostare una tappa
   salva e se ne va dalla pagina. È la regola di A-bis alla lettera: un
   comando sopra le risposte costa una scelta sbagliata senza accorgersene.

   IL CONTO, perché la barra qualcosa lo dava. Teneva sempre in vista il
   conteggio dei luoghi scelti, che cambia mentre si spunta. Ma ogni casella
   dice già di sé di essere spuntata, proprio dove il dito l'ha toccata: il
   conteggio è una conferma in più, non la conferma. E il posto dove serve
   davvero — «quante ne ho prese, posso andare?» — è accanto al comando, cioè
   dove sta adesso. Si paga un gesto: si scorre in fondo per generare. È lo
   stesso prezzo che A-bis ha accettato sulla home, e per la stessa ragione.

   `--pt-sopra-nav` resta in uso altrove (audioguida, pannello mappa), dove
   la riga di aggancio non cade sulle scelte di nessuno. */
.pt-builder-bar {
  margin: var(--pt-4) var(--pt-align) var(--pt-3);
  padding: var(--pt-3) var(--pt-4);
  border-radius: var(--pt-r);
  background: var(--pt-ink);
  color: #fff;
  box-shadow: var(--pt-shadow-lift);
}

.pt-builder-bar-row { display: flex; align-items: center; gap: var(--pt-3); }
/* v30 — Quando il testo di sinistra non c'è (nel tour lampo non c'è mai:
   quella riga di stato è rimasta vuota), il bottone restava schiacciato a
   destra e metà barra era una lastra nera senza motivo. Se non c'è niente da
   dire, la barra è tutta il comando. */
.pt-builder-bar-row > span:empty { display: none; }
.pt-builder-bar-row:has(> span:empty) .pt-btn,
.pt-builder-bar-row:has(> span:empty) button { flex: 1; justify-content: center; }
.pt-builder-bar-row span { flex: 1; min-width: 0; font: var(--pt-t-strong); }
.pt-builder-bar button, .pt-builder-bar .pt-btn {
  flex: 0 0 auto;
  padding: 11px 16px;
  border: 0;
  border-radius: var(--pt-r-xs);
  background: var(--pt-sg);
  color: #fff;
  font: var(--pt-t-strong);
  font-weight: 800;
  cursor: pointer;
}

/* Spento deve SEMBRARE spento, non rotto: fondo appena accennato e testo
   attenuato, ma ancora leggibile (7,4:1) — chi non capisce perché un bottone
   è inattivo non lo attiva mai. La frase accanto dice il motivo. */
.pt-builder-bar button:disabled,
.pt-builder-bar .pt-btn:disabled {
  background: rgb(255 255 255 / 0.10);
  color: rgb(255 255 255 / 0.55);
  cursor: not-allowed;
  transform: none;
}
.pt-builder-bar button:disabled i { opacity: 0.55; }
.pt-builder-ripreso { margin-top: 6px; font: var(--pt-t-small); font-size: 12px; color: #fff; }   /* v64 — era velato, e la regola non dichiara su che cosa sta */

.pt-endpoints { display: grid; gap: var(--pt-3); margin: 0 var(--pt-align) var(--pt-4); }
.pt-endpoint-field { display: grid; gap: 5px; }
.pt-cat-toggle { cursor: pointer; }

/* --- Tour lampo ----------------------------------------------------------- */

.pt-lampo-section { margin: var(--pt-4) var(--pt-align); }
/* v30 — erano `display: flex` con `flex-wrap`: le pastiglie andavano a capo a
   larghezze diverse e producevano un mosaico frastagliato — una riga con una
   voce lunga, poi due corte, poi una lunga. La griglia (sezione 3) dà a tutte
   la stessa larghezza, ed è la stessa di «Scopri»: due schermate che fanno
   cose parenti adesso si somigliano. */
/* v30 — Erano la stessa cosa: due pillole. Ma una pillola regge un'etichetta
   corta su una riga sola; «Itinerario Arabo-Normanno» dentro mezza colonna va
   a capo tre volte, e una pillola alta tre righe non è una pillola, è un ovale
   con dentro un paragrafo. Il tempo resta pillola (le etichette sono corte
   davvero), le categorie diventano schede come in «Scopri». */
.pt-lampo-chip, .pt-lampo-cat {
  display: flex;
  align-items: center;
  gap: 6px;
  border: 1px solid var(--pt-line-2);
  background: var(--pt-card);
  color: var(--pt-ink-70);
  font: var(--pt-t-strong);
  font-size: 13.5px;
  cursor: pointer;
  transition: background 0.14s ease, border-color 0.14s ease, color 0.14s ease;
}
.pt-lampo-chip {
  justify-content: center;
  min-height: 46px;
  padding: 10px var(--pt-2);
  border-radius: var(--pt-r-pill);
  font-size: 14px;
}

/* La scheda categoria: l'icona apre la riga, il nome la occupa, e la casella
   di sistema sparisce alla vista ma resta sotto le dita e sotto la tastiera —
   il segnale di scelto è la scheda che si riempie, lo stesso gesto che il
   riquadro del tempo insegna due sezioni più su. */
.pt-lampo-cat {
  align-items: stretch;
  padding: 0;
  border-radius: var(--pt-r-sm);
  font-size: 13px;
}
.pt-lampo-cat > input {
  position: absolute;
  width: 1px; height: 1px; margin: 0;
  opacity: 0;
  pointer-events: none;
}
.pt-lampo-cat > span {
  display: flex;
  align-items: center;
  gap: 8px;
  width: 100%;
  min-height: 46px;
  padding: 9px var(--pt-3);
  line-height: 1.25;
  hyphens: auto;
}
.pt-lampo-chip.active, .pt-lampo-cat.active,
.pt-lampo-cat:has(> input:checked) {
  background: var(--pt-scelto); border-color: var(--pt-scelto); color: #fff;
}
/* La casella nascosta non deve nascondere anche il fuoco da tastiera. */
.pt-lampo-cat:has(> input:focus-visible) {
  outline: 2px solid var(--pt-sg);
  outline-offset: 2px;
}

.pt-lampo-radio {
  display: flex;
  align-items: center;
  gap: var(--pt-3);
  margin-bottom: 6px;
  padding: 12px var(--pt-3);
  border: 1px solid var(--pt-line);
  border-radius: var(--pt-r-sm);
  background: var(--pt-card);
  cursor: pointer;
}
.pt-lampo-radio.active, .pt-gruppo-radio.active, .pt-accesso-radio.active {
  border-color: var(--pt-scelto);
  /* v65 — «scelto» era il colore del fondo pagina: una voce selezionata
     diventava più spenta, non più accesa. Adesso prende il tinto del blu, che
     è il token che in tutta l'app vuol dire «questo, adesso». */
  background: var(--pt-scelto-tint);
}
/* DUE PALLINI PER LA STESSA SCELTA.
   Il pallino disegnato (`-dot`) sta ACCANTO al `<input type="radio">` vero, che
   nessuno nascondeva: si vedevano entrambi — quello di sistema, blu, e quello
   del sistema di design, rosso — e sembravano due controlli distinti per la
   stessa domanda. È lo stesso difetto già corretto sulle caselle del
   costruttore. L'input resta nel documento (serve al modulo, alla tastiera e
   ai lettori di schermo), ma non si vede. */
.pt-lampo-radio > input[type="radio"],
.pt-gruppo-radio > input[type="radio"],
.pt-accesso-radio > input[type="radio"] {
  position: absolute;
  width: 1px; height: 1px;
  padding: 0; margin: -1px;
  overflow: hidden;
  clip: rect(0, 0, 0, 0);
  white-space: nowrap;
  border: 0;
}
/* Chi ospita un controllo nascosto in posizione assoluta si dichiara
   riferimento: vedi la sezione 7-bis del documento di design. */
.pt-lampo-radio, .pt-gruppo-radio, .pt-accesso-radio { position: relative; }
/* Il fuoco da tastiera non deve sparire con l'input: lo prende la riga. */
.pt-lampo-radio > input:focus-visible ~ .pt-lampo-radio-dot,
.pt-gruppo-radio > input:focus-visible ~ .pt-gruppo-radio-dot {
  outline: 3px solid var(--pt-sg);
  outline-offset: 2px;
}

.pt-lampo-radio-dot, .pt-gruppo-radio-dot {
  flex: 0 0 auto;
  width: 19px;
  height: 19px;
  border: 2px solid var(--pt-line-2);
  border-radius: 50%;
}
.pt-lampo-radio.active .pt-lampo-radio-dot,
.pt-gruppo-radio.active .pt-gruppo-radio-dot {
  border-color: var(--pt-sg);
  border-width: 6px;
}

.pt-lampo-badge {
  margin: var(--pt-4) var(--pt-align);
  padding: var(--pt-4);
  border: 1px solid var(--pt-scelto);
  border-radius: var(--pt-r);
  background: var(--pt-card);
}
.pt-lampo-badge-head { display: flex; align-items: center; justify-content: space-between; gap: var(--pt-3); }
.pt-lampo-badge-label {
  display: inline-flex;
  align-items: center;
  gap: 6px;
  font: var(--pt-t-label);
  letter-spacing: 0.14em;
  text-transform: uppercase;
  color: var(--pt-sg);
}
.pt-lampo-badge-time { font: 800 16px/1 var(--pt-font); font-stretch: var(--pt-wide); letter-spacing: -0.03em; }
.pt-lampo-bar { height: 7px; margin-top: var(--pt-3); border-radius: var(--pt-r-pill); background: var(--pt-paper-2); overflow: hidden; }
.pt-lampo-bar > span { display: block; height: 100%; border-radius: var(--pt-r-pill); background: var(--pt-sg); }

/* ERA IN RIGA CON QUATTRO FIGLI. La regola era stata scritta per due — icona
   e testo, affiancati — e poi dentro al riquadro sono finiti anche la scheda
   del luogo più vicino e il pulsante "torna alla selezione". Restando
   `flex-direction: row`, i quattro si spartivano la larghezza: misurati su uno
   schermo da 412px facevano 24, 39, 85 e 130 pixel, ognuno alto nove righe,
   con una parola per riga. Si vedeva solo nel caso "il tempo non basta", che
   capita raramente — e infatti è arrivato da un utente.

   Adesso è una COLONNA: la riga icona+testo in cima (`.pt-lampo-limite-capo`),
   sotto la scheda e il pulsante, ognuno a tutta larghezza. */
.pt-lampo-limite {
  display: flex;
  flex-direction: column;
  gap: var(--pt-3);
  margin: var(--pt-4) var(--pt-align);
  padding: var(--pt-4);
  border: 1px solid var(--pt-oro-200);
  border-radius: var(--pt-r);
  background: var(--pt-oro-tint);
}
.pt-lampo-limite-capo { display: flex; align-items: flex-start; gap: var(--pt-3); }
.pt-lampo-limite-icon { flex: 0 0 auto; font-size: 24px; line-height: 1.2; color: var(--pt-oro-testo); }
.pt-lampo-limite-text { flex: 1; min-width: 0; margin: 0; font: var(--pt-t-small); color: var(--pt-ink-70); }
/* Dentro il riquadro la scheda non ha bisogno dei propri margini di pagina:
   ce li mette il `padding` del riquadro. */
.pt-lampo-limite .pt-lampo-poi-card,
.pt-lampo-limite .pt-lampo-riprova { margin-inline: 0; width: 100%; }

.pt-lampo-poi-card {
  display: flex;
  align-items: center;
  gap: var(--pt-3);
  margin: 0 var(--pt-align) var(--pt-2);
  padding: var(--pt-3);
  border: 1px solid var(--pt-line);
  border-radius: var(--pt-r);
  background: var(--pt-card);
  color: var(--pt-ink);
}
.pt-lampo-poi-info { flex: 1; min-width: 0; }
.pt-lampo-poi-info h3 { font-size: 15.5px; letter-spacing: -0.028em; }
.pt-lampo-poi-cat { font: var(--pt-t-label); letter-spacing: 0.12em; text-transform: uppercase; color: var(--pt-ink-55); }

/* --- Modifica tappe ------------------------------------------------------- */

.pt-edit-section { margin: var(--pt-4) var(--pt-align); }
.pt-edit-list { display: grid; gap: 6px; }
.pt-edit-item {
  display: flex;
  align-items: center;
  gap: var(--pt-2);
  padding: 10px var(--pt-3);
  border: 1px solid var(--pt-line);
  border-radius: var(--pt-r-sm);
  background: var(--pt-card);
}
.pt-edit-nome { flex: 1; min-width: 0; font: var(--pt-t-strong); overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
.pt-edit-actions { display: flex; gap: 4px; flex: 0 0 auto; }
/* `.pt-edit-add` NON sta in questo gruppo: gli altri tre sono bottoni-icona
   quadrati, lui è un bottone di testo che porta il nome di un luogo. Ci era
   finito dentro, prendeva `width: 34px` (poi 44px su telefono) e
   `place-items: center`, e il nome del luogo usciva dal riquadro sovrapponendosi
   alle righe vicine: l'elenco "aggiungi tappe" era illeggibile. */
.pt-edit-up, .pt-edit-down, .pt-edit-remove {
  display: grid;
  place-items: center;
  width: 34px;
  height: 34px;
  border: 1px solid var(--pt-line-2);
  border-radius: var(--pt-r-xs);
  background: var(--pt-card);
  color: var(--pt-ink-70);
  font-size: 17px;
  cursor: pointer;
}
/* FASE H — «su» della prima tappa e «giù» dell'ultima sono spenti (`disabled`)
   e si presentavano identici agli altri, con la manina: un comando che non
   risponde. Adesso si vede che non c'è niente da fare. */
.pt-edit-up:disabled, .pt-edit-down:disabled { cursor: default; opacity: 0.35; }


.pt-edit-cat-head {
  margin: var(--pt-3) 0 var(--pt-2);
  font: var(--pt-t-label);
  letter-spacing: 0.14em;
  text-transform: uppercase;
  color: var(--pt-ink-55);
}


/* ============================================================================
   9. PASSAPORTO
   ============================================================================
   È l'unico posto in cui l'oro ha diritto di comparire: il passaporto è ciò
   che l'utente si conquista camminando. Se l'oro finisse anche altrove, qui
   smetterebbe di significare qualcosa.
   ========================================================================== */

.pt-passport-hero {
  margin: var(--pt-3) var(--pt-align) 0;
  padding: var(--pt-5);
  border: 1px solid var(--pt-oro-200);
  border-radius: var(--pt-r-lg);
  background: var(--pt-oro-tint);
}
.pt-passport-hero h1, .pt-passport-hero h2 { font-size: 25px; letter-spacing: -0.04em; }
.pt-passport-sub { margin-top: 6px; font: var(--pt-t-small); color: var(--pt-ink-70); }

/* v77 — stessa correzione della testata di sezione: «12%» e «12/101 luoghi
   visitati» sono la stessa frase detta due volte, e a 1280 stavano a 895 px
   l'uno dall'altro. Il numero grande e la sua spiegazione vanno letti insieme. */
.pt-passport-progress-head {
  display: flex;
  align-items: baseline;
  justify-content: flex-start;
  gap: var(--pt-3);
  margin: var(--pt-5) 0 var(--pt-2);
}
.pt-passport-pct {
  font: 800 34px/1 var(--pt-font);
  font-stretch: var(--pt-wide);
  letter-spacing: -0.045em;
  color: var(--pt-oro-testo);
}
.pt-passport-count { font: var(--pt-t-small); color: var(--pt-ink-70); }
.pt-passport-track { background: color-mix(in srgb, var(--pt-oro) 20%, transparent); }
.pt-passport-fill { background: var(--pt-oro); }

.pt-collect-grid {
  display: grid;
  grid-template-columns: repeat(auto-fill, minmax(96px, 1fr));
  gap: var(--pt-2);
  margin: 0 var(--pt-align);
}
.pt-collect-item {
  position: relative;
  display: block;
  padding: var(--pt-2);
  border: 1px solid var(--pt-line);
  border-radius: var(--pt-r-sm);
  background: var(--pt-card);
  color: var(--pt-ink);
  text-align: center;
}

.pt-collect-thumb {
  display: grid;
  place-items: center;
  height: 52px;
  margin-bottom: 6px;
  border-radius: var(--pt-r-xs);
  background: var(--pt-paper-2);
  color: var(--pt-ink-45);
  font-size: 23px;
}
/* Un luogo raccolto porta il sigillo: fondo oro e spunta. */
.pt-collect-item.collected .pt-collect-thumb { background: var(--pt-oro); color: #fff; }
.pt-collect-check {
  position: absolute;
  top: 6px;
  inset-inline-end: 6px;
  display: grid;
  place-items: center;
  width: 20px;
  height: 20px;
  border-radius: 50%;
  background: var(--pt-oro);
  color: #fff;
  font-size: 13px;
}
.pt-collect-name {
  display: block;
  font: var(--pt-t-label);
  font-size: 10.5px;
  letter-spacing: 0.02em;
  text-transform: none;
  line-height: 1.25;
  overflow: hidden;
  display: -webkit-box;
  -webkit-line-clamp: 2;
  -webkit-box-orient: vertical;
}
.pt-collect-date { display: block; margin-top: 3px; font: var(--pt-t-small); font-size: 10px; color: var(--pt-oro-testo); }
.pt-collect-todo { color: var(--pt-ink-55); }   /* v64 — era -45: 3,58:1 */

/* FASE H — IL DEBITO 14: L'ULTIMA TARGA NON RESTA SOLA A META' RIGA.
   Era una griglia `auto-fill`: cinque riconoscimenti in due colonne facevano
   2 + 2 + 1, e in quattro (il tablet, 768 e 1024) 4 + 1 — l'ultima, «Cittadino
   onorario», da sola in un angolo, con il vuoto accanto. Adesso le targhe
   vanno a capo come le parole: stessa misura minima (148, e 230 sul largo),
   quindi le righe piene sono larghe al pixel come prima, e l'ultima riga si
   allarga fino a riempirsi. La targa che resta sola diventa una riga intera,
   e per il riconoscimento più grande è la misura giusta. Misurato a 320, 390,
   430, 768, 1024 e 1280. */
.pt-badge-grid {
  display: flex;
  flex-wrap: wrap;
  gap: var(--pt-2);
  margin: 0 var(--pt-align);
}
.pt-badge-grid > .pt-badge-item { flex: 1 1 148px; min-width: 0; }
.pt-badge-item {
  display: flex;
  align-items: flex-start;
  gap: var(--pt-3);
  padding: var(--pt-3);
  border: 1px solid var(--pt-line);
  border-radius: var(--pt-r-sm);
  background: var(--pt-card);
}
.pt-badge-icon {
  display: grid;
  place-items: center;
  flex: 0 0 auto;
  width: 40px;
  height: 40px;
  border-radius: 50%;
  background: var(--pt-oro);
  color: #fff;
  font-size: 21px;
}
.pt-badge-lock .pt-badge-icon,
.pt-badge-item.pt-badge-lock .pt-badge-icon { background: var(--pt-paper-2); color: var(--pt-ink-45); }
.pt-badge-text { flex: 1; min-width: 0; }
.pt-badge-text strong { display: block; font: var(--pt-t-strong); font-size: 13.5px; }
.pt-badge-text small { display: block; margin-top: 2px; font: var(--pt-t-small); font-size: 11.5px; color: var(--pt-ink-55); }
.pt-badge-progress { margin-top: 5px; font: var(--pt-t-label); font-size: 10px; letter-spacing: 0.08em; color: var(--pt-oro-testo); }


/* ============================================================================
   10. GRUPPI, USCITE, COMMUNITY
   ========================================================================== */

.pt-gruppo, .pt-gruppo-attiva, .pt-accesso-pannello, .pt-uscita, .pt-uscita-programma {
  margin: var(--pt-4) var(--pt-align);
  padding: var(--pt-4);
  border: 1px solid var(--pt-line);
  border-radius: var(--pt-r);
  background: var(--pt-card);
}
.pt-gruppo-head, .pt-gruppo-attiva-head, .pt-gruppo-join-head {
  display: flex;
  align-items: center;
  gap: var(--pt-3);
}
.pt-gruppo-title, .pt-gruppi-titolo { font-size: 17px; letter-spacing: -0.032em; }
.pt-gruppo-attiva-freccia { margin-left: auto; color: var(--pt-ink-45); transition: transform var(--pt-fast) var(--pt-ease); }
details[open] .pt-gruppo-attiva-freccia { transform: rotate(90deg); }
.pt-gruppo-attiva summary { list-style: none; cursor: pointer; }
.pt-gruppo-attiva summary::-webkit-details-marker { display: none; }

.pt-gruppo-lista { display: grid; margin-top: var(--pt-3); }
/* Il filetto separa DUE membri: sul primo era una riga sospesa sotto le
   pastiglie, che sembrava un errore di disegno. Con un solo partecipante —
   il caso di chi ha appena creato il gruppo — era l'unica cosa che si vedeva. */
.pt-gruppo-membro {
  display: flex;
  align-items: center;
  gap: var(--pt-3);
  padding: 10px 0;
}
.pt-gruppo-membro + .pt-gruppo-membro { border-top: 1px solid var(--pt-line); }
.pt-gruppo-nome { flex: 1; min-width: 0; font: var(--pt-t-strong); }
/* Nome sopra, ruolo sotto: erano sulla stessa riga e con un nome lungo (o un
   indirizzo email) "Organizzatore" finiva a capo da solo. */
.pt-gruppo-nome small {
  display: block;
  margin-top: 1px;
  font: var(--pt-t-small);
  font-size: 12px;
  font-weight: 400;
  color: var(--pt-ink-55);
}
.pt-gruppo-badges { display: flex; gap: 5px; flex-wrap: wrap; margin-top: var(--pt-2); }

/* Il conteggio è un DATO, e nel sistema i dati sono pastiglie squadrate in
   inchiostro pieno (come `.pt-section-count`). Era testo grigio accanto al
   titolo, che si leggeva come una nota a margine invece che come "quanti
   siete". */
/* FASE F — e resta il gemello di `.pt-section-count`: dati, non azioni.
   Il fondo quieto è quello di lui, e la ragione è scritta lì. */
.pt-gruppo-count {
  flex: 0 0 auto;
  margin-left: auto;
  padding: 4px 9px;
  border-radius: var(--pt-r-xs);
  background: var(--pt-paper-2);
  color: var(--pt-ink-70);
  font: var(--pt-t-label);
  font-size: 11px;
  font-variant-numeric: tabular-nums;
}

/* ERA UN BOTTONE SENZA NESSUNO STILE: solo `display:flex` e un margine. Il
   browser ci metteva il suo — bordo nero squadrato, carattere di sistema — in
   mezzo a una scheda del sistema di design. Ed è l'azione che dà senso a tutta
   la sezione: un viaggio di gruppo con un partecipante solo è un tour normale.
   Contorno e non pieno, perché il pieno di questa pagina è già preso
   dall'azione del tour ("Avvia" / "Concludi"): due pieni sono due primi posti. */
.pt-gruppo-invita {
  display: flex;
  align-items: center;
  justify-content: center;
  gap: var(--pt-2);
  width: 100%;
  min-height: 44px;
  margin-top: var(--pt-4);
  padding: 12px var(--pt-4);
  border: 1px solid var(--pt-scelto);
  border-radius: var(--pt-r-sm);
  background: var(--pt-card);
  color: var(--pt-ink);
  font: var(--pt-t-strong);
  font-weight: 800;
  cursor: pointer;
  transition: background-color var(--pt-fast) var(--pt-ease);
}
.pt-gruppo-invita i { font-size: 18px; }
.pt-gruppo-invita:active { transform: scale(0.985); }

/* IL PANNELLO DELLE IMPOSTAZIONI ERA UNA SCHEDA DENTRO UNA SCHEDA.
   `.pt-accesso-pannello` sta nell'elenco che dà bordo, fondo e padding alle
   sezioni di primo livello; annidato dentro `.pt-gruppo` disegnava un secondo
   riquadro con dentro una riga sola e un grande vuoto sotto. Qui dentro
   diventa una riga apribile, separata da un filetto: la stessa cosa, senza la
   cornice. */
.pt-gruppo > .pt-accesso-pannello {
  margin: var(--pt-4) 0 0;
  padding: var(--pt-3) 0 0;
  border: 0;
  border-top: 1px solid var(--pt-line);
  border-radius: 0;
  background: none;
}
.pt-accesso-pannello > summary {
  display: flex;
  align-items: center;
  gap: var(--pt-2);       /* l'ingranaggio era incollato al testo */
  min-height: 44px;
  font: var(--pt-t-strong);
  color: var(--pt-ink);
  cursor: pointer;
  list-style: none;
}
.pt-accesso-pannello > summary::-webkit-details-marker { display: none; }
.pt-accesso-pannello > summary > i:first-child { font-size: 19px; color: var(--pt-ink-70); }
/* La freccia dice che si apre: prima niente lo diceva, e un pannello chiuso
   senza indizi è un pannello che nessuno apre. */
.pt-accesso-pannello > summary::after {
  content: "\ea5f";                   /* ti-chevron-down */
  content: "\ea5f" / "";            /* FASE H — la stessa icona, senza nome: il lettore di schermo non la legge */
  margin-left: auto;
  font-family: "tabler-icons";
  font-size: 17px;
  color: var(--pt-ink-45);
  transition: transform var(--pt-fast) var(--pt-ease);
}
.pt-accesso-pannello[open] > summary::after { transform: rotate(180deg); }
.pt-accesso-pannello > form { margin-top: var(--pt-3); }
/* La nota e l'etichetta che la segue erano attaccate: due frasi diverse che
   sembravano un paragrafo solo. */
.pt-accesso-nota { margin: var(--pt-3) 0; }
.pt-accesso-pannello .pt-uscita-label { display: block; margin-bottom: var(--pt-2); }
.pt-accesso-pannello .pt-uscita-salva { margin-top: var(--pt-4); }
.pt-gruppo-permesso-label { font: var(--pt-t-strong); }
.pt-gruppo-radio, .pt-accesso-radio {
  display: flex;
  align-items: flex-start;
  gap: var(--pt-3);
  margin-bottom: 6px;
  padding: 12px var(--pt-3);
  border: 1px solid var(--pt-line);
  border-radius: var(--pt-r-sm);
  background: var(--pt-card);
  cursor: pointer;
}
.pt-gruppo-radio-text { flex: 1; min-width: 0; font: var(--pt-t-strong); }
.pt-gruppo-radio-text small { display: block; margin-top: 2px; font: var(--pt-t-small); font-size: 12.5px; font-weight: 400; color: var(--pt-ink-55); }
.pt-gruppo-join { margin: var(--pt-4) var(--pt-align); padding: var(--pt-5); border: 1px solid var(--pt-scelto); border-radius: var(--pt-r); background: var(--pt-card); }
.pt-gruppo-join-sub { margin-top: 6px; font: var(--pt-t-small); color: var(--pt-ink-55); }
.pt-gruppo-join-btn { width: 100%; margin-top: var(--pt-3); }
.pt-gruppo-join-full { color: var(--pt-danger); font: var(--pt-t-strong); }
.pt-gruppo-partecipanti-nascosti { font: var(--pt-t-small); color: var(--pt-ink-55); }

.pt-bacheca-card { display: flex; align-items: stretch; gap: var(--pt-3); padding: 0; overflow: hidden; }
.pt-bacheca-data {
  display: grid;
  place-content: center;
  flex: 0 0 auto;
  width: 66px;
  padding: var(--pt-3) 0;
  background: var(--pt-scelto);
  color: #fff;
  text-align: center;
}
.pt-bacheca-giorno { display: block; font: 800 22px/1 var(--pt-font); font-stretch: var(--pt-wide); letter-spacing: -0.04em; }
.pt-bacheca-mese {
  display: block;
  margin-top: 3px;
  font: var(--pt-t-label);
  font-size: 9.5px;
  letter-spacing: 0.15em;
  text-transform: uppercase;
  color: #fff;   /* v64 — era 80%: 4,07:1 sul blu acceso */
}
.pt-bacheca-corpo { flex: 1; min-width: 0; padding: var(--pt-3) var(--pt-4) var(--pt-3) 0; }
.pt-bacheca-corpo h3 { font-size: 16px; letter-spacing: -0.03em; }
.pt-bacheca-meta { display: flex; flex-wrap: wrap; gap: 4px 12px; margin-top: 6px; font: var(--pt-t-small); font-size: 12.5px; color: var(--pt-ink-55); }
.pt-bacheca-posti { font-weight: 700; color: var(--pt-ok); }
.pt-bacheca-incorso { color: var(--pt-sg); font-weight: 700; }
.pt-bacheca-avviso {
  margin: var(--pt-3) var(--pt-align);
  padding: 12px 14px;
  border: 1px solid var(--pt-oro-200);
  border-radius: var(--pt-r-sm);
  background: var(--pt-oro-tint);
  font: var(--pt-t-small);
  font-size: 12.5px;
  color: var(--pt-ink-70);
}

.pt-community-card-head { display: flex; align-items: flex-start; gap: var(--pt-3); }
.pt-community-card-head h3 { flex: 1; font-size: 16.5px; letter-spacing: -0.03em; }
.pt-community-meta { display: flex; flex-wrap: wrap; gap: 4px 12px; margin-top: 6px; font: var(--pt-t-small); font-size: 12.5px; color: var(--pt-ink-55); }
.pt-community-racconto { margin-top: var(--pt-3); font: var(--pt-t-small); font-size: 13.5px; line-height: 1.5; color: var(--pt-ink-70); }
.pt-community-card-foot { display: flex; align-items: center; justify-content: space-between; gap: var(--pt-3); margin-top: var(--pt-3); padding-top: var(--pt-3); border-top: 1px solid var(--pt-line); }
.pt-community-copie { font: var(--pt-t-small); font-size: 12.5px; color: var(--pt-ink-55); }
.pt-community-go { color: var(--pt-sg); font: var(--pt-t-strong); }

.pt-uscita-quando { display: flex; align-items: center; gap: 8px; font: var(--pt-t-strong); }
.pt-uscita-programma-sub { margin-bottom: var(--pt-3); }
.pt-uscita-avvia, .pt-uscita-salva { width: 100%; margin-top: var(--pt-3); }

.pt-gruppi-sezione { margin-top: var(--pt-6); }

.pt-tour-autore { display: flex; align-items: center; gap: 8px; margin-top: var(--pt-2); font: var(--pt-t-small); font-size: 12.5px; color: var(--pt-ink-55); }
.pt-tour-pending { background: var(--pt-warn-tint); color: var(--pt-warn); }
.pt-tour-published { background: var(--pt-ok-tint); color: var(--pt-ok); }

.pt-nav-box {
  margin: var(--pt-4) var(--pt-align);
  padding: var(--pt-4);
  border: 1px solid var(--pt-line);
  border-radius: var(--pt-r);
  background: var(--pt-card);
}
.pt-nav-bar { display: flex; align-items: center; gap: var(--pt-3); }
.pt-nav-label { font: var(--pt-t-label); letter-spacing: 0.14em; text-transform: uppercase; color: var(--pt-ink-55); }
.pt-nav-count { font: var(--pt-t-strong); }
.pt-nav-stop { font: var(--pt-t-strong); }
.pt-nav-progress { flex: 1; }


/* ============================================================================
   11. PROPOSTE, PUBBLICAZIONE, ACCESSO
   ========================================================================== */

.pt-propose-form, .pt-publish-form, .pt-auth-form {
  display: grid;
  gap: var(--pt-4);
  margin: var(--pt-4) var(--pt-align);
  padding: var(--pt-5);
  border: 1px solid var(--pt-line);
  border-radius: var(--pt-r);
  background: var(--pt-card);
}
.pt-propose-textarea, .pt-publish-textarea { min-height: 92px; resize: vertical; }

.pt-propose-vicini { margin-top: var(--pt-2); }
.pt-propose-vicini-label { font: var(--pt-t-label); letter-spacing: 0.14em; text-transform: uppercase; color: var(--pt-ink-55); }

.pt-proposta-card { display: flex; align-items: flex-start; gap: var(--pt-3); }
.pt-proposta-info { flex: 1; min-width: 0; }
/* FASE F — IL NOME DEL LUOGO SU UNA RIGA SUA. La regola dava corpo a un `<h3>`
   che il template non ha: scrive `<strong>`, in linea, e il nome correva
   dentro la categoria e la data — «Prova audit Arab- / Norman Route · 6 Sep /
   2026». */
.pt-proposta-info strong { display: block; font-size: 15.5px; letter-spacing: -0.028em; }
.pt-proposta-info small { display: block; margin-top: 2px; }

/* FASE F — CENTRATA SUL LARGO, CON IL SUO MARGINE SUL TELEFONO.
   Era `margin-inline: auto`, che cancella il margine della regola qui sopra:
   sul telefono, dove la pagina è più stretta della scheda, la scheda andava
   da x=0 a 390, con gli angoli tondi tagliati dal bordo dello schermo — su
   tutte e sei le pagine dell'account. `max()` sceglie il più grande fra il
   margine della pagina e quello che la centra: sul largo è il secondo, e la
   scheda sta dov'era. */
.pt-auth-form { max-width: 420px; margin-inline: max(var(--pt-align), (100% - 420px) / 2); }
.pt-auth-form h1, .pt-auth-form h2 { font-size: 24px; letter-spacing: -0.04em; }
.pt-auth-divider {
  display: flex;
  align-items: center;
  gap: var(--pt-3);
  font: var(--pt-t-label);
  letter-spacing: 0.14em;
  text-transform: uppercase;
  /* FASE H — ink-55 e non 45: «oppure» è testo da 11 px, e al 45% faceva 3,04:1
     (serve 4,5). Lo ha trovato axe; `audit_contrasto` non guardava la pagina
     dell'accesso. */
  color: var(--pt-ink-55);
}
.pt-auth-divider::before, .pt-auth-divider::after {
  content: "";
  flex: 1;
  height: 1px;
  background: var(--pt-line);
}
.pt-auth-switch { text-align: center; font: var(--pt-t-small); color: var(--pt-ink-55); }

/* ---------------------------------------------------------------------------
   v32 · LE PAGINE DELL'ACCOUNT CHE ARRIVANO DA ALLAUTH

   Undici pagine — reimposta password, cambia password, indirizzi email,
   conferma, collegamenti, accesso con Google — uscivano senza foglio di stile.
   Vestito il ponte (`allauth/layouts/base.html`) e i suoi «elementi», servono
   queste poche forme: sono le stesse del resto dell'app, con un nome.
   ------------------------------------------------------------------------- */
.pt-auth-form { padding: var(--pt-4) var(--pt-align) var(--pt-6); }
.pt-auth-sottotitolo { margin: var(--pt-2) 0 0; font-size: 17px; letter-spacing: -0.03em; }
.pt-auth-testo {
  margin: 0;
  font: var(--pt-t-body);
  font-size: 14.5px;
  line-height: 1.55;
  color: var(--pt-ink-70);
}
.pt-auth-riga { margin: 0; border: 0; border-top: 1px solid var(--pt-line); }
.pt-auth-azioni { display: grid; gap: var(--pt-2); }
@media (min-width: 521px) {
  .pt-auth-azioni:not(.is-colonna) { grid-auto-flow: column; grid-auto-columns: 1fr; }
}
.pt-auth-provider { display: grid; gap: var(--pt-2); }

/* Un collegamento che sta da solo su una riga è un bersaglio: «Password
   dimenticata?» era alto 20px. Solo quelli isolati — dentro una frase
   resterebbero le righe distanziate a caso. */
.pt-auth-form > a:not(.pt-btn):not(.pt-google-btn),
.pt-auth-campi > a:not(.pt-btn):not(.pt-google-btn),
.pt-auth-switch > a {
  display: inline-flex;
  align-items: center;
  min-height: 44px;
}
/* FASE H — «Accedi» sotto la registrazione era largo 43: un pixel sotto la
   soglia. Il testo resta dov'è, centrato nella sua area. */
.pt-auth-switch > a { min-width: 44px; justify-content: center; }
.pt-auth-dettagli > summary {
  min-height: 44px;
  display: flex;
  align-items: center;
  font: var(--pt-t-strong);
  cursor: pointer;
}

/* La casella di scelta è una riga sola: casella, poi la frase. L'etichetta in
   maiuscoletto sopra — quella dei campi di testo — qui direbbe due volte la
   stessa cosa. */
.pt-campo.is-scelta { gap: 0; }
/* `.pt-campo > label` è maiuscoletto spaziato: giusto per l'etichetta di un
   campo di testo, sbagliato per la frase accanto a una casella — l'indirizzo
   email usciva TUTTO MAIUSCOLO. Il selettore qui è più specifico di quello,
   non solo diverso. */
.pt-campo > label.pt-campo-scelta,
.pt-campo-scelta {
  display: flex;
  align-items: center;
  gap: 10px;
  min-height: 44px;
  font: var(--pt-t-body);
  font-size: 14.5px;
  letter-spacing: 0;
  text-transform: none;
  color: var(--pt-ink);
  cursor: pointer;
}
.pt-campo-scelta input { width: 20px; height: 20px; accent-color: var(--pt-sg); flex: 0 0 auto; }

/* Le tabelle di allauth (indirizzi email, collegamenti) senza forma erano
   colonne appiccicate al bordo. */
.pt-auth-form table { width: 100%; border-collapse: collapse; font: var(--pt-t-body); font-size: 14px; }
.pt-auth-form th, .pt-auth-form td { padding: 10px 8px; text-align: start; border-bottom: 1px solid var(--pt-line); }
.pt-auth-form th { font: var(--pt-t-label); font-size: 11px; letter-spacing: 0.12em; text-transform: uppercase; color: var(--pt-ink-55); }

.pt-google-btn {
  display: flex;
  align-items: center;
  justify-content: center;
  gap: 10px;
  width: 100%;
  padding: 13px;
  border: 1px solid var(--pt-line-2);
  border-radius: var(--pt-r-sm);
  background: var(--pt-card);
  color: var(--pt-ink);
  font: var(--pt-t-strong);
  font-weight: 700;
}



/* --- Eventi e mappa ------------------------------------------------------- */

/* v76 — LA TESSERA DELL'EVENTO È UN COLLEGAMENTO.
   Era un `<div>`: da qui porta alla pagina dell'evento, quindi si comporta come
   una scheda che si tocca — colore dell'inchiostro, freccia in coda, e il
   bersaglio alto abbastanza per un dito. */
.pt-evento-card {
  display: flex;
  align-items: center;
  gap: var(--pt-3);
  min-height: 44px;
  color: var(--pt-ink);
  transition: border-color var(--pt-fast) var(--pt-ease);
}
.pt-evento-card .pt-evento-corpo { flex: 1; }

/* v76 — DUE ELENCHI DI EVENTI, DUE CLASSI.
   `.pt-eventi-elenco` è la fila che SCORRE sulla home: `<li>` larghi 270px,
   tre per schermata, e su desktop una griglia fitta. Qui invece si sfoglia un
   elenco intero, e le tessere sono righe larghe.

   La prima scrittura riusava la classe della home, e su schermo largo le
   tessere finivano dentro colonne da 200px con «Feast of Saint Rosalia»
   spezzato su quattro righe. Due usi diversi sotto lo stesso nome: è il modo in
   cui una classe smette di voler dire qualcosa. */
.pt-eventi-lista { display: grid; gap: var(--pt-2); }
/* FASE E — IL MARGINE LO DÀ LA LISTA, NON LA TESSERA.

   La tessera porta il margine della pagina (`.pt-card` e famiglia), ed è
   giusto quando sta da sola. Dentro una lista era sbagliato in due modi,
   misurati a 390 e a 1280 prima di toccare niente:
     - sulla pagina di un evento la lista sta in una sezione che il margine
       glielo dà già: sul telefono le tessere partivano a x=32 e il titolo della
       sezione a 16 — il margine c'era due volte;
     - sul largo la regola di v75 toglie il margine ai figli della lista, e la
       lista, che sta direttamente in `<main>`, non ne aveva uno suo: le tessere
       della ricerca partivano a x=20 e i titoli a 36.
   Adesso vale la regola del foglio: il margine è di chi contiene. Una lista
   che sta nella pagina lo prende; una che sta in un blocco lo eredita; le
   tessere dentro non ne hanno. */
.pt-eventi-lista .pt-evento-card { margin: 0; }
main > .pt-eventi-lista { margin-inline: var(--pt-align); }
.pt-evento-freccia {
  flex: 0 0 auto;
  font-size: 18px;
  color: var(--pt-ink-45);
}
.pt-evento-card:active { transform: scale(0.995); }

/* La targhetta «in corso» / «già passato» sopra la copertina di un evento.
   Sopra una fotografia il fondo è ignoto: prende lo stesso disco scuro della
   targhetta della categoria, misurato in v75 (0,45 → 6,1:1 col bianco). */
.pt-badge-ora {
  display: inline-flex;
  align-items: center;
  gap: 5px;
  padding: 4px 10px;
  border-radius: var(--pt-r-pill);
  background: rgba(0, 0, 0, 0.45);
  color: #fff;
  font: var(--pt-t-label);
  font-size: 10px;
  letter-spacing: 0.08em;
  text-transform: uppercase;
}
.pt-badge-ora i { font-size: 12px; }
.pt-badge-ora.is-spento { background: rgba(0, 0, 0, 0.55); }

/* La copertina di un evento senza luogo: niente famiglia da cui prendere il
   colore, quindi la superficie quieta e l'icona del calendario. */
.pt-evento-testa { background-color: var(--pt-fam, var(--pt-ink-70)); }
.pt-evento-pagina:not([data-cat]) .pt-evento-testa { background-color: var(--pt-ink-70); }
/* FASE E — `.pt-evento-date`, il quadratino rosso pieno con «09 / OTT», non
   c'è più: la tessera usa `.pt-data-blocco`, il blocco in tinta della riga
   d'agenda (sezione 8 del foglio). Il rosso pieno è l'azione, uno per
   schermata, e sulla pagina di un evento ce n'erano quattro. */
.pt-evento-card h3 { font-size: 16px; letter-spacing: -0.03em; }
/* FASE E — la riga sotto il nome è `.pt-fatti`, la stessa di ogni scheda
   dell'app (corpo, colore, a capo): la regola che le dava un corpo suo, 13 px
   invece di 12,5, se n'è andata con la targhetta del luogo. */

/* v92 — L'ORA, DOVE C'È, SI VEDE.

   Era in coda alla frase del «quando», a 12,5 px e dello stesso grigio della
   punteggiatura che la precedeva: l'unico dato che dice a che ora bisogna
   essere in un posto, scritto come una virgola. Qui diventa inchiostro pieno,
   più grande di mezzo punto e con la sua icona.

   NON in rosso: da v90 il rosso della segnaletica dentro una fila di fatti
   vuol dire «questo viene da te» — la distanza da dove sei. L'ora viene
   dall'evento, come la data. In evidenza si va col peso e col contrasto; il
   colore ha già un mestiere. */
/* I DUE SELETTORI IN PIÙ NON SONO PIGRIZIA: è una collisione, misurata.

   Dentro il blocco grande `.pt-evidenza-corpo strong` è il TITOLO — 24 px —, e
   un `<strong>` con la sua classe pesa meno di un elemento più una classe:
   l'ora usciva grande come il nome dell'evento. È la stessa lezione dei nomi
   di classe che si scontrano (v87), con un elemento al posto di un nome.
   Nominare i due posti dove l'ora vive costa due righe e si vede nel foglio;
   un `!important` avrebbe funzionato e non avrebbe spiegato niente. */
.pt-evento-ora,
.pt-evidenza-fatti .pt-evento-ora,
.pt-evento-card .pt-evento-ora {
  display: inline-flex;
  align-items: center;
  gap: 3px;
  margin-inline-start: 6px;
  color: var(--pt-ink);
  font: var(--pt-t-strong);
  font-size: 13px;
}
.pt-evento-ora i { font-size: 14px; }

/* v92 — E QUANDO NEI PROSSIMI GIORNI NON C'È NIENTE, LA RIGA CHE LO DICE.

   Sta dove starebbero le linguette, perché risponde alla stessa domanda. È
   una riga di testo e non un riquadro d'avviso: non è successo niente di
   male, è un calendario di feste annuali — e un riquadro giallo direbbe che
   c'è un problema da risolvere.

   FASE E — ED È UNA FRASE, NON UNA FILA. Era `display: flex` con dentro
   un'icona, tre pezzi di testo e un `<strong>`: sul telefono il `<strong>`
   diventava una colonna sua, a x=271, e la riga si leggeva in due colonne.
   Adesso è un paragrafo, e parla con la voce dei titoli — le grazie — perché
   è la risposta al titolo della pagina: «Cosa succede a Palermo?» /
   «Questa settimana Palermo è più tranquilla.» Niente icona: il calendario
   sbarrato diceva «vietato», e qui non è vietato niente. */
.pt-agenda-quieta {
  max-width: 34ch;
  margin: 0 var(--pt-align) var(--pt-5);
  color: var(--pt-ink-70);
  font-family: var(--pt-font-titolo);
  font-size: 20px;
  line-height: 1.35;
  letter-spacing: -0.01em;
}

#map, .pt-mappa { border-radius: var(--pt-r); }
.pt-user-marker {
  width: 16px;
  height: 16px;
  border: 3px solid #fff;
  border-radius: 50%;
  background: var(--pt-sg);
  box-shadow: 0 0 0 2px var(--pt-sg);
}

/* Leaflet: il minimo per non stonare col resto. */
.leaflet-container { font-family: var(--pt-font); }
.leaflet-popup-content-wrapper {
  border-radius: var(--pt-r-sm);
  box-shadow: var(--pt-shadow-pop);
}
.leaflet-popup-content { margin: 12px 14px; font: var(--pt-t-small); }
.leaflet-bar a { color: var(--pt-ink); }


/* ============================================================================
   12. DESKTOP
   ============================================================================
   Sopra 800px la navigazione passa in alto: il pollice non esiste, e la
   convenzione consolidata mette lì le destinazioni principali. Il contenuto
   diventa una colonna centrata, non si allarga all'infinito — una riga di
   testo lunga uno schermo non si legge.
   ========================================================================== */

@media (min-width: 800px) {
  :root {
    --pt-align: calc(max(var(--pt-gutter), (100% - var(--pt-col)) / 2) + var(--pt-gutter));
  }

  body { background: var(--pt-paper); padding-bottom: var(--pt-7); }

  main {
    --pt-align: var(--pt-gutter);
    max-width: var(--pt-col);
    margin-inline: auto;
    padding-top: var(--pt-5);
  }

  .pt-header { border-bottom: 1px solid var(--pt-line); }

  .pt-topbar {
    max-width: var(--pt-col);
    margin-inline: auto;
    border-bottom: 0;
    padding-inline: var(--pt-gutter);
  }

  .pt-bottom-nav {
    position: static;
    max-width: var(--pt-col);
    margin: 0 auto;
    padding: 0 var(--pt-gutter) var(--pt-2);
    border: 0;
    border-radius: 0;
    background: none;
    box-shadow: none;
    gap: var(--pt-1);
  }
  .pt-bottom-nav a {
    flex: 0 0 auto;
    flex-direction: row;
    gap: 7px;
    padding: 8px 13px;
    border-radius: var(--pt-r-pill);
    font-size: 13.5px;
    letter-spacing: -0.01em;
  }
  /* v69 — sullo schermo largo la voce e' una riga (icona a fianco
     dell'etichetta), non una colonna: la pastiglia dell'attivo torna a
     prendere la VOCE INTERA, che qui e' gia' una pastiglia. Il colore e' lo
     stesso del telefono — tinta chiara e blu — cambia la forma, che segue
     l'impaginazione invece di contraddirla. Senza questo l'icona restava larga
     58 px e spingeva l'etichetta lontano dalla propria icona. */
  .pt-bottom-nav a i {
    width: auto;
    height: auto;
    border-radius: 0;
    background: none;
    font-size: 18px;
  }
  .pt-bottom-nav a.active { background: var(--pt-scelto-tint); color: var(--pt-scelto); }
  .pt-bottom-nav a.active i { background: none; }

  /* Le barre che galleggiano restano larghe quanto la LETTURA, non quanto la
     pagina: un lettore audio largo un metro non si guarda, si subisce. */
  .pt-audio-player, .pt-audio-banner, .pt-anche-qui {
    left: 50%;
    right: auto;
    width: min(760px, calc(100% - 40px));
    transform: translateX(-50%);
    bottom: 20px;
  }
  /* FASE D — `.pt-builder-bar` ERA IN QUELLA LISTA, E NON GALLEGGIA DA v99.
     Tolto `position: fixed`, `left` e `bottom` non facevano più niente; la
     larghezza e lo spostamento sì. Una barra larga 760 px, nel flusso, a
     partire dal margine della pagina, spostata indietro di metà della sua
     larghezza: misurata a 1280, **x = −344**. Il comando del giro lampo
     cominciava fuori dallo schermo, e sul costruttore e su «modifica tappe» il
     conto delle tappe non si vedeva affatto. Sul telefono la regola non vale,
     e le prove guardavano il telefono: da v99 a v102, quattro rilasci senza
     che nessuno la vedesse.

     Adesso è un comando a blocco come gli altri del largo: parte dal margine
     e si ferma a 520 px, la misura di v75. */
  .pt-builder-bar { max-width: 520px; }

  /* --- v75: QUELLO CHE LA COLONNA LARGA ROMPE ------------------------------
     Misurato passando su sedici pagine a 1280px, prima di ridisegnare niente.
     Nessuno scorrimento orizzontale, ma due difetti su quasi tutte:

     1. i comandi «a blocco» diventavano larghi 1148px. Un bottone largo uno
        schermo non dice «premi qui», dice «non so dove metterti»: la larghezza
        di un comando è una promessa su quanto è importante, e a quella misura
        la promessa è falsa;
     2. il testo arrivava a centosessanta caratteri per riga. Oltre i settanta
        l'occhio perde il capo della riga successiva — è il difetto che rende
        una pagina «faticosa» senza che si sappia dire perché.

     Le due regole qui sotto valgono per TUTTE le pagine, comprese quelle che
     questo rilascio non ridisegna: allargare la griglia le tocca tutte, e una
     pagina non ridisegnata deve restare buona, non «meno peggio». */
  .pt-btn-blocco,
  .pt-listen-btn,
  .pt-guida-fab,
  .pt-intorno { max-width: 520px; }
  /* Il comando dentro una scheda o una colonna stretta non si tocca: lì la
     larghezza gliela dà già il contenitore. */
  .pt-reviews .pt-btn-blocco,
  .pt-piano .pt-btn-blocco { max-width: none; }

  /* La misura della lettura. `ch` e non `px`: segue il corpo del testo, che è
     il modo giusto di contare i caratteri per riga. */
  .pt-poi-descrizione,
  .pt-poi-breve,
  .pt-guida-nota,
  .pt-vuoto p,
  .pt-sezione-sub,
  .pt-eroe-sub,
  .pt-lead { max-width: var(--pt-lettura); }

  /* --- v75: LA SCHEDA DI UN LUOGO DIVENTA UNA PAGINA -----------------------
     Il racconto a sinistra, i fatti a destra. È la divisione del prototipo, e
     l'unica che giustifica una colonna larga: senza, la pagina larga è la
     pagina stretta stirata. */
  .pt-articolo {
    display: grid;
    grid-template-columns: minmax(0, 1.32fr) minmax(0, 0.68fr);
    align-items: start;
    gap: var(--pt-7);
  }
  /* I fatti restano in vista mentre si legge: chi legge una descrizione lunga
     e poi vuole l'indirizzo non deve tornare indietro a cercarlo. Il `top`
     tiene conto della testata, che è appiccicata anche lei. */
  .pt-articolo-lato {
    position: sticky;
    top: calc(var(--pt-header-h) + var(--pt-4));
    padding: var(--pt-5);
    border: 1px solid var(--pt-line);
    border-radius: var(--pt-r-lg);
    background: var(--pt-card);
  }
  .pt-articolo-lato .pt-dati { margin-top: 0; }
  /* Dentro una colonna stretta il comando riprende tutta la larghezza che ha:
     lì il contenitore è già la misura giusta. */
  .pt-articolo-lato .pt-btn-blocco { max-width: none; }

  /* FASE C — DOPO L'ARTICOLO, LA PAGINA RESTA NELLA COLONNA DEL RACCONTO.
     Misurato a 1280, sotto le due colonne: il comando «aggiungi a un tour»
     centrato da solo (380–900), le tessere dei tour e dell'evento larghe metà
     pagina (36–634, la prima colonna di una griglia con una voce sola), le
     recensioni a 880 e il loro stato vuoto rientrato di sedici (52–868).
     Quattro misure, nessuna delle quali era quella del testo sopra (36–802).

     Adesso è una: la colonna del racconto. Il numero è quello della griglia
     dell'articolo qui sopra — `1.32fr` su `2fr`, cioè 0,66 dello spazio che
     resta tolti i margini e lo stacco — e una prova controlla che i due
     restino d'accordo: se la griglia cambia, questo deve cambiare con lei. */
  .pt-poi > .pt-poi-collegati {
    max-width: calc((100% - 2 * var(--pt-align) - var(--pt-7)) * 0.66);
  }
  .pt-reviews {
    max-width: calc((100% - 2 * var(--pt-align) - var(--pt-7)) * 0.66 + 2 * var(--pt-align));
  }

  /* La copertina diventa alta come una copertina. Il giorno che arriva la
     fotografia questa è la misura in cui entrerà. */
  .pt-poi-testa { min-height: 360px; padding-block: var(--pt-6); }
  .pt-poi-testa .pt-poi-title { font-size: clamp(40px, 4.6vw, 62px); }
  .pt-poi-testa > i.ti { font-size: 240px; right: 8px; bottom: -36px; }
  .pt-poi-occhiello { font-size: 19px; max-width: var(--pt-lettura); }
  .pt-poi-descrizione { font-size: 17px; }

  /* --- v75: IL CATALOGO DIVENTA UNA GRIGLIA -------------------------------
     Centouno luoghi in una colonna sola su uno schermo da 1280 erano venti
     righe alte cinquanta pixel con mezzo schermo vuoto ai lati. In griglia se
     ne vedono nove per schermata invece di tre, e la scheda ha lo spazio per
     diventare quello che il prototipo chiede: **una tessera con la fotografia
     sopra**.

     La griglia è tutta qui, nel foglio: il markup della scheda non cambia di
     un attributo. La stessa tessera che sul telefono è un disco da 54 px qui è
     una fascia larga quanto la scheda — e il giorno in cui `poi.immagine` sarà
     pieno quella fascia sarà già la fotografia, perché il ramo che la mette
     come `background-image` c'è da sempre. */
  .pt-list {
    grid-template-columns: repeat(auto-fill, minmax(290px, 1fr));
    gap: var(--pt-4);
    margin-inline: var(--pt-align);
  }
  .pt-poi-card {
    flex-direction: column;
    align-items: stretch;
    gap: 0;
    margin: 0;
    padding: 0;
    overflow: hidden;
  }
  .pt-poi-tessera {
    position: relative;
    width: 100%;
    height: 168px;
    border-radius: 0;
    font-size: 44px;
  }
  /* La stessa velatura della copertina, per la stessa ragione: oggi toglie il
     piatto a una tinta larga trecento pixel, domani fa leggere quello che
     scriveremo sopra una fotografia. */
  .pt-poi-tessera::after {
    content: "";
    position: absolute;
    inset: 0;
    background: linear-gradient(to bottom, rgba(0, 0, 0, 0.10), rgba(0, 0, 0, 0.22));
    pointer-events: none;
  }
  .pt-poi-tessera > i { position: relative; z-index: 1; }
  .pt-poi-info { padding: var(--pt-4); }
  /* La descrizione breve nella scheda non ha più il tetto della lettura: la
     colonna è già stretta, e un `max-width` dentro una colonna stretta non
     fa niente tranne confondere chi legge il foglio. */
  .pt-poi-card .pt-poi-breve { max-width: none; }

  /* Gli strumenti del catalogo non si allargano con la pagina: tre pastiglie
     larghe quattrocento pixel l'una non sono tre pastiglie, sono tre bandiere.
     La ricerca sì — quella è un campo, e un campo largo è un campo comodo. */
  .pt-lista-strumenti .pt-sezioni { max-width: 620px; }
  .pt-scopri-riga { max-width: 860px; }

  /* Le recensioni sono un posto dove si legge e si scrive: restano alla misura
     della lettura, non a quella della pagina. Un campo di testo largo milleduecento
     pixel invita a scrivere un tema, e poi lo rilegge male chi lo riceve.

     FASE C — la misura era 880 px, scelta qui da sola; adesso è quella della
     colonna del racconto (766 a 1280), e la regola sta con le altre della
     seconda metà della scheda, sopra, accanto a `.pt-articolo`. Due misure di
     lettura nella stessa pagina erano due bordi destri. */

  /* --- v75: LE PAGINE CHE QUESTO RILASCIO NON RIDISEGNA --------------------
     Tour, percorsi pronti, community, i miei tour, i tour che passano da un
     luogo: saranno v76. Ma la colonna si è allargata oggi, e una scheda che
     prima era larga 728 px adesso ne è larga 1148 con dentro una riga sola.
     Non è rotta — è stirata, che è il modo in cui una pagina «non ancora
     fatta» sembra invece «fatta male».

     Due colonne bastano a rimetterle in proporzione, e non anticipano niente
     di v76: è impaginazione, non ridisegno. */
  .pt-lista-blocco,
  .pt-eventi-lista,
  .pt-poi-collegati {
    display: grid;
    grid-template-columns: repeat(auto-fill, minmax(420px, 1fr));
    gap: var(--pt-3);
  }
  .pt-lista-blocco > *,
  .pt-eventi-lista > *,
  .pt-poi-collegati > * { min-width: 0; margin-inline: 0; }
  /* FASE E — MA IL MARGINE CHE I FIGLI PERDONO, QUALCUNO LO DEVE PRENDERE.
     Qui sopra v75 lo toglie alle schede; `.pt-poi-collegati` ne ha uno suo,
     `.pt-lista-blocco` no: sui percorsi pronti, nella community e nella
     ricerca le schede partivano a x=20 e i titoli a 36, sedici pixel fuori
     dalla colonna da tutti e due i lati. La variante `-lati` il margine ce
     l'ha già (come `padding`), e resta fuori.
     Lo stato vuoto dentro uno di questi elenchi va su tutta la riga: era una
     cella della griglia, 582 px su 1240 a sinistra, e il margine suo (v75
     non lo toglieva, perché la regola dello stato vuoto sta più in basso)
     diventerebbe doppio. */
  main > .pt-lista-blocco:not(.pt-lista-blocco-lati) { margin-inline: var(--pt-align); }
  main > .pt-lista-blocco:not(.pt-lista-blocco-lati) > .pt-vuoto-blocco { grid-column: 1 / -1; margin-inline: 0; }
  /* FASE E — «Gli altri in programma» sono al più tre (la vista li taglia a
     tre): in due colonne facevano 2 + 1, con la terza tessera orfana sotto.
     Tre colonne, e la riga è piena. */
  .pt-evento-pagina .pt-eventi-lista { grid-template-columns: repeat(3, minmax(0, 1fr)); }

  #pt-toast { bottom: 32px; }

  /* Su desktop lo spazio c'è: gli interessi vanno a capo invece di scorrere,
     ed è sempre preferibile mostrarli tutti che farli cercare. */
  .pt-avvio-interessi,
  .pt-chip-row {
    flex-wrap: wrap;
    overflow-x: visible;
    margin-inline: 0;
    padding-inline: var(--pt-align);
    -webkit-mask-image: none;
    mask-image: none;
  }
  .pt-avvio-interessi { padding-inline: 0; }

  .pt-avvio { padding: var(--pt-6); }
  .pt-avvio h1 { font-size: 38px; }
  .pt-avvio > p { font-size: 16px; }

  .pt-poi-testa, .pt-hero { height: 180px; font-size: 68px; }
  .pt-riprendi-attivo h2 { font-size: 29px; }

  .pt-collect-grid { grid-template-columns: repeat(auto-fill, minmax(112px, 1fr)); }

  /* --- v81: la rivista e l'elenco, su schermo largo -----------------------
     Il blocco grande diventa due colonne: la fotografia a sinistra e il nome
     accanto. A tutta larghezza una fotografia alta 190 px sopra tre righe di
     testo e' una fascia, non un blocco d'apertura.

     E le righe dell'elenco restano righe — larghe, non affiancate: due colonne
     di righe compatte sono una tabella, e una tabella si legge per colonne, non
     per voci. Il tetto e' quello della lettura, non quello della pagina. */
  .pt-evidenza-grande { grid-template-columns: minmax(0, 1fr) minmax(0, 1fr); align-items: stretch; }
  .pt-evidenza-foto { min-height: 280px; }
  .pt-evidenza-corpo { padding: var(--pt-6); align-self: center; }
  /* FASE E — e l'agenda degli eventi è fatta di righe allo stesso modo:
     misurata prima, andava da 36 a 1244, con la freccia a mille pixel dal
     nome della festa. Una regola sola per le due, perché la misura è una. */
  .pt-righe,
  .pt-agenda { max-width: 860px; }
  .pt-riga-foto { width: 104px; height: 78px; }

  /* --- v77: LE PAGINE PERSONALI, MISURATE A 1280 --------------------------

     Quattro numeri, presi prima di toccare niente:

       · «Tu»              quattro righe larghe 1148 px con venti caratteri
                           dentro, e mezzo schermo vuoto sotto;
       · «I miei tour»     la riga dei fatti a **171 caratteri**, cioè il
                           difetto che v75 aveva corretto sul catalogo e che
                           qui era rimasto;
       · le targhe del passaporto  **157 px** di larghezza a 1280 contro i
                           175 che hanno a 390: allargando lo schermo si sono
                           ristrette, e la descrizione è finita su sette righe;
       · i tre filtri del passaporto  **377 px l'uno**. Un filtro largo un
                           terzo di schermo non è un filtro, è un'insegna. */
  .pt-tu-elenco,
  .pt-tour-lista {
    grid-template-columns: repeat(auto-fill, minmax(420px, 1fr));
    gap: var(--pt-3);
  }
  .pt-tour-lista > * { margin-inline: 0; }
  /* FASE F — E IL MARGINE CHE LE SCHEDE PERDONO LO PRENDE LA GRIGLIA: è il
     difetto della FASE E sugli elenchi (v75), su un contenitore che la FASE E
     non aveva misurato perché sta dietro l'accesso. Misurato: le schede dei
     giri salvati da 20 a 1260, con il titolo e il comando «crea» a 36. E lo
     stato vuoto va su tutta la riga: era una cella, 36–618 su 1208. */
  .pt-tour-lista { margin-inline: var(--pt-align); }
  .pt-tour-lista > .pt-vuoto-blocco { grid-column: 1 / -1; margin-inline: 0; }

  /* Le targhe: da 148 a 230 di larghezza minima. La griglia riempiva la
     colonna con sette colonne strette perché nessuno le aveva detto che il
     minimo era stato scelto per un telefono. */
  .pt-badge-grid > .pt-badge-item { flex-basis: 230px; }

  /* I filtri e la ricerca del passaporto stanno alla misura dei comandi a
     blocco di v75: 520 px. Sotto restano com'erano — lì `flex: 1` su tre
     pastiglie in 358 px è la cosa giusta. */
  .pt-passport-filtri,
  .pt-passport-cerca { max-width: 520px; }

  /* Il riquadro dorato dell'avanzamento non è un contenuto da leggere: è un
     numero e una barra. Alla larghezza della pagina diventa un cartellone. */
  .pt-passport-hero { max-width: 720px; }
}


/* ============================================================================
   13. CORREZIONI DOPO LA PROVA A SCHERMO
   ============================================================================
   Blocchi la cui forma reale nei template non coincideva con quella dedotta
   dall'inventario delle classi. Stanno in coda, dove vincono, e restano
   separati di proposito: sono il risultato di una verifica, e chi li legge
   deve poter capire perché esistono.
   ========================================================================== */

/* --- CONTENITORI DELLE MAPPE ----------------------------------------------
   LEAFLET NON DÀ ALTEZZA AL PROPRIO CONTENITORE. Un `<div>` vuoto è alto zero,
   quindi una mappa senza una regola di altezza non è "brutta": è INVISIBILE, e
   non dà nessun errore — la libreria si inizializza, scarica pure le tessere, e
   non si vede niente.

   È successo tre volte, su tre pagine diverse, e ogni volta è stato corretto
   solo lì: la pagina Mappa (qui sotto), il riquadro dell'itinerario (con un
   `height` scritto in linea) e "segnala un luogo", che è rimasta invisibile per
   quattro versioni — nessuno se ne accorgeva perché la pagina si apre lo
   stesso, il modulo funziona lo stesso e persino l'elenco dei "luoghi già
   presenti nelle vicinanze" si popolava.

   Questa regola vale per TUTTI i contenitori di mappa: un contenitore nuovo
   nasce visibile anche se chi lo aggiunge si dimentica di dargli un'altezza.
   `min-height` è la rete di sicurezza; l'altezza giusta la mette la pagina.
   Un test statico verifica che ogni `L.map('...')` abbia il suo contenitore
   qui dentro. */
#pt-map,
#pt-itin-map,
#pt-propose-map {
  position: relative;          /* per l'avviso "senza rete" che ci galleggia sopra */
  min-height: 220px;
  border: 1px solid var(--pt-line);
  border-radius: var(--pt-r);
  background: var(--pt-paper-2);   /* mentre le tessere arrivano, non un buco bianco */
}

/* v25 — sopra la mappa adesso c'è la riga dei filtri: l'altezza le lascia
   il suo spazio, altrimenti il fondo della mappa finisce sotto la barra. */
.pt-mappa-filtri { margin-bottom: var(--pt-2); }

/* v84 — LA MAPPA PRENDE TUTTO QUELLO CHE RESTA.
   Misurato prima: un riquadro 358x574 che cominciava a 355 px, con i margini e
   il raggio di una scheda. Una mappa dentro una scheda si guarda; una mappa che
   arriva ai bordi si usa — ed e' quello che il prototipo chiede («vista Mappa a
   tutto schermo»).

   L'altezza non e' un numero indovinato: `--pt-strumenti-h` la misura il
   browser sul blocco appiccicato vero, e la riaggiorna quando il pannello delle
   categorie si apre. Un `calc` con dentro «meno 270» sarebbe stato giusto su
   uno schermo solo. */
/* In vista mappa la pagina NON SCORRE: header, strumenti, mappa, barra, e
   sono esattamente un'altezza di schermo. La testata editoriale qui non c'e'
   (vedi `scopri.html`), e senza di lei non resta niente da scorrere — che e'
   il solo modo di avere davvero una mappa a tutto schermo.

   Provato prima con `sticky`: la mappa non arrivava mai alla sua soglia perche'
   sopra c'era meno pagina da scorrere della testata stessa, e gli ultimi
   sessantotto pixel finivano sotto la barra. Misurato: mappa a 844 su una barra
   che comincia a 777. Il difetto non era la regola, era la testata. */
/* Lo spazio in fondo che il corpo tiene per la barra e per il bottone della
   guida (136 px) qui non serve: l'altezza della mappa lo conta gia'. Senza
   questa riga la pagina scorreva di centodiciotto pixel e la mappa finiva
   sotto la barra. `:has` non lo capiscono i browser vecchi: li' resta lo
   scorrimento di prima, che e' il comportamento di sempre. */
body:has(#pt-map) { padding-bottom: 0; }
/* FASE H — e sul telefono la riga della guida, che qui finiva sotto la barra
   per scelta (la mappa arriva fino a lei), non c'è: nessuno la vedeva né la
   toccava, ma Tab ci arrivava e il fuoco spariva dietro la barra. Sul largo,
   dove si vede sotto la mappa, resta. */
@media (max-width: 799px) {
  body:has(#pt-map) .pt-guida-fab { display: none; }
}

/* Il contenitore esiste per una ragione sola: sul largo la scheda si appoggia
   DENTRO la mappa, e `absolute` ha bisogno di un genitore posizionato. Senza,
   si agganciava al documento e sporgeva di cinquanta pixel dal bordo sinistro
   della mappa. */
.pt-mappa-piena { position: relative; }

#pt-map {
  /* `--pt-mappa-top` e' la distanza vera fra il bordo alto dello schermo e il
     bordo alto della mappa, misurata dal browser a pagina ferma: dipende
     dall'altezza della testata, da quella degli strumenti, dalla lingua e
     dalla larghezza. Sottrarla e' l'unico modo di finire esattamente sopra la
     barra a ogni schermo — un `calc` con tre token dentro era giusto su uno
     schermo solo, e su 1280 sbordava di otto pixel. */
  height: calc(100dvh - var(--pt-mappa-top, 250px) - var(--pt-nav-h) - var(--pt-2));
  min-height: 320px;
  margin: 0;
  border: 0;
  border-radius: 0;
}

@media (min-width: 800px) {
  /* Sul largo la barra in basso non c'e' e il contenuto ha una colonna: la
     mappa resta dentro la colonna, con il suo filetto. Piena da bordo a bordo
     su 1 280 px non sarebbe una mappa a tutto schermo, sarebbe uno sfondo. */
  #pt-map {
    /* Sul largo la barra in basso non c'e': resta solo il respiro sotto. */
    height: calc(100dvh - var(--pt-mappa-top, 290px) - var(--pt-4));
    margin: 0 var(--pt-align);
    border: 1px solid var(--pt-line);
    border-radius: var(--pt-r);
  }
}

/* LA SCHEDA CHE SALE DAL BASSO.
   Il fumetto di Leaflet stava sopra il segnaposto — cioe' dove c'e' il dito —
   ed era largo quanto bastava a un nome. Qui la scheda sale dal fondo, sopra la
   barra: si legge senza spostare la mano, e ci sta dentro quello che serve a
   decidere (la tessera, la categoria, la zona, la durata, il biglietto).

   `translateY` e non `display:none`: chiusa resta nel documento, quindi un
   lettore di schermo la trova quando si apre e il movimento si puo' spegnere
   con `prefers-reduced-motion`, che questo foglio rispetta gia' in blocco. */
.pt-mappa-scheda {
  position: fixed;
  z-index: 25;
  inset-inline: var(--pt-3);
  bottom: var(--pt-sopra-nav);
  display: flex;
  align-items: flex-start;
  gap: var(--pt-3);
  padding: var(--pt-3);
  border: 1px solid var(--pt-line);
  border-radius: var(--pt-r);
  background: var(--pt-card);
  box-shadow: var(--pt-shadow-pop);
  transform: translateY(calc(100% + var(--pt-sopra-nav) + 20px));
  transition: transform var(--pt-med) var(--pt-ease);
}
.pt-mappa-scheda.is-aperta { transform: none; }
.pt-mappa-scheda[hidden] { display: none; }

.pt-mappa-scheda-foto {
  flex: 0 0 auto;
  display: grid;
  place-items: center;
  width: 88px;
  height: 70px;
  border-radius: var(--pt-r-sm);
  background: var(--pt-fam, var(--pt-ink-70)) center/cover no-repeat;
  color: #fff;
  font-size: 26px;
}
.pt-mappa-scheda-corpo { flex: 1; min-width: 0; }
.pt-mappa-scheda-corpo .pt-poi-cat { display: inline-block; }
.pt-mappa-scheda-corpo h3 {
  margin: 3px 0 0;
  font-size: 16.5px;
  letter-spacing: -0.03em;
}
.pt-mappa-scheda-fatti {
  display: flex;
  flex-wrap: wrap;
  gap: var(--pt-2);
  margin-top: 4px;
  color: var(--pt-ink-55);
  font: var(--pt-t-small);
  font-size: 12.5px;
}
.pt-mappa-scheda-fatti i { margin-inline-end: 3px; }
.pt-mappa-scheda-vai {
  display: inline-flex;
  align-items: center;
  gap: 6px;
  margin-top: var(--pt-2);
  min-height: 44px;
  padding: 0 var(--pt-3);
  border-radius: var(--pt-r-sm);
  background: var(--pt-sg);
  color: #fff;
  font: var(--pt-t-strong);
  font-size: 13px;
  text-decoration: none;
}
/* La X sta in alto a destra ed e' un bersaglio da 44: e' l'unico modo di
   togliere la scheda senza toccare la mappa, e su una mappa ogni tocco fa
   qualcosa. */
.pt-mappa-scheda-chiudi {
  flex: 0 0 auto;
  display: grid;
  place-items: center;
  width: 44px;
  height: 44px;
  margin: -6px -6px 0 0;
  border: 0;
  border-radius: 50%;
  background: none;
  color: var(--pt-ink-55);
  font-size: 20px;
  cursor: pointer;
}
@media (hover: hover) {
  .pt-mappa-scheda-chiudi:hover { background: var(--pt-paper-2); color: var(--pt-ink); }
  .pt-mappa-scheda-vai:hover { background: var(--pt-sg-dark); }
}

@media (min-width: 800px) {
  /* Sul largo non sale dal fondo dello schermo: si appoggia in basso a sinistra
     sulla mappa, che li' e' un riquadro e non tutto lo schermo. */
  .pt-mappa-scheda {
    position: absolute;
    inset-inline: auto;
    left: var(--pt-4);
    bottom: var(--pt-4);
    width: 420px;
    transform: translateY(calc(100% + var(--pt-6)));
  }
}

/* "Segnala un luogo": qui la mappa non illustra, si USA — ci si trascina
   sopra un pin per indicare un punto preciso. Sotto i 260px non si distingue
   una via dall'altra e il dito copre metà della scena. */
#pt-propose-map {
  height: 300px;
  min-height: 260px;
}
@media (min-width: 800px) {
  #pt-propose-map { height: 380px; }
}

/* `.pt-nav-progress` NON è una barra: è la riga che contiene etichetta e
   conteggio. La barra vera è `.pt-nav-bar`. Averle scambiate schiacciava il
   testo dentro sette pixel. */
.pt-nav-progress {
  display: flex;
  align-items: baseline;
  justify-content: space-between;
  gap: var(--pt-3);
  height: auto;
  margin-bottom: var(--pt-2);
  border-radius: 0;
  background: none;
  overflow: visible;
}
.pt-nav-label { display: inline-flex; align-items: center; gap: 6px; }

.pt-nav-bar {
  height: 7px;
  border-radius: var(--pt-r-pill);
  background: var(--pt-paper-2);
  overflow: hidden;
}
.pt-nav-bar > span {
  display: block;
  height: 100%;
  border-radius: var(--pt-r-pill);
  background: var(--pt-ok);
  transition: width var(--pt-med) var(--pt-ease);
}

.pt-nav-stop {
  display: flex;
  align-items: center;
  justify-content: center;
  gap: 8px;
  width: 100%;
  margin-top: var(--pt-3);
  padding: 12px;
  border: 1px solid var(--pt-scelto);
  border-radius: var(--pt-r-sm);
  background: var(--pt-card);
  color: var(--pt-ink);
  font: var(--pt-t-strong);
  font-weight: 800;
  cursor: pointer;
}


/* `.pt-order-badge` è un'etichetta di testo ("Percorso ottimizzato"), non il
   numero di una tappa: la forma quadrata da 30px la tagliava. */
.pt-order-badge {
  display: inline-flex;
  align-items: center;
  gap: 6px;
  width: auto;
  height: auto;
  margin: 0 var(--pt-align) var(--pt-2);
  padding: 6px 11px;
  border-radius: var(--pt-r-xs);
  background: var(--pt-paper-2);
  color: var(--pt-ink-70);
  font: var(--pt-t-label);
  font-size: 10.5px;
  letter-spacing: 0.11em;
  text-transform: uppercase;
}
.pt-order-badge i { font-size: 14px; }

/* ---------------------------------------------------------------------------
   v31 · LE AZIONI SUL TOUR

   Erano tre bottoni impilati di tre larghezze diverse — 124, 358, 358 px —
   perché due erano «a blocco» e uno no. Tre cose dello stesso rango devono
   avere la stessa forma.

   Il nome della classe c'era già nel foglio, senza nessun template che la
   usasse: un avanzo. Ma la sua unica regola porta una lezione già pagata —
   «tre comandi affiancati in 358px danno bersagli da 40px e testi tagliati»,
   più in basso, a max-width 520. Per questo la colonna sola è la forma di
   base e non un ripiego: si affiancano solo dove le celle stanno larghe.
   ------------------------------------------------------------------------- */
.pt-tour-azioni {
  display: grid;
  grid-template-columns: 1fr;
  gap: var(--pt-2);
  margin: var(--pt-3) var(--pt-align);
}
.pt-tour-azioni > * { width: 100%; min-height: 46px; }
@media (min-width: 521px) {
  .pt-tour-azioni { grid-template-columns: repeat(auto-fit, minmax(210px, 1fr)); }
}

/* --- v87: LA SCHEDA DI UN PERCORSO ----------------------------------------

   Quattro aggiunte, e nessuna regola vecchia toccata. Tutte vivono solo
   quando l'uscita NON è in corso: mentre si cammina la pagina resta quella
   che v31, v36 e v52 hanno misurato, riga per riga. */

/* LA COPERTINA. Le stesse proporzioni della copertina di un luogo (v75) e la
   stessa velatura, perché la didascalia è bianca e una facciata al sole è
   chiara: 0,55 in basso regge 4,74:1, ed è un numero misurato, non scelto. */
.pt-tour-copertina {
  position: relative;
  height: 200px;
  margin: 0 var(--pt-align);
  border-radius: var(--pt-r-lg);
  background: var(--pt-paper-2) center/cover no-repeat;
  box-shadow: var(--pt-shadow-card);
}
.pt-tour-copertina::after {
  content: "";
  position: absolute;
  inset: 0;
  border-radius: inherit;
  background: linear-gradient(to top, rgba(0, 0, 0, 0.55) 0%, rgba(0, 0, 0, 0) 52%);
  pointer-events: none;
}
.pt-tour-copertina-dida {
  position: absolute;
  z-index: 1;
  inset-inline: var(--pt-3);
  bottom: var(--pt-2);
  display: flex;
  align-items: center;
  gap: var(--pt-2);
  min-height: 44px;            /* la soglia di v16 vale anche qui */
  color: #fff;
  font: var(--pt-t-strong);
  font-size: 14.5px;
  text-decoration: none;
  text-shadow: 0 1px 3px rgba(0, 0, 0, 0.45);
}
.pt-tour-copertina + .pt-credito { margin: var(--pt-2) var(--pt-align) 0; }

/* I TRE NUMERI SOTTO IL TITOLO. Una riga di prosa, non tre riquadri: i
   riquadri esistono già più in basso e sono la didascalia del percorso. Qui
   sono la risposta a tre domande che si fanno prima di leggere l'elenco. */
.pt-tour-meta {
  display: flex;
  flex-wrap: wrap;
  gap: var(--pt-2) var(--pt-4);
  margin-top: var(--pt-3);
  color: var(--pt-ink-70);
  font: var(--pt-t-strong);
  font-size: 13.5px;
}
.pt-tour-meta span { display: inline-flex; align-items: center; gap: 5px; }
.pt-tour-meta i { font-size: 15px; color: var(--pt-ink-55); }

/* LA MINIATURA DELLA TAPPA — SOLO SOPRA GLI 800 PX.

   Sul telefono costa troppo, e il numero lo dice: con la tessera da 64 px
   accanto ai due comandi, al titolo restano centosettanta pixel su
   trecentonovanta e «Chiesa di San Giovanni degli Eremiti» va a cinque righe.
   Misurato: la riga da 90 px diventava 270, e l'elenco delle sette tappe da
   712 px a millenovecento.

   È la stessa decisione che v84 ha preso per Scopri, con le stesse parole di
   Aldo: righe sul telefono, schede sul largo. Il prototipo chiede la miniatura
   e ha ragione dove c'è spazio; dove non ce n'è, il titolo viene prima.

   E la tessera c'è SEMPRE, con la fotografia o con la famiglia: disegnarla solo
   dove c'è una fotografia, con sei fotografie su centoquattordici, vuol dire
   disegnarla a caso — tre titoli rientrati e quattro no. */
.pt-tappa-foto { display: none; }

/* «COSA ASCOLTERAI». Il nome è `pt-tour-ascolto` e non `pt-tour-nota`: quello
   esiste da v65 ed è la riga che spiega una sparizione. Quinta collisione di
   nomi di questo progetto, e la prima trovata PRIMA di scriverla — cercare nel
   foglio prima di battezzare è diventato un gesto, non un proposito. */
.pt-tour-ascolto {
  margin: var(--pt-4) var(--pt-align) 0;
  padding: var(--pt-4);
  border: 1px solid var(--pt-line);
  border-radius: var(--pt-r);
  background: var(--pt-card);
}
.pt-tour-ascolto-titolo {
  display: flex;
  align-items: center;
  gap: 7px;
  margin: 0;
  font: var(--pt-t-label);
  letter-spacing: 0.14em;
  text-transform: uppercase;
  color: var(--pt-ink-70);
}
.pt-tour-ascolto-titolo i { font-size: 16px; }
.pt-tour-ascolto-dato { margin: var(--pt-2) 0 0; color: var(--pt-ink-70); font-size: 14px; }
.pt-tour-ascolto-dato strong {
  font-family: var(--pt-font-titolo);
  font-weight: 400;
  font-size: 22px;
  color: var(--pt-ink);
}
.pt-tour-ascolto-dato.is-vuota { font-style: italic; color: var(--pt-ink-55); }
/* FASE D — quando ogni tappa ha il suo racconto la frase è tutto il blocco, e
   prende la voce del numero che sostituisce: le grazie, in inchiostro pieno. */
.pt-tour-ascolto-dato.is-tutte {
  font-family: var(--pt-font-titolo);
  font-size: 19px;
  line-height: 1.25;
  color: var(--pt-ink);
}
.pt-tour-ascolto-elenco {
  margin: var(--pt-2) 0 0;
  padding-inline-start: var(--pt-4);
  color: var(--pt-ink-55);
  font: var(--pt-t-small);
  font-size: 12.5px;
  line-height: 1.6;
}
.pt-tour-ascolto + .pt-nota-card { margin-inline: var(--pt-align); }

/* IL COMANDO DI UN PERCORSO DEL CATALOGO, APPICCICATO SUL TELEFONO.

   Stesso modello di `.pt-poi-parti` (v83), e stessa geometria: un elemento
   appiccicato col bordo basso resta incollato alla riga del fondo finché la sua
   posizione naturale è più giù. Quindi deve stare ALLA FINE del suo genitore —
   dal suo vecchio posto, a novecento pixel su una pagina di duemiladuecento, si
   staccava dopo la prima schermata. Misurato tutte e due le volte.

   La classe la mette il template dove il riquadro è in fondo, invece di un
   `:has()` sul contenuto: così l'altro posto — il riquadro di stato accanto
   alla mappa, quando si cammina — non può appiccicarsi per sbaglio. */
.pt-uscita-fondo .pt-uscita { margin-bottom: 0; }
/* L'APPICCICATURA STA SULL'INVOLUCRO, NON SUL RIQUADRO DENTRO.

   Terza misura, e la più istruttiva: un elemento appiccicato si muove solo
   dentro il proprio genitore, e il genitore del riquadro era l'involucro —
   alto quanto lui. Zero spazio per muoversi, zero effetto, e nessun errore da
   nessuna parte: la regola c'era, `position: sticky` risultava applicato, e non
   succedeva niente.

   È la stessa lezione di v80 e v83 («sticky si muove solo dentro il proprio
   genitore»), pagata una terza volta perché questa volta il genitore lo avevo
   creato io, due righe prima, senza pensarci. */
@media (max-width: 799px) {
  .pt-uscita-fondo {
    position: sticky;
    bottom: var(--pt-sopra-nav);
    z-index: 5;
  }
  .pt-uscita-fondo .pt-uscita { box-shadow: var(--pt-shadow-pop); }
}


/* La riga che spiega una sparizione. Compare solo quando c'è qualcosa da
   spiegare: un comando che sparisce in silenzio insegna a diffidare. */
.pt-tour-nota {
  display: flex;
  align-items: flex-start;
  gap: 7px;
  margin: 0 var(--pt-align) var(--pt-3);
  font: var(--pt-t-small);
  font-size: 12.5px;
  color: var(--pt-ink-55);
}
.pt-tour-nota i { flex: 0 0 auto; margin-top: 1px; font-size: 14px; }

/* La scheda dentro la scheda: `.pt-uscita` è già un riquadro con bordo e
   sfondo, e `.pt-nav-box` ne disegnava un secondo dentro. Due cornici per
   dire una cosa sola. Qui il riquadro interno smette di essere un riquadro
   e torna a essere il contenuto di quello che lo contiene. */
.pt-nav-box {
  margin: var(--pt-3) 0 0;
  padding: 0;
  border: 0;
  background: none;
}
/* La programmazione era il terzo riquadro dentro il riquadro: un `details`
   dentro una scheda è una riga che si apre, non una scheda a sua volta. */
.pt-uscita > .pt-uscita-programma {
  margin: var(--pt-3) calc(-1 * var(--pt-4)) calc(-1 * var(--pt-4));
  padding: var(--pt-3) var(--pt-4);
  border: 0;
  border-top: 1px solid var(--pt-line);
  border-radius: 0;
  background: none;
}

/* Lo stato dell'uscita è una targhetta con icona, etichetta e momento.
   v31 — era `display: flex`, cioè un blocco: una lastra colorata larga quanto
   la scheda, che sembrava l'intestazione della sezione invece della sua
   etichetta di stato. Sta nella stessa regola di `.pt-shared-badge` e
   `.pt-gruppo-badge`, che sono targhette e si comportano da tali. */
.pt-uscita-stato {
  display: inline-flex;
  align-items: center;
  gap: 8px;
  width: auto;
  padding: 10px 13px;
  border-radius: var(--pt-r-sm);
  background: var(--pt-paper-2);
  color: var(--pt-ink-70);
  font: var(--pt-t-label);
  font-size: 11px;
  letter-spacing: 0.1em;
  text-transform: uppercase;
}
.pt-uscita-stato i { font-size: 15px; }
.pt-uscita-quando { margin-left: auto; text-transform: none; letter-spacing: 0.01em; font-weight: 600; }
/* v66 — il rosso dell'azione sulla propria tinta faceva 4,31:1, sotto soglia:
   a 10 px grassetto una targhetta di stato e' testo piccolo, e la soglia e'
   4,5. Accendere il rosso (v64) e accendere la sua tinta ha consumato il
   margine da tutte e due le parti. Qui va la variante scura — 6,04:1 — che e'
   lo stesso rosso, non un colore nuovo. Trovato dall'audit del contrasto, e
   solo perche' un tour era davvero in corso mentre girava: gli stati si
   vedono solo quando accadono. */
.pt-uscita-stato-in_corso { background: var(--pt-sg-tint); color: var(--pt-sg-dark); }
.pt-uscita-stato-concluso { background: var(--pt-ok-tint); color: var(--pt-ok); }
.pt-uscita-stato-annullato, .pt-uscita-stato-scaduto { background: var(--pt-danger-tint); color: var(--pt-danger); }

/* "Avvia il tour" ha un titolo e una spiegazione dentro il bottone. */
/* v63 — `pt-azione-doppia` entra in queste quattro regole invece di
   ricopiarle. E' la stessa FORMA — comando primario con un sottotitolo — usata
   da «Avvia il tour» e dal nuovo «Avvia questo percorso»; scritta due volte,
   fra sei mesi le due si sarebbero allontanate di due pixel alla volta.
   Guardando la pagina renderizzata, senza queste righe il sottotitolo restava
   in linea col titolo: «Start this route It becomes yours and starts now». */
.pt-uscita-avvia, .pt-azione-doppia { width: 100%; margin-top: var(--pt-3); text-align: start; }
.pt-uscita-avvia span, .pt-azione-doppia span { display: block; }
.pt-uscita-avvia strong, .pt-azione-doppia strong { display: block; font-size: 15px; }
.pt-uscita-avvia small, .pt-azione-doppia small { display: block; margin-top: 2px; font-weight: 400; font-size: 12.5px; color: #fff; }   /* v64 — era 88%: 4,15:1 sul rosso acceso */

.pt-uscita-programma summary {
  display: flex;
  align-items: center;
  gap: 8px;
  cursor: pointer;
  font: var(--pt-t-strong);
  list-style: none;
}
.pt-uscita-programma summary::-webkit-details-marker { display: none; }
.pt-uscita-programma[open] summary { margin-bottom: var(--pt-3); }

/* Il lucchetto è un secondo elemento DENTRO il tondo del riconoscimento: va
   messo in un angolo, non sovrapposto all'icona. */
.pt-badge-icon { position: relative; }
.pt-badge-lock {
  position: absolute;
  right: -3px;
  bottom: -3px;
  display: grid;
  place-items: center;
  width: 17px;
  height: 17px;
  border-radius: 50%;
  background: var(--pt-ink);
  color: #fff;
  font-size: 10px;
}
.pt-badge-item.is-locked .pt-badge-icon { background: var(--pt-paper-2); color: var(--pt-ink-45); }
.pt-badge-item.is-locked .pt-badge-text strong { color: var(--pt-ink-55); }

/* Il passaporto aveva perso il titolo: nel template c'è solo il sottotitolo,
   il titolo sta nella testata della pagina. Qui si dà peso al sottotitolo. */
.pt-passport-sub { font-size: 14.5px; color: var(--pt-ink-70); }

/* Il lettore audio galleggia ancora e quindi lo spazio se lo prende. La barra
   del builder no: da v99 sta nel flusso della pagina, e i 210 px che le erano
   riservati qui erano una schermata vuota da scorrere in fondo a tre pagine. */
body:has(.pt-audio-player:not([hidden])) { padding-bottom: 200px; }

/* Su itinerario_detail il pulsante della guida è nascosto (c'è il lettore
   audio), quindi il corpo può respirare un po' meno. */
.pt-itin-card .pt-badge-cat i { font-size: 13px; }

/* `.pt-builder-checkbox` è uno <span> con dentro l'icona di spunta, non un
   controllo nativo: il vero <input> gli sta accanto e va nascosto alla vista.
   Prima si vedevano entrambi — la casella di sistema e la spunta verde — e
   sembravano due controlli diversi per la stessa cosa. */
/* Stesso motivo di `.pt-avvio-scelta`: chi ospita un controllo nascosto in
   posizione assoluta deve dichiararsi riferimento, altrimenti il controllo
   scappa dal suo contenitore. Qui la lista è verticale e il difetto non si
   vedeva, ma la regola vale comunque. */
.pt-builder-item { position: relative; }
.pt-builder-item > input[type="checkbox"] {
  position: absolute;
  width: 1px; height: 1px;
  padding: 0; margin: -1px;
  overflow: hidden;
  clip: rect(0, 0, 0, 0);
  white-space: nowrap;
  border: 0;
}

.pt-builder-checkbox {
  display: grid;
  place-items: center;
  flex: 0 0 auto;
  width: 24px;
  height: 24px;
  border: 1.5px solid var(--pt-line-2);
  border-radius: var(--pt-r-xs);
  background: var(--pt-card);
  color: transparent;
  font-size: 16px;
  transition: all var(--pt-fast) var(--pt-ease);
}


.pt-builder-item > input:checked ~ .pt-builder-checkbox,
.pt-builder-item.checked .pt-builder-checkbox {
  background: var(--pt-sg);
  border-color: var(--pt-sg);
  color: #fff;
}

.pt-builder-item > input:focus-visible ~ .pt-builder-checkbox {
  outline: 3px solid var(--pt-sg);
  outline-offset: 2px;
}

.pt-builder-item.checked,
/* v65 — vedi `.pt-lampo-radio.active`: «scelto» non può essere il colore del
   fondo pagina. Ed era scritta due volte, identica, a milleduecento righe di
   distanza: adesso è una. */
.pt-builder-item:has(input:checked) { border-color: var(--pt-scelto); background: var(--pt-scelto-tint); }

/* Il cuore dei preferiti sta dentro il titolo della voce: va staccato dal
   testo, altrimenti si attaccano. */
.pt-builder-item-text .pt-fav-star { margin-inline-end: 6px; vertical-align: -3px; }

/* FASE D — qui stavano le due regole di `.pt-future-note`, la riga
   «Prossimamente: potrai fissare un orario per una tappa» del costruttore:
   la promessa di una funzione che non c'è, tolta con la sua classe. */

/* Ultime voci emerse dal confronto fra le classi usate nei template e quelle
   definite qui. Il controllo è meccanico e va rifatto quando si aggiunge
   interfaccia: una classe senza stile non dà errore, si limita a essere
   brutta in un angolo che nessuno guarda. */

.pt-account-dropdown { min-width: 232px; }

#pt-builder-svuota {
  flex: 0 0 auto;
  padding: 9px 13px;
  border: 1px solid rgba(255, 255, 255, 0.3);
  border-radius: var(--pt-r-xs);
  background: none;
  color: #fff;
  font: var(--pt-t-strong);
  font-size: 13px;
  cursor: pointer;
}


.pt-edit-cat { margin-bottom: var(--pt-4); }

/* I due menu a discesa di partenza e arrivo: campi, non pulsanti. */
.pt-endpoint-field label {
  display: flex;
  align-items: center;
  gap: 6px;
  font: var(--pt-t-label);
  letter-spacing: 0.14em;
  text-transform: uppercase;
  color: var(--pt-ink-55);
}
.pt-endpoint-field select,
select#pt-edit-add, select.pt-propose-input {
  width: 100%;
  padding: 12px 14px;
  border: 1px solid var(--pt-line-2);
  border-radius: var(--pt-r-sm);
  background: var(--pt-card);
  color: var(--pt-ink);
  font: var(--pt-t-body);
}

.pt-tour-publish {
  display: inline-flex;
  align-items: center;
  gap: 6px;
  padding: 7px 11px;
  border: 1px solid var(--pt-line-2);
  border-radius: var(--pt-r-xs);
  background: var(--pt-card);
  color: var(--pt-ink);
  font: var(--pt-t-strong);
  font-size: 13px;
}


.pt-guida-alternative { display: grid; gap: var(--pt-2); }

/* L'etichetta della quarta tessera del tempo ("Giornata") deve stare su una
   riga come le altre tre: se va a capo, la fila perde l'allineamento che è
   proprio ciò che la fa leggere come un cartello. */
.pt-tempo-unita,
.pt-tempo-parola { white-space: nowrap; }


/* ============================================================================
   14. LA CITTÀ
   ============================================================================
   La schermata di scelta è l'unica pagina che sta fuori da ogni città: niente
   barra delle sezioni, niente accesso alla guida. Deve sembrare una soglia,
   non una pagina dell'app in cui si è già dentro.
   ========================================================================== */

.pt-scelta {
  margin: var(--pt-5) var(--pt-align) var(--pt-4);
}

.pt-scelta h1 {
  margin: var(--pt-2) 0 var(--pt-3);
  font-size: clamp(30px, 8.2vw, 40px);
  line-height: 1.02;
  letter-spacing: -0.045em;
}

.pt-scelta > p {
  max-width: 34ch;
  font: var(--pt-t-body);
  color: var(--pt-ink-70);
}

.pt-scelta-posizione {
  display: inline-flex;
  align-items: center;
  gap: 8px;
  margin-top: var(--pt-4);
  padding: 11px 16px;
  border: 1px solid var(--pt-line-2);
  border-radius: var(--pt-r-pill);
  background: var(--pt-card);
  color: var(--pt-ink);
  font: var(--pt-t-strong);
  cursor: pointer;
  transition: border-color var(--pt-fast) var(--pt-ease);
}
.pt-scelta-posizione i { font-size: 18px; color: var(--pt-sg); }

.pt-scelta-posizione.is-loading { opacity: 0.55; pointer-events: none; }
.pt-scelta-posizione.is-lontano { border-color: var(--pt-line); color: var(--pt-ink-55); }
.pt-scelta-posizione.is-lontano i { color: var(--pt-ink-45); }

.pt-scelta-lista { display: grid; gap: var(--pt-3); margin: 0 var(--pt-align); }

/* La tessera di una città non è un elenco a discesa: è una scelta con dentro
   i numeri veri, perché «100 luoghi · 11 siti Unesco» dice quanto vale una
   città meglio di qualunque immagine — e sono dati che l'app ha già. */
.pt-citta-card {
  position: relative;
  display: block;
  padding: var(--pt-5);
  border: 1px solid var(--pt-line-2);
  border-radius: var(--pt-r-lg);
  background: var(--pt-card);
  color: var(--pt-ink);
  transition: border-color var(--pt-fast) var(--pt-ease),
              transform var(--pt-fast) var(--pt-ease);
}


.pt-citta-nome {
  display: block;
  font: 800 clamp(26px, 7vw, 32px)/1.04 var(--pt-font);
  font-stretch: var(--pt-wide);
  letter-spacing: -0.045em;
}

.pt-citta-occhiello {
  display: block;
  margin-top: 5px;
  font: var(--pt-t-body);
  font-size: 14.5px;
  color: var(--pt-ink-70);
}

.pt-citta-numeri {
  display: flex;
  flex-wrap: wrap;
  gap: 6px 20px;
  margin-top: var(--pt-4);
  font: var(--pt-t-label);
  font-size: 11px;
  letter-spacing: 0.11em;
  text-transform: uppercase;
  color: var(--pt-ink-55);
}
.pt-citta-numeri > span { display: inline-flex; align-items: baseline; gap: 5px; }
.pt-citta-numeri b {
  font: 800 19px/1 var(--pt-font);
  font-stretch: var(--pt-wide);
  font-variant-numeric: tabular-nums;
  letter-spacing: -0.035em;
  color: var(--pt-ink);
}

.pt-citta-freccia {
  position: absolute;
  top: var(--pt-5);
  inset-inline-end: var(--pt-5);
  font-size: 22px;
  color: var(--pt-ink-45);
}


/* La città riconosciuta dal GPS si dichiara e va in cima, ma non viene
   scelta al posto dell'utente: proporre non è decidere. */
.pt-citta-card.is-vicina { border-color: var(--pt-sg); }

.pt-citta-vicina {
  position: absolute;
  top: calc(var(--pt-5) * -1 + 12px);
  inset-inline-start: var(--pt-5);
  padding: 4px 10px;
  border-radius: var(--pt-r-xs);
  background: var(--pt-sg);
  color: #fff;
  font: var(--pt-t-label);
  letter-spacing: 0.12em;
  text-transform: uppercase;
}
.pt-citta-card.is-vicina { margin-top: 12px; }

.pt-scelta-nota {
  margin: var(--pt-5) var(--pt-align);
  font: var(--pt-t-small);
  font-size: 12.5px;
  color: var(--pt-ink-55);
  text-align: center;
}

/* --- Il selettore nella testata ------------------------------------------
   Stessa forma di quello della lingua, e gli sta accanto: sono la stessa cosa
   — il contesto in cui l'app parla — e mettendoli vicini l'utente impara un
   comportamento solo invece di due. */

.pt-citta-btn {
  display: inline-flex;
  align-items: center;
  gap: 5px;
  height: 38px;
  padding: 0 13px;
  border: 1px solid var(--pt-line-2);
  border-radius: var(--pt-r-pill);
  background: var(--pt-card);
  color: var(--pt-ink);
  font: var(--pt-t-strong);
  font-size: 13px;
  max-width: 130px;
  cursor: pointer;
  transition: border-color var(--pt-fast) var(--pt-ease);
}
.pt-citta-btn i { font-size: 16px; color: var(--pt-sg); flex: 0 0 auto; }
.pt-citta-btn span { overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }


.pt-citta-menu { min-width: 200px; }

/* --- L'avviso di cambio città --------------------------------------------
   Aprire il link a un luogo di un'altra città cambia contesto. Il cambio
   avviene — chiedere il permesso per una cosa che l'utente ha già espresso
   aprendo il link sarebbe un ostacolo — ma viene DICHIARATO: un cambio
   silenzioso disorienta, e chi non capisce perché l'app parla di Roma pensa
   che si sia rotta. */

.pt-avviso-citta {
  display: flex;
  align-items: center;
  gap: var(--pt-3);
  margin: var(--pt-3) var(--pt-align) 0;
  padding: 12px var(--pt-4);
  border: 1px solid var(--pt-scelto);
  border-radius: var(--pt-r-sm);
  background: var(--pt-card);
  font: var(--pt-t-small);
  color: var(--pt-ink);
}
.pt-avviso-citta > i:first-child { flex: 0 0 auto; font-size: 19px; color: var(--pt-sg); }
.pt-avviso-citta strong { font-weight: 800; }
.pt-avviso-citta a {
  margin-inline-start: auto;
  flex: 0 0 auto;
  font: var(--pt-t-strong);
  font-size: 13px;
  color: var(--pt-ink-70);
  text-decoration: underline;
  text-underline-offset: 3px;
}


/* I preferiti di un'altra città sono più quieti di quelli di qui: sono
   presenti e raggiungibili, ma non competono con il contenuto corrente. */
/* v62 — LE SCHEDE DI UN'ALTRA CITTA' RESTANO SCHEDE.

   Qui c'era: `.pt-list-altrove .pt-poi-card { background: var(--pt-paper) }`.
   Serviva ad avvisare che toccarle cambia citta'. Ma `--pt-paper` e' lo sfondo
   della pagina: la regola non marcava la scheda, **la cancellava** — stesso
   colore sotto e sopra, il bordo che sparisce nel foglio.

   E si applicava molto piu' spesso di quanto sembri: basta trovarsi in una
   citta' dove non si hanno preferiti — succede appena se ne apre una nuova —
   perche' TUTTE le sezioni siano «altrove» e l'intera pagina esca piatta,
   diversa da ogni altra lista dell'app. E' quello che si vede nella
   segnalazione: citta' corrente Lipari, preferiti a Palermo e a Roma.

   L'avviso non si perde, perche' non era questa regola a darlo: c'e'
   l'intestazione col nome della citta' sopra ogni gruppo, e c'e' l'avviso in
   cima alla pagina di destinazione — che il commento di allora nominava
   gia' come il posto giusto dove dirlo. */

@media (min-width: 800px) {
  .pt-scelta-lista { grid-template-columns: repeat(2, 1fr); }
  .pt-scelta h1 { font-size: 44px; }
}


/* ============================================================================
   15. MOBILE — CORREZIONI MISURATE
   ============================================================================
   L'app è mobile-first, ma "mobile-first" non è una dichiarazione d'intenti:
   è una cosa che si misura. Questo blocco raccoglie i difetti trovati da un
   controllo automatico su tutte le pagine a quattro larghezze (320, 360, 390,
   430 px), che cerca quattro cose:

     · elementi che sfondano il bordo dello schermo
     · bersagli di tocco sotto i 44×44 px
     · campi di testo sotto i 16px, che su iOS fanno zoomare la pagina
     · sovrapposizioni con le barre fisse

   Ogni regola qui sotto corrisponde a un difetto reale trovato dalla misura,
   non a un sospetto.
   ========================================================================== */

/* --- 1. LA SCHEDA LUOGO SFONDAVA LO SCHERMO A 320px ----------------------
   Misurato: 373px di larghezza dentro una finestra di 320.

   Causa: `.pt-poi-cat` ha `white-space: nowrap` (il nome della categoria non
   deve andare a capo) ma è un elemento flessibile senza `min-width: 0`. La
   regola predefinita dei contenitori flessibili e a griglia è che un figlio non
   si stringe sotto la larghezza del proprio contenuto: con una categoria come
   "ITINERARIO ARABO-NORMANNO" in maiuscoletto spaziato sono 194px che si
   rifiutano di comprimersi, e trascinano fuori tutta la scheda.

   È il difetto peggiore trovato, perché su un telefono piccolo rendeva la
   pagina scorrevole in orizzontale — e una lista che balla lateralmente mentre
   si scorre con il pollice dà l'impressione che l'app sia rotta. */

.pt-poi-card { min-width: 0; }
.pt-poi-riga1 { min-width: 0; }
.pt-poi-cat { flex: 0 1 auto; min-width: 0; }

/* Stesso rimedio dove la stessa forma si ripete. */
.pt-list > * { min-width: 0; }
.pt-tappa, .pt-lampo-poi-card, .pt-builder-item, .pt-edit-item,
.pt-altro-riga, .pt-intorno, .pt-riprendi-quieto { min-width: 0; }

/* --- 2. I MENU A DISCESA USCIVANO DALLO SCHERMO --------------------------
   Misurato sul Tour lampo: un <select> con dentro i nomi dei cento luoghi era
   largo 468px in una finestra di 390. Un menu a discesa prende per default la
   larghezza dell'opzione più lunga, e i nomi dei luoghi sono lunghi. */

select, .pt-endpoint-field select, .pt-propose-input {
  max-width: 100%;
  text-overflow: ellipsis;
}

/* --- 3. I CAMPI DI TESTO FACEVANO ZOOMARE LA PAGINA SU iOS ---------------
   Safari su iPhone ingrandisce automaticamente la pagina quando si tocca un
   campo con carattere sotto i 16px — e, cosa peggiore, NON la rimpicciolisce
   quando il campo perde il fuoco: si resta con l'interfaccia zoomata e si deve
   pizzicare per tornare indietro.

   I campi erano a 15px. Non è un dettaglio tipografico: è la differenza fra
   una ricerca che funziona e una che rompe la pagina. Sedici pixel è il minimo
   e non si scende. */

@media (max-width: 799px) {
  input[type="text"], input[type="search"], input[type="email"],
  input[type="password"], input[type="number"], input[type="url"],
  input[type="datetime-local"], input[type="date"], input[type="time"],
  textarea, select,
  .pt-search input, .form-control, .pt-campo-input, .pt-propose-input, .pt-propose-textarea,
  .pt-publish-input, .pt-publish-textarea, .pt-review-textarea, .pt-uscita-input,
  /* v66 — QUESTE TRE RIGHE MANCAVANO, E LA REGOLA PERDEVA DOVE SERVIVA DI PIÙ.
     Su un campo dentro `.pt-campo` — cioè tutti i campi dei moduli di account,
     accesso compreso — il selettore che impone i 15 px è
     `.pt-campo > input:not([type="checkbox"]):not([type="radio"])`, che pesa
     0-3-1: batte `input[type="email"]`, che pesa 0-1-1. Il risultato è che
     accesso, registrazione e recupero password avevano i campi a **15 px**, e
     su iPhone toccare l'email ingrandisce la pagina e non la rimpicciolisce
     più. È la prima schermata che un turista nuovo incontra.

     È lo STESSO difetto del `select.pt-propose-input` di v16, con un'altra
     classe: sui campi la specificità non è un dettaglio di stile, è uno zoom
     involontario. Non l'ha trovato nessuno perché `audit_mobile` faceva
     l'accesso prima di misurare, e queste pagine da dentro non esistono. */
  .pt-campo > input:not([type="checkbox"]):not([type="radio"]),
  .pt-campo > select, .pt-campo > textarea,
  .pt-endpoint-field select {
    font-size: 16px;
  }
}

/* --- 4. BERSAGLI DI TOCCO SOTTO I 44px -----------------------------------
   Quarantaquattro pixel è la soglia sotto la quale un dito sbaglia: è la
   raccomandazione di Apple, Material dice 48. Misurati sotto soglia: i comandi
   della testata (38), i pulsanti delle tappe (36), le pastiglie dei filtri
   (38 di altezza), il cuore dei preferiti (19).

   Dove ingrandire il riquadro visibile avrebbe appesantito il disegno, si
   allarga la SOLA area sensibile con uno pseudo-elemento: il pollice trova
   44px, l'occhio continua a vedere l'elemento della misura giusta. */

.pt-home-btn, .pt-account-btn, .pt-lang-btn, .pt-citta-btn,
.pt-cerca-btn { min-height: 44px; }
.pt-account-btn, .pt-home-btn { width: 44px; height: 44px; }

.pt-tappa-listen, .pt-visited-toggle,
.pt-edit-up, .pt-edit-down, .pt-edit-remove {
  width: 44px;
  height: 44px;
}
/* Il bottone di testo cresce in larghezza, non in quadrato: l'altezza minima
   basta a garantire il bersaglio da 44px. */
.pt-edit-add { min-height: 44px; }

@media (max-width: 799px) {
  .pt-chip, .pt-action-btn, .pt-avvio-scelta span, .pt-lampo-chip, .pt-lampo-cat {
    min-height: 44px;
  }
  .pt-btn, .btn, .pt-tempo-altro { min-height: 44px; }
  .pt-guida-fab { min-height: 46px; }
  .dropdown-item { min-height: 44px; }
}

/* Il cuore dei preferiti è 19px per disegno — ingrandirlo lo trasformerebbe
   nell'elemento più vistoso della scheda, che non è. Si allarga solo l'area
   sensibile, che è invisibile. */
.pt-fav-star { position: relative; }
.pt-fav-star::after {
  content: "";
  position: absolute;
  top: 50%;
  left: 50%;
  width: 44px;
  height: 44px;
  transform: translate(-50%, -50%);
}

/* --- 5. LA TESTATA A 320px -----------------------------------------------
   Con il pulsante home in più, i comandi della testata non ci stavano: home
   44 + account 44 + città 110 + lingua 70 + spazi = oltre i 288px disponibili.

   Il nome della città sparisce sotto i 420px, non il pulsante: l'icona del
   segnaposto resta, il menu continua a dire dove sei, e la città è comunque
   scritta nel titolo della home. È l'informazione più ridondante delle tre.

   Il titolo della sezione, sulle cinque pagine principali, ripete la voce
   evidenziata nella barra in basso: può stringersi fino a sparire senza che
   nessuno perda niente. */

.pt-topbar { gap: var(--pt-2); }
.pt-topbar .pt-topbar-titolo { flex: 1 1 auto; min-width: 0; }

@media (max-width: 420px) {
  .pt-citta-btn span { display: none; }
  .pt-citta-btn { padding-inline: 11px; }
  .pt-topbar { padding-inline: 12px; }
  .pt-topbar .pt-topbar-titolo { font-size: 16px; }
}

@media (max-width: 340px) {
  /* Su schermi molto stretti il titolo cede il posto ai comandi: la sezione
     è comunque nominata dalla barra in basso. */
  .pt-topbar .pt-topbar-titolo { display: none; }
}

/* --- 6. IL PULSANTE HOME -------------------------------------------------- */

.pt-home-btn {
  display: grid;
  place-items: center;
  flex: 0 0 auto;
  border: 1px solid var(--pt-line-2);
  border-radius: var(--pt-r-sm);
  background: var(--pt-card);
  color: var(--pt-ink);
  font-size: 21px;
  transition: all var(--pt-fast) var(--pt-ease);
}

.pt-home-btn:active { transform: scale(0.94); }

/* Sulla home, il pulsante dice di essere già a casa invece di fingere di
   portare da qualche parte. */
.pt-home-btn[aria-current="page"] {
  background: var(--pt-scelto);
  border-color: var(--pt-scelto);
  color: #fff;
}

/* La via d'uscita dalla scelta città. */
.pt-scelta-torna {
  display: inline-flex;
  align-items: center;
  gap: 7px;
  min-height: 44px;
  margin: var(--pt-3) var(--pt-align) 0;
  padding: 10px 14px;
  border: 1px solid var(--pt-line-2);
  border-radius: var(--pt-r-pill);
  background: var(--pt-card);
  color: var(--pt-ink);
  font: var(--pt-t-strong);
}


/* --- 7. RESPIRO E SICUREZZE ----------------------------------------------
   Cose che su telefono si notano e su schermo grande no. */

@media (max-width: 799px) {
  /* Nessuna pagina deve poter scorrere in orizzontale. È una rete di
     sicurezza, non una soluzione: se scatta, c'è un difetto da trovare — ma
     l'utente nel frattempo non vede la pagina ballare.

     v25 — `hidden` faceva anche un'altra cosa, non voluta: su `html`/`body`
     trasforma la pagina in un contenitore di scorrimento, e questo **spegne
     `position: sticky`** per tutto quello che c'è dentro. Effetto misurato:
     l'intestazione dell'app dichiarava `position: sticky` da sempre e non si
     è mai appiccicata a niente — scorreva via come un elemento qualunque, e
     nessuno se n'era accorto perché in cima alla pagina appare uguale.

     `clip` fa la stessa guardia — niente scorrimento orizzontale — senza
     creare quel contenitore. `hidden` resta come ripiego per i browser che
     `clip` non ce l'hanno: lì si perde lo sticky, che è esattamente la
     situazione di prima, non un peggioramento. */
  html, body { overflow-x: hidden; }
  @supports (overflow-x: clip) {
    html, body { overflow-x: clip; }
  }

  /* Le barre fisse rispettano la zona sicura anche ai lati: sui telefoni con
     schermo curvo o in orizzontale, senza questo i bordi finiscono sotto la
     cornice. */
  /* FASE D — senza `.pt-builder-bar`: sta nel flusso da v99, e su un
     elemento che non è posizionato `left` e `right` non fanno niente. */
  .pt-audio-player, .pt-audio-banner, .pt-anche-qui {
    left: max(10px, env(safe-area-inset-left));
    right: max(10px, env(safe-area-inset-right));
  }
  /* v69 — la barra in basso no: da quando e' ancorata deve arrivare ai due
     bordi dello schermo, altrimenti resta una tavoletta con dieci pixel di
     pagina che scorre ai lati. La zona sicura la rispetta lo stesso, ma con il
     RIENTRO invece che con la posizione: il colore arriva al bordo, le voci
     no. */
  .pt-bottom-nav {
    left: 0;
    right: 0;
    padding-left: max(6px, env(safe-area-inset-left));
    padding-right: max(6px, env(safe-area-inset-right));
  }
  /* Le parole lunghe (nomi di luoghi, indirizzi) vanno spezzate invece di
     sfondare: "Sferracavallo" su uno schermo da 320 non ci sta intero. */
  .pt-poi-card h3, .pt-poi-title, .pt-tappa-info h3, .pt-itin-card h3,
  .pt-citta-nome, .pt-avvio h1, .pt-scelta h1 {
    overflow-wrap: break-word;
    hyphens: auto;
  }

  /* LE TESSERE DEL TEMPO, terza forma in tre rilasci — e vale la pena dire
     perché, perché il giro è finito dove era partito con una ragione in più.

     v29 le aveva messe in quattro colonne: a 320px erano riquadri da 68px con
     l'etichetta che andava a capo. v68 aveva fatto crescere il numero e messo
     un pavimento a 11px sull'unità (era 9,36px su un telefono da 390 e 8,5 su
     uno da 320: metà del significato del bottone, scritta più piccola di
     qualunque altro testo dell'app). v71 le aveva girate in quattro righe.

     v73 le rimette in fila, ma la fila adesso SCORRE: quattro colonne fisse
     obbligano ogni tessera a stare in un quarto di schermo, e una fila che
     scorre no. Da 320px si vedono due tessere e mezzo — e la mezza è il
     segnale che ce ne sono altre, che quattro colonne strette non davano.

     Qui vivono le misure VERE: la regola di base non arriva mai a un telefono,
     questo blocco è tutto ciò che sta sotto gli 800px. Il pavimento di v68
     resta, e adesso è una prova che guarda TUTTA la famiglia `.pt-tempo`
     invece di una riga sola. */
  .pt-tempo { width: 124px; min-height: 144px; padding: 12px; }
  .pt-tempo-cifra { font-size: 26px; }
  .pt-tempo-parola { font-size: 16px; }
  .pt-tempo-ritmo { font-size: 12px; }

  /* Le tre statistiche del percorso: a 320px "10h 33min" andava a capo dentro
     un riquadro da 96px. */
  .pt-stat-value { font-size: clamp(17px, 5vw, 21px); }
  .pt-stat-label { font-size: 9px; letter-spacing: 0.09em; }
}

/* --- 8. GLI ULTIMI BERSAGLI SOTTO SOGLIA ---------------------------------
   Trovati dalla seconda passata di misura, dopo aver tolto dal conteggio i
   falsi positivi (elementi dentro contenitori che scorrono, attribuzione di
   OpenStreetMap, caselle di spunta). Sono tutti reali. */

/* La freccia indietro era 38px: è il comando più usato dell'app dopo la barra
   in basso, e stava sotto soglia. */
.pt-indietro { width: 44px; height: 44px; }

/* Il selettore di città, ridotto alla sola icona sotto i 420px, era largo 40. */
.pt-citta-btn { min-width: 44px; justify-content: center; }

/* Il salto al contenuto: si vede solo navigando da tastiera, ma quando si vede
   deve essere un bersaglio come gli altri. */
.pt-skip { min-height: 44px; display: inline-flex; align-items: center; }

/* Collegamenti dentro righe di testo — il sito ufficiale nella scheda di un
   luogo, "cambia città" nell'avviso — erano alti 15-17px. Si allarga l'area
   sensibile in verticale senza scostare il testo. */
.pt-dati dd a, .pt-avviso-citta a, .pt-photo-change, .pt-auth-switch a {
  display: inline-flex;
  align-items: center;
  min-height: 44px;
}

/* La riga di una tappa: 40px di altezza, quattro sotto soglia. */
.pt-tappa-info { min-height: 44px; display: flex; flex-direction: column; justify-content: center; }

/* I comandi di ingrandimento della mappa sono di Leaflet e nascono a 30px. */
.leaflet-control-zoom a {
  width: 44px !important;
  height: 44px !important;
  line-height: 44px !important;
  font-size: 20px !important;
}

/* Il carattere dei campi: `select.pt-propose-input` continuava a restare a
   15px perché il selettore che glielo imponeva è più specifico (elemento +
   classe) di quello della regola per mobile. Su iOS un campo sotto i 16px fa
   zoomare la pagina e non la fa tornare indietro: qui la specificità non è un
   dettaglio di stile, è un difetto d'uso. */
@media (max-width: 799px) {
  select.pt-propose-input, select.pt-lampo-select,
  .pt-endpoint-field select, select#pt-edit-add { font-size: 16px; }
}

/* --- 9. GLI ULTIMI ------------------------------------------------------- */

/* Il pulsante della posizione nella scelta città: 43px, uno sotto soglia. */
.pt-scelta-posizione { min-height: 44px; }

/* Le sezioni che si aprono (programma un'uscita, attiva il gruppo): la
   linguetta era alta 19px, e si tocca per aprire. */
summary { min-height: 44px; display: flex; align-items: center; }
.pt-uscita-programma summary, .pt-gruppo-attiva summary { padding-block: var(--pt-2); }

/* L'etichetta di categoria su una scheda evento è un COLLEGAMENTO al luogo,
   non una targhetta: essendo toccabile deve avere l'altezza di un bersaglio. */
a.pt-badge-cat { min-height: 44px; padding-inline: 10px; }

/* Le azioni sui tour salvati stavano in una riga stretta: 38 e 40 px. */
.pt-tour-share, .pt-tour-delete, .pt-tour-publish { min-height: 44px; min-width: 44px; }

/* --- v45 — La riga delle azioni di un tour salvato --------------------------
   «I bottoni sono grandi e poco comunicativi.» Erano tutte e tre senza una
   parola — misurato: 21 su 21 — e due si allargavano a 292px per contenere
   un'icona da 16. Adesso ognuna dice quello che fa, e sta larga quanto la sua
   parola. */
.pt-tour-card .pt-tour-actions {
  display: flex;
  flex-wrap: wrap;
  align-items: center;
  gap: var(--pt-2);
  /* FASE F — dentro la scheda i comandi cominciano dove comincia il testo:
     il margine della pagina che `.pt-tour-actions` porta per il giro generato
     (dove sta in `main`) qui li spostava di 16 px a destra del nome — 49
     contro 33 sul telefono, 53 contro 37 sul largo. */
  margin-inline: 0;
}
/* FASE F — «Condividi» e «Pubblica» sono due comandi pari nella stessa riga, e
   avevano due disegni: «Condividi» prendeva quello del comando grande della
   pagina di un percorso (`.pt-share-btn`, 12/16 px di riempimento, il corpo
   pieno), «Pubblica» quello della riga. Qui dentro, lo stesso per tutti e due. */
.pt-tour-card .pt-tour-share {
  gap: 6px;
  padding: 7px 11px;
  border-radius: var(--pt-r-xs);
  font-size: 13px;
}
/* «Elimina» e' l'unica irreversibile: sta in fondo, spinta a destra. Non e' un
   pari degli altri due, e il bordo rosso che aveva le dava lo stesso peso di
   «Condividi». Il rosso torna quando la si sta premendo, che e' il momento in
   cui serve. */
/* La pastiglia con l'icona del percorso, tolta perche' non diceva niente,
   faceva anche una cosa che diceva: teneva il link della scheda sopra i 44px.
   Sulla scheda piu' corta — un tour pronto, senza nessuna pastiglia di stato —
   il bersaglio e' sceso a 41. L'ha trovato `tools/audit_mobile.py`, che
   controlla proprio questa soglia. La misura si dichiara qui, dove e' una
   scelta, invece di dipendere da un pezzo di decorazione. */
.pt-tour-card > a { display: block; min-height: 44px; }

.pt-tour-card .pt-tour-elimina-form { margin-inline-start: auto; }
.pt-tour-card .pt-tour-delete {
  border-color: transparent;
  background: transparent;
  color: var(--pt-ink-55);
}
.pt-tour-card .pt-tour-delete:active {
  border-color: var(--pt-danger);
  color: var(--pt-danger);
}

/* Le due pastiglie della pubblicazione sono STATI, non comandi: stavano in
   mezzo alle azioni, dove sembravano due bottoni spenti. Adesso stanno
   accanto allo stato dell'uscita, e dicono a parole quello che dicevano con
   un'icona e un `title` che su un telefono non si apre mai. */
.pt-itin-card .pt-tour-stato,
.pt-itin-card .pt-tour-pending,
.pt-itin-card .pt-tour-published { margin-top: var(--pt-2); margin-inline-end: 6px; }

/* Su telefono le azioni di un tour vanno in colonna invece di stringersi:
   tre comandi affiancati in 358px danno bersagli da 40px e testi tagliati.

   v45 — Vale ancora per `.pt-tour-azioni` (la pagina del tour, dove i comandi
   sono davvero tre e lunghi). NON piu' per le schede di «I miei tour»: li' i
   comandi erano tre perche' le due regole di v31 non erano applicate. Con la
   regola, un'uscita e' condivisibile OPPURE pubblicabile, mai tutte e due,
   quindi la riga porta al massimo un comando piu' «Elimina». Due voci con la
   loro parola stanno in una riga sola, e misurano piu' dei 44px di soglia. */
@media (max-width: 520px) {
  .pt-tour-azioni { display: grid; grid-template-columns: 1fr; gap: var(--pt-2); }
}

/* Il pin trascinabile di "proponi un luogo" è l'icona predefinita di Leaflet
   (25×41, un'immagine). Non si ingrandisce senza sostituirla, e sarebbe una
   modifica di sostanza per un caso d'uso raro; resta l'unico bersaglio sotto
   soglia dell'app, ed è dichiarato qui invece di essere nascosto. */

/* --- 10. IL PULSANTE DELLA GUIDA COPRIVA L'AZIONE PRINCIPALE --------------
   Con l'etichetta "Chiedi" il pulsante è largo 105px e galleggia sopra il
   contenuto. Su uno schermo da 320 finiva esattamente sopra la quarta tessera
   del tempo — cioè sopra l'azione primaria della home.

   Su telefono diventa un cerchio con la sola icona: è la forma consueta di un
   pulsante flottante, occupava un terzo dello spazio e nascondeva la parola,
   lasciando un cerchio scuro con un'icona sola.

   v23 — Il comando non galleggia più: è una riga in fondo alla pagina, e su
   una riga lo spazio c'è. La parola torna, su tutte le larghezze, e con essa
   il nome per esteso: un cerchio anonimo in fondo a una pagina sarebbe un
   elemento smarrito, non un invito. */

/* --- 11. RESPIRO SOTTO LE BARRE FISSE ------------------------------------
   La barra di navigazione è fissa: senza spazio riservato, l'ultima riga della
   lista resta sotto e sembra tagliata. (Fino a v22 qui si teneva conto anche
   del pulsante della guida, che galleggiava più in basso della barra; adesso
   sta nel flusso della pagina e non chiede più spazio suo.) */

@media (max-width: 799px) {
  body { padding-bottom: calc(var(--pt-nav-h) + env(safe-area-inset-bottom) + var(--pt-4)); }
  body:has(.pt-audio-player:not([hidden])) { padding-bottom: calc(170px + env(safe-area-inset-bottom)); }
}

/* ---------------------------------------------------------------------------
   16. AVVISO "MAPPA SENZA RETE"
   Le tessere di OpenStreetMap arrivano dalla rete. Quando non arrivano, la
   mappa restava un rettangolo vuoto: un difetto che sembra un errore
   dell'app e invece è una connessione assente. L'avviso galleggia sopra la
   mappa, non la sostituisce — i segnaposto restano leggibili.
--------------------------------------------------------------------------- */
.pt-mappa-offline {
  position: absolute;
  /* IN BASSO, non in alto: in alto a sinistra Leaflet mette i comandi dello
     zoom, e su una mappa stretta (quella di "segnala un luogo" è larga 276px
     su telefono) l'avviso ci finiva sopra insieme al pin — cioè copriva
     proprio le due cose che servono. `bottom` lascia libera l'attribuzione. */
  left: var(--pt-2);
  right: var(--pt-2);
  bottom: 24px;
  z-index: 500;                 /* sopra i riquadri di Leaflet, sotto i popup */
  display: flex;
  align-items: flex-start;
  gap: var(--pt-2);
  max-width: 30rem;
  margin-inline: auto;
  padding: var(--pt-2) var(--pt-3);
  border: 1px solid var(--pt-line-2);
  border-radius: var(--pt-r-sm);
  background: var(--pt-card);
  box-shadow: var(--pt-shadow-lift);
  font: var(--pt-t-small);
  font-size: 13px;
  line-height: 1.4;
  color: var(--pt-ink-70);
}
.pt-mappa-offline i { flex: 0 0 auto; font-size: 20px; color: var(--pt-sg); }


/* ---------------------------------------------------------------------------
   17. STATO VUOTO
   Una pagina senza contenuti non deve sembrare rotta. Il blocco è centrato
   nello spazio disponibile, non appeso in alto: quando è l'unica cosa in
   pagina, essere al centro fa la differenza fra "non c'è niente" e "manca
   qualcosa". La cornice tratteggiata dice "spazio che si riempirà", non
   "errore".
--------------------------------------------------------------------------- */
.pt-vuoto-blocco {
  display: flex;
  flex-direction: column;
  align-items: center;
  justify-content: center;
  gap: var(--pt-2);
  min-height: 46vh;              /* al centro dello schermo, non sotto la testata */
  margin: var(--pt-4) var(--pt-align);
  padding: var(--pt-6) var(--pt-4);
  border: 1px dashed var(--pt-line-2);
  border-radius: var(--pt-r-lg);
  text-align: center;
}
.pt-vuoto-blocco > i {
  font-size: 34px;
  line-height: 1;
  color: var(--pt-ink-45);
}
.pt-vuoto-titolo {
  margin: var(--pt-1) 0 0;
  /* I titoli non hanno un token `font:` — hanno una regola (h1..h4). Qui il
     peso e la larghezza vanno dichiarati, perché l'elemento è un <p>. */
  font-family: var(--pt-font);
  font-size: 18px;
  font-weight: 800;
  font-stretch: 112%;
  letter-spacing: -0.03em;
  line-height: 1.25;
  color: var(--pt-ink);
}
.pt-vuoto-testo {
  max-width: 26rem;
  margin: 0;
  font: var(--pt-t-body);
  font-size: 14.5px;
  color: var(--pt-ink-70);
}
.pt-vuoto-azione { margin-top: var(--pt-3); width: auto; }

/* Dentro una pagina che ha già altro sopra (i preferiti di un'altra città, la
   lista dei tour di gruppo) il blocco non deve prendersi mezzo schermo. */
.pt-ha-altro .pt-vuoto-blocco { min-height: 0; }


/* ---------------------------------------------------------------------------
   18. TESTATA DI PAGINA — un componente, non dieci improvvisazioni

   Dieci pagine si riscrivevano l'intestazione dentro `style="..."`, con CINQUE
   padding diversi (`16px`, `16px 16px 4px`, `16px 16px 8px`, `12px 16px 4px`) e
   `font-weight: 600` che schiacciava gli 800 del sistema: i titoli di dieci
   pagine erano più leggeri di quelli delle altre quattro, e il sottotitolo era
   `#777` — 3,96:1 sulla carta, sotto la soglia di leggibilità.

   `.pt-section-head` esisteva già ma serve a un'altra cosa (una sezione DENTRO
   una pagina, con il contatore a destra). Questa è la testata della pagina:
   icona nel titolo, una riga di spiegazione sotto.

   v77 — QUESTO BLOCCO NON C'È PIÙ. Le sue regole vivono in `.pt-testata
   .is-compatta`, in cima al foglio, con le stesse identiche misure: 20px di
   titolo con l'icona accanto, 13,5px di sommario. Non è stato cancellato, è
   stato **fuso**: il componente di v75 aveva dovuto prendere un nome nuovo
   proprio per non toccare le pagine che usavano questo, e tenerne due per
   sempre sarebbe stato il difetto, non il debito.

   Un difetto che la fusione ha fatto emergere: due pagine (`proponi_poi` e
   `pubblica_tour`) tenevano **l'intero modulo dentro la testata** — misurata,
   la «testata» di «Proponi un luogo» era alta **1463 px**. Non era una
   testata: era un contenitore con un titolo in cima.
--------------------------------------------------------------------------- */

/* Una riga che porta altrove: icona, testo, freccia. `.pt-cta-card` fa già
   questo per i blocchi grandi; questa è la versione compatta, che tre righe
   della pagina Itinerari costruivano a mano mettendo `display:flex` in linea
   su `.pt-itin-card`, che è invece una scheda a blocco. */
.pt-riga-vai {
  display: flex;
  align-items: center;
  gap: var(--pt-3);
}
.pt-riga-vai > .ti:first-child {
  flex: 0 0 auto;
  font-size: 20px;
  color: var(--pt-ink-70);
}
.pt-riga-vai > span { flex: 1; min-width: 0; }
.pt-riga-vai > .ti-chevron-right {
  flex: 0 0 auto;
  margin-left: auto;
  color: var(--pt-ink-45);
}

/* Il conteggio in linea accanto a un controllo (quante tappe hai scelto,
   quanto durerà il giro): era `#777` a 13px, scritto a mano in tre punti. */
.pt-conta-inline {
  font: var(--pt-t-small);
  font-size: 13px;
  color: var(--pt-ink-55);
}

/* --- Marcatori della mappa -------------------------------------------------
   Erano tre implementazioni diverse, costruite come stringhe HTML dentro il
   JavaScript con i colori riscritti a mano (`#C0341C` è `--pt-sg`, `#0E6B4E` è
   `--pt-ok`): il giorno in cui la palette cambia, la mappa resta indietro.
   Adesso il JavaScript mette solo la classe, il colore lo decide il foglio. */
.pt-marker-pin,
.pt-marker-trascina,
.pt-marker-tappa {
  display: flex;
  align-items: flex-end;
  justify-content: center;
  width: 44px;
  height: 44px;
}
.pt-marker-trascina { width: 48px; height: 48px; cursor: grab; }
.pt-marker-tappa { align-items: center; }

/* v25 — I SEGNAPOSTO DICONO ANCHE *CHE COSA* SONO.

   La mappa disegnava centouno segnaposto rossi identici, ampiamente
   sovrapposti: diceva DOVE stanno i luoghi e nascondeva COSA sono, cioe'
   esattamente l'informazione che serve per scegliere. Non si distingueva una
   chiesa da una friggitoria.

   Il sistema per dirlo esisteva gia' — le sei famiglie di colore chiavate sullo
   slug della categoria (sezione 5), quelle che le schede dell'elenco usano da
   sempre. Bastava che la mappa se ne servisse: il segnaposto porta `data-cat`,
   e da li' `--pt-fam` arriva da solo. Zero colori nuovi, zero decisioni nuove.

   Il rosso resta a chi non ha famiglia (il ripiego di `--pt-fam`) e al
   segnaposto trascinabile di "segnala un luogo", che e' un'AZIONE e non un
   contenuto: li' il colore del comando e' quello giusto. */
.pt-marker-pin > span,
.pt-marker-trascina > span {
  display: flex;
  align-items: center;
  justify-content: center;
  width: 26px;
  height: 26px;
  border-radius: 50% 50% 50% 0;
  background: var(--pt-fam);
  color: var(--pt-card);
  transform: rotate(-45deg);
  box-shadow: 0 1px 4px rgb(var(--pt-notte) / 0.35);
}
.pt-marker-trascina > span {
  background: var(--pt-sg);   /* è un comando, non un contenuto */
  width: 30px;
  height: 30px;
  border: 2.5px solid var(--pt-card);
  box-shadow: 0 2px 8px rgb(var(--pt-notte) / 0.45);
}
/* --- v44 — Il luogo da cui si è arrivati ------------------------------------
   «Quando dentro il dettaglio di un POI clicco su Vedi nella mappa, mi fa
   vedere tutti i POI di quella categoria e non il POI indicato.»

   Restano tutti — vedere dove sta un luogo RISPETTO agli altri è il motivo per
   cui si apre una mappa — ma quello scelto si riconosce a colpo d'occhio.

   Il colore non cambia: è quello della sua famiglia, e continua a dire che
   cosa è. Cambiano la taglia, l'anello chiaro che lo stacca dalle strade, e un
   alone dello stesso colore. Nessun colore nuovo: l'evidenza è tutta nella
   forma. */
.pt-marker-pin.pt-marker-fuoco > span {
  position: relative;
  width: 36px;
  height: 36px;
  border: 3px solid var(--pt-card);
  box-shadow: 0 3px 10px rgb(var(--pt-notte) / 0.45);
}
/* L'alone sta sullo SPAN, non sul contenitore: `--pt-fam` arriva da
   `data-cat`, che e' sullo span. Messo un piano piu' su prendeva il ripiego e
   usciva grigio-azzurro — misurato guardandolo. Un cerchio ruotato resta un
   cerchio, quindi il `rotate(-45deg)` del segnaposto non lo tocca. */
.pt-marker-pin.pt-marker-fuoco > span::before {
  content: "";
  position: absolute;
  left: 50%;
  top: 50%;
  width: 58px;
  height: 58px;
  margin: -29px 0 0 -29px;
  border-radius: 50%;
  background: var(--pt-fam);
  opacity: 0.25;
  z-index: -1;
}
.pt-marker-pin.pt-marker-fuoco i { font-size: 18px; }

.pt-marker-pin i,
.pt-marker-trascina i { font-size: 14px; transform: rotate(45deg); }
.pt-marker-trascina i { font-size: 15px; }

.pt-marker-tappa > span {
  display: flex;
  align-items: center;
  justify-content: center;
  width: 26px;
  height: 26px;
  border-radius: 50%;
  background: var(--pt-ok);
  color: var(--pt-card);
  font: var(--pt-t-label);
  font-size: 12px;
  box-shadow: 0 1px 4px rgb(var(--pt-notte) / 0.35);
}
.pt-marker-tappa.is-visited > span { opacity: 0.55; }
.pt-marker-tappa svg { stroke: var(--pt-card); }

/* Il fumetto della mappa: la categoria era `#777` scritto a mano. */
.pt-map-popup-cat {
  font: var(--pt-t-small);
  font-size: 12px;
  color: var(--pt-ink-55);
}
.leaflet-popup-content a { color: var(--pt-sg); font-weight: 700; }

/* Gli stati di un'uscita: ne mancavano DUE su sei — `pronto` e `programmato`,
   cioè i due più comuni — e cadevano sul grigio neutro. */
.pt-uscita-stato-pronto { color: var(--pt-ink-70); }
.pt-uscita-stato-programmato { color: var(--pt-sg); }

/* Errore di campo di un modulo: era `#B8461F`, un terracotta della palette
   precedente, scritto a mano in cinque punti delle pagine di accesso. */
.invalid-feedback,
.pt-campo-errore {
  display: block;
  margin-top: calc(var(--pt-1) * -1);
  margin-bottom: var(--pt-3);
  font: var(--pt-t-small);
  font-size: 12.5px;
  color: var(--pt-danger);
}


/* --- Utility nate dal censimento degli stili in linea ---------------------
   Non sono "utility generiche": sono i quattro valori che 24 template
   scrivevano a mano, ognuno con una variante leggermente diversa. Avere un
   nome vuol dire che la prossima pagina non ne inventa un quinto. */
.pt-pagina-top { padding-top: var(--pt-3); }
.pt-lista-blocco { padding-block: var(--pt-2); }
.pt-lista-blocco-lati { padding-inline: var(--pt-align); }
/* FASE F — LA VARIANTE `-lati` IL MARGINE CE L'HA GIÀ, COME `padding`: quello
   delle schede dentro va tolto, o c'è due volte. Misurato sulle mie
   segnalazioni: le schede e lo stato vuoto a x=32 sul telefono, con il titolo
   a 16 (e lo stato vuoto a 52 sul largo, in mezza riga). */
.pt-lista-blocco-lati > * { margin-inline: 0; }
.pt-lista-blocco-lati > .pt-vuoto-blocco { grid-column: 1 / -1; }
.pt-list-staccata { margin-top: var(--pt-2); }

/* `hidden` deve vincere sul `display` del componente: senza questa riga, un
   elemento flex resta visibile anche con l'attributo `hidden` addosso. */
[hidden] { display: none !important; }

/* Righe di tappa: il titolo era un `<div>` con `font-weight: 500` — un peso
   che il sistema non contiene — e il sottotitolo un `<div class="text-muted">`.
   Le regole per `h3` e `p` esistevano già. */
.pt-tappa-info a { text-decoration: none; color: inherit; }

/* I tre stati del tour condiviso: due delle tre coppie di colori scritte a
   mano erano sotto la soglia di leggibilità (4,26:1 e 3,14:1). */
.pt-shared-badge.is-ok { background: var(--pt-ok-tint); color: var(--pt-ok); border-color: var(--pt-ok); }
.pt-shared-badge.is-warn { background: var(--pt-warn-tint); color: var(--pt-warn); border-color: var(--pt-oro-200); }

/* La mappa dell'itinerario: altezza e stacco erano in linea.

   v25 — `width: 100%` insieme al margine laterale faceva **390 + 16 + 16**:
   la mappa sbordava di sedici pixel oltre il bordo destro, a ogni larghezza.
   Il difetto c'era da versioni e non si vedeva perché `overflow-x: hidden` su
   `html`/`body` lo tagliava via in silenzio — la "rete di sicurezza" che il
   commento della sezione 9 chiamava per nome: «se scatta, c'è un difetto da
   trovare». Tolta la rete per restituire lo sticky, il difetto è saltato
   fuori da solo. Adesso usa la stessa formula dei suoi fratelli. */
/* v36 — LA MAPPA È LA PAGINA.
   Era alta 220px e arrivava a schermata 1,2: sopra c'erano 485px di comandi.
   Su un telefono da 844px prendeva il 26% di una schermata, meno di ogni
   blocco di bottoni che la precedeva. Adesso apre la pagina, ed è alta quanto
   basta a farci stare un percorso invece di un dettaglio di percorso.

   A tutta larghezza sotto gli 800px, senza margini né bordo: una mappa
   incorniciata dentro una scheda sembra l'illustrazione di un contenuto; una
   mappa che tocca i bordi è il contenuto. */
#pt-itin-map {
  width: 100%;
  height: 340px;
  margin: 0 0 var(--pt-3);
  border-inline: 0;
  border-radius: 0;
}
@media (min-width: 800px) {
  #pt-itin-map {
    width: calc(100% - var(--pt-gutter) * 2);
    height: 360px;
    margin-inline: var(--pt-align);
    border-inline: 1px solid var(--pt-line);
    border-radius: var(--pt-r);
  }
}

/* Il testo accanto al pallino nella scelta del punto di partenza. */
.pt-lampo-radio-testo { flex: 1; min-width: 0; }

/* FASE C — «MOSTRA ALTRI» COMINCIA DOVE COMINCIA L'ELENCO.
   È figlio diretto di `main`, e `main` non ha margini laterali: li mette ogni
   blocco con `--pt-align`. Questo non li aveva, e con `width: 100%` di
   `.pt-btn-blocco` andava da x=0 a x=390 sotto schede che stanno fra 16 e 374
   — l'ultimo comando dell'elenco era l'unico largo quanto lo schermo. Sul
   largo `max-width: 520px` lo ferma, e il margine lo allinea al testo. */
#pt-mostra-altri {
  width: calc(100% - 2 * var(--pt-align));
  margin-inline: var(--pt-align);
}

/* La riga di stato di "vicino a te", accanto al bottone. */
#pt-near-me-status {
  align-self: center;
  font: var(--pt-t-label);
  font-size: 11px;
  letter-spacing: 0.04em;
  color: var(--pt-ink-55);
}

/* La nota sotto la scelta di partenza e arrivo nel costruttore. */
.pt-endpoints-nota {
  margin: 0 var(--pt-align);
  font: var(--pt-t-small);
  font-size: 12px;
  color: var(--pt-ink-55);
}


/* ---------------------------------------------------------------------------
   19. PAGINE DI ACCESSO
   Erano l'ultimo pezzo fuori dal sistema: etichette senza stile, campi
   attaccati fra loro, nessun titolo. La `gap` di `.pt-auth-form` vale per i
   suoi figli DIRETTI — il `<form>` è uno solo di quelli, e dentro non arrivava
   niente. È il difetto che faceva sembrare la pagina non finita.
--------------------------------------------------------------------------- */
.pt-auth-form { display: grid; gap: var(--pt-4); }

.pt-auth-testa { display: grid; gap: var(--pt-1); }
/* v100 — il titolo di queste pagine e' diventato `<h1>`: era un `<h2>`
   perche' si dava per scontato che l'`<h1>` fosse il marchio nella barra.
   Il tag cambia, il corpo no — le due righe qui sotto sono quelle di prima. */
.pt-auth-testa h1, .pt-auth-testa h2 { font-size: 22px; letter-spacing: -0.04em; line-height: 1.04; }
.pt-auth-testa p {
  margin: 0;
  font: var(--pt-t-small);
  font-size: 13.5px;
  line-height: 1.5;
  color: var(--pt-ink-55);
}

.pt-auth-campi { display: grid; gap: var(--pt-4); }

/* Un campo è etichetta + controllo + eventuale nota: stanno insieme, e lo
   spazio fra due campi dev'essere maggiore di quello fra etichetta e casella,
   altrimenti non si capisce a cosa appartiene l'etichetta. */
.pt-campo { display: grid; gap: 7px; }
.pt-campo > label,
.pt-auth-campi > label {
  font: var(--pt-t-label);
  font-size: 11px;
  letter-spacing: 0.14em;
  text-transform: uppercase;
  color: var(--pt-ink-70);
}
.pt-campo-aiuto {
  margin: 0;
  font: var(--pt-t-small);
  font-size: 12.5px;
  color: var(--pt-ink-55);
}

/* v72 — la riga che dichiara che cosa si può caricare, sotto le due aree di
   caricamento. Sta attaccata alla propria area (margine in cima piccolo) e
   respira sotto, perché quello che segue è il comando di invio. */
.pt-foto-limite { margin: 6px 2px var(--pt-3); }

/* v62 — QUANDO L'AIUTO E' UN COMANDO, DEVE SEMBRARLO.

   `pt-campo-aiuto` nasce come nota sotto un campo: grigia, piccola, da leggere
   e basta. «Password dimenticata?» usa lo stesso posto ma non e' una nota: e'
   l'unica via d'uscita di chi non riesce a entrare. Guardando la pagina
   renderizzata si vedeva una riga di testo grigio identica a un commento — un
   comando che nessuno prova a toccare.

   Prende quindi il colore delle azioni e il bersaglio da 44 px richiesto dal
   sistema di design: resta discreto, ma si vede che si puo' premere. */
a.pt-campo-aiuto {
  justify-self: start;
  display: inline-flex;
  align-items: center;
  min-height: 44px;
  color: var(--pt-sg);
  text-decoration: underline;
  text-underline-offset: 3px;
}
.pt-campo-errore { margin: 0; }

/* Un campo in errore lo dice anche col bordo, non solo col testo sotto: chi
   ha tre campi e uno sbagliato deve vedere QUALE, senza rileggere tutto. */
.pt-campo-input[aria-invalid="true"], .form-control[aria-invalid="true"] { border-color: var(--pt-danger); }
.pt-campo-input[aria-invalid="true"], .form-control[aria-invalid="true"]:focus { box-shadow: 0 0 0 3px var(--pt-danger-tint); }

.pt-auth-esito { justify-items: center; text-align: center; padding-block: var(--pt-7); }
.pt-auth-esito > i { font-size: 36px; color: var(--pt-ink-45); }
.pt-auth-esito h1, .pt-auth-esito h2 { font-size: 22px; letter-spacing: -0.04em; }
.pt-auth-esito p {
  margin: 0;
  max-width: 26rem;
  font: var(--pt-t-body);
  color: var(--pt-ink-70);
}
.pt-auth-esito-azioni { display: grid; gap: var(--pt-2); width: 100%; }
.pt-auth-esito-azioni form { display: grid; }


/* ---------------------------------------------------------------------------
   20. IL PASSAGGIO DEL MOUSE ESISTE SOLO DOVE C'È UN MOUSE

   Su uno schermo tattile `:hover` non descrive niente: il browser lo applica
   al tocco e **ci resta**. Il risultato è una scheda che rimane con il bordo
   scuro dopo che l'hai toccata, come se fosse selezionata, finché non tocchi
   altrove. Con sessantuno regole di hover, l'effetto era ovunque: una lista di
   schede in cui una sembra scelta senza motivo.

   `pointer: fine` esclude anche i telefoni che dichiarano un hover simulato.
   Il ritorno tattile su touch resta `:active`, che è istantaneo e non si
   incolla (vedi `transform: scale(0.985)` sui bottoni).
--------------------------------------------------------------------------- */
@media (hover: hover) and (pointer: fine) {
  /* v78 — il credito. Ce l'ha ricordato la guardia di v64: su uno schermo
     tattile `:hover` si applica al tocco E CI RESTA, e un credito che resta
     evidenziato dopo che gli hai sfiorato sopra sembra selezionato. */
  .pt-credito a:hover { color: var(--pt-ink); }

  a:hover { color: var(--pt-sg-dark); }
  .pt-account-btn:hover { border-color: var(--pt-ink); color: var(--pt-ink); }
  .pt-lang-btn:hover { border-color: var(--pt-ink); }
  .pt-bottom-nav a:hover { color: var(--pt-ink); }
  .pt-bottom-nav a.active:hover { color: #fff; }
  .dropdown-item:hover { background: var(--pt-paper-2); color: var(--pt-ink); }   /* v67 — vedi sopra */
  .dropdown-item:hover i { color: var(--pt-ink); }
  .pt-logout-item:hover { color: var(--pt-danger); }
  .pt-logout-item:hover i { color: var(--pt-danger); }
  .pt-menu-voce.active:hover { background: var(--pt-scelto); color: #fff; }
  .pt-btn-primario:hover, .btn.btn-primary:hover {
  background: var(--pt-sg-dark); border-color: var(--pt-sg-dark); color: #fff;
}
  .pt-btn-ink:hover { background: #000; color: #fff; }
  .pt-btn-secondario:hover, .btn.btn-outline-secondary:hover {
  background: var(--pt-card); border-color: var(--pt-ink); color: var(--pt-ink);
}
  .pt-btn-danger:hover { background: var(--pt-danger-tint); color: var(--pt-danger); }
  .pt-chip:hover { border-color: var(--pt-ink); color: var(--pt-ink); }
  a.pt-card:hover, a.pt-itin-card:hover, a.pt-tour-card:hover, a.pt-evento-card:hover, a.pt-community-card:hover, a.pt-bacheca-card:hover, a.pt-gruppo-card:hover {
  border-color: var(--pt-ink);
  color: var(--pt-ink);
}
  .pt-altro-riga:hover { border-color: var(--pt-ink); color: var(--pt-ink); }
  .pt-action-btn:hover { border-color: var(--pt-ink); color: var(--pt-ink); }
  .pt-poi-card:hover { border-color: var(--pt-ink); color: var(--pt-ink); }
  .pt-fav-star:hover { stroke: var(--pt-sg); transform: scale(1.12); }
  .pt-riprendi-attivo:hover .pt-riprendi-azione { background: var(--pt-sg-dark); }
  .pt-riprendi-quieto:hover { border-color: var(--pt-ink); color: var(--pt-ink); }
  .pt-tempo:hover .pt-tempo-quanto { color: var(--pt-scelto); }
  .pt-parti:hover { background: var(--pt-sg-dark); }
  .pt-parti:hover i { transform: translateX(3px); }
  .pt-tempo-altro:hover { color: var(--pt-ink); text-decoration-color: var(--pt-ink); }
  .pt-intorno:hover { border-color: var(--pt-ink); }
  .pt-guida-fab:hover { color: #fff; background: #000; }
  .pt-indietro:hover { background: var(--pt-paper-2); color: var(--pt-ink); }
  .pt-review-delete:hover { color: var(--pt-danger); }
  .pt-star-input label:hover, .pt-star-input label:hover ~ label { color: var(--pt-oro); }
  .pt-photo-drop:hover { border-color: var(--pt-ink); }
  .pt-lightbox-close:hover { background: rgba(255, 255, 255, 0.28); }
  .pt-cta-card:hover { border-color: var(--pt-ink); color: var(--pt-ink); }
  .pt-cta-lampo:hover { background: var(--pt-sg-dark); border-color: var(--pt-sg-dark); color: #fff; }
  .pt-open-route-btn:hover { border-color: var(--pt-ink); color: var(--pt-ink); }
  .pt-tappa:hover { border-color: var(--pt-ink); color: var(--pt-ink); }
  .pt-tappa-listen:hover { border-color: var(--pt-ink); color: var(--pt-ink); }
  .pt-visited-toggle:hover { border-color: var(--pt-ok); color: var(--pt-ok); }
  .pt-audio-player-controls button:hover { background: rgba(255, 255, 255, 0.26); }
  .pt-anche-qui-item:hover { background: var(--pt-scelto); color: #fff; }
  .pt-share-btn:hover, .pt-tour-share:hover { border-color: var(--pt-ink); color: var(--pt-ink); }
  .pt-tour-delete:hover, .pt-gruppo-esci:hover, .pt-gruppo-rimuovi:hover, .pt-uscita-annulla:hover { background: var(--pt-danger-tint); color: var(--pt-danger); }
  .pt-builder-item:hover { border-color: var(--pt-ink); }
  .pt-builder-bar button:hover { background: var(--pt-sg-dark); color: #fff; }
  .pt-edit-up:hover, .pt-edit-down:hover, .pt-edit-add:hover { border-color: var(--pt-ink); color: var(--pt-ink); }
  .pt-edit-remove:hover { border-color: var(--pt-danger); color: var(--pt-danger); }
  .pt-collect-item:hover { border-color: var(--pt-ink); color: var(--pt-ink); }
  .pt-google-btn:hover { border-color: var(--pt-ink); color: var(--pt-ink); }
  .pt-nav-stop:hover { background: var(--pt-scelto); color: #fff; }
  .pt-builder-item:hover .pt-builder-checkbox { border-color: var(--pt-ink); }
  #pt-builder-svuota:hover { background: rgba(255, 255, 255, 0.14); color: #fff; }
  .pt-tour-publish:hover { border-color: var(--pt-ink); color: var(--pt-ink); }
  .pt-scelta-posizione:hover { border-color: var(--pt-ink); }
  .pt-citta-card:hover {
  border-color: var(--pt-ink);
  color: var(--pt-ink);
  transform: translateY(-1px);
}
  .pt-citta-card:hover .pt-citta-freccia { color: var(--pt-sg); }
  .pt-citta-btn:hover { border-color: var(--pt-ink); }
  .pt-avviso-citta a:hover { color: var(--pt-ink); }
  .pt-home-btn:hover { border-color: var(--pt-ink); color: var(--pt-ink); }
  .pt-scelta-torna:hover { border-color: var(--pt-ink); color: var(--pt-ink); }
}

/* La stellina nelle righe del costruttore: fine riga, allineata al centro,
   con l'area di tocco piena (44px) e senza rubare spazio al nome. */
.pt-builder-item-fav {
  display: grid;
  place-items: center;
  flex: 0 0 auto;
  align-self: center;
  width: 44px;
  height: 44px;
  margin-right: calc(var(--pt-2) * -1);
}


/* --- "Aggiungi tappe": un bottone di testo, non un quadratino --------------- */
.pt-edit-add {
  display: flex;
  align-items: center;
  gap: var(--pt-2);
  width: 100%;
  margin-bottom: var(--pt-1);
  padding: 10px var(--pt-3);
  border: 1px solid var(--pt-line-2);
  border-radius: var(--pt-r-sm);
  background: var(--pt-card);
  color: var(--pt-ink);
  font: var(--pt-t-body);
  font-size: 14.5px;
  text-align: left;
  cursor: pointer;
  transition: border-color var(--pt-fast) var(--pt-ease);
}
.pt-edit-add > i {
  flex: 0 0 auto;
  font-size: 18px;
  color: var(--pt-sg);   /* è l'azione della riga: aggiungere */
}

/* Il conteggio sulla barra scura: `--pt-ink-55` è pensato per la carta, su
   fondo nero fa 3,0:1. Sulla barra il testo secondario è bianco attenuato. */
.pt-builder-bar .pt-conta-inline,
.pt-builder-bar-row span {
  color: rgb(255 255 255 / 0.75);
}

/* Le due etichette gemelle di "pubblica il tuo tour": una raccoglie i consigli,
   l'altra le cose da evitare. Erano entrambe neutre tranne una, che portava il
   ROSSO DELL'AZIONE scritto in linea — il rosso è il segnale di "questa è
   l'azione", e su un'etichetta passiva mente. Adesso dicono quello che sono. */
.pt-icona-bene { color: var(--pt-ok); }
.pt-icona-attenzione { color: var(--pt-warn); }

/* L'ultima voce del menu città: non è una città, è la porta per la schermata
   che le mostra tutte. Si distingue con il peso e la freccia, non con un
   colore — nel menu il colore è già occupato dallo stato "attiva". */
.pt-citta-tutte {
  font-weight: 800;
  color: var(--pt-ink-70);
}
.pt-citta-tutte .ti { margin-left: auto; font-size: 16px; }


/* --- "Non sei in città" ----------------------------------------------------
   Chi chiede un tour dalla propria posizione stando a centinaia di chilometri
   riceveva il calcolo esatto di una domanda assurda: «il punto più vicino a te
   è a 5665 minuti a piedi». Adesso la posizione fuori raggio viene ignorata,
   il percorso parte dal centro, e questo avviso dice cosa è successo — prima
   del risultato, non al posto del risultato. */
.pt-avviso-lontano {
  display: flex;
  align-items: flex-start;
  gap: var(--pt-2);
  margin: var(--pt-3) var(--pt-align) 0;
  padding: var(--pt-3);
  border: 1px solid var(--pt-line-2);
  border-radius: var(--pt-r-sm);
  background: var(--pt-card);
  font: var(--pt-t-small);
  color: var(--pt-ink-70);
}
.pt-avviso-lontano > i { flex: 0 0 auto; font-size: 19px; color: var(--pt-ink-45); }

/* --- v41 — Il campo di ricerca dei luoghi ---------------------------------
   Sta sopra le sezioni e allineato con loro (`--pt-align`), non dentro una
   scheda propria: non è un'altra cosa da fare prima di scegliere, è il modo
   veloce di arrivare all'elenco che c'è sotto. */
/* Appiccicato sotto l'intestazione, con la stessa regola gia' usata per gli
   strumenti dell'elenco luoghi: un campo che filtra centouno righe e che
   sparisce appena si comincia a scorrerle non filtra niente. `top` e'
   l'altezza vera dell'intestazione, che e' anch'essa appiccicata; lo z-index
   sta sotto la sua (30) e sopra le schede.

   Appiccicato e' l'INVOLUCRO, non il campo: cosi' la riga di esito viaggia
   con lui — annunciare tre risultati e poi far sparire la frase mentre si
   scorre e' un conto lasciato a meta'. E il fondo pieno sta qui, dove copre
   tutta la larghezza: messo sul campo serviva un'ombra allargata, che copriva
   proprio la riga di esito sotto. */
.pt-builder-cerca-wrap {
  position: sticky;
  top: var(--pt-header-h);
  z-index: 20;
  /* Il padding in basso non e' decorativo: senza, il margine dell'ultimo
     figlio ESCE dall'involucro (collasso dei margini) e il fondo pieno
     finisce a filo del testo — le schede che scorrono sotto spuntavano per
     qualche pixel proprio sotto la frase. */
  padding-top: var(--pt-2);
  padding-bottom: var(--pt-2);
  background: var(--pt-paper);
}
.pt-builder-cerca {
  display: flex;
  align-items: center;
  gap: 8px;
  margin: 0 var(--pt-align) var(--pt-2);
  padding: 0 12px;
  min-height: 46px;
  border: 1px solid var(--pt-line);
  border-radius: var(--pt-r-sm);
  background: var(--pt-card);
}
.pt-builder-cerca > i { flex: 0 0 auto; font-size: 19px; color: var(--pt-ink-45); }
.pt-builder-cerca:focus-within { border-color: var(--pt-scelto); }
.pt-builder-cerca:focus-within > i { color: var(--pt-scelto); }
.pt-builder-cerca input {
  flex: 1;
  min-width: 0;
  /* v55 — Il campo riempie il contenitore, se no il bersaglio e' alto 21 px.
     Il riempimento stava sul contenitore (46 px), il campo dentro ne prendeva
     21, e toccare il bordo NON mette a fuoco: provato. L'audit non se ne era
     accorto perche' la sua regola sui bersagli non guardava i campi di testo
     (corretta anch'essa in v55). Stessa riga in tre punti perche' questo
     componente ha tre nomi — vedi `test_le_tre_caselle_di_ricerca_sono_lo_stesso_pezzo`. */
  align-self: stretch;
  border: 0;
  padding: 0;
  background: transparent;
  font: var(--pt-t-strong);
  /* 16px non e' una scelta di gusto: sotto questa misura iOS INGRANDISCE la
     pagina appena si tocca il campo, e non la rimette piu' a posto. Lo trova
     `tools/audit_mobile.py`, che controlla proprio questa soglia su ogni
     campo di ogni pagina — e su questo l'aveva trovato. */
  font-size: 16px;
  font-weight: 500;
  color: var(--pt-ink);
}
.pt-builder-cerca input:focus { outline: none; }
.pt-builder-cerca input::placeholder { color: var(--pt-ink-45); font-weight: 400; }
/* La crocetta nativa di `type="search"` è minuscola e cambia da browser a
   browser: qui ce n'è una vera, grande abbastanza da centrarla con un dito. */
.pt-builder-cerca input::-webkit-search-cancel-button { display: none; }
.pt-builder-cerca button {
  flex: 0 0 auto;
  display: flex;
  align-items: center;
  justify-content: center;
  width: 30px;
  height: 30px;
  margin-inline-end: -6px;
  border: 0;
  border-radius: 50%;
  background: transparent;
  color: var(--pt-ink-45);
  cursor: pointer;
}
.pt-builder-cerca button > i { font-size: 16px; }

.pt-builder-esito {
  margin: 0 var(--pt-align);
  font: var(--pt-t-small);
  color: var(--pt-ink-55);
}
/* Nessun risultato NON è un errore: è un vicolo cieco da cui si esce
   cancellando una lettera. Il rosso dell'app vuol dire «premi qui», e usarlo
   qui vorrebbe dire allarme per una parola scritta male. Resta il testo, che
   dice già tutto, solo un po' più scuro perché si legga. */
.pt-builder-esito.is-vuoto { color: var(--pt-ink-70); }

/* --- v49 — La riga di fatti su cui si sceglie un tour ----------------------
   Una scheda diceva nome, autore e «9 tappe»: con quaranta tour erano dieci
   schermate di blocchi quasi identici, e l'unico modo di distinguerli era
   leggere i nomi uno per uno.
   I fatti stanno su una riga che va a capo da sola: su 320 px sono due righe,
   su 430 una. Non e' una griglia perche' il numero di voci cambia — un giro
   senza zona ne ha tre, uno con quattro. */
.pt-fatti {
  display: flex;
  flex-wrap: wrap;
  align-items: center;
  gap: 3px 11px;
  margin: 5px 0 0;
  font: var(--pt-t-small);
  font-size: 12.5px;
  /* `font:` non azzera `text-transform`, e queste righe stanno dentro schede
     che lo impostano a `uppercase`: senza questa riga i fatti uscivano
     «7 TAPPE · 4H 54MIN · ALBERGHERIA». Visto misurando, non leggendo. */
  text-transform: none;
  letter-spacing: 0;
  color: var(--pt-ink-55);
}
.pt-fatti > span { display: inline-flex; align-items: center; gap: 4px; white-space: nowrap; }
/* I numeri stanno su una riga, i NOMI no: «Ballaro' / Albergheria» e
   «Itinerario Arabo-Normanno» a 320 px sbordavano di 17 px — trovato
   dall'audit, non a occhio. Questi vanno a capo dentro se stessi. */
.pt-fatti .pt-fatti-lungo,
.pt-fatti .pt-fatti-cat { white-space: normal; min-width: 0; }
.pt-fatti .pt-fatti-lungo i, .pt-fatti .pt-fatti-cat i { flex: 0 0 auto; }
/* FASE E — e il «quando» di un evento è una frase, non un numero: va a capo
   dentro se stesso, e l'ora, se non ci sta, scende alla riga sotto. Misurato
   a 320 px aggiungendo un'ora a ogni «quando» (nessun evento in catalogo ne
   ha una, e per questo non si vedeva): la colonna finisce a x=304, e senza
   questa riga la tessera arrivava a 374 e la riga d'agenda a 348 — l'agenda
   lo faceva già in v103. Con la riga, tutte e due a 304. */
.pt-fatti > .pt-quando { white-space: normal; flex-wrap: wrap; }
.pt-fatti i { font-size: 14px; color: var(--pt-ink-45); }

/* «3/8 tappe»: e' l'unica voce che parla di TE, e si distingue dalle altre —
   verde come ogni cosa fatta in quest'app. */
.pt-fatti-avanzamento { color: var(--pt-ok); font-weight: 600; }
.pt-fatti-avanzamento i { color: var(--pt-ok); }

/* Che cosa c'e' dentro. Il colore viene dalla famiglia della categoria, come i
   segnaposto sulla mappa da v25 e le schede dell'elenco: nessun colore nuovo. */
/* Nessun fondo colorato: le sei famiglie non hanno una tinta chiara
   dichiarata, e inventarne sei qui vorrebbe dire aggiungere sei decisioni al
   sistema per una pastiglia. Il colore sta nel testo e nell'icona — come fa
   `.pt-poi-cat`, che e' l'altro posto dove il nome di una categoria porta il
   proprio colore. */
.pt-fatti-cat {
  display: inline-flex;
  align-items: center;
  gap: 4px;
  color: var(--pt-fam);
  font: var(--pt-t-small);
  font-size: 11.5px;
  font-weight: 600;
}
.pt-fatti-cat i { font-size: 13px; }

.pt-fatti-quando {
  margin: 6px 0 0;
  font: var(--pt-t-small);
  font-size: 12.5px;
  color: var(--pt-ink-55);
}
.pt-fatti-quando i { font-size: 14px; color: var(--pt-ink-45); vertical-align: -2px; }

/* Un tour pubblicato e' un percorso da rifare quando vuoi; se e' anche
   un'uscita aperta, e' un invito con una data. Due cose diverse che sulla
   scheda si somigliavano. */
.pt-community-viva {
  display: inline-flex;
  align-items: center;
  gap: 5px;
  color: var(--pt-ok);
  font: var(--pt-t-small);
  font-size: 12px;
  font-weight: 600;
}

/* --- v50 — La ricerca fra i tour ------------------------------------------
   Una sola casella per quattro liste. Il campo e' quello del costruttore
   (v41), con la stessa misura: 16 px, perche' sotto quella soglia iOS
   ingrandisce la pagina al tocco e non la rimette a posto. */
.pt-cerca-tour {
  display: flex;
  flex-direction: column;
  gap: var(--pt-2);
  margin: var(--pt-3) var(--pt-align) var(--pt-4);
}
.pt-cerca-tour-campo {
  display: flex;
  align-items: center;
  gap: 8px;
  padding: 0 12px;
  min-height: 46px;
  border: 1px solid var(--pt-line);
  border-radius: var(--pt-r-sm);
  background: var(--pt-card);
}
.pt-cerca-tour-campo > i { flex: 0 0 auto; font-size: 19px; color: var(--pt-ink-45); }
.pt-cerca-tour-campo:focus-within { border-color: var(--pt-scelto); }
.pt-cerca-tour-campo:focus-within > i { color: var(--pt-scelto); }
.pt-cerca-tour-campo input {
  flex: 1;
  min-width: 0;
  /* v55 — Il campo riempie il contenitore, se no il bersaglio e' alto 21 px.
     Il riempimento stava sul contenitore (46 px), il campo dentro ne prendeva
     21, e toccare il bordo NON mette a fuoco: provato. L'audit non se ne era
     accorto perche' la sua regola sui bersagli non guardava i campi di testo
     (corretta anch'essa in v55). Stessa riga in tre punti perche' questo
     componente ha tre nomi — vedi `test_le_tre_caselle_di_ricerca_sono_lo_stesso_pezzo`. */
  align-self: stretch;
  border: 0;
  padding: 0;
  background: transparent;
  font: var(--pt-t-strong);
  font-size: 16px;
  font-weight: 500;
  color: var(--pt-ink);
}
.pt-cerca-tour-campo input:focus { outline: none; }
.pt-cerca-tour-campo input::placeholder { color: var(--pt-ink-45); font-weight: 400; }
.pt-cerca-tour-campo input::-webkit-search-cancel-button { display: none; }
/* FASE F — SUL LARGO LA RICERCA È UNA RIGA.
   Il modulo è una colonna — il campo, poi il comando — ed è giusto sul
   telefono, dove il comando largo quanto lo schermo è il bersaglio del
   pollice. Sul largo quella colonna faceva di «Cerca» una fascia rossa di
   1208 px, contro la misura dei comandi a blocco (520, v75). Qui il campo si
   allarga — un campo largo è un campo comodo (FASE C) — e il comando è largo
   quanto la sua parola, accanto a lui. */
@media (min-width: 800px) {
  .pt-cerca-tour { flex-direction: row; align-items: stretch; }
  .pt-cerca-tour-campo { flex: 1; }
}

.pt-cerca-tour-esito,
.pt-cerca-tour-invito {
  margin: 0 var(--pt-align) var(--pt-3);
  font: var(--pt-t-small);
  color: var(--pt-ink-55);
}

/* Da dove viene un risultato e' meta' della risposta: «il giro dei mercati»
   trovato fra i tuoi e trovato fra le uscite aperte sono due cose diverse da
   fare. L'etichetta sta in cima alla scheda, prima del nome. */
.pt-risultato-fonte {
  display: inline-block;
  margin-bottom: 4px;
  padding: 2px 7px;
  border-radius: var(--pt-r-xs);
  background: var(--pt-paper-2);
  color: var(--pt-ink-70);
  font: var(--pt-t-label);
  font-size: 10px;
  letter-spacing: 0.1em;
  text-transform: uppercase;
}
.pt-fonte-tuoi { background: var(--pt-scelto-tint); color: var(--pt-scelto); }
.pt-fonte-uscite { background: var(--pt-ok-tint); color: var(--pt-ok); }

/* La porta della ricerca, uguale su tutte e quattro le liste. Non e' un
   comando pieno: e' un modo di arrivare altrove, come le righe della sezione
   Tour. */
.pt-cerca-porta {
  display: flex;
  align-items: center;
  gap: 10px;
  margin: 0 var(--pt-align) var(--pt-3);
  padding: 12px 14px;
  min-height: 48px;
  border: 1px solid var(--pt-line);
  border-radius: var(--pt-r-sm);
  background: var(--pt-card);
  color: var(--pt-ink-70);
  font: var(--pt-t-strong);
  font-weight: 600;
}
.pt-cerca-porta > span { flex: 1; min-width: 0; }
.pt-cerca-porta > i { flex: 0 0 auto; font-size: 18px; color: var(--pt-ink-45); }

/* --- v51 — Il passaporto fa vedere che cosa manca -------------------------
   Il badge piu' grosso dice «15/101»: vai a prendere gli altri 86. Poi la
   pagina li elencava tutti mescolati, per 6,3 schermate, senza un modo di
   vedere solo quelli che mancano. Tre pastiglie e una casella. */
.pt-passport-filtri {
  display: flex;
  gap: var(--pt-2);
  margin: 0 var(--pt-align) var(--pt-2);
}
.pt-passport-filtro {
  flex: 1;
  min-height: 44px;
  padding: 8px 6px;
  border: 1px solid var(--pt-line);
  border-radius: var(--pt-r-sm);
  background: var(--pt-card);
  color: var(--pt-ink-70);
  font: var(--pt-t-strong);
  font-size: 13px;
  font-weight: 600;
  cursor: pointer;
}
.pt-passport-filtro.is-attivo {
  border-color: var(--pt-scelto);
  background: var(--pt-scelto);
  color: #fff;
}
.pt-passport-filtro-n {
  display: block;
  font-size: 11px;
  font-weight: 700;
  /* FASE H — 0,85 e non 0,75: il numero da 11 px faceva 4,02:1 sul bianco e
     4,15:1 sul rosso del filtro acceso. Adesso 5,1 e 4,9. `audit_contrasto` non
     lo vedeva perché non teneva conto dell'opacità: da questa fase sì. */
  opacity: 0.85;
  font-variant-numeric: tabular-nums;
}

.pt-passport-cerca {
  display: flex;
  align-items: center;
  gap: 8px;
  margin: 0 var(--pt-align) var(--pt-3);
  padding: 0 12px;
  min-height: 46px;
  border: 1px solid var(--pt-line);
  border-radius: var(--pt-r-sm);
  background: var(--pt-card);
}
.pt-passport-cerca > i { flex: 0 0 auto; font-size: 19px; color: var(--pt-ink-45); }
.pt-passport-cerca:focus-within { border-color: var(--pt-scelto); }
.pt-passport-cerca:focus-within > i { color: var(--pt-scelto); }
.pt-passport-cerca input {
  flex: 1;
  min-width: 0;
  /* v55 — Il campo riempie il contenitore, se no il bersaglio e' alto 21 px.
     Il riempimento stava sul contenitore (46 px), il campo dentro ne prendeva
     21, e toccare il bordo NON mette a fuoco: provato. L'audit non se ne era
     accorto perche' la sua regola sui bersagli non guardava i campi di testo
     (corretta anch'essa in v55). Stessa riga in tre punti perche' questo
     componente ha tre nomi — vedi `test_le_tre_caselle_di_ricerca_sono_lo_stesso_pezzo`. */
  align-self: stretch;
  border: 0;
  padding: 0;
  background: transparent;
  font: var(--pt-t-strong);
  /* 16px: sotto questa misura iOS ingrandisce la pagina al tocco. Vedi v41. */
  font-size: 16px;
  font-weight: 500;
  color: var(--pt-ink);
}
.pt-passport-cerca input:focus { outline: none; }
.pt-passport-cerca input::placeholder { color: var(--pt-ink-45); font-weight: 400; }
.pt-passport-cerca input::-webkit-search-cancel-button { display: none; }
.pt-passport-cerca button {
  flex: 0 0 auto;
  display: flex;
  align-items: center;
  justify-content: center;
  width: 30px;
  height: 30px;
  margin-inline-end: -6px;
  border: 0;
  border-radius: 50%;
  background: transparent;
  color: var(--pt-ink-45);
  cursor: pointer;
}

.pt-passport-vuoto-filtro {
  margin: 0 var(--pt-align) var(--pt-4);
  font: var(--pt-t-small);
  color: var(--pt-ink-55);
}
.pt-passport-vuoto-filtro strong { color: var(--pt-ink); }

/* I gruppi danno struttura a centouno voci: senza, e' un muro. */
.pt-passport-gruppo { margin-bottom: var(--pt-4); }
/* FASE F — `<h3>` e non più `<h4>`: il gruppo sta sotto «I tuoi luoghi», che
   è diventato un `<h2>`. L'aspetto non cambia, e la spaziatura va scritta: una
   `<h3>` dentro una `.pt-section-head` prende il -0,04em della riga di
   servizio, che l'`<h4>` non prendeva. */
.pt-passport-gruppo-testa h3 {
  display: flex;
  align-items: center;
  gap: 7px;
  margin: 0;
  font: var(--pt-t-strong);
  font-size: 15px;
  font-weight: 700;
  letter-spacing: -0.035em;
  color: var(--pt-ink);
}
.pt-passport-gruppo-testa h3 i { font-size: 17px; color: var(--pt-ink-45); }

/* --- v53 — Le domande che uno si fa in strada -----------------------------
   «Vicino a me» c'era gia' ed era un `.pt-action-btn` da solo; adesso sta in
   fila con i filtri, perche' rispondono tutti alla stessa domanda — «che cosa
   cerco» — anche se uno riordina e gli altri restringono. La fila va a capo:
   con quattro pastiglie a 320 px non ci stanno su una riga. */
.pt-scopri-filtri {
  display: flex;
  flex-wrap: wrap;
  gap: var(--pt-2);
  margin: 0 var(--pt-align) var(--pt-3);
}
/* FASE D — `min-width` perché una pastiglia con una parola corta e senza icona
   («Tutti», da quando le fasce della durata hanno perso l'orologio) usciva
   larga 43 px: sotto il bersaglio da 44, e `audit_mobile` l'ha vista. Le altre
   pastiglie sono tutte più larghe, e non cambiano di un pixel. */
.pt-scopri-filtro {
  display: inline-flex;
  align-items: center;
  justify-content: center;
  gap: 6px;
  min-height: 44px;
  min-width: 44px;
  padding: 8px 13px;
  border: 1px solid var(--pt-line);
  border-radius: var(--pt-r-pill);
  background: var(--pt-card);
  color: var(--pt-ink-70);
  font: var(--pt-t-strong);
  font-size: 13px;
  font-weight: 600;
  cursor: pointer;
}
.pt-scopri-filtro > i { font-size: 16px; color: var(--pt-ink-45); }
.pt-scopri-filtro.is-attivo,
.pt-scopri-filtro.active {
  border-color: var(--pt-scelto);
  background: var(--pt-scelto);
  color: #fff;
}
.pt-scopri-filtro.is-attivo > i,
.pt-scopri-filtro.active > i { color: #fff; }

/* --- Il centro «Tour»: sezioni con dentro dei tour --- v54 -----------------
   Difetto #9 del referto: la pagina era cinque righe con la freccetta e
   nessuna era contenuto; la prima scheda vera cominciava a 698 px dall'alto.
   Difetto #10: da una lista non si arrivava alle altre.

   Qui non nasce un componente nuovo per le schede: sono le stesse
   `.pt-itin-card` delle altre liste, con la stessa riga di fatti di v49. Le
   classi qui sotto sono solo la cornice — il titolo con «Vedi tutti», la
   frase per quando una sezione è vuota, e le due azioni in fondo.           */
.pt-hub-sez { margin-bottom: var(--pt-5); }

/* «Vedi tutti · 12» sta nell'intestazione, a destra del titolo. Il numero è
   il motivo per toccarla: dice quanti ce ne sono oltre i tre mostrati.

   FASE D — `.pt-hub-tutti` NON C'È PIÙ. Era un secondo «Vedi tutti», in un
   altro rosso (`--pt-scelto` invece di `--pt-sg-dark`) e a un altro corpo
   (13,5 invece di 13), accanto a quello dei rail di Scopri: due disegni per
   lo stesso comando. La testa della sezione è diventata `.pt-sezione-testa`
   e il collegamento `.pt-sezione-tutto`, gli stessi di Scopri; le regole di
   qui se ne sono andate con la classe. */

/* La data di un'uscita: senza, è un percorso qualunque; con, un appuntamento.
   Riga propria sotto il titolo, perché è l'unica cosa che quella scheda ha e
   le altre tre sezioni no.                                                  */
.pt-hub-quando {
  display: inline-flex;
  align-items: center;
  gap: 5px;
  margin-bottom: var(--pt-1);
  color: var(--pt-sg);
  font: var(--pt-t-strong);
  font-size: 13px;
}
.pt-hub-quando > i { font-size: 15px; }

/* Una sezione vuota lo dice in una riga e non si prende una schermata: il
   vuoto illustrato (`_vuoto.html`) è giusto su una pagina che contiene solo
   quello, non su una delle quattro sezioni di un centro.                    */
.pt-hub-niente {
  margin: 0 var(--pt-align);
  padding: var(--pt-3);
  border: 0;
  border-radius: var(--pt-r-sm);
  background: var(--pt-paper-2);
  color: var(--pt-ink-55);
  font: var(--pt-t-small);
}

/* v88 — LA SEZIONE VUOTA CHE INVITA.

   Stessa forma della riga tratteggiata qui sopra — quella resta, per le
   sezioni che un invito non ce l'hanno — ma con l'icona davanti e l'azione in
   fondo: tre negazioni in colonna sono un muro, tre inviti sono una pagina che
   sa che cosa manca.

   L'azione e' un collegamento dentro una riga di testo, quindi ha bisogno dei
   suoi 44 px di altezza: la regola di v16 vale anche dentro una frase, ed e'
   la stessa che il foglio applica ai collegamenti dei dati pratici. */
/* FASE D — SENZA IL TRATTEGGIO. È il segno che dice «qui manca qualcosa», e
   la sezione 19 lo aveva già tolto agli altri cinque stati vuoti dell'app:
   restavano questi due, su una pagina che ne mostra fino a tre di fila. Stessa
   ricetta di quelli: niente bordo, la fascia calda sotto. E sulla fascia la
   terracotta che fa da testo è `--pt-sg-dark` (§3 del documento di design). */
.pt-hub-invito {
  display: flex;
  flex-wrap: wrap;
  align-items: center;
  gap: var(--pt-2);
  margin: 0 var(--pt-align);
  padding: var(--pt-2) var(--pt-3);
  border: 0;
  border-radius: var(--pt-r-sm);
  background: var(--pt-paper-2);
  color: var(--pt-ink-70);
  font: var(--pt-t-small);
  font-size: 13px;
}
.pt-hub-invito > i { flex: 0 0 auto; color: var(--pt-sg); font-size: 16px; }
.pt-hub-invito > span { flex: 1 1 auto; min-width: 0; }
.pt-hub-invito > a {
  display: inline-flex;
  align-items: center;
  gap: 5px;
  min-height: 44px;
  color: var(--pt-sg-dark);
  font: var(--pt-t-strong);
  font-size: 13px;
  text-decoration: none;
}
.pt-hub-invito > a > i { font-size: 15px; }

/* v83 — IL COMANDO DELLA SCHEDA DI UN LUOGO.
   Misurato a 390 px: la scheda e' alta 1 841 px e «aggiungi al percorso»
   finiva a 1 500 — cioe' oltre la penultima schermata, mentre e' l'azione per
   cui la pagina esiste.

   Sul largo e' un comando centrato sotto l'articolo, con la misura di v75 per
   i bottoni a blocco (520 px): a tutta larghezza su 1 180 px un bottone non e'
   un comando, e' una fascia. */
/* v92 — LO STESSO BLOCCO ANCHE SULLA PAGINA DI UN EVENTO.

   `.pt-evento-parti` non è un componente nuovo: è lo stesso comando
   appiccicato, e sta negli stessi selettori invece che in una regola gemella.
   Due regole con la stessa geometria divergono alla prima correzione — e
   questa geometria è già costata tre misurazioni fra v80, v83 e v87. */
.pt-poi-parti,
.pt-evento-parti {
  margin: var(--pt-5) var(--pt-align) var(--pt-4);
}

@media (max-width: 799px) {
  /* `sticky` e non `fixed`, come il comando della home a v80: resta in vista
     finche' la pagina e' sullo schermo e se ne va con lei. Fisso per tutta la
     pagina coprirebbe i tour che passano di qui e gli eventi. */
  .pt-poi-parti,
  .pt-evento-parti {
    position: sticky;
    bottom: var(--pt-sopra-nav);
    z-index: 5;
    margin-inline: 0;
    padding: var(--pt-3) var(--pt-align) var(--pt-2);
    border-radius: var(--pt-r);
    background: var(--pt-card);
    box-shadow: var(--pt-shadow-pop);
  }
}

@media (min-width: 800px) {
  .pt-poi-parti,
  .pt-evento-parti { max-width: 520px; margin-inline: auto; }
  /* FASE C — sulla scheda di un luogo il comando non sta più al centro.
     Sull'evento viene subito dopo la copertina, prima di tutto, ed è il suo
     primario: lì il centro è il posto giusto. Qui viene DOPO un articolo a due
     colonne, ed è il secondario di «Ascolta la storia»: centrato da solo
     (380–900 a 1280) non apparteneva a niente. Adesso comincia dove comincia
     il racconto e dove comincia «Ascolta», largo come lui: 36–556. La geometria
     — margini, appiccicato sul telefono — resta quella comune; cambia solo da
     che parte sta, e per una ragione che l'evento non ha. */
  .pt-poi-parti { margin-inline: var(--pt-align) auto; }
}

/* v83 — LA MEMORIA DEL VIAGGIO: quattro numeri, due righe da due.
   Quattro e non sette perche' quattro entrano in due righe su un telefono da
   390 senza che nessuna etichetta vada a capo — misurato — e perche' queste
   quattro raccontano un viaggio invece di contare i clic.
   Non e' un cruscotto: niente riquadri colorati, niente grafici. E' la stessa
   carta delle schede, con il numero grande e l'etichetta piccola sotto. */
.pt-memoria {
  display: grid;
  grid-template-columns: 1fr 1fr;
  gap: var(--pt-2);
  margin: 0;
  padding: 0;
  list-style: none;
}
.pt-memoria-voce {
  display: grid;
  grid-template-columns: auto 1fr;
  grid-template-rows: auto auto;
  align-items: center;
  gap: 2px var(--pt-3);
  padding: var(--pt-3);
  border: 1px solid var(--pt-line);
  border-radius: var(--pt-r);
  background: var(--pt-card);
}
.pt-memoria-voce > i {
  grid-row: 1 / 3;
  display: grid;
  place-items: center;
  width: 38px;
  height: 38px;
  border-radius: var(--pt-r-sm);
  background: var(--pt-paper-2);
  color: var(--pt-ink-45);
  font-size: 21px;
}
.pt-memoria-voce > strong {
  font-family: var(--pt-font-titolo);
  font-weight: 400;
  font-size: 26px;
  line-height: 1;
  letter-spacing: -0.03em;
  font-variant-numeric: tabular-nums;
}
/* «12 su 101»: il totale e' un dato di contorno e si vede che lo e'. */
.pt-memoria-voce > strong > small {
  margin-inline-start: 5px;
  color: var(--pt-ink-55);
  font: var(--pt-t-small);
  font-size: 12px;
}
.pt-memoria-voce > span {
  color: var(--pt-ink-55);
  font: var(--pt-t-small);
  font-size: 12.5px;
}

@media (min-width: 800px) {
  /* Sul largo stanno in fila: quattro riquadri larghi mezza pagina sarebbero
     quattro cartelli, ed e' l'effetto cruscotto che V2 vieta. */
  .pt-memoria { grid-template-columns: repeat(4, 1fr); }
}

/* v54 — Le due azioni stavano in fondo e affiancate: creare un tour e' gia' il
   pulsante grande della home, e qui erano due schede alte in cima a una pagina
   che deve mostrare dei tour.

   v83 — ADESSO SONO CINQUE E SONO UNA FILA CHE SCORRE. La porta generica
   «tour lampo» e' diventata quattro porte concrete — le quattro durate che il
   modulo offre — piu' il costruttore: chi tocca «2 ore» salta il modulo e
   arriva al giro. Cinque schede in una griglia a due colonne sarebbero tre
   righe alte; in fila ne stanno due e mezza per schermo e si scorre col
   pollice, come le altre file dell'app.

   La scheda NON cambia: e' la stessa `.pt-hub-azione` di v54, con la sua
   larghezza minima perche' in una fila non c'e' una colonna che gliela dia. */
.pt-hub-azioni {
  display: flex;
  gap: var(--pt-2);
  margin: var(--pt-2) 0 var(--pt-4);
  padding: var(--pt-1) var(--pt-align) var(--pt-2);
  overflow-x: auto;
  scrollbar-width: none;
}
.pt-hub-azioni::-webkit-scrollbar { display: none; }
.pt-hub-azioni > .pt-hub-azione { flex: 0 0 132px; }

@media (min-width: 800px) {
  /* Sul largo ci stanno tutte: niente da scorrere, e una fila che non scorre
     non deve sembrare tagliata. */
  .pt-hub-azioni { flex-wrap: wrap; overflow-x: visible; }
  .pt-hub-azioni > .pt-hub-azione { flex: 1 1 132px; max-width: 200px; }
}
.pt-hub-azione {
  display: flex;
  flex-direction: column;
  align-items: center;
  justify-content: center;
  gap: 6px;
  min-height: 76px;
  padding: var(--pt-3);
  border: 1px solid var(--pt-line);
  border-radius: var(--pt-r);
  background: var(--pt-card);
  color: var(--pt-ink);
  font: var(--pt-t-strong);
  text-align: center;
  text-decoration: none;
}
.pt-hub-azione > i {
  display: grid;
  place-items: center;
  width: 38px;
  height: 38px;
  border-radius: var(--pt-r-sm);
  background: var(--pt-paper-2);
  color: var(--pt-ink-45);
  font-size: 21px;
}
/* L'accento della scorciatoia sta SULL'ICONA e non sulla scheda: e' la regola
   di v45, quando `.pt-cta-lampo` era 358x92 px di rosso pieno e si prendeva il
   segnale piu' forte della pagina pur non essendo il comando principale. La
   scheda resta identica alla sorella; cambia il quadratino.               */
.pt-hub-azione-viva > i { background: var(--pt-sg-tint); color: var(--pt-sg); }

/* Le altre liste, in fondo a ognuna --- v54 ---------------------------------
   Difetto #10: quattro stanze con una porta sola, quella d'ingresso. Sta in
   fondo e non in cima perché è quel che serve a chi ha guardato e non ha
   trovato: in cima ruberebbe il posto al contenuto.                        */
.pt-altre-liste {
  display: flex;
  flex-wrap: wrap;
  align-items: center;
  gap: var(--pt-2);
  margin: var(--pt-6) var(--pt-align) var(--pt-5);
  padding-top: var(--pt-4);
  border-top: 1px solid var(--pt-line);
}
.pt-altre-liste-eti {
  flex: 0 0 100%;
  margin-bottom: var(--pt-1);
  color: var(--pt-ink-55);
  font: var(--pt-t-label);
  letter-spacing: 0.08em;
  text-transform: uppercase;
}
.pt-altre-liste a {
  display: inline-flex;
  align-items: center;
  gap: 6px;
  min-height: 44px;
  padding: 8px 13px;
  border: 1px solid var(--pt-line);
  border-radius: var(--pt-r-pill);
  background: var(--pt-card);
  color: var(--pt-ink-70);
  font: var(--pt-t-strong);
  font-size: 13px;
  font-weight: 600;
  text-decoration: none;
}
.pt-altre-liste a > i { font-size: 16px; color: var(--pt-ink-45); }
.pt-altre-liste a:hover { border-color: var(--pt-line-2); color: var(--pt-ink); }


/* ============================================================================
   26. v64 — LE SUPERFICI CHE SI STACCANO
   ============================================================================
   L'unica aggiunta strutturale del rilascio, e vale la pena dire perché è
   piccola.

   Il fondo pagina è passato dalla carta calda (#F2F1EC) al bianco freddo
   (#F6F8FC): più chiaro di prima, quindi la distanza fra il fondo e una scheda
   bianca si è ridotta, e il filo che le separava pesa meno di quanto pesava.

   La tentazione era mettere un'ombra a tutte e quarantacinque le regole che
   usano quel filo. Sarebbe stato sbagliato due volte: è la riscrittura che
   questo rilascio ha promesso di non fare, e soprattutto quelle quarantacinque
   NON sono tutte schede — ci sono campi di testo, pastiglie, interruttori.
   Un campo di testo che galleggia dice una cosa falsa: che si può prendere e
   portare altrove.

   Qui sotto ci sono solo gli oggetti che si toccano e che portano da qualche
   parte. L'ombra è appena percettibile per scelta: deve rispondere alla
   domanda «questa è una cosa sola?», non annunciarsi.
   ========================================================================== */

.pt-poi-card,
.pt-bacheca-card, .pt-gruppo-card, .pt-proposta-card, .pt-map-card,
.pt-lampo-poi-card,
.pt-stat-card,
.pt-collect-item,
.pt-badge-item,
.pt-tu-riga,
.pt-altro-riga,
.pt-intorno,
.pt-hub-azione,
.pt-riprendi-quieto {
  box-shadow: var(--pt-shadow-card);
}

/* Chi ha già un'ombra sua non la prende doppia: il richiamo attivo della home
   galleggia con `--pt-shadow-pop` perché sta succedendo adesso, e sommargli
   questa lo farebbe sembrare più lontano, non più vicino. */
.pt-riprendi-attivo { box-shadow: var(--pt-shadow-pop); }

/* Chi si tiene stretto il gesto lo tiene stretto anche adesso. */
.pt-poi-card:active,
.pt-tu-riga:active,
.pt-altro-riga:active,
.pt-hub-azione:active { box-shadow: none; }


/* ============================================================================
   27. v65 — L'IMPAGINAZIONE
   ============================================================================
   v64 ha cambiato i colori e ha lasciato l'impaginazione dov'era. Qui cambia
   l'impaginazione, e non cambia niente di quello che l'app fa: stessi moduli,
   stessi comandi, stessi indirizzi.

   Tre pezzi nuovi e una regola sola dietro: **ciò che si tocca è tondo e pieno
   di colore, ciò che si legge è piano**. È la stessa regola di sempre — «tondo
   si tocca» — portata dai bordi alle superfici.
   ========================================================================== */

/* --- La fila delle categorie, in cima alla home -----------------------------
   Scorciatoie, non filtri. Sono TONDE apposta: le pastiglie del modulo sotto
   sono rettangolari, e due controlli che si somigliano e fanno cose diverse
   sono un controllo che nessuno sa usare (è il difetto che v25 ha tolto dalla
   home, e non va rimesso con un'altra forma).

   Scorre di lato, e questa volta va bene: qui non è l'unico modo di scegliere
   una categoria — l'elenco intero sta nel pannello di Scopri — ed è la ragione
   per cui v25 l'aveva bocciata come filtro. Una scorciatoia che finisce fuori
   dallo schermo resta una scorciatoia; un filtro no. */
.pt-fila-cat {
  margin: var(--pt-4) 0 0;
  overflow-x: auto;
  overflow-y: hidden;
  -webkit-overflow-scrolling: touch;
  scrollbar-width: none;
}
.pt-fila-cat::-webkit-scrollbar { display: none; }

.pt-fila-cat ul {
  display: flex;
  gap: var(--pt-3);
  margin: 0;
  /* v73 — il rientro NON sta più qui. La fila viveva in cima alla pagina, a
     tutta larghezza, e doveva allinearsi da sola; adesso sta dentro «Scopri»,
     che il rientro ce l'ha già: rimetterlo qui lo raddoppiava, e la fila
     partiva due gutter dentro rispetto al titolo che le sta sopra. */
  padding: 2px 0 var(--pt-2);
  list-style: none;
}
.pt-fila-cat li { flex: 0 0 auto; }

/* v73 — DA DISCHI A PASTIGLIE.
   Erano dischi pieni del colore della famiglia, in cima alla pagina: erano la
   prima cosa che si vedeva, e gridavano più del titolo. Adesso stanno dentro
   «Scopri», dove sono una scorciatoia fra le altre, e hanno la forma di
   un'etichetta — contorno, icona colorata, nome per esteso. Il colore della
   famiglia resta sull'icona, che è dove serve a riconoscere. */
.pt-fila-cat a {
  display: inline-flex;
  align-items: center;
  gap: 7px;
  min-height: 44px;
  padding: 0 14px;
  border: 1px solid var(--pt-line);
  border-radius: var(--pt-r-sm);
  background: var(--pt-card);
  color: var(--pt-ink);
  font: var(--pt-t-strong);
  font-size: 13px;
  white-space: nowrap;
  text-decoration: none;
  transition: border-color var(--pt-fast) var(--pt-ease);
}
.pt-fila-cat a > i { font-size: 17px; color: var(--pt-fam, var(--pt-sg)); }
.pt-fila-cat a:active { transform: scale(0.98); }


/* --- Scopri: tre destinazioni, una fila ------------------------------------
   Erano due controlli su due righe: le sezioni (Luoghi | Eventi) e
   l'interruttore di vista (elenco | mappa). Due file di pastiglie a otto pixel
   l'una dall'altra, e chi arrivava doveva capire che la prima cambiava *che
   cosa* e la seconda *come*.

   Sono tre destinazioni, e adesso è una fila sola. La combinazione impossibile
   — la mappa degli eventi, che v29 aveva già escluso — semplicemente non è
   offerta: «Mappa» porta ai luoghi sulla mappa, non alla vista corrente
   trasformata in mappa. */
.pt-tre-viste {
  display: flex;
  gap: var(--pt-2);
  margin-bottom: var(--pt-3);
}
.pt-tre-viste .pt-sezione-btn {
  flex: 1;
  padding: 0 var(--pt-2);
  border-radius: var(--pt-r-pill);
  /* Tre pastiglie in 390 px stanno se nessuna va a capo: «In programma» — la
     dicitura lunga scritta quando erano due — diventa «Eventi», che è dove si
     va. Il conteggio accanto dice già che ce n'è qualcuno. */
  white-space: nowrap;
}
.pt-tre-viste .pt-sezione-btn i { font-size: 17px; }

@media (max-width: 359px) {
  /* A 320 px tre parole più tre icone non ci stanno: restano le icone, che
     dicono la stessa cosa, e l'etichetta resta per chi legge con la voce. */
  .pt-tre-viste .pt-sezione-btn { font-size: 0; gap: 0; }
  .pt-tre-viste .pt-sezione-btn i { font-size: 19px; }
  .pt-tre-viste .pt-sezione-conta { font-size: 10px; }
}


/* --- La scheda di un luogo: la copertina ------------------------------------
   La testata era una fascia colorata con dentro un'icona grande, e il nome del
   luogo cominciava sotto, su fondo bianco: due blocchi per una cosa sola, e il
   colore della famiglia non diceva niente su niente.

   Adesso il nome sta DENTRO il colore, e la fascia diventa la copertina che
   quel luogo non ha — le fotografie non ci sono e non arriveranno domani. */
.pt-poi-copertina-alto {
  display: flex;
  align-items: center;
  gap: var(--pt-2);
  position: relative;
  z-index: 1;
}
.pt-poi-copertina-alto .pt-fav-star { margin-left: auto; flex: 0 0 auto; }

/* Sopra il colore pieno, un'etichetta bianca con il contorno sparisce: qui le
   due targhette si scuriscono invece di schiarirsi. Il nero al 26% funziona
   sopra tutte e sei le famiglie — non serve una regola per ciascuna. */
/* v75 — la targhetta si scurisce da 0,26 a 0,45: sopra il velo alto fa 6,1:1
   contro il bianco, e sopra una tinta piena non si nota la differenza. Il
   numero vecchio era stato scelto quando sotto c'era sempre un colore pieno,
   cioè un fondo noto; adesso sotto può esserci qualunque fotografia.

   FASE C — la regola che stava qui non valeva più da v93: più in basso nel
   foglio un'altra regola con lo stesso selettore rimetteva alla targhetta un
   fondo BIANCO al 16%. Sopra una fotografia bianca il bianco su bianco fa
   1:1, cioè niente — e la prova che doveva custodire questo contrasto
   leggeva la prima delle due regole, non quella che vince. La targhetta
   adesso è una regola sola, in «LA COPERTINA DEL LUOGO, FASE C». */
/* La stella non ha uno sfondo suo, e sopra una fotografia chiara sparisce:
   2,12:1 col solo velo. Il disco la riporta a 6,1:1 e non cambia niente sopra
   una tinta piena, dove era già leggibile. */
.pt-poi-testa .pt-fav-star {
  display: grid;
  place-items: center;
  /* 44 e non 38: il disco è anche il bersaglio del dito, e la prima scrittura
     l'aveva RIMPICCIOLITO sotto la soglia di v16 mentre cercava di renderlo
     visibile. L'ha trovato `audit_mobile`, a tutte e quattro le larghezze. */
  width: 44px;
  height: 44px;
  border-radius: var(--pt-r-icona);
  background: rgba(0, 0, 0, 0.45);
}
/* (FASE C — il sigillo UNESCO della copertina era qui: bianco al 92%, 9,5 px
   in minuscolo. Adesso è il sigillo di tutta l'app, accanto a
   `.pt-figura-sigillo`.) */
.pt-poi-testa .pt-fav-star svg { stroke: #fff; }
.pt-poi-testa .pt-fav-star.is-on svg,
.pt-poi-testa button.pt-fav-star[aria-pressed="true"] svg { fill: #fff; stroke: #fff; }

.pt-poi-testa .pt-poi-title {
  position: relative;
  z-index: 1;
  margin: 0;
  color: #fff;
}

/* L'icona della categoria resta, come filigrana: dice ancora di che genere è
   il posto, senza contendere il nome. */
.pt-poi-testa > i.ti {
  position: absolute;
  right: -6px;
  bottom: -14px;
  font-size: 132px;
  line-height: 1;
  color: #fff;
  /* La trasparenza sta su `opacity` e non dentro il colore, e non è un
     dettaglio di scrittura: la guardia sulle velature di v64 pretende che un
     bianco velato sia MISURABILE, e qui non lo è — la copertina prende una
     delle sei famiglie, quindi il fondo cambia da luogo a luogo.
     La misura però non serve, ed è il punto: questa non è informazione. È la
     stessa icona della categoria che sta scritta a parole nella targhetta due
     centimetri più su, messa qui come filigrana. Se non si vedesse affatto non
     si perderebbe niente — e infatti è `aria-hidden`. */
  opacity: 0.16;
  pointer-events: none;
}


/* --- Le tessere veloci della scheda di un luogo (v65) -----------------------
   Zona, visita, ingresso: tre parole ciascuno, quindi tre tessere affiancate.
   Erano tre pastiglie in fila senza etichetta — «Kalsa · 40 min · Ticketed» —
   e quei quaranta minuti potevano essere la visita, il cammino o la coda. */
.pt-poi-veloci {
  display: grid;
  grid-template-columns: repeat(auto-fit, minmax(104px, 1fr));
  gap: var(--pt-2);
  margin: var(--pt-3) 0 0;
}
.pt-poi-veloci > div {
  display: grid;
  gap: 5px;
  padding: 11px 12px;
  border-radius: var(--pt-r-sm);
  background: var(--pt-paper-2);
}
.pt-poi-veloci dt {
  font: var(--pt-t-label);
  letter-spacing: 0.12em;
  text-transform: uppercase;
  color: var(--pt-ink-55);
}
.pt-poi-veloci dd {
  margin: 0;
  font: var(--pt-t-strong);
  font-size: 14px;
  color: var(--pt-ink);
}
.pt-poi-veloci dd.is-ok { color: var(--pt-ok); }


/* ===========================================================================
   v68 → v73 — I LUOGHI PIU' VICINI
   ---------------------------------------------------------------------------
   v68 li aveva fatti come RIGHE: nome a sinistra, distanza in una pastiglia a
   destra. v73 li fa diventare SCHEDE, con la tessera della famiglia sopra —
   la stessa forma che hanno «da non perdere» e il catalogo, perche' sono la
   stessa cosa: un luogo che si puo' aprire.

   Le regole vivono nel blocco della home (`.pt-scheda`), e quelle vecchie
   sono state tolte invece di lasciate: una regola che non ha piu' un elemento
   e' una trappola per chi la legge il mese prossimo.

   Quello che NON e' cambiato, ed e' la ragione per cui quelle righe esistevano:
   la distanza si mostra, e il nome lungo si taglia invece di sfondare — con
   `min-width: 0` su ogni anello della catena, che e' la lezione misurata in
   v68 (506 px dentro un elenco di 358).
   =========================================================================== */

/* --- v87: LA SCHEDA DI UN PERCORSO, SUL LARGO ----------------------------- */
@media (min-width: 800px) {
  /* DUE COLONNE: le tappe a sinistra, quello che si guarda MENTRE si legge
     l'elenco a destra. Sul telefono l'involucro non fa niente — resta una
     colonna e l'ordine del documento è quello di prima, quindi ogni misura
     presa da v36 in poi resta valida senza rimisurarla.

     La griglia si allinea in alto: il riepilogo deve stare accanto alla PRIMA
     tappa, non a metà dell'elenco.

     FASE D — 360 e non 320: a 320 una scheda dei numeri ha 85 px di testo, e
     «7h 27min» ne chiede 99 al corpo del telefono e 85 anche a 18 px — andava
     a capo fra l'ora e i minuti. A 360 le schede hanno 98 px, e a 18 px ci
     stanno anche i «19h 50min» dei giri più lunghi della community (97). */
  .pt-tour-doppia {
    display: grid;
    grid-template-columns: minmax(0, 1fr) minmax(0, 360px);
    align-items: start;
    gap: 0 var(--pt-5);
    margin-inline: var(--pt-align);
  }
  /* Il titolo delle tappe e la linea stanno in colonna uno; tutto il resto —
     i numeri, l'ascolto, il consiglio — scende in colonna due, uno sotto
     l'altro. `grid-row: span 2` sulla colonna uno tiene insieme testa ed
     elenco senza che il resto ci si infili in mezzo. */
  .pt-tour-doppia > .pt-tappe-testa { grid-column: 1; }
  .pt-tour-doppia > .pt-tappe-linea { grid-column: 1; }
  /* FASE D — LA COLONNA DUE È UN BLOCCO SOLO, `.pt-tour-lato`.
     Prima i suoi pezzi entravano nella griglia uno per uno, e la griglia
     metteva ciascuno nella prima riga libera: i numeri accanto alla prima
     tappa, «Cosa ascolterai» sotto l'ultima, e i due paragrafi che
     `_percorso_numeri.html` porta con sé — «(1h 57min di cui a piedi)» e
     «calcolato da dove sei» — in colonna UNO, perché nessuna regola li
     nominava. Misurato a 1280 sul percorso arabo-normanno: i numeri a
     924–1244 e fino a y=1090, la loro nota a 52–884 e a y=1382. Una
     nota staccata dal suo numero non ne è la nota. */
  .pt-tour-doppia > .pt-tour-lato { grid-column: 2; }
  /* E il numero sta su una riga (vedi la larghezza della colonna, qui sopra):
     18 px nella colonna, sul telefono resta quello di prima. */
  .pt-tour-lato .pt-stat-value { font-size: 18px; }
  /* I margini laterali ce li ha già l'involucro: lasciarli anche ai figli
     vorrebbe dire due volte lo stesso margine dentro una colonna stretta. */
  .pt-tour-doppia > .pt-tappe-testa,
  .pt-tour-doppia > .pt-tappa,
  .pt-tour-lato > .pt-route-stats,
  .pt-tour-lato > .pt-duration-breakdown,
  .pt-tour-lato > .pt-percorso-nota,
  .pt-tour-lato > .pt-tour-ascolto,
  .pt-tour-lato > .pt-tour-ascolto + .pt-nota-card { margin-inline: 0; }
  .pt-tour-doppia .pt-tappa { margin-inline: 0; }
  .pt-tour-doppia .pt-tappe-linea::before { left: calc(var(--pt-3) + 15px); }

  /* La miniatura della tappa: qui lo spazio c'è, e una fila di fotografie dice
     che giro è dove una fila di nomi dice solo quali luoghi. */
  .pt-tappa-info.ha-foto {
    flex-direction: row;
    align-items: center;
    /* `justify-content: center` arriva dalla regola dei bersagli da 44 px e in
       colonna è giusto. Girata in orizzontale centrava il contenuto in
       LARGHEZZA: ogni tessera partiva da un punto diverso a seconda di quanto
       era lungo il nome. Si vede solo guardando, e si è visto guardando. */
    justify-content: flex-start;
    gap: var(--pt-3);
  }
  .pt-tappa-testo { min-width: 0; }
  .pt-tappa-foto {
    display: grid;
    place-items: center;
    flex: 0 0 auto;
    width: 64px;
    height: 48px;
    border-radius: var(--pt-r-sm);
    background: var(--pt-fam, var(--pt-ink-70));
    color: #fff;
    font-size: 22px;
  }
  .pt-tappa-foto.is-foto { background: var(--pt-paper-2) center/cover no-repeat; }

  /* La copertina respira: la stessa altezza della testata accanto avrebbe
     fatto una fascia, non una fotografia. */
  .pt-tour-copertina { height: 320px; }
}

/* ===========================================================================
   v93 — LA RIVISTA
   ---------------------------------------------------------------------------
   Il brief di Aldo non chiede di abbellire: chiede di cambiare la DOMANDA a
   cui la pagina risponde. Da «quali funzioni ha Voce» a «che cosa posso fare
   adesso a Palermo». Questa sezione è ciò che serve per quel cambio, e non
   una riga di più.

   TRE COSE, E POI TUTTO IL RESTO DISCENDE.

   1. LA SCALA. Un prodotto editoriale si riconosce prima di essere letto, e
      lo si riconosce dalla scala: un titolo grande, poche parole, molta aria.
      Il foglio aveva titoli da 30 px e corpo da 15: misure da pannello di
      controllo. Qui i titoli arrivano a 72 e il corpo a 16 — la soglia che il
      brief chiede e che è anche quella che Safari iOS non ingrandisce.

   2. LA FOTOGRAFIA È UN COMPONENTE, NON UN ATTRIBUTO. `.pt-figura` è UNA
      cornice con quattro misure (eroe · feature · scheda · riga). Ogni
      immagine dell'app passa da lì, quindi il giorno in cui le fotografie
      arrivano non c'è niente da ritoccare — e finché non arrivano, il posto
      vuoto è DISEGNATO invece di essere un buco.

      Questo è il punto che questa versione paga davvero. Il catalogo ha 101
      luoghi e zero fotografie vere: un impianto fotografico che senza foto
      mostra rettangoli colorati è peggio di quello che c'era prima. La
      «targa» (`.pt-figura.is-targa`) è la risposta — una superficie composta,
      con il nome del luogo e la sua famiglia, che si legge come una scelta
      grafica e non come un'immagine mancante.

   3. UNA CARD SOLO SE RISPONDE A «PERCHÉ DEVO CLICCARE». Il brief lo scrive
      così e ha ragione: dove la card non ha una risposta, qui c'è una riga o
      una voce di elenco. Le card che restano diventano più grandi e più rare.

   COSA NON CAMBIA, E SI PUÒ VERIFICARE: nessun nome di token, nessun id,
   nessun `data-*`, nessun `name=` di modulo. Il contratto con il JavaScript
   (app.js, percorso.js, audioguide.js, posizione.js) è intatto — questa
   sezione aggiunge e sovrascrive proprietà, non struttura.
   =========================================================================== */

/* --- 1. LA SCALA -----------------------------------------------------------
   Si cambiano i TOKEN, non le regole: il corpo cresce in 40 punti del foglio
   senza che nessuno di quei 40 punti venga toccato. È la stessa disciplina di
   v79 con la terracotta, ed è il motivo per cui questa sezione è corta.

   FASE B — qui c'erano anche i quattro gettoni della scala e `--pt-col`,
   RIDICHIARATI con i valori nuovi mentre quelli vecchi restavano in testa al
   foglio. Adesso i valori in vigore stanno nella dichiarazione originale, in
   testa, e qui restano solo le proporzioni, che non c'erano altrove. La
   colonna si e' allargata di 60 px perche' il brief chiede 1200–1280; il
   testo non l'ha seguita — `--pt-lettura` e' un'altra misura. */
:root {
  /* Le proporzioni delle immagini stanno qui perché il brief chiede «crop
     coerenti» e «aspect ratio controllati»: un solo posto in cui cambiarli. */
  --pt-ar-eroe:    4 / 3;
  --pt-ar-feature: 3 / 2;
  --pt-ar-scheda:  4 / 3;
  --pt-ar-largo:   16 / 9;
}

/* I titoli prendono la scala editoriale. `text-wrap: balance` c'era già su
   h1/h2: qui conta di più, perché a 72 px una riga orfana si vede da lontano. */
h1, .pt-testata-titolo {
  font-size: clamp(38px, 6.4vw, 72px);
  line-height: 0.98;
  letter-spacing: -0.035em;
}
h2 {
  font-size: clamp(26px, 3.2vw, 40px);
  line-height: 1.04;
  letter-spacing: -0.028em;
}
/* La versione compatta della testata NON cresce: è la riga di servizio delle
   pagine interne, e il brief dice «una frase dominante per pagina». Due titoli
   grandi sulla stessa schermata sono due frasi dominanti. */
.pt-testata.is-compatta .pt-testata-titolo {
  font-size: 20px;
  line-height: 1.2;
  letter-spacing: -0.01em;
}
.pt-lead {
  font-size: 18px;
  line-height: 1.55;
  color: var(--pt-ink-55);
  max-width: 56ch;
}
.pt-testata.is-compatta .pt-lead { font-size: 14px; }

/* L'occhiello è l'unica cosa che resta tutta maiuscola in tutta l'app. */
.pt-occhio { letter-spacing: 0.18em; }


/* --- 2. LA FIGURA ----------------------------------------------------------
   UNA cornice per ogni immagine dell'app.

   Perché una sola: prima dell'unificazione le immagini vivevano in cinque
   posti diversi (`pt-eroe-foto`, `pt-scheda-tessera`, `pt-percorso-tessera`,
   `pt-riga-foto`, `pt-tour-copertina`), ognuno con il suo modo di ritagliare e
   il suo ripiego. Cinque componenti gemelli che divergono alla prima
   correzione — il foglio documenta questo errore accaduto sei volte, e questa
   è la settima evitata.

   `--pt-ar` è la proporzione, e si imposta dall'esterno. Niente altezze fisse:
   un'altezza fissa è un ritaglio che cambia con la larghezza dello schermo. */
.pt-figura {
  position: relative;
  display: block;
  overflow: hidden;
  aspect-ratio: var(--pt-ar, var(--pt-ar-scheda));
  border-radius: var(--pt-r-lg);
  background: var(--pt-paper-2);
  isolation: isolate;          /* il velo non esce dalla cornice */
}
.pt-figura > img {
  display: block;
  width: 100%;
  height: 100%;
  object-fit: cover;
  /* Il baricentro di un monumento sta in alto: un ritaglio centrato taglia le
     cupole e tiene il selciato. Misurato sulle sei foto di prova, e vero in
     generale per l'architettura. */
  object-position: 50% 42%;
}

/* IL VELO. Serve solo quando c'è del testo sopra, quindi non è di serie: un
   velo su un'immagine che non porta testo la scurisce e basta. */
.pt-figura.is-velata::after {
  content: "";
  position: absolute;
  inset: 0;
  background: linear-gradient(to top,
              rgb(var(--pt-velo) / 0.74) 0%,
              rgb(var(--pt-velo) / 0.34) 34%,
              rgb(var(--pt-velo) / 0) 62%);
  pointer-events: none;
}

/* --- LA TARGA: il posto della fotografia quando la fotografia non c'è -------
   Questo è il pezzo che decide se l'impianto fotografico regge o no.

   Il ripiego di prima era una tessera piena del colore della famiglia. Su una
   pastiglia da 54 px funziona ed è una scelta grafica vera (v49). Su un eroe
   da 600 px lo stesso colore diventa un rettangolo viola: l'occhio ci legge
   un'immagine che non ha caricato, e nessuna tipografia lo salva.

   La targa non prova a sembrare una fotografia. È una SUPERFICIE COMPOSTA:
   la carta dell'app, un reticolo finissimo nel colore della famiglia, il
   segno della categoria in grande e molto scarico, e il nome del luogo con le
   grazie. Si legge come la copertina di un capitolo — che è esattamente il
   registro che il brief chiede — e non promette niente che non mantenga.

   Quando la fotografia arriva, `is-targa` sparisce dal markup e non resta
   nessuna traccia: nessuna regola qui sotto tocca il ramo con l'immagine. */
/* LA TARGA È SCURA, e la prima stesura di v93 aveva sbagliato proprio qui.

   Il primo tentativo era chiaro: carta avorio e un reticolo finissimo nel
   colore della famiglia. Guardato in pagina accanto alle altre, era un
   rettangolo lavanda slavato — non diceva «immagine», ma non diceva nemmeno
   «scelta grafica»: spariva. Un ripiego che sparisce è un buco con più passi.

   IL FONDO SCURO RISOLVE DUE COSE INSIEME. In una pagina di carta chiara una
   superficie scura ha lo stesso PESO di una fotografia: la griglia
   dell'impaginato regge, e il giorno in cui le foto arrivano non cambia il
   ritmo della pagina, cambia solo il contenuto dei riquadri. E il testo bianco
   sopra un fondo scuro è la stessa composizione che avrà la fotografia con il
   suo velo — cioè la targa e la foto sono due stati dello stesso componente,
   non due componenti.

   IL COLORE DELLA FAMIGLIA RESTA, come accento e non come fondo: sei fondi
   saturi in una pagina sarebbero un arcobaleno, e la famiglia si legge lo
   stesso dal filetto e dall'etichetta. */
.pt-figura.is-targa {
  display: grid;
  place-items: center;
  align-content: center;
  gap: var(--pt-2);
  padding: var(--pt-5) var(--pt-4);
  text-align: center;
  background-color: var(--pt-targa);
  background-image:
    /* la trama: righe diagonali finissime, nessun file */
    repeating-linear-gradient(135deg,
      rgba(255, 255, 255, 0.035) 0 1px,
      transparent 1px 9px),
    /* la luce dall'alto, nel colore della famiglia */
    radial-gradient(130% 100% at 50% 0%,
      color-mix(in srgb, var(--pt-fam) 55%, transparent) 0%,
      transparent 68%);
  border: 0;
}
/* Il segno della categoria, grande e scarico: è una filigrana, non un'icona. */
.pt-figura.is-targa > i {
  position: absolute;
  inset-block-start: 50%;
  inset-inline-start: 50%;
  transform: translate(-50%, -50%);
  font-size: clamp(84px, 30cqw, 220px);
  line-height: 1;
  color: #fff;
  opacity: 0.09;
  pointer-events: none;
}
.pt-figura.is-targa > .pt-figura-nome {
  position: relative;
  z-index: 1;
  font-family: var(--pt-font-titolo);
  font-weight: 400;
  font-size: clamp(20px, 5.2cqw, 38px);
  line-height: 1.04;
  letter-spacing: -0.025em;
  color: var(--pt-card);
  text-wrap: balance;
  max-width: 17ch;
}
/* L'etichetta della famiglia, schiarita per stare su fondo scuro: i sei colori
   pieni sono misurati su carta chiara e su questo fondo non passerebbero.
   Mescolati col bianco stanno tutti sopra 7:1 — verificato dal collaudo. */
.pt-figura.is-targa > .pt-figura-fam {
  position: relative;
  z-index: 1;
  font: var(--pt-t-label);
  letter-spacing: 0.16em;
  text-transform: uppercase;
  color: color-mix(in srgb, var(--pt-fam) 34%, #fff);
}
/* Il filetto che dichiara la famiglia senza tingere tutto il fondo. */
.pt-figura.is-targa::before {
  content: "";
  position: absolute;
  inset-block-start: 0;
  inset-inline: 0;
  height: 4px;
  background: var(--pt-fam);
  z-index: 1;
}
/* `container-type` abilita le unità `cqw` qui sopra: la targa si dimensiona
   sulla PROPRIA larghezza, così la stessa classe serve l'eroe e la scheda. */
.pt-figura { container-type: inline-size; }

/* Il sigillo UNESCO e la didascalia, sopra al velo.

   FASE C — IL SIGILLO È UNO. La copertina di un luogo ne disegnava un secondo:
   un'etichetta bianca al 92%, 9,5 px, in minuscolo — la stessa cosa detta da
   un altro componente, e più piccola proprio sulla pagina in cui il sigillo
   conta di più. Adesso i due selettori condividono il disegno; al sigillo delle
   figure resta solo la posizione, perché lui galleggia sopra un'immagine e
   quello della copertina sta in fila con la stella. Il fondo è pieno (l'oro
   chiaro), quindi sopra una fotografia regge da solo, senza velo. */
.pt-figura-sigillo,
.pt-poi-testa .pt-badge-unesco {
  display: inline-flex;
  align-items: center;
  gap: 6px;
  padding: 6px 10px;
  border-radius: var(--pt-r-pill);
  background: var(--pt-oro-tint);
  border: 1px solid var(--pt-oro-200);
  color: var(--pt-oro-testo);
  font: var(--pt-t-label);
  letter-spacing: 0.12em;
  text-transform: uppercase;
  font-style: normal;
}
.pt-figura-sigillo {
  position: absolute;
  z-index: 2;
  inset-block-start: var(--pt-3);
  inset-inline-start: var(--pt-3);
}
.pt-poi-testa .pt-badge-unesco { flex: 0 0 auto; }
.pt-figura-didascalia {
  position: absolute;
  z-index: 2;
  inset-inline: var(--pt-4);
  inset-block-end: var(--pt-3);
  display: flex;
  align-items: center;
  gap: var(--pt-2);
  min-height: 44px;
  color: #fff;
  font-family: var(--pt-font-titolo);
  font-size: clamp(20px, 3.2cqw, 30px);
  line-height: 1.06;
  letter-spacing: -0.02em;
  text-shadow: 0 1px 10px rgba(0, 0, 0, 0.5);
}


/* --- 3. L'EROE -------------------------------------------------------------
   Il brief: «La Home deve raccontare una promessa», e «non rendere la Home
   una pagina con titolo + form + lista».

   Due colonne asimmetriche (il testo prende più spazio della figura, 1,05 a
   0,95 — non è il 45/55 del prototipo perché il nostro titolo è più lungo di
   quello del prototipo e a 45% andava su quattro righe). */
.pt-eroe {
  gap: var(--pt-6);
  padding-block: var(--pt-6) var(--pt-5);
  align-items: center;
}
.pt-eroe h1:not(.pt-evento-titolo) {
  /* La promessa è la cosa più grande della pagina, e resta sotto le sei
     parole: «Palermo si racconta mentre cammini». */
  font-size: clamp(40px, 6.6vw, 74px);
  margin-block: var(--pt-2) var(--pt-3);
  max-width: 15ch;
}
.pt-eroe-sub {
  font-size: 19px;
  line-height: 1.5;
  color: var(--pt-ink-55);
  max-width: 34ch;
}
/* La figura dell'eroe: la proporzione è la sua, non un `min-height`. */
.pt-eroe .pt-figura { --pt-ar: var(--pt-ar-eroe); }
.pt-eroe .pt-credito { margin: var(--pt-2) 0 0; }

@media (max-width: 799px) {
  /* v96 — IL FONDO DELL'EROE PAGA LA SALITA DELLA SCHEDA, ED È UN VINCOLO.

     `.pt-piano` sale di `--pt-5` sull'eroe (v73, «la risposta comincia qui»).
     Qui sotto c'era `--pt-3`: dodici pixel per pagarne ventiquattro, e la
     differenza se la prendeva l'ultima riga del sommario. Misurato a 390:
     «Dimmi quanto tempo hai. Al percorso pensiamo noi» tagliato a metà per
     undici pixel — visibile nello screenshot, e mai nominato da nessuno.

     Le due misure adesso sono LO STESSO TOKEN, quindi non possono divergere:
     se un giorno la salita cambia, il fondo cambia con lei. */
  .pt-eroe { padding-block: var(--pt-4) var(--pt-5); gap: var(--pt-4); }
  .pt-eroe .pt-figura { order: -1; --pt-ar: var(--pt-ar-largo); }
  .pt-eroe .pt-credito { order: -1; }
  .pt-eroe h1:not(.pt-evento-titolo) { font-size: clamp(34px, 9.6vw, 46px); max-width: none; }
  .pt-eroe-sub { font-size: 17px; max-width: none; }
}


/* --- 4. IL PIANIFICATORE CHE NON SEMBRA UN MODULO --------------------------
   Il brief, alla lettera: «NON deve sembrare un form».

   Quello che c'era erano due `fieldset` numerati con dentro sette schede
   bordate: misurato a 1280, 384 px di altezza e l'aspetto di una procedura in
   tre passi. È corretto, è accessibile, ed è la cosa che fa sembrare Voce un
   configuratore invece di una guida.

   Qui diventa quello che il rendering mostra: due domande in fila e due file
   di pastiglie. La stessa identica struttura HTML — `fieldset`, `legend`,
   `input[type=radio]` con gli stessi `name`, gli stessi `id` e gli stessi
   `data-*` — perché l'accessibilità e il JavaScript di v48 e v73 dipendono da
   quella e non dall'aspetto. Cambia come si vede, non come funziona.

   Le due domande stanno AFFIANCATE su schermo largo e IN COLONNA sul
   telefono: il brief chiede «subito dopo» per la seconda, e su 390 px
   affiancarle vorrebbe dire due colonne microscopiche — cosa che il brief
   vieta esplicitamente. */
.pt-piano {
  padding: var(--pt-5);
  border-radius: var(--pt-r-xl);
  /* Niente ombra: il pianificatore non galleggia, è dentro la pagina. La
     regola di v64 vale — le ombre sono per ciò che galleggia davvero. */
  box-shadow: none;
  border: 1px solid var(--pt-line);
}
.pt-passo { margin-bottom: var(--pt-4); }
.pt-passo:last-of-type { margin-bottom: var(--pt-3); }

/* La domanda torna a essere una domanda: niente numero in un disco. Il
   numero diceva «passo 1 di 2», cioè prometteva una procedura. */
.pt-passo-titolo {
  display: block;
  margin-bottom: var(--pt-3);
  font-family: var(--pt-font-titolo);
  font-weight: 400;
  font-size: 26px;
  line-height: 1.1;
  letter-spacing: -0.02em;
  color: var(--pt-ink);
}
.pt-passo-num { display: none; }

/* LE PASTIGLIE DEL TEMPO. Da scheda 150×118 a pastiglia 44 di altezza.
   Il ritmo («una mattina senza fretta») non sparisce: diventa la riga sotto la
   fila, riscritta dal comando in fondo, che è dove serve leggerla. */
.pt-tempi {
  display: flex;
  flex-wrap: wrap;
  gap: var(--pt-2);
  overflow: visible;      /* non scorre più: ci stanno tutte e quattro */
  padding: 0;
  margin: 0;
  list-style: none;
}
.pt-tempo {
  display: inline-flex;
  align-items: baseline;
  gap: 7px;
  min-height: 46px;
  padding: 11px 18px;
  border: 1px solid var(--pt-line-2);
  border-radius: var(--pt-r-pill);
  background: var(--pt-card);
  color: var(--pt-ink);
  cursor: pointer;
  transition: background var(--pt-fast) var(--pt-ease),
              border-color var(--pt-fast) var(--pt-ease);
}
.pt-tempo-icona,
.pt-tempo-ritmo,
.pt-tempo-segno { display: none; }
.pt-tempo-cifra {
  font: var(--pt-t-strong);
  font-size: 17px;
  font-weight: 800;
  margin: 0;
  color: inherit;
  letter-spacing: 0;
}
.pt-tempo-parola { font-size: 17px; margin-top: 0; }
.pt-tempo-unita {
  font: var(--pt-t-small);
  font-size: 14px;
  font-weight: 600;
  text-transform: none;
  letter-spacing: 0;
  color: var(--pt-ink-55);
}
/* «Scelto» = tinta + contorno + PESO. Il brief vieta il solo colore, e la
   spunta qui non c'è più: al suo posto il contorno pieno, che è un secondo
   canale visivo esattamente come lo era il segno. */
.pt-tempo:has(input:checked) {
  background: var(--pt-sg-soft);
  border-color: var(--pt-sg);
  box-shadow: inset 0 0 0 1px var(--pt-sg);
}
.pt-tempo:has(input:checked) .pt-tempo-cifra,
.pt-tempo:has(input:checked) .pt-tempo-unita { color: var(--pt-sg-dark); }

/* LE PARTENZE, stessa forma. Erano tre righe alte 64 con icona e sottotitolo:
   il sottotitolo («La mia posizione attuale» sotto «La mia posizione») diceva
   la stessa cosa due volte. */
.pt-partenze {
  display: flex;
  flex-wrap: wrap;
  gap: var(--pt-2);
}
.pt-partenza {
  display: inline-flex;
  align-items: center;
  gap: 9px;
  min-height: 46px;
  padding: 11px 18px;
  border: 1px solid var(--pt-line-2);
  border-radius: var(--pt-r-pill);
  background: var(--pt-card);
}
.pt-partenza > i:first-of-type { font-size: 19px; color: var(--pt-ink-55); }
.pt-partenza-testo { display: inline-flex; align-items: center; }
.pt-partenza-testo strong {
  font: var(--pt-t-strong);
  font-size: 15px;
  font-weight: 700;
}
.pt-partenza-testo small { display: none; }
.pt-partenza-segno { display: none; }
.pt-partenza:has(input:checked) {
  background: var(--pt-sg-soft);
  border-color: var(--pt-sg);
  box-shadow: inset 0 0 0 1px var(--pt-sg);
}
.pt-partenza:has(input:checked) > i:first-of-type,
.pt-partenza:has(input:checked) .pt-partenza-testo strong { color: var(--pt-sg-dark); }

/* Le due domande affiancate su schermo largo. */
@media (min-width: 800px) {
  .pt-piano {
    display: grid;
    grid-template-columns: 1fr 1fr;
    column-gap: var(--pt-6);
    align-items: start;
  }
  .pt-piano-via { grid-column: 1 / -1; margin-top: var(--pt-2); }
  .pt-piano-altro { grid-column: 1 / -1; }
  .pt-mappa-scelta { grid-column: 1 / -1; }
}

/* IL COMANDO. Resta il più importante della home e adesso lo sembra. */
.pt-parti {
  min-height: 60px;
  border-radius: var(--pt-r-pill);
  font-size: 17px;
}
.pt-parti small {
  font: var(--pt-t-label);
  letter-spacing: 0.14em;
  opacity: 0.82;
}
.pt-parti-riga { font-size: 17px; font-weight: 800; }

/* IL DIFETTO MISURATO, E LA SUA CORREZIONE.

   A 390 px il comando appiccicato copriva le pastiglie del tempo mentre le si
   sceglieva: nello screenshot di collaudo «Quanto tempo hai?» era leggibile e
   le sue quattro scelte erano sotto al bottone. Un comando che copre la
   domanda a cui deve rispondere.

   A-bis — LA DIAGNOSI DI v93, SCRITTA QUI SOTTO, ERA SBAGLIATA.

   Diceva: «la causa non era `sticky` — quella è la soluzione giusta e il brief
   la chiede — ma il fatto che il modulo non riservava spazio». Ed è la ragione
   per cui **questo difetto è tornato due volte**: v93 lo ha visto e gli ha
   messo un fondo sfumato sotto, v96 lo ha visto di nuovo e ha alzato il
   pianificatore, e tutte e due le volte il comando ha continuato a galleggiare
   sopra le risposte — perché la causa era proprio `sticky`.

   Quello che v93 aveva misurato era vero e utile: «"Quanto tempo hai?" era
   leggibile e le sue quattro scelte erano sotto al bottone». Non è bastato
   perché è stato letto come un problema di sfondo invece che di posizione.

   Lo sticky è stato tolto (il ragionamento per esteso sta nella sezione 4).
   Di questo blocco restano le due cose che valgono lo stesso: il respiro del
   modulo e il margine negativo che ridà al comando i pixel che il padding gli
   toglie. Via la sfumatura: serviva a far intravedere il testo che passava
   **sotto** al comando, e sotto al comando non passa più niente. */
@media (max-width: 799px) {
  .pt-piano { padding: var(--pt-4); padding-bottom: var(--pt-2); }
  .pt-piano-via {
    margin-inline: calc(var(--pt-4) * -1);
    padding: var(--pt-3) var(--pt-4) var(--pt-3);
  }
  .pt-passo-titolo { font-size: 22px; }
}


/* --- 5. LA SEZIONE EDITORIALE ---------------------------------------------
   L'intestazione di sezione esisteva già (`.pt-sezione-testa`) ed è giusta:
   qui prende solo la scala nuova. */
.pt-sezione-testa { margin-bottom: var(--pt-4); align-items: end; }
.pt-sezione-testa h2 { font-size: clamp(26px, 3.2vw, 38px); }
/* FASE C — l'intestazione quando non sta dentro una sezione che le dà i
   margini: su Scopri, sopra le pastiglie e l'elenco, che sono fratelli e non
   figli (l'elenco ha i figli diretti come schede, e il JavaScript lo sa). */
.pt-sezione-testa.is-sola { margin: var(--pt-6) var(--pt-align) var(--pt-4); }
.pt-sezione-sub { font-size: 16px; color: var(--pt-ink-55); margin-top: var(--pt-1); }


/* --- 6. IL FEATURE ---------------------------------------------------------
   «Da non perdere» (Scopri), «il percorso consigliato» (Tour), l'evento in
   evidenza. Erano tre componenti; è uno.

   Il brief: grande fotografia, titolo, una frase, i dati, UNA CTA. */
.pt-feature {
  display: grid;
  grid-template-columns: 1fr;
  gap: 0;
  margin: 0 var(--pt-align) var(--pt-5);
  overflow: hidden;
  border: 1px solid var(--pt-line);
  border-radius: var(--pt-r-xl);
  background: var(--pt-card);
  box-shadow: var(--pt-shadow-card);
}
.pt-feature .pt-figura {
  border-radius: 0;
  --pt-ar: var(--pt-ar-largo);
}
.pt-feature-corpo {
  padding: var(--pt-5);
  display: flex;
  flex-direction: column;
  align-items: flex-start;
  justify-content: center;
  gap: var(--pt-3);
}
.pt-feature-corpo > * { margin: 0; }
.pt-feature-corpo h2,
.pt-feature-corpo h3 {
  font-family: var(--pt-font-titolo);
  font-weight: 400;
  font-size: clamp(28px, 3.4vw, 42px);
  line-height: 1.04;
  letter-spacing: -0.03em;
  text-wrap: balance;
}
.pt-feature-testo {
  font-size: 17px;
  line-height: 1.55;
  color: var(--pt-ink-55);
  max-width: 46ch;
}
.pt-feature .pt-fatti { gap: var(--pt-3); }

@media (min-width: 800px) {
  .pt-feature { grid-template-columns: 1.05fr 0.95fr; align-items: stretch; }
  .pt-feature .pt-figura { height: 100%; --pt-ar: auto; min-height: 340px; }
  .pt-feature-corpo { padding: var(--pt-6); }
  /* Il feature «rovesciato»: immagine a destra. Serve ad alternare il ritmo
     quando in una pagina ce n'è più di uno — il brief chiede composizioni
     asimmetriche, non una griglia ripetuta. */
  .pt-feature.is-rovescia .pt-figura { order: 2; }
}
@media (max-width: 799px) {
  .pt-feature-corpo { padding: var(--pt-4); gap: var(--pt-2); }
  .pt-feature-testo { font-size: 16px; }
}


/* --- 7. I TEMI -------------------------------------------------------------
   «Che Palermo vuoi scoprire?» — quattro immagini grandi, titolo sopra,
   pochissimo testo. Il brief lo dice esplicitamente: NON card standard.

   Sono le categorie vere del catalogo con il loro conto: un tema che non ha
   luoghi dietro sarebbe una promessa vuota, e questo è il difetto che il
   brief chiama «stato vuoto come blocco negativo». */
.pt-temi {
  display: grid;
  grid-template-columns: repeat(2, 1fr);
  gap: var(--pt-2);
  margin: 0 var(--pt-align) var(--pt-5);
  padding: 0;
  list-style: none;
}
.pt-tema {
  position: relative;
  display: block;
  overflow: hidden;
  border-radius: var(--pt-r-lg);
  color: var(--pt-ink);
  text-decoration: none;
  min-height: 152px;
}
.pt-tema .pt-figura { --pt-ar: var(--pt-ar-scheda); border-radius: inherit; height: 100%; }
.pt-tema-testo {
  position: absolute;
  z-index: 2;
  inset-inline: var(--pt-3);
  inset-block-end: var(--pt-3);
}
.pt-tema-testo strong {
  display: block;
  font-family: var(--pt-font-titolo);
  font-weight: 400;
  font-size: clamp(18px, 2.2vw, 25px);
  line-height: 1.08;
  letter-spacing: -0.02em;
  text-wrap: balance;
}
.pt-tema-testo small {
  display: block;
  margin-top: 3px;
  font: var(--pt-t-label);
  letter-spacing: 0.14em;
  text-transform: uppercase;
  opacity: 0.9;
}
/* La figura riempie la tessera e il testo le sta sopra: con la fotografia
   sopra al velo, con la targa sopra al fondo scuro. In tutti e due i casi il
   testo è bianco — che è il punto del fondo scuro della targa: una sola
   composizione, due contenuti. */
.pt-tema .pt-figura {
  position: absolute;
  inset: 0;
  height: 100%;
  --pt-ar: auto;
}
.pt-tema-testo { color: #fff; }
.pt-tema:has(.is-velata) .pt-tema-testo { text-shadow: 0 1px 10px rgba(0, 0, 0, 0.5); }
/* Dentro un tema la targa non scrive il nome del luogo: il nome che conta qui
   è quello del TEMA, e lo scrive la tessera. Due titoli nello stesso riquadro
   sono il modo in cui un componente comincia a contraddirsi. */
.pt-tema .pt-figura.is-targa { padding: 0; }
.pt-tema .pt-figura-nome,
.pt-tema .pt-figura-fam { display: none; }

@media (min-width: 800px) {
  .pt-temi { grid-template-columns: repeat(4, 1fr); gap: var(--pt-3); }
  .pt-tema { min-height: 230px; }
}


/* --- 8. L'AGENDA -----------------------------------------------------------
   «Stasera a Palermo»: l'ora a sinistra, l'evento a destra, una linea che li
   tiene insieme. Il brief la chiede come sezione principale degli eventi, e la
   ragione è che un evento senza l'ora non è un evento — è una scheda.

   È la stessa forma della timeline delle tappe (`.pt-tappe-linea`), con il
   numero sostituito dall'ora. Non è un componente nuovo: è quello, con un
   dato diverso. */
.pt-agenda { margin: 0 var(--pt-align) var(--pt-5); padding: 0; list-style: none; }
.pt-agenda > li { position: relative; }
.pt-agenda-voce {
  display: grid;
  grid-template-columns: 68px 1fr auto;
  gap: var(--pt-3);
  align-items: center;
  padding: var(--pt-3) 0;
  border-block-end: 1px solid var(--pt-line);
  color: inherit;
  text-decoration: none;
  min-height: 64px;
}
.pt-agenda > li:last-child .pt-agenda-voce { border-block-end: 0; }
.pt-agenda-ora {
  font: var(--pt-t-strong);
  font-size: 19px;
  font-weight: 800;
  font-variant-numeric: tabular-nums;
  color: var(--pt-sg);
  letter-spacing: -0.01em;
}
.pt-agenda-corpo { min-width: 0; }
.pt-agenda-corpo strong {
  display: block;
  font-family: var(--pt-font-titolo);
  font-weight: 400;
  font-size: 21px;
  line-height: 1.15;
  letter-spacing: -0.02em;
  color: var(--pt-ink);
}
.pt-agenda-corpo small {
  display: flex;
  align-items: center;
  gap: 5px;
  margin-top: 3px;
  font: var(--pt-t-small);
  color: var(--pt-ink-55);
}
.pt-agenda-voce > .ti-chevron-right { color: var(--pt-sg); font-size: 20px; }

/* LA DATA SUL TELEFONO, come il brief la disegna: 12 / SET impilati. */
.pt-data-blocco {
  display: grid;
  place-items: center;
  align-content: center;
  min-width: 54px;
  padding: 7px 4px;
  border-radius: var(--pt-r-sm);
  background: var(--pt-sg-soft);
  line-height: 1;
}
.pt-data-blocco b {
  font-size: 21px;
  font-weight: 800;
  color: var(--pt-sg-dark);
  font-variant-numeric: tabular-nums;
}
.pt-data-blocco small {
  margin-top: 2px;
  font: var(--pt-t-label);
  letter-spacing: 0.1em;
  text-transform: uppercase;
  color: var(--pt-sg-dark);
}


/* --- 9. LA TESTATA DI PAGINA SU SCHERMO LARGO ------------------------------
   Il brief chiede l'intestazione editoriale: il marchio a sinistra, le cinque
   voci accanto, i comandi a destra. Una riga sola.

   Quello che c'era: il marchio nella barra e le cinque voci in una SECONDA
   riga sotto, che è la barra del telefono portata su desktop. Funziona, ma
   costa 56 px su ogni pagina e dice «app» invece di «rivista».

   Sotto gli 800 px non cambia niente: la barra in fondo resta quella, ed è
   giusta — il pollice sta in basso. */
@media (min-width: 800px) {
  .pt-header {
    display: grid;
    grid-template-columns: auto 1fr auto;
    align-items: center;
    gap: var(--pt-5);
    max-width: var(--pt-col);
    margin-inline: auto;
    padding-inline: var(--pt-gutter);
  }
  .pt-topbar {
    grid-column: 1;
    padding-inline: 0;
    gap: var(--pt-3);
  }
  .pt-topbar .pt-topbar-titolo { font-size: 30px; }
  /* I comandi di destra escono dalla barra e vanno nella terza colonna. */
  .pt-topbar-right {
    grid-column: 3;
    grid-row: 1;
  }
  .pt-bottom-nav {
    grid-column: 2;
    grid-row: 1;
    justify-content: flex-start;
    gap: var(--pt-1);
    padding: 0;
    border: 0;
    background: transparent;
    box-shadow: none;
  }
  .pt-bottom-nav a {
    flex-direction: row;
    align-items: center;
    gap: 7px;
    padding: 9px 14px;
    border-radius: var(--pt-r-pill);
    font-size: 15px;
    font-weight: 700;
  }
  .pt-bottom-nav a i { font-size: 18px; }
  .pt-bottom-nav a span { font-size: 15px; }
  /* «Sei qui» su desktop: tinta, peso e un filetto sotto. Tre canali, di cui
     due non cromatici — la regola del brief, e quella di v73. */
  .pt-bottom-nav a.active {
    background: var(--pt-sg-soft);
    font-weight: 800;
  }
  .pt-bottom-nav a.active i { background: none; }
}
/* A metà strada le cinque voci con la parola non ci stanno accanto al marchio
   e ai quattro comandi: restano una riga sotto, come prima. */
@media (min-width: 800px) and (max-width: 1080px) {
  .pt-header { display: block; padding-inline: 0; }
  .pt-topbar { padding-inline: var(--pt-gutter); }
  .pt-bottom-nav { padding-inline: var(--pt-gutter); }
}


/* --- 10. IL DIARIO (TU) ----------------------------------------------------
   «NON deve sembrare un account»: le statistiche diventano la prima cosa, i
   comandi dell'account l'ultima. */
.pt-statistiche {
  display: grid;
  grid-template-columns: repeat(2, 1fr);
  gap: var(--pt-2);
  margin: 0 var(--pt-align) var(--pt-5);
  padding: 0;
  list-style: none;
}
.pt-statistica {
  padding: var(--pt-4);
  border: 1px solid var(--pt-line);
  border-radius: var(--pt-r-lg);
  background: var(--pt-card);
  text-align: start;
}
.pt-statistica b {
  display: block;
  font-family: var(--pt-font-titolo);
  font-weight: 400;
  font-size: clamp(34px, 6vw, 52px);
  line-height: 1;
  letter-spacing: -0.04em;
  color: var(--pt-ink);
  font-variant-numeric: tabular-nums;
}
.pt-statistica b small {
  font-family: var(--pt-font);
  font-size: 15px;
  font-weight: 600;
  color: var(--pt-ink-45);
  letter-spacing: 0;
  /* FASE F — «2su 101»: il totale stava attaccato al numero. */
  margin-inline-start: 6px;
}
.pt-statistica span {
  display: block;
  margin-top: var(--pt-2);
  font: var(--pt-t-label);
  letter-spacing: 0.14em;
  text-transform: uppercase;
  color: var(--pt-ink-55);
}
@media (min-width: 800px) {
  .pt-statistiche { grid-template-columns: repeat(4, 1fr); gap: var(--pt-3); }
}


/* --- 11. LE RIGHE DELL'ELENCO ---------------------------------------------
   Il brief: «Ridurre il numero di card». Dove la card non risponde a «perché
   devo cliccare», qui c'è una riga — e la riga porta la sua miniatura, che è
   l'unica cosa che ne fa capire il contenuto a colpo d'occhio. */
.pt-riga-foto,
.pt-riga .pt-figura {
  flex: 0 0 auto;
  width: 92px;
  --pt-ar: var(--pt-ar-scheda);
  border-radius: var(--pt-r-sm);
}
.pt-riga .pt-figura.is-targa { padding: 0; }
.pt-riga .pt-figura.is-targa > .pt-figura-nome,
.pt-riga .pt-figura.is-targa > .pt-figura-fam { display: none; }
.pt-riga .pt-figura.is-targa > i {
  font-size: 30px;
  opacity: 0.4;
  transform: translate(-50%, -50%);
}


/* --- 12. GLI STATI VUOTI ---------------------------------------------------
   «NON mostrare stati vuoti come grandi blocchi negativi.» Il componente
   c'era già (`_vuoto.html`); qui perde il bordo tratteggiato, che è il segno
   grafico che dice «qui manca qualcosa». */
.pt-vuoto-blocco {
  border: 0;
  background: var(--pt-paper-2);
  border-radius: var(--pt-r-xl);
  padding: var(--pt-6) var(--pt-5);
}
.pt-vuoto-blocco .pt-vuoto-titolo {
  font-family: var(--pt-font-titolo);
  font-weight: 400;
  font-size: 25px;
  letter-spacing: -0.02em;
  color: var(--pt-ink);
}
.pt-vuoto-blocco .pt-vuoto-testo { font-size: 16px; color: var(--pt-ink-55); }


/* --- 13. LA VETRINA --------------------------------------------------------
   Poche card, ma grandi: «Da non perdere» in home, i luoghi di un tema, i
   percorsi consigliati. Sostituisce tre scroller orizzontali che mostravano
   tessere da 168 px — troppo piccole per far venire voglia di qualcosa, che è
   l'unico mestiere di questa sezione.

   Due colonne sul telefono e tre su schermo largo: il brief vieta le colonne
   microscopiche, e sotto i 168 px una figura 4:3 non racconta più niente. */
.pt-vetrina {
  display: grid;
  grid-template-columns: repeat(2, 1fr);
  gap: var(--pt-3);
  margin: 0 var(--pt-align) var(--pt-5);
  padding: 0;
  list-style: none;
}
.pt-vetrina-voce {
  display: flex;
  flex-direction: column;
  gap: var(--pt-2);
  color: inherit;
  text-decoration: none;
}
.pt-vetrina-voce .pt-figura { --pt-ar: var(--pt-ar-scheda); }
.pt-vetrina-cat {
  font: var(--pt-t-label);
  letter-spacing: 0.14em;
  text-transform: uppercase;
  color: var(--pt-fam);
}
.pt-vetrina-voce strong {
  font-family: var(--pt-font-titolo);
  font-weight: 400;
  font-size: clamp(19px, 2.1vw, 26px);
  line-height: 1.1;
  letter-spacing: -0.025em;
  color: var(--pt-ink);
  text-wrap: balance;
}
.pt-vetrina-voce .pt-fatti { margin-top: auto; }

@media (min-width: 800px) {
  .pt-vetrina { grid-template-columns: repeat(3, 1fr); gap: var(--pt-4); }
}


/* --- 14. LA FIGURA DELL'EROE È UN COLLEGAMENTO -----------------------------
   Era un `div` con la didascalia cliccabile dentro: il bersaglio era la riga
   in basso, cioè 44 px su una figura alta 400. Adesso è tutta la figura a
   portare al luogo — che è quello che chiunque prova a fare per primo. */
.pt-eroe-figura {
  display: block;
  text-decoration: none;
  border-radius: var(--pt-r-lg);
}
.pt-eroe-figura .pt-figura { --pt-ar: var(--pt-ar-eroe); }
@media (min-width: 800px) {
  /* In griglia la figura riempie la colonna: la proporzione lascia il posto
     all'altezza della riga, com'era per `.pt-eroe-foto`. */
  .pt-eroe-figura { grid-column: 2; align-self: stretch; }
  .pt-eroe-figura .pt-figura { --pt-ar: auto; height: 100%; min-height: 360px; }
}
@media (max-width: 799px) {
  .pt-eroe-figura { order: -1; }
  .pt-eroe-figura .pt-figura { --pt-ar: var(--pt-ar-largo); }
}


/* --- 15. CORREZIONI MISURATE SULLA PRIMA PROVA A SCHERMO -------------------
   Tre difetti visti nello screenshot di collaudo di v93, non ipotizzati. */

/* (a) IL NOME SCRITTO DUE VOLTE. Nella vetrina la targa scriveva il nome del
   luogo e la card lo riscriveva sotto: due volte la stessa parola a otto pixel
   di distanza. Dentro una card che ha già il suo titolo, la targa fa solo da
   superficie. */
.pt-vetrina-voce .pt-figura-nome { display: none; }

/* (b) I BERSAGLI DELLA BARRA SU DESKTOP. Misurati a 36 px: sotto la soglia di
   44 che questo foglio si è dato da v16 e che il brief ripete. Il mouse non se
   ne accorge, un dito su un portatile touch sì. */
@media (min-width: 800px) {
  .pt-bottom-nav a { min-height: 44px; padding-block: 0; align-items: center; }
}

/* (c) LE TAPPE DEL PERCORSO ERANO DISCHI COLORATI.
   Nell'anteprima del giro ogni tappa era un cerchio pieno da 54 px col numero
   sopra: cinque bolli in fila che non dicono che posti sono. Diventano figure
   piccole con la stessa cornice di tutto il resto — e quando le fotografie
   arriveranno, saranno cinque fotografie.

   La classe e la struttura NON cambiano: `app.js` riscrive questa lista da
   capo quando la scelta cambia, e si aspetta
   `<span class="pt-percorso-tessera"><i class="ti"></i><b></b></span>`.
   Cambia solo come quella struttura si vede.

   v97 — LA MISURA STA IN UN TOKEN, E LA LARGHEZZA NON È PIÙ SCRITTA DUE VOLTE.
   Qui c'erano `> li > a { width: 104px }` e una tessera larga 104 dentro un
   `<li>` largo 84: venti pixel di troppo per ogni voce, che con lo stacco di
   dodici facevano **otto pixel di sovrapposizione fra una miniatura e la
   successiva**. È il motivo per cui la fila sembrava una striscia continua
   invece di cinque tappe. Adesso la larghezza la dichiara il token, e la
   griglia della riga la legge dallo stesso posto. */
.pt-percorso-tessera {
  position: relative;
  display: grid;
  place-items: center;
  width: var(--pt-tappa-foto);
  height: calc(var(--pt-tappa-foto) * 3 / 4);
  border-radius: var(--pt-r-sm);
  background-color: var(--pt-targa);
  background-image:
    repeating-linear-gradient(135deg, rgba(255,255,255,.035) 0 1px, transparent 1px 9px),
    radial-gradient(130% 100% at 50% 0%,
      color-mix(in srgb, var(--pt-fam) 55%, transparent) 0%, transparent 68%);
  background-size: cover;
  background-position: center;
  overflow: hidden;
}
.pt-percorso-tessera > i { font-size: 24px; color: #fff; opacity: 0.42; }
/* Quando la fotografia c'è, `app.js` aggiunge `is-foto` e la mette come
   sfondo: il velo qui sotto tiene leggibile il numero. */
.pt-percorso-tessera.is-foto { background-image: none; }
.pt-percorso-tessera.is-foto::before {
  content: "";
  position: absolute;
  inset: 0;
  background: linear-gradient(to top, rgb(var(--pt-velo) / .58), rgb(var(--pt-velo) / 0) 60%);
}
/* Il numero della tappa: un bollo in basso a sinistra, non al centro. */
.pt-percorso-tessera > b {
  position: absolute;
  z-index: 2;
  inset-block-end: 5px;
  inset-inline-start: 5px;
  display: grid;
  place-items: center;
  min-width: 21px;
  height: 21px;
  padding: 0 5px;
  border-radius: var(--pt-r-pill);
  background: var(--pt-sg);
  color: #fff;
  font: var(--pt-t-label);
  font-size: 11.5px;
  font-variant-numeric: tabular-nums;
}


/* --- 16. SECONDA PASSATA SULLA VETRINA ------------------------------------
   (a) Anche la famiglia era scritta due volte: dentro la targa e sotto la
   figura. Dentro una card che porta già categoria e titolo, la targa resta
   solo superficie — icona e filetto, niente testo. */
.pt-vetrina-voce .pt-figura-fam { display: none; }

/* (b) TRE TARGHE IDENTICHE.
   I tre luoghi di «Da non perdere» sono i tre con la priorità più alta, e in
   questo catalogo appartengono tutti e tre alla stessa famiglia: tre riquadri
   identici in fila, che sembrano un errore di caricamento.

   Non si risolve cambiando i tre luoghi — quella scelta è del generatore ed è
   giusta. Si risolve facendo in modo che due targhe della stessa famiglia non
   si somiglino: la luce cambia angolo e la filigrana cambia posto. Sono gli
   stessi due valori del fondo, spostati; nessun colore nuovo. */
.pt-vetrina > li:nth-child(3n + 2) .pt-figura.is-targa {
  background-image:
    repeating-linear-gradient(45deg, rgba(255,255,255,.035) 0 1px, transparent 1px 9px),
    radial-gradient(120% 110% at 18% 8%,
      color-mix(in srgb, var(--pt-fam) 58%, transparent) 0%, transparent 70%);
}
.pt-vetrina > li:nth-child(3n + 2) .pt-figura.is-targa > i {
  transform: translate(-22%, -46%) rotate(-8deg);
}
.pt-vetrina > li:nth-child(3n + 3) .pt-figura.is-targa {
  background-image:
    repeating-linear-gradient(100deg, rgba(255,255,255,.035) 0 1px, transparent 1px 10px),
    radial-gradient(125% 105% at 84% 14%,
      color-mix(in srgb, var(--pt-fam) 52%, transparent) 0%, transparent 66%);
}
.pt-vetrina > li:nth-child(3n + 3) .pt-figura.is-targa > i {
  transform: translate(-78%, -54%) rotate(7deg);
}


/* --- 17. I TOUR LAMPO ------------------------------------------------------
   «Poco tempo?» — il tempo grande, e accanto che giro è.

   Erano cinque riquadri identici con la stessa icona grigia: cinque bersagli
   uguali che bisogna leggere tutti per scoprire che quattro sono la stessa
   cosa con un numero diverso. Qui il numero è la cosa grande — è il dato su
   cui si decide — e il ritmo, che il registro delle durate aveva già e solo la
   home mostrava, dice che cosa ci si fa in quel tempo. */
.pt-lampi {
  display: grid;
  grid-template-columns: 1fr;
  gap: var(--pt-2);
  margin: 0 var(--pt-align) var(--pt-3);
  padding: 0;
  list-style: none;
}
.pt-lampo {
  display: grid;
  grid-template-columns: 74px 1fr auto;
  align-items: center;
  gap: var(--pt-3);
  min-height: 72px;
  padding: var(--pt-3) var(--pt-4);
  border: 1px solid var(--pt-line);
  border-radius: var(--pt-r-lg);
  background: var(--pt-card);
  color: inherit;
  text-decoration: none;
  transition: border-color var(--pt-fast) var(--pt-ease);
}
.pt-lampo-quanto {
  display: flex;
  align-items: baseline;
  gap: 4px;
  color: var(--pt-sg);
}
.pt-lampo-quanto b {
  font-family: var(--pt-font-titolo);
  font-weight: 400;
  font-size: 34px;
  line-height: 1;
  letter-spacing: -0.03em;
  font-variant-numeric: tabular-nums;
}
.pt-lampo-quanto em {
  font-style: normal;
  font: var(--pt-t-label);
  letter-spacing: 0.12em;
  text-transform: uppercase;
}
.pt-lampo-parola { font-size: 21px; }
.pt-lampo-ritmo {
  font-size: 16px;
  line-height: 1.3;
  color: var(--pt-ink);
}
.pt-lampo > .ti-arrow-right { color: var(--pt-sg); font-size: 19px; }
/* La durata predefinita è quella che il modulo propone da sé: un accento solo,
   la regola di v45. */
.pt-lampo.is-viva { border-color: var(--pt-sg); background: var(--pt-sg-tint); }

.pt-crea-riga { margin: 0 var(--pt-align) var(--pt-5); }

@media (min-width: 800px) {
  .pt-lampi { grid-template-columns: repeat(2, 1fr); gap: var(--pt-3); }
}

/* La quarta durata non ha una cifra: dice «Giornata», che in una colonna da
   74 px scritta a 21 px va a finire sopra al ritmo accanto. La colonna si
   dimensiona sul contenuto e tiene un minimo, così le tre con la cifra restano
   incolonnate e la quarta si prende quello che le serve. */
.pt-lampo { grid-template-columns: minmax(74px, max-content) 1fr auto; }
.pt-lampo-quanto { white-space: nowrap; }
.pt-lampo-parola { font-size: 19px; letter-spacing: -0.02em; }


/* --- 18. LA COPERTINA DELLA SCHEDA LUOGO ----------------------------------
   `.pt-poi-testa` era una fascia piena del colore della famiglia con dentro
   un'icona grande: la stessa scelta della tessera da 54 px, portata a 1180 di
   larghezza. Alla misura di una copertina quel colore non è più un segnale,
   è un rettangolo — ed era il difetto che v93 ha già corretto sulla targa.

   Qui non cambia il markup, perché dentro ci sono `_fav_star.html`, le
   targhette e il titolo, e tre partial diversi lo scrivono. Cambia la
   superficie: la stessa ricetta della targa — fondo scuro, trama, luce e
   filetto nel colore della famiglia — così la scheda del luogo e la sua figura
   nell'elenco si somigliano, che è il minimo per un prodotto che vuole
   sembrare uno solo. */
.pt-poi-testa {
  background-color: var(--pt-targa);
  background-image:
    repeating-linear-gradient(135deg, rgba(255,255,255,.035) 0 1px, transparent 1px 9px),
    radial-gradient(120% 100% at 50% 0%,
      color-mix(in srgb, var(--pt-fam) 52%, transparent) 0%, transparent 70%);
  background-size: cover;
  background-position: center;
  border: 0;
}
/* Quando la fotografia c'è, il velo tiene leggibile il nome sopra.

   FASE C — E LO TIENE LEGGIBILE ANCHE QUANDO IL NOME VA SU DUE RIGHE. Il velo
   di v93 scendeva da 0,72 a 0,15 già a metà copertina: la riga in basso del
   titolo reggeva, quella in alto no. Misurato sopra una fotografia BIANCA — una
   facciata al sole, il caso peggiore — con «Quattro Canti (Piazza Vigliena)»
   a 390: la prima riga sta fra il 27 e il 45% dell'altezza, dove il velo
   valeva 0,44→0,25, cioè 2,99→1,78:1. Sotto il 3:1 che un titolo grande
   chiede. E la prova che doveva accorgersene leggeva il velo di v75, che su
   una copertina con la fotografia non vince: questa regola sì.
   Adesso 0,78 in fondo e 0,56 al 48%: la prima riga sta fra 6,2 e 4,6:1, e
   sopra il 50% il velo si apre — lì c'è l'occhiello, che ha il suo fondo, e
   in cima la stella e il sigillo, che hanno il loro. */
.pt-poi-testa[style*="background-image"]::after {
  content: "";
  position: absolute;
  inset: 0;
  background: linear-gradient(to top, rgb(var(--pt-velo) / .78) 0%, rgb(var(--pt-velo) / .56) 48%, transparent 82%);
  pointer-events: none;
}
.pt-poi-testa > i { color: #fff; opacity: 0.10; font-size: clamp(110px, 20vw, 230px); }
.pt-poi-testa .pt-poi-copertina-alto,
.pt-poi-testa .pt-poi-title { position: relative; z-index: 1; }
/* Il nome del luogo è la frase dominante della pagina. */
.pt-poi-title {
  font-family: var(--pt-font-titolo);
  font-weight: 400;
  font-size: clamp(32px, 5.4vw, 60px);
  line-height: 1.0;
  letter-spacing: -0.035em;
  color: var(--pt-card);
  text-wrap: balance;
}
/* --- LA COPERTINA DEL LUOGO, FASE C ---------------------------------------
   La categoria è l'occhiello del titolo: sta subito sopra il nome, come in
   una rivista e come sulla copertina della home, invece che in alto nella
   fila con il sigillo e la stella, dove era il primo dei tre a tagliarsi
   («ITINERARIO ARABO-NORM…» a 390). `margin-top: auto` la tiene attaccata al
   titolo dentro la colonna flessibile della copertina, che distribuisce il
   resto dello spazio fra la fila in alto e lei.

   SULLA TARGA È TESTO SEMPLICE: il fondo è scuro e noto, e una scatola
   intorno a un'etichetta su fondo scuro è un'etichetta che sembra selezionata
   — che è quello che si vedeva (bianco al 16%, nessun margine interno, angoli
   vivi). SOPRA UNA FOTOGRAFIA si porta il proprio fondo: il velo della
   fotografia scende dal basso e a metà copertina è già quasi trasparente, e un
   titolo su due righe spinge l'occhiello proprio lì. Il velo al 60% sopra una
   fotografia BIANCA — il caso peggiore — fa 5,04:1 col bianco: sopra la
   soglia di 4,5 che serve a un testo da 11 px (al 45% di v75 faceva 3,08), e
   la misura è una prova. */
.pt-poi-testa .pt-poi-cat {
  position: relative;
  z-index: 1;
  align-self: flex-start;
  max-width: 100%;
  margin-top: auto;
  margin-bottom: var(--pt-2);
  border: 0;
  background: none;
  color: #fff;
}
.pt-poi-testa[style*="background-image"] .pt-poi-cat {
  padding: 3px 8px;
  border-radius: var(--pt-r-xs);
  background: rgb(var(--pt-velo) / .6);
}

/* L'occhiello sotto la copertina: è la frase che dice perché questo posto
   conta, e stava alla misura di un sottotitolo qualsiasi. */
.pt-poi-occhiello {
  font-family: var(--pt-font-titolo);
  font-weight: 400;
  font-size: clamp(19px, 2.2vw, 26px);
  line-height: 1.3;
  letter-spacing: -0.02em;
  color: var(--pt-ink-70);
  max-width: 44ch;
}

/* Il titolo del racconto, nuovo in v93. */
.pt-racconto-titolo {
  font-size: clamp(24px, 2.6vw, 32px);
  margin: 0 0 var(--pt-3);
}
.pt-poi-descrizione { font-size: 17px; line-height: 1.68; }

/* Le due note — la curiosità e il consiglio — sono la voce della guida, e il
   brief chiede che la prima stia su fondo accento. */
.pt-nota-card { border-radius: var(--pt-r-lg); padding: var(--pt-4) var(--pt-5); }
.pt-nota-card p { font-size: 16.5px; line-height: 1.6; }
.pt-nota-testa {
  font: var(--pt-t-label);
  letter-spacing: 0.15em;
  text-transform: uppercase;
}
.pt-nota-curiosita { background: var(--pt-sg-soft); border-color: transparent; }


/* --- 19. GLI ALTRI STATI VUOTI ---------------------------------------------
   La sezione 12 aveva tolto il bordo tratteggiato a `.pt-vuoto-blocco`, che è
   il componente nuovo. Restavano cinque riquadri tratteggiati più vecchi —
   recensioni, passaporto, bacheca, tappe — e sulla scheda di un luogo se ne
   vedono due di fila: due rettangoli a trattini in fondo a una pagina che fin
   lì si legge come un articolo.

   Il tratteggio è il segno grafico che dice «qui manca qualcosa». Il brief
   chiede l'opposto: lo stato vuoto racconta che cosa sta per arrivare. */
.pt-vuoto,
.pt-edit-vuoto,
.pt-passport-empty,
.pt-reviews-empty,
.pt-bacheca-vuota {
  border: 0;
  background: var(--pt-paper-2);
  border-radius: var(--pt-r-lg);
  padding: var(--pt-5) var(--pt-4);
  color: var(--pt-ink-55);
  font-size: 16px;
}


/* --- 20. LE ULTIME SUPERFICI PIENE ----------------------------------------
   Restavano due posti in cui il colore della famiglia riempiva un riquadro
   grande: la copertina del blocco «Da non perdere» (`.pt-evidenza-foto`) e le
   tessere delle file di Scopri (`.pt-scheda-tessera`, che nella variante
   grande arriva a 250×140).

   Misurato in pagina su Scopri: due file da cinque tessere piene di blu, rosa,
   arancio e viola una accanto all'altra. Alla misura della pastiglia da 54 px
   quel colore è un segnale utile (v49); alla misura di una copertina è una
   cartella colori.

   Stessa ricetta della targa, stesso risultato: peso fotografico, famiglia
   leggibile dal filetto e dalla luce. Le tessere PICCOLE non si toccano — sotto
   i 60 px la trama non si vede e il colore pieno resta la scelta giusta. */
.pt-evidenza-foto,
.pt-scheda-tessera {
  background-color: var(--pt-targa);
  background-image:
    repeating-linear-gradient(135deg, rgba(255,255,255,.035) 0 1px, transparent 1px 9px),
    radial-gradient(130% 100% at 50% 0%,
      color-mix(in srgb, var(--pt-fam) 55%, transparent) 0%, transparent 68%);
  background-size: cover;
  background-position: center;
  position: relative;
  overflow: hidden;
}
/* Il filetto della famiglia, come sulla targa. */
.pt-evidenza-foto::before,
.pt-scheda-grande .pt-scheda-tessera::before {
  content: "";
  position: absolute;
  inset-block-start: 0;
  inset-inline: 0;
  height: 3px;
  background: var(--pt-fam);
  z-index: 1;
}
.pt-evidenza-foto > i,
.pt-scheda-tessera > i { color: #fff; opacity: 0.30; }
.pt-evidenza-foto > i { font-size: clamp(64px, 9vw, 120px); opacity: 0.12; }

/* Le tessere piccole restano piene: sotto i 60 px la trama non si legge e il
   colore pieno è il segnale più rapido che ci sia. */
.pt-poi-tessera { background: var(--pt-fam); }

/* Le file di Scopri andavano a capo su schermo largo: cinque tessere e la
   sesta orfana sulla riga sotto. Sono file che SCORRONO — `data-sfuma` mette
   già la sfumatura che dichiara che continuano — e una fila che scorre non va
   a capo. Misurato a 1280: 6 voci, 5+1.

   FASE C — E LA REGOLA CHE STAVA QUI NON POTEVA FUNZIONARE. Era
   `flex-wrap: nowrap` su queste tre file: sul telefono sono `flex` senza
   `wrap`, cioè già `nowrap` per definizione; sopra gli 800 la sezione del
   desktop le trasforma in `grid`, dove `flex-wrap` non vuol dire niente. Una
   regola che non tocca nessuna larghezza, con sopra il commento che diceva di
   aver corretto il difetto — e il difetto c'era ancora, tre volte per
   pagina: misurato alla FASE C, «Non spendere niente.», «Solo mezz'ora.» e
   «Quello che vale il viaggio.» su due righe ciascuna, 5+1.
   (`.pt-evidenza-elenco` non ha più nessun elemento in nessun template.)

   Adesso la fila di Scopri sul largo è una fila davvero: una riga sola che
   scorre, con la metà di una tessera in vista che dice «continua» — la regola
   del carosello di v94 (`.pt-rail`, «tre e mezzo in vista») — e le frecce per
   chi ha il mouse (`data-frecce` nel template), perché uno scorrimento di lato
   con la rotella è un gesto che non esiste. Tre e mezzo fino a 1100 px, dove
   quattro sarebbero larghe 160 e i nomi finirebbero tutti troncati; quattro e
   mezzo sopra. Sul telefono non cambia niente: lì era già così. */
@media (min-width: 800px) {
  .pt-scopri-blocco .pt-vicini-elenco {
    grid-template-columns: none;
    grid-auto-flow: column;
    grid-auto-columns: calc((100% - 3 * var(--pt-3)) / 3.5);
    overflow-x: auto;
    overscroll-behavior-x: contain;
    scroll-snap-type: x proximity;
  }
  .pt-scopri-blocco .pt-vicini-elenco > li { scroll-snap-align: start; }
}
@media (min-width: 1100px) {
  .pt-scopri-blocco .pt-vicini-elenco { grid-auto-columns: calc((100% - 4 * var(--pt-3)) / 4.5); }
}


/* --- 21. I BERSAGLI DA 44 PX VALGONO ANCHE SU SCHERMO LARGO ---------------
   Il foglio portava chip e bottoni a 44 px solo sotto gli 800 (sezione 15):
   la soglia era stata scritta pensando al telefono. Il collaudo di v93 a
   1024/1280/1440 ha trovato nove bersagli sotto soglia — le pastiglie del
   costruttore e della guida a 38 px, un bottone del tour lampo a 42.

   Un portatile con lo schermo touch esiste, e il brief chiede 44 senza
   distinguere la larghezza. Costa sei pixel di altezza su tre pagine. */
.pt-chip,
.pt-lampo-chip,
.pt-scopri-filtro,
.pt-passport-filtro,
.pt-cat-toggle,
.pt-btn,
.btn { min-height: 44px; }


/* --- 22. IL TITOLO DI PASSO -----------------------------------------------
   Il costruttore è l'unica pagina dell'app in cui una numerazione serve
   davvero: quattro decisioni che hanno un ordine naturale, e il brief le
   elenca numerate. Sulla home il numero era sbagliato — lì sono due domande,
   non due passi — e infatti v93 lo ha tolto.

   Niente riquadri e niente linee: il numero in terracotta accanto alla
   domanda, con le grazie. La gerarchia la fa la scala, non una cornice. */
.pt-step {
  display: flex;
  align-items: baseline;
  gap: var(--pt-3);
  margin: var(--pt-6) var(--pt-align) var(--pt-3);
  font-family: var(--pt-font-titolo);
  font-weight: 400;
  font-size: clamp(22px, 2.6vw, 30px);
  line-height: 1.1;
  letter-spacing: -0.025em;
  color: var(--pt-ink);
}
.pt-step-n {
  flex: 0 0 auto;
  font-size: 0.62em;
  font-weight: 700;
  font-family: var(--pt-font);
  font-variant-numeric: tabular-nums;
  color: var(--pt-sg);
}
.pt-step-n::after { content: "."; }
/* FASE D — la riga sotto il titolo di un passo: che cosa fa quel passo, o che
   cosa aspetta. Stretta al titolo (i margini si fondono: 12 − 4 = 8 px), nel
   secondario, alla misura della lettura.

   La regola «dentro il blocco delle partenze il titolo non ha i margini della
   pagina» se n'è andata con il titolo, che da questa fase sta fuori dal
   blocco. */
.pt-step-nota {
  max-width: var(--pt-lettura);
  margin: -4px var(--pt-align) var(--pt-3);
  font: var(--pt-t-small);
  color: var(--pt-ink-55);
}
/* Il terzo passo aspetta due luoghi. Quando il JavaScript di v30 mostra le due
   tendine, la riga d'attesa se ne va: la regola sta qui, e il JavaScript non
   la conosce. */
#pt-endpoints:not([hidden]) + .pt-endpoints-attesa { display: none; }


/* --- 23. LA SEZIONE «VETRINA» DEL CENTRO TOUR -----------------------------
   `_hub_sezione.html` con `vetrina=True`: le stesse schede, disposte in
   griglia e con la figura della prima tappa. È la sezione dei percorsi scritti
   da Voce, e il brief chiede che pesi più delle altre tre. */
.pt-vetrina-tour { display: grid; grid-template-columns: repeat(2, 1fr); gap: var(--pt-3); }
.pt-itin-card.pt-itin-grande {
  display: flex;
  flex-direction: column;
  gap: var(--pt-2);
  margin: 0;
  padding: 0;
  border: 0;
  background: none;
  box-shadow: none;
}
.pt-itin-grande .pt-figura { --pt-ar: var(--pt-ar-scheda); margin-bottom: var(--pt-1); }
.pt-itin-grande h3 {
  font-family: var(--pt-font-titolo);
  font-weight: 400;
  font-size: clamp(19px, 2.1vw, 26px);
  line-height: 1.1;
  letter-spacing: -0.025em;
  font-stretch: normal;
  margin: 0;
}
@media (min-width: 800px) {
  .pt-vetrina-tour { grid-template-columns: repeat(3, 1fr); gap: var(--pt-4); }
}
/* FASE D — SUL TELEFONO LA TERZA SCHEDA NON RESTA ORFANA.
   Tre percorsi in due colonne fanno 2 + 1: misurato a 390, la terza scheda
   stava a 16–189 con mezza riga vuota accanto — la griglia che finisce con un
   buco è l'immagine di un elenco incompleto. L'ultima, se è dispari, prende la
   riga intera e una figura più larga che alta (16:9): da due più una sola
   diventa due più una grande, ed è così con qualunque numero dispari — anche
   con una fascia di durata accesa che ne lascia una sola. */
@media (max-width: 799px) {
  .pt-vetrina-tour > .pt-itin-grande:last-child:nth-child(odd) { grid-column: 1 / -1; }
  .pt-vetrina-tour > .pt-itin-grande:last-child:nth-child(odd) .pt-figura { --pt-ar: var(--pt-ar-largo); }
}
/* FASE D — 16 e non 8: la fila sta adesso fra la testa della sezione e le
   schede, e a otto pixel le pastiglie toccavano le figure della vetrina. */
.pt-filtri-durata { margin-bottom: var(--pt-4); }
/* v108 — la fila dei temi sotto quella della durata. Le due filtrano la stessa
   lista e stanno insieme: fra l'una e l'altra 12, poco più degli 8 fra due
   pastiglie della stessa fila, quindi si leggono come due domande e non come
   una fila andata a capo. Sotto l'ultima, i 16 di prima. */
.pt-filtri-tema { margin-bottom: var(--pt-4); }
.pt-filtri-durata:has(+ .pt-filtri-tema) { margin-bottom: var(--pt-3); }

/* Il titolo dell'evento: è un `h2` per non fare il secondo `h1` della pagina
   (la barra ne ha già uno), ma è la frase dominante e prende la scala
   dell'eroe. La gerarchia la fa la scala, il livello serve alla voce. */
.pt-evento-titolo {
  font-size: clamp(32px, 5vw, 56px);
  line-height: 1.0;
  letter-spacing: -0.035em;
  margin: var(--pt-2) 0 var(--pt-3);
}

/* La figura senza famiglia: nessun colore inventato. Stessa regola di v76 per
   `.pt-evidenza-foto.is-neutra`, portata sul componente nuovo. */
.pt-figura.is-neutra.is-targa {
  background-image:
    repeating-linear-gradient(135deg, rgba(255,255,255,.035) 0 1px, transparent 1px 9px),
    radial-gradient(130% 100% at 50% 0%, rgba(255,255,255,.10) 0%, transparent 68%);
}
.pt-figura.is-neutra.is-targa::before { background: var(--pt-ink-45); }
/* Un colore PIENO e non un bianco velato: l'audit delle velature misura il
   fondo dichiarato nella stessa regola, e qui il fondo sta in `.is-targa` —
   una regola diversa. Una velatura che l'audit non può misurare è una
   velatura che nessuno ricontrollerà al prossimo cambio di tema, ed è
   esattamente il difetto che quell'audit esiste per prendere.
   #D7DBE2 su #1E242E fa 11,4:1. */
.pt-figura.is-neutra .pt-figura-fam { color: var(--pt-su-targa); }


/* --- 24. LA FAMIGLIA COME TESTO PICCOLO -----------------------------------
   Trovato da `tools/audit_contrasto.py`, non ipotizzato.

   I sei colori delle famiglie sono misurati per il RIEMPIMENTO: bianco sopra,
   tutti sopra 4,5 (v49). Come TESTO su carta calda non ci arrivano — misurati
   adesso su #F6F3ED: strada 4,15 · sacro 4,18 · cultura 4,39 · natura 4,47.
   Tre sotto soglia e uno al pelo.

   Finché la famiglia compariva solo su tessere piene e pastiglie da 88 px il
   problema non c'era, perché non era mai testo. v93 la usa come occhiello
   sopra i titoli (`.pt-vetrina-cat`) e l'audit se n'è accorto subito.

   La correzione NON è alzare la soglia né togliere il colore: è un secondo
   token per famiglia, scurito quanto basta e verificato su tutti e quattro i
   fondi dell'app — carta, scheda, fascia e accento morbido.

       famiglia      riempimento   testo      carta scheda fascia soft
       patrimonio    #6C4BE8       #6546DA     5,51  6,01   5,19  4,53
       sacro         #D0348A       #B02C75     5,48  5,97   5,15  4,50
       cultura       #0E7C93       #0C6B7F     5,54  6,03   5,21  4,55
       strada        #C25417       #A24613     5,54  6,04   5,22  4,56
       natura        #0F8055       #0D704A     5,52  6,02   5,20  4,54
       città         #1B62E0       #195BD0     5,50  5,99   5,18  4,52

   `--pt-fam` resta quello di prima e continua a riempire: il colore che si
   vede su una tessera non cambia di un grado. */
:root {
  --pt-fam-patrimonio-testo: #6546DA;
  --pt-fam-sacro-testo:      #B02C75;
  --pt-fam-cultura-testo:    #0C6B7F;
  --pt-fam-strada-testo:     #A24613;
  --pt-fam-natura-testo:     #0D704A;
  --pt-fam-citta-testo:      #195BD0;
  --pt-fam-testo: var(--pt-fam-citta-testo);
}
[data-cat="arabo_normanno"], [data-cat="palazzi"],
[data-cat="roma_antica"]                                 { --pt-fam-testo: var(--pt-fam-patrimonio-testo); }
[data-cat="chiese_oratori"]                              { --pt-fam-testo: var(--pt-fam-sacro-testo); }
[data-cat="musei"], [data-cat="teatri"]                  { --pt-fam-testo: var(--pt-fam-cultura-testo); }
[data-cat="mercati"], [data-cat="gusto"],
[data-cat="street_art"]                                  { --pt-fam-testo: var(--pt-fam-strada-testo); }
[data-cat="parchi_giardini"], [data-cat="natura_mare"]   { --pt-fam-testo: var(--pt-fam-natura-testo); }
[data-cat="piazze_monumenti"], [data-cat="memoria_civile"],
[data-cat="dintorni"]                                    { --pt-fam-testo: var(--pt-fam-citta-testo); }

/* Dove la famiglia è testo, adesso usa il token del testo. */
.pt-vetrina-cat,
.pt-fatti-cat,
.pt-poi-cat { color: var(--pt-fam-testo); }
/* Sulla copertina scura del luogo l'occhiello resta bianco: lì il fondo non è
   la carta. La riga sopra lo riporterebbe al colore della famiglia. */
.pt-poi-testa .pt-poi-cat { color: #fff; }


/* --- 25. ALTRE TRE MISURE DELLO STESSO AUDIT ------------------------------ */

/* (a) L'occhiello della curiosità era oro sopra l'accento morbido: 4,11.
   L'oro è il colore della ricompensa (passaporto, sigilli) e su rosa non ha
   niente da dire; su `--pt-sg-soft` passano solo inchiostro, inchiostro-70 e
   la terracotta scura — che è anche quella giusta di significato, perché
   questa nota è voce della guida e non un premio. 5,81. */
.pt-nota-curiosita .pt-nota-testa { color: var(--pt-sg-dark); }

/* (b) «di 101» sotto il numero delle statistiche era `--pt-ink-45`, che il
   foglio dichiara da v64 NON adatto al testo piccolo: 3,05 su avorio. È lo
   stesso difetto che l'audit di v64 aveva già trovato in tre punti. 5,72. */
.pt-statistica b small { color: var(--pt-ink-55); }

/* (c) IL TESTO BIANCO DEI TEMI STAVA SOPRA IL NULLA.
   La tessera del tema non aveva un fondo suo: la targa scura le stava dietro
   in `position:absolute`, e l'audit — che risale agli antenati per trovare un
   fondo solido — trovava la carta e misurava bianco su crema: 1,11.

   Visivamente andava bene, e questa è esattamente la trappola: se un giorno la
   figura non rendesse (una foto che non carica, una regola cambiata) il testo
   diventerebbe invisibile davvero. Il fondo scuro va sulla tessera, così il
   bianco ha sempre qualcosa sotto — e adesso l'audit può misurarlo. */
.pt-tema { background: var(--pt-targa); }


/* --- 26. v94 — L'ATTRIBUZIONE DELLA MINI MAPPA ----------------------------
   Sul riquadro del giro in home l'attribuzione era spenta: su 150 px di
   altezza la scritta di Leaflet è ingombrante, e toglierla sembrava la scelta
   di buon senso. Non lo era — i dati sono di OpenStreetMap sotto ODbL e la
   Tile Usage Policy la pretende, ed è una delle ragioni per cui in produzione
   ci hanno bloccati con un 403.

   Piccola è un problema di grafica e si risolve; assente è un problema di
   licenza e non si risolve. Quindi: c'è, sta nell'angolo, non copre il giro.
   Il colore è misurato (ink-55 su carta: 5,5:1) — un'attribuzione illeggibile
   sarebbe assente sotto mentite spoglie. */
.pt-percorso-mappa .leaflet-control-attribution {
  padding: 1px 5px;
  background: color-mix(in srgb, var(--pt-card) 88%, transparent);
  border-start-start-radius: var(--pt-r-xs);
  font-size: 9.5px;
  line-height: 1.5;
  color: var(--pt-ink-55);
}
.pt-percorso-mappa .leaflet-control-attribution a { color: var(--pt-ink-55); }


/* --- 27. v94 — IL GIRO IN DUE COLONNE, COME LO CHIEDE IL BRIEF ------------
   «DESKTOP: layout 50/50 — sinistra: mini mappa, destra: timeline tappe.»

   Fino a v93 la mappa stava sopra, a tutta larghezza: 1146×150, cioè 7,6:1.
   Con le tile caricate non si notava, perché le strade riempiono qualunque
   forma; togliendo le tile (v94) il difetto è saltato fuori nudo — il giro
   disegnato occupava un decimo della larghezza e galleggiava in mezzo a un
   rettangolo vuoto. La forma era sbagliata da sempre, le tile la nascondevano.

   Affiancata alle tappe la mappa diventa ~560×300, cioè 1,9:1: una proporzione
   in cui un giro a piedi ci sta davvero. E le tappe, che a tutta larghezza
   erano una fila da scorrere, diventano la colonna verticale che il brief
   chiama «timeline».

   v97 — «SUL TELEFONO NON CAMBIA NIENTE» ERA LA META' SBAGLIATA.

   Qui sotto c'era scritto: «lì la fila orizzontale è giusta — una colonna di
   cinque tappe spingerebbe il comando fuori dallo schermo». Misurata, la fila
   sul telefono era **larga 488 px in un riquadro da 324**: la quarta tappa
   tagliata a un terzo e la quinta interamente fuori, mentre la riga sopra
   annunciava «5 luoghi». E il comando non è appiccicato qui — sta dentro la
   scheda e scorre con lei, quindi non c'era niente da spingere fuori.

   La colonna adesso è la disposizione di tutti, e sta nella sezione 2 col
   resto del componente. Qui restano le sole cose che sul telefono davvero
   non valgono: le due colonne e la mappa alta 300. */
@media (min-width: 800px) {
  .pt-percorso {
    display: grid;
    grid-template-columns: 1fr 1fr;
    column-gap: var(--pt-5);
    align-items: start;
  }
  .pt-percorso-testa,
  .pt-percorso-dati,
  .pt-percorso-via { grid-column: 1 / -1; }

  .pt-percorso-mappa { height: 300px; margin-top: 0; }

  .pt-percorso-tappe { gap: var(--pt-2); margin-top: 0; }
}


/* --- 28. v94 — TRE CORREZIONI DI CASCATA E UNA DI ALLINEAMENTO ------------

   LA CASCATA. `caricaLeaflet()` inietta `leaflet.css` A RUNTIME, quando la
   mappa serve davvero (v86: Leaflet pesa quanto il resto della pagina e non lo
   paga chi non lo usa). Conseguenza che si vede solo a schermo: quel foglio
   arriva DOPO `custom.css`, quindi a parità di specificità vince lui. Due
   regole nostre erano scritte a parità e non facevano niente:

     `.pt-percorso-mappa .leaflet-container` (0,2,0) perdeva contro
     `.leaflet-container` (0,1,0)? No — perdeva perché il contenitore è lo
     STESSO elemento: Leaflet aggiunge `leaflet-container` al div che gli
     passiamo, quindi il discendente non esiste e la regola non si applica mai.
     Il selettore giusto è `.pt-percorso-mappa.leaflet-container`, due classi
     sullo stesso elemento.

   Si vedeva come un rettangolo grigio #DDD — il fondo di serie di Leaflet —
   al posto della carta dell'app, e si vedeva solo quando le tile mancano,
   cioè esattamente nel caso che v94 esiste per sistemare. */
.pt-percorso-mappa.leaflet-container,
#pt-map.leaflet-container,
#pt-itin-map.leaflet-container,
#pt-propose-map.leaflet-container,
.pt-mappa-scelta.leaflet-container { background: var(--pt-paper-2); }

/* L'ALLINEAMENTO — E LA BATTAGLIA DI SPECIFICITÀ CHE NON C'È PIÙ.

   Qui stavano due gruppi di regole che a v94 servivano a rimediare, sul solo
   desktop, ai lasciti della fila orizzontale: il nome ricentrato, il clamp a
   due righe tolto, e la riga riportata a tutta larghezza. Quest'ultima aveva
   richiesto tre livelli di selettore perché la sezione 15 aveva scritto
   `.pt-percorso-tappe > li > a { width: 104px }` (0,1,3), e nessun selettore
   da (0,1,2) la batte a qualunque distanza lo si scriva più in basso — un'ora
   di tentativi contro dieci minuti di CSSOM, e vale la pena ricordarlo.

   v97 le ha tolte tutte e due, e non perché siano diventate sbagliate: perché
   **non c'è più la cosa da rimediare**. La fila orizzontale non esiste a
   nessuna larghezza, quindi `width: 104px`, il clamp e la centratura non
   esistono, e queste tre regole rimediavano al nulla. La lezione sulla
   specificità resta scritta; il rimedio no. */


/* --- 29. v94 — IL CAROSELLO -----------------------------------------------
   `.pt-rail` è un MODIFICATORE, non un componente nuovo: si aggiunge a una
   griglia che esiste già (`.pt-temi`, `.pt-vetrina`) e la fa scorrere. Così la
   stessa vetrina resta una griglia dove la griglia è giusta — su «Tu», sul
   centro Tour — e diventa una fila solo dove serve movimento.

   LE CARD SBORDANO DI PROPOSITO. Il margine laterale diventa padding: la
   prima card comincia allineata al testo, e l'ultima può uscire dallo schermo
   invece di fermarsi al margine. È quello che dice «continua» prima ancora
   della sfumatura — e sul telefono la card successiva si vede per un terzo,
   che è l'invito a trascinare.

   `scroll-snap` di tipo `proximity` e non `mandatory`: con `mandatory` un
   trascinamento corto viene riportato indietro di forza e sembra che la
   pagina combatta col dito. */
.pt-rail {
  /* v95 — `.pt-rail` NASCE AUTOSUFFICIENTE.
     A v94 era un modificatore puro e dava per scontata una griglia di base
     (`.pt-temi`, `.pt-vetrina`, che dichiarano loro `display: grid`). Usato da
     solo sul carosello della copertina, `grid-auto-flow: column` non aveva
     niente su cui agire: l'elenco restava un blocco e le sei diapositive si
     impilavano in verticale — 647x2911 invece di 647x485, misurato. Dichiarare
     qui le quattro righe dell'elenco costa nulla e toglie un presupposto
     implicito, che è il modo in cui un modificatore diventa una trappola. */
  display: grid;
  margin-block: 0;
  padding-block: 0;
  list-style: none;
  grid-template-columns: none;
  grid-auto-flow: column;
  grid-auto-columns: 74%;
  gap: var(--pt-3);
  overflow-x: auto;
  overscroll-behavior-x: contain;
  scroll-snap-type: x proximity;
  scroll-padding-inline-start: var(--pt-align);
  margin-inline: 0;
  padding-inline: var(--pt-align);
  scrollbar-width: none;
}
.pt-rail::-webkit-scrollbar { display: none; }
.pt-rail > li { scroll-snap-align: start; }

@media (min-width: 800px) {
  /* Tre e mezzo in vista: il mezzo è quello che dichiara che ce ne sono altri. */
  .pt-rail { grid-auto-columns: 28%; gap: var(--pt-4); }
}

/* --- Le frecce ------------------------------------------------------------
   Le crea `initFrecceRail()` dentro un involucro che si crea anche lui. Stanno
   SOPRA la fila, a metà altezza, e ci stanno solo quando c'è da scorrere. */
.pt-rail-wrap { position: relative; }
.pt-rail-freccia {
  position: absolute;
  z-index: 3;
  inset-block-start: calc(50% - 22px);
  display: none;
  place-items: center;
  width: 44px;
  height: 44px;
  padding: 0;
  border: 1px solid var(--pt-line);
  border-radius: var(--pt-r-icona);
  background: var(--pt-card);
  color: var(--pt-ink);
  box-shadow: var(--pt-shadow-pop);
  cursor: pointer;
}
.pt-rail-freccia > i { font-size: 20px; }
.pt-rail-freccia.is-indietro { inset-inline-start: calc(var(--pt-align) - 22px); }
.pt-rail-freccia.is-avanti { inset-inline-end: calc(var(--pt-align) - 22px); }
.pt-rail-freccia[hidden] { display: none; }

/* Solo dove c'è un mouse: col dito si trascina, e due dischi sopra le card
   sarebbero due bersagli che coprono il contenuto senza aggiungere niente. */
@media (hover: hover) and (pointer: fine) {
  .pt-rail-wrap.ha-frecce .pt-rail-freccia:not([hidden]) { display: grid; }
}

/* Dentro un carosello le tessere dei temi tornano alte come in griglia: senza,
   `grid-auto-columns` le lascerebbe alte quanto il contenuto. */
.pt-temi.pt-rail > li { min-height: 152px; }
@media (min-width: 800px) {
  .pt-temi.pt-rail > li { min-height: 230px; }
}
/* Le card della vetrina sono alte quanto la più alta della fila: allineate in
   basso i dati, altrimenti ogni card finisce a un'altezza diversa. */
.pt-vetrina.pt-rail > li { display: flex; }
.pt-vetrina.pt-rail .pt-vetrina-voce { width: 100%; }


/* --- 30. v95 — IL PIANIFICATORE SU SCHERMO LARGO DICE CHE GIRO TI DÀ ------
   Aldo: «la configurazione del percorso lampo nella home lato desktop non va
   bene, la trovo poco comunicativa».

   MISURATO PRIMA DI TOCCARE NIENTE, a 1440: la colonna del tempo è larga 563
   px e le quattro pastiglie stanno in una griglia a due colonne — passo 286 px
   per un contenuto di 87. Due terzi di ogni cella sono vuoti, e le quattro
   voci dicono «01 ora», «02 ore», «03 ore», «Giornata»: un numero e
   un'unità. Nessuna delle due cose è un caso:

     · la griglia a due colonne è di v80, scritta quando le voci erano SCHEDE
       alte 118 px. v93 le ha ridotte a pastiglie senza togliere la griglia:
       il contenitore è rimasto quello di un contenuto che non esiste più;
     · il RITMO («una mattina senza fretta») esiste nel registro delle durate,
       sta nel markup, ed è v93 che lo spegne — giustamente sul telefono, dove
       quattro pastiglie con una frase sotto sarebbero mezza schermata.

   Su schermo largo quello spazio c'è, e il ritmo è esattamente la cosa che
   rende la scelta una scelta invece di un numero. Quindi le quattro voci
   diventano RIGHE a tutta colonna: la cifra grande, l'unità, la frase che dice
   che giro è, e la spunta.

   PERCHÉ NON TORNA A SEMBRARE UN MODULO, che è il difetto che v93 aveva
   corretto: non ci sono riquadri. Sono righe separate da un filo, come un
   menù — la cifra con le grazie fa da numero di portata e la frase da
   descrizione. La scelta si dichiara con la tinta, il filetto a sinistra e la
   spunta: tre canali, di cui due non cromatici.

   SUL TELEFONO NON CAMBIA NIENTE. Le pastiglie compatte di v93 restano, e
   restano per la stessa ragione di allora. */
@media (min-width: 800px) {
  .pt-tempi {
    display: grid;
    grid-template-columns: 1fr;
    gap: 0;
  }
  .pt-tempi > li { width: auto; }

  .pt-tempo {
    display: grid;
    grid-template-columns: 52px auto 1fr 22px;
    align-items: baseline;
    gap: var(--pt-2);
    width: 100%;
    min-height: 56px;
    padding: var(--pt-3) var(--pt-3);
    border: 0;
    border-block-end: 1px solid var(--pt-line);
    border-radius: 0;
    background: transparent;
    box-shadow: none;
  }
  .pt-tempi > li:last-child .pt-tempo { border-block-end: 0; }

  .pt-tempo-cifra {
    font-family: var(--pt-font-titolo);
    font-weight: 400;
    font-size: 30px;
    line-height: 1;
    letter-spacing: -0.03em;
    color: var(--pt-ink);
    font-variant-numeric: tabular-nums;
  }
  /* «Giornata» non è una cifra: non ha unità accanto e prende le due colonne,
     altrimenti finirebbe schiacciata in 52 px. */
  /* «Giornata» prende le due colonne della cifra e dell'unità: in 52 px
     finirebbe schiacciata. `justify-self: start` la tiene incolonnata con le
     tre cifre sopra invece di centrarla nella campata doppia. */
  .pt-tempo-parola {
    font-size: 22px;
    grid-column: 1 / 3;
    justify-self: start;
    white-space: nowrap;
  }
  .pt-tempo-unita {
    font: var(--pt-t-label);
    letter-spacing: 0.14em;
    text-transform: uppercase;
    color: var(--pt-ink-55);
  }
  /* IL RITMO TORNA A VEDERSI: è la ragione di tutta questa sezione. */
  .pt-tempo-ritmo {
    display: block;
    grid-column: 3;
    font-size: 15.5px;
    line-height: 1.3;
    color: var(--pt-ink-70);
    text-align: start;
  }
  /* LA SPUNTA, RIPORTATA NEL FLUSSO.
     Di serie è un disco terracotta con dentro un segno bianco, messo in
     `position: absolute` nell'angolo e rimpicciolito da `transform: scale(.5)`
     finché non è scelto — misure giuste sulla PASTIGLIA, dove l'angolo esiste.
     In riga l'assoluto la tirava fuori dalla griglia e la scala la riduceva a
     un pallino: si vedeva un bollo pieno e non una spunta. Qui è un segno e
     basta, nella sua colonna. */
  .pt-tempo-segno {
    position: static;
    display: block;
    grid-column: 4;
    justify-self: end;
    width: auto;
    height: auto;
    background: none;
    border-radius: 0;
    transform: none;
    font-size: 19px;
    color: var(--pt-sg);
    opacity: 0;
    transition: opacity var(--pt-fast) var(--pt-ease);
  }

  .pt-tempo:has(input:checked) {
    background: var(--pt-sg-soft);
    border-color: transparent;
    box-shadow: inset 3px 0 0 var(--pt-sg);
    border-radius: var(--pt-r-sm);
  }
  .pt-tempo:has(input:checked) .pt-tempo-cifra,
  .pt-tempo:has(input:checked) .pt-tempo-unita { color: var(--pt-sg-dark); }
  .pt-tempo:has(input:checked) .pt-tempo-ritmo { color: var(--pt-ink); }
  .pt-tempo:has(input:checked) .pt-tempo-segno { opacity: 1; }

  /* LE PARTENZE, stessa forma: la nota sotto torna a vedersi. «Il cuore della
     città» e «Tocca il punto di partenza» dicono qualcosa che l'etichetta non
     dice — ed è la stessa ragione del ritmo. */
  .pt-partenze { display: grid; grid-template-columns: 1fr; gap: 0; }
  .pt-partenza {
    display: grid;
    grid-template-columns: 26px 1fr 22px;
    align-items: center;
    gap: var(--pt-3);
    width: 100%;
    min-height: 56px;
    padding: var(--pt-3);
    border: 0;
    border-block-end: 1px solid var(--pt-line);
    border-radius: 0;
    background: transparent;
    box-shadow: none;
  }
  .pt-partenze > .pt-partenza:last-child { border-block-end: 0; }
  .pt-partenza > i:first-of-type { font-size: 21px; }
  .pt-partenza-testo { display: block; }
  .pt-partenza-testo strong { display: block; font-size: 16px; }
  .pt-partenza-testo small {
    display: block;
    margin-top: 1px;
    font: var(--pt-t-small);
    font-size: 14px;
    color: var(--pt-ink-55);
  }
  .pt-partenza-segno {
    position: static;
    display: block;
    justify-self: end;
    width: auto;
    height: auto;
    background: none;
    border-radius: 0;
    transform: none;
    font-size: 19px;
    color: var(--pt-sg);
    opacity: 0;
  }
  .pt-partenza:has(input:checked) {
    background: var(--pt-sg-soft);
    border-color: transparent;
    box-shadow: inset 3px 0 0 var(--pt-sg);
    border-radius: var(--pt-r-sm);
  }
  .pt-partenza:has(input:checked) .pt-partenza-segno { opacity: 1; }
  .pt-partenza:has(input:checked) .pt-partenza-testo small { color: var(--pt-ink-70); }
}


/* --- 31. v95 — IL CAROSELLO DELLA COPERTINA -------------------------------
   `.is-piena` è il modificatore del modificatore: una diapositiva riempie
   tutta la fila. Serve all'eroe, dove l'immagine è la cosa grande della
   pagina; nelle file di card resta il 28% di v94, perché lì il mezzo che
   sbuca è quello che dice «continua».

   `scroll-snap-type: x mandatory` e non `proximity`: qui una diapositiva a
   metà non è mai una posizione voluta — o si guarda una fotografia o l'altra.
   Nelle file di card vale il contrario, ed è per quello che erano diverse. */
.pt-eroe-galleria { min-width: 0; }
.pt-rail.is-piena {
  grid-auto-columns: 100%;
  gap: var(--pt-3);
  padding-inline: 0;
  scroll-snap-type: x mandatory;
}
.pt-rail.is-piena > li { scroll-snap-align: center; min-width: 0; }
.pt-eroe-galleria .pt-eroe-figura { display: block; }
.pt-eroe-galleria .pt-credito { margin: var(--pt-2) 0 0; }

/* In griglia la galleria sta nella colonna della figura, e sul telefono va
   sopra il testo: sono le stesse due regole che aveva la figura singola. */
@media (min-width: 800px) {
  .pt-eroe-galleria { grid-column: 2; align-self: stretch; }
  /* v95 — UN TOKEN SOLO PER LA COPERTINA. La figura e il riquadro dei puntini
     devono avere la stessa proporzione per costruzione: se sono due valori
     scritti in due punti, cambiarne uno li disallinea in silenzio — ed è
     successo, 54 px di scarto, appena la copertina è passata da 4:3 a 3:2. */
  .pt-eroe-galleria { --pt-ar-copertina: var(--pt-ar-feature); }
  .pt-eroe-galleria .pt-figura { --pt-ar: var(--pt-ar-copertina); }
}
@media (max-width: 799px) {
  /* Sul telefono la copertina va SOPRA il testo. La sua altezza non si decide
     qui: la decide la sezione 36, e in pixel di schermo invece che in
     proporzione. Qui c'erano una `--pt-ar-copertina` e una `--pt-ar` che da
     v96 non hanno più effetto — due righe morte che dicevano il contrario di
     quelle vive, cioè il modo in cui il prossimo che legge sbaglia. */
  .pt-eroe-galleria { order: -1; }
}

/* --- I puntini -----------------------------------------------------------
   Dicono quante sono e a quale si è. Stanno SOPRA la fotografia, in basso, e
   non sotto: sotto allungherebbero l'eroe di venti pixel per un'informazione
   che vale solo mentre si guarda l'immagine.

   Bersaglio da 44 px con un bollo da 8: l'area sensibile la fa il padding, il
   segno resta discreto. È la stessa soluzione del cuore dei preferiti (v66). */
/* I PUNTINI STANNO SOTTO LA FOTOGRAFIA, NON SOPRA, e l'ho scoperto misurando.

   Erano bianchi e in `position: absolute` sul fondo dell'involucro, come in
   quasi tutti i caroselli. Ma qui l'involucro contiene ANCHE il credito della
   fotografia — che da v95 viaggia dentro la diapositiva, perché un credito
   fermo mentre le foto scorrono attribuisce l'immagine di un autore a un
   altro. Risultato: i puntini finivano sulla riga del credito, bianchi su
   carta crema, cioè invisibili.

   Invece di inseguirli con un offset calcolato sull'altezza del credito — che
   cambia quando il credito non c'è — stanno nella riga del credito di
   proposito: il credito a sinistra, i puntini a destra. È un piede di
   fotografia, si legge come tale, e non copre l'immagine.

   I colori sono quelli della carta: spento `--pt-ink-45`, acceso la
   terracotta. Non è testo, quindi la soglia è 3:1 per l'indicatore attivo —
   la terracotta su crema fa 5,5. */
.pt-rail-punti {
  display: flex;
  justify-content: flex-end;
  align-items: center;
  gap: 2px;
  margin-top: calc(var(--pt-2) * -1);
}
.pt-rail-punto {
  flex: 0 0 auto;
  /* 26 e non 22: WCAG 2.5.8 chiede **24×24** per un bersaglio, e ventidue ci
     passava sotto di due pixel. `sweep.js` non l'aveva visto perché misurava
     la sola altezza — la larghezza di un bersaglio conta quanto l'altezza, e
     adesso la misura anche lui. Il bollo resta da 7 px: a crescere è l'area
     sensibile, non il segno. */
  width: 26px;
  height: 44px;
  padding: 0;
  border: 0;
  background: none;
  cursor: pointer;
  pointer-events: auto;
}
.pt-rail-punto::before {
  content: "";
  display: block;
  width: 7px;
  height: 7px;
  margin: 18px auto;
  border-radius: var(--pt-r-icona);
  background: var(--pt-ink-45);
  transition: background var(--pt-fast) var(--pt-ease),
              transform var(--pt-fast) var(--pt-ease);
}
.pt-rail-punto.is-qui::before { background: var(--pt-sg); transform: scale(1.45); }
.pt-rail-punto:focus-visible {
  outline: 2px solid var(--pt-sg);
  outline-offset: -10px;
  border-radius: var(--pt-r-xs);
}

/* Sulla copertina le frecce stanno dentro l'immagine, non fuori. */
.pt-eroe-galleria .pt-rail-freccia.is-indietro { inset-inline-start: var(--pt-3); }
.pt-eroe-galleria .pt-rail-freccia.is-avanti { inset-inline-end: var(--pt-3); }

/* Il piede della copertina: credito a sinistra, puntini a destra, una riga. */
.pt-eroe-galleria { position: relative; }
.pt-eroe-galleria .pt-rail-punti { margin-top: 0; }


/* --- 32. v95 — I PUNTINI TORNANO SOPRA LA FOTOGRAFIA, SENZA NUMERI MAGICI --
   La versione con i puntini nella riga del credito funzionava ed era leggibile,
   ma li metteva su una riga tutta loro: trenta pixel per sei bollini, e un
   piede di fotografia che si allontanava dalla fotografia.

   Sopra l'immagine è il posto giusto — c'è già il velo di `is-velata` che
   garantisce un fondo scuro, quindi il bianco si legge su qualunque foto. Il
   problema era ancorarli: l'involucro contiene la fotografia **e** il credito,
   quindi il suo fondo non è il fondo dell'immagine, e la differenza cambia a
   seconda che quella foto un credito ce l'abbia o no.

   La soluzione senza numeri magici: il riquadro dei puntini prende LA STESSA
   PROPORZIONE della figura, ancorato in alto. Avendo la stessa larghezza e la
   stessa `aspect-ratio`, ha per costruzione la stessa altezza — quindi il suo
   fondo è il fondo dell'immagine, con o senza credito, a ogni larghezza. Le
   proporzioni sono gli stessi token che usa la figura: se un giorno cambiano,
   cambiano insieme. */
.pt-eroe-galleria .pt-rail-punti {
  position: absolute;
  inset-block-start: 0;
  inset-inline: 0;
  aspect-ratio: var(--pt-ar-copertina, var(--pt-ar-eroe));
  align-items: flex-end;
  justify-content: center;
  margin: 0;
  padding-block-end: 2px;
  pointer-events: none;
}
.pt-eroe-galleria .pt-rail-punto { pointer-events: auto; }
.pt-eroe-galleria .pt-rail-punto::before {
  background: rgba(255, 255, 255, 0.55);
  box-shadow: 0 1px 3px rgba(0, 0, 0, 0.5);
}
.pt-eroe-galleria .pt-rail-punto.is-qui::before { background: #fff; }
.pt-eroe-galleria .pt-rail-punto:focus-visible { outline-color: #fff; }

@media (max-width: 799px) {
  /* Il riquadro dei puntini segue il token della copertina, qualunque sia. */
  .pt-eroe-galleria .pt-rail-punti { aspect-ratio: var(--pt-ar-copertina); }
}


/* --- 33. v95 — IL COMANDO TORNA DENTRO LA PRIMA SCHERMATA -----------------
   Misurato a 1280 su una piega di 900, dopo il carosello e il pianificatore a
   righe: «Scopri il mio percorso» finiva a **982 px**. È la stessa misura che
   v80 aveva combattuto (963) e lo stesso identico errore: due miglioramenti
   veri — una copertina che vale la pena guardare e delle scelte che dicono
   qualcosa — pagati entrambi con l'unica cosa che non si può pagare, cioè
   l'azione principale.

   Recuperati 104 px senza togliere niente a nessuno dei due:

     · la copertina passa da 4:3 a 3:2 (−54). Resta la cosa più grande della
       pagina, e 3:2 è la proporzione di una fotografia, non un compromesso;
     · l'eroe stringe l'aria sopra e sotto (−26);
     · le righe del pianificatore passano da 56 a 52 px di altezza minima
       (−16) e il modulo da 24 a 20 di respiro interno (−8).

   Misurato dopo: 878. Dentro, con ventidue pixel di margine. */
@media (min-width: 800px) {
  .pt-eroe { padding-block: var(--pt-4) var(--pt-4); }
  .pt-piano { padding: var(--pt-4); }
  .pt-tempo, .pt-partenza { min-height: 52px; }
}


/* --- 34. v95 — IL CREDITO SULLA COPERTINA, DENTRO LA FOTOGRAFIA -----------
   Su schermo largo il credito si prendeva 44 px SOTTO l'immagine, e quei 44 px
   li pagava il comando principale (misurato: da 852 a 896).

   Dentro la fotografia non è un ripiego per guadagnare spazio: è dove un
   credito sta in una rivista — piccolo, nell'angolo, sopra la cosa che
   attribuisce. Il velo di `is-velata` c'è già e garantisce il fondo scuro, e
   l'angolo in basso a destra è libero: il nome del luogo sta a sinistra e i
   puntini al centro.

   Resta un collegamento vero e resta cliccabile: sta FUORI dall'`<a>` della
   figura (un `<a>` dentro un `<a>` è HTML non valido) e ci passa sopra.

   v96 — E VALE ANCHE SUL TELEFONO. Qui c'era scritto il contrario, con due
   ragioni che misurate sono tutte e due false:

     «sotto l'immagine c'è spazio» — non c'è. Quei 44 px più gli 8 di stacco
     spingevano il titolo a 364 e la scheda del pianificatore a 517 su una
     schermata di 664. Il primo schermo di Voce si apriva su una fotografia e
     una riga di crediti, e la promessa del prodotto cominciava sotto la metà;

     «il comando è appiccicato in fondo, quindi non paga niente» — paga tutto.
     `position: sticky` non può sollevare un elemento sopra il proprio
     contenitore: con il modulo che comincia a 517, il comando si fermava a
     650 invece che a 586 e finiva **53 px sotto la barra**, coperto da lei
     perché la barra sta più in alto nello strato. È il bottone tagliato che
     si vede nello screenshot di Aldo.

   Adesso l'impaginazione della copertina è UNA SOLA a tutte le larghezze:
   nome in basso a sinistra, puntini in basso a destra, credito appena sopra
   di loro. Una disposizione invece di due è anche una cosa sola da
   ricontrollare quando cambierà. */
.pt-eroe-galleria .pt-rail > li { position: relative; }
.pt-eroe-galleria .pt-credito {
    position: absolute;
    z-index: 2;
    inset-block-end: 10px;
    inset-inline-end: var(--pt-3);
    margin: 0;
    max-width: 40%;
    justify-content: flex-end;
    font-size: 11px;
    /* COLORI PIENI, non bianchi velati. `audit_contrasto.py` misura le
       velature componendole sul fondo dichiarato nella stessa regola: qui il
       fondo è una fotografia, quindi non c'è niente da comporre e il bianco
       all'86% risultava 4,14 — sotto soglia, e soprattutto non verificabile.
       È la stessa correzione di v93 sull'etichetta della famiglia: una
       velatura che l'audit non può misurare è una velatura che nessuno
       ricontrollerà al prossimo cambio di tema. */
    color: #fff;
    text-align: end;
}
.pt-eroe-galleria .pt-credito a { color: #fff; }
.pt-eroe-galleria .pt-credito i { color: var(--pt-su-targa); }
/* La pastiglia della licenza, sul velo, ha bisogno del suo fondo. */
.pt-eroe-galleria .pt-credito-licenza {
  background: rgba(255, 255, 255, 0.18);
  border-color: transparent;
  color: #fff;
}

/* I PUNTINI E IL CREDITO NON SI CONTENDONO L'ANGOLO.
   Calcolato a 1280: sei puntini centrati occupano 257→389, il credito
   ancorato a destra 347→630. Quaranta pixel di sovrapposizione — che con un
   credito più lungo («Foto di Matthias Süßen · CC BY-SA 4.0») diventano cento.

   In basso a sinistra c'è il nome del luogo, che è la cosa grande. La destra
   la si impila: i puntini in fondo, il credito appena sopra. Il 44 non è un
   numero magico, è l'altezza del bersaglio dei puntini — la soglia che questo
   foglio si è dato da v16 e che non cambia. */
.pt-eroe-galleria .pt-rail-punti {
  justify-content: flex-end;
  padding-inline-end: var(--pt-2);
}

/* v96 — DUE NUMERI CHE NON TORNAVANO, TROVATI MISURANDO A OGNI LARGHEZZA.

   `max-width` è un TETTO, non una larghezza: finché il nome è corto i due
   riquadri non si toccano anche se i tetti si sovrappongono, e a 1280 —
   l'unica larghezza a cui v95 aveva misurato — restavano quaranta pixel di
   distanza. **Fra 800 e 1100 no.** Lì la figura è 540 invece di 647, il nome
   arriva al suo tetto (346) e il credito comincia a 280: ottantadue pixel di
   sovrapposizione, cioè il nome del luogo scritto sotto il nome del
   fotografo.

   64 + 46 fa 110, e un tetto che supera il cento è una collisione che aspetta
   la larghezza giusta. Adesso fanno 92, e restano sotto il cento a qualunque
   misura — è un invariante, non una taratura.

   E il credito sale sopra la fascia del nome invece di sfiorarla: 44 è
   l'altezza minima del nome, `--pt-3` il suo stacco dal fondo. Gli stessi
   token, così le due misure si muovono insieme. */
.pt-eroe-galleria .pt-credito { inset-block-end: calc(44px + var(--pt-3) + 2px); }

/* Il nome del luogo non invade la colonna di destra. `.pt-figura-didascalia`
   è larga quanto la figura: il testo sta a sinistra, ma un nome lungo come
   «Santa Maria dell'Ammiraglio (La Martorana)» ci arriva sotto al credito.

   v96 — 52 e non 64, per la ragione scritta qui sopra: 52 + 40 = 92, e la
   somma dei due tetti deve stare sotto il cento. Il nome non ci perde niente
   — «Cappella Palatina» a 30 px misura 255 px e il tetto a 1280 ne dà 336.

   Sul telefono i numeri sono altri ancora, perché la striscia è larga 390 e
   non 647. La misura cambia, la regola no. */
.pt-eroe-galleria .pt-figura-didascalia { max-width: 52%; }

/* v96 — SULLA STRISCIA LE MISURE SONO ALTRE, LA DISPOSIZIONE È LA STESSA.
   Nome a sinistra, credito e puntini impilati a destra: identico al desktop.
   Cambiano i numeri, perché cambia il foglio — 358×133 invece di 570×285:

     · `min-height: 44px` sul credito è la misura di un bersaglio, e serve
       quando il credito è una riga a sé sotto una scheda. Dentro l'immagine è
       una didascalia, e quei 44 px su una striscia da 133 sono un terzo
       dell'altezza occupato da aria. Il collegamento resta un link in linea,
       che è il caso che WCAG 2.5.8 esenta;
     · il nome scende a 17 px e a poco meno di metà larghezza: «Santa Maria
       dell'Ammiraglio (La Martorana)» a 20 px in 186 px andava su cinque
       righe e si mangiava la striscia intera. */
@media (max-width: 799px) {
  .pt-eroe-galleria .pt-figura-didascalia {
    max-width: 44%;
    font-size: 17px;
    min-height: 0;
  }
  .pt-eroe-galleria .pt-credito {
    min-height: 0;
    max-width: 54%;
    inset-block-end: 38px;
    row-gap: 2px;
  }
}


/* --- 35. v95 — SOTTO IL TESTO BIANCO CI DEV'ESSERE SEMPRE QUALCOSA --------
   `tools/audit_contrasto.py` ha misurato la didascalia della copertina a
   **1,18:1**: bianco su crema. Visivamente era giusta — sta sopra una
   fotografia, col velo di `is-velata` sotto — ma l'audit risale agli antenati
   cercando un fondo solido e trova la carta, perché la fotografia è
   un'immagine e non un colore.

   È la stessa trappola dei temi a v93, e la risposta è la stessa: non si mette
   a tacere l'audit, si toglie il caso. Una figura VELATA porta del testo
   bianco per definizione; se quella figura ha per fondo la carta e
   l'immagine non arriva — 404, rete lenta, un file spostato — il testo bianco
   resta su crema e sparisce davvero.

   Fondo scuro su ogni figura velata: con la fotografia non si vede perché la
   copre, senza si vede eccome. E l'audit adesso può misurarlo. */
.pt-figura.is-velata { background-color: var(--pt-targa); }


/* --- 36. v96 — LA COPERTINA SUL TELEFONO SI MISURA IN SCHERMO -------------
   «Lato desktop va bene. Mobile no.» Misurato su un iPhone 12 (390×664),
   prima di toccare niente:

   | | |
   |---|---|
   | copertina + credito | 95 → 348, cioè **253 px: il 38% dello schermo** |
   | «Palermo si racconta mentre cammini» | comincia a **364**, sotto la metà |
   | sommario dell'eroe | **tagliato di 11 px** dalla scheda che sale |
   | pianificatore | comincia a **517** su una schermata di 664 |
   | comando | 558→650, cioè **53 px sotto la barra**, coperto da lei |
   | «Quanto tempo hai?» | il comando ci passa sopra: la risposta sopra la domanda |

   Il difetto vero è UNO e gli altri sono i suoi effetti: **la copertina si
   misurava in proporzioni invece che in schermo**. `16/9` a 358 px di
   larghezza fa 201 px di altezza — e 201 px sono un quarto di un telefono
   alto e un terzo di uno corto. Una proporzione descrive la FORMA di un
   ritaglio; su un telefono la domanda non è che forma ha la fotografia, è
   **quanto schermo si prende**.

   Su desktop la domanda è davvero la forma, perché la copertina sta in una
   colonna accanto al testo e non ruba niente a nessuno: lì `3/2` resta. È per
   questo che questa sezione tocca solo il telefono — che è anche quello che
   Aldo ha chiesto.

   UN TOKEN SOLO, come per `--pt-ar-copertina` a v95 e per la stessa ragione:
   la figura e il riquadro dei puntini devono avere la stessa altezza PER
   COSTRUZIONE. Scritta in due punti, la prima correzione li disallinea in
   silenzio — è già successo, 54 px, e il commento della sezione 31 lo
   racconta.

   `svh` e non `vh`: su un telefono `vh` è lo schermo con la barra
   dell'indirizzo RITIRATA, cioè uno schermo che al primo disegno non esiste.
   `svh` è quello che si vede davvero, che è esattamente ciò che questa misura
   vuole sapere. La riga con `vh` resta sotto come ripiego per chi non conosce
   `svh`: chi lo conosce legge la seconda e vince. */
@media (max-width: 799px) {
  .pt-eroe-galleria {
    /* Il 20 non è un gusto: è la quota che fa agganciare il comando anche sul
       telefono più corto in commercio (568 px con la barra aperta). A 21 ne
       restavano due di sovrapposizione — due, ma questo foglio conta a zero. */
    --pt-h-copertina: clamp(96px, 20vh, 200px);
    --pt-h-copertina: clamp(96px, 20svh, 200px);
  }
  .pt-eroe-galleria .pt-figura {
    --pt-ar: auto;
    height: var(--pt-h-copertina);
  }
  /* Il riquadro dei puntini non ha più una proporzione da inseguire: prende
     LA STESSA altezza, dallo stesso token. */
  .pt-eroe-galleria .pt-rail-punti {
    aspect-ratio: auto;
    height: var(--pt-h-copertina);
  }
}

/* SUL TABLET LA STESSA REGOLA DÀ UN RISULTATO SBAGLIATO, E VA DETTO PERCHÉ.

   Fra 600 e 799 px l'impaginazione è ancora quella del telefono — una colonna,
   copertina sopra il testo — ma la striscia è larga 736 invece di 358. Con il
   tetto dei telefoni veniva 736×200, cioè **3,7:1**: non una fotografia, una
   feritoia. E il motivo per cui il tetto esisteva — lo schermo corto — su un
   iPad non c'è: di altezza ce n'è 1024.

   Quindi il tetto sale. Il conto del comando (sezione 37) regge con
   abbondanza: il modulo comincia a 485 e ne avrebbe 838 di margine. */
@media (min-width: 600px) and (max-width: 799px) {
  .pt-eroe-galleria {
    --pt-h-copertina: clamp(160px, 28vh, 300px);
    --pt-h-copertina: clamp(160px, 28svh, 300px);
  }
}


/* --- 37. v96 — IL COMANDO SI AGGANCIA DAVVERO -----------------------------
   `position: sticky` ha una regola che quasi nessuno ha in mente e che qui
   spiegava tutto: **un elemento appiccicato non può essere sollevato sopra il
   proprio contenitore.** Non si ferma dove dice `bottom:`; si ferma al primo
   dei due vincoli che incontra.

   Il conto, misurato e non deciso a tavolino:

       fondo del comando = inizio del modulo + 16 (respiro) + 24 (stacco) + 92 (altezza)
       riga di aggancio  = altezza dello schermo − 78 (--pt-sopra-nav)

   quindi si aggancia solo se **inizio del modulo ≤ schermo − 210**. Con il
   modulo a 517 servirebbe uno schermo da 727: più alto di qualunque telefono
   con la barra dell'indirizzo aperta. **Su telefono non si è mai agganciato**,
   da v80 in poi, e nessuna prova poteva accorgersene perché la regola CSS era
   ed è scritta giusta — è la geometria attorno che non la lasciava lavorare.

   Due mosse, e nessuna delle due tocca il desktop:

   1. la sezione 36 alza il modulo (517 → circa 410 a 664);
   2. qui il blocco del comando si stringe: lo stacco da 24 a 8 e il respiro
      da 12 a 8 sopra e sotto. Sono 24 px che sul telefono non dicono niente —
      il comando è già l'unica cosa colorata della schermata — e che nel conto
      qui sopra valgono il doppio, perché entrano sia nell'altezza sia nel
      vincolo.

   Il conto dopo: **inizio del modulo ≤ schermo − 186**, cioè agganciato da
   596 px in su. Sotto i 596 — un 4,7" con la barra aperta — il comando resta
   comunque SOPRA la barra invece che sotto, che è l'unica cosa che si vedeva
   rotta.

   A-bis — «l'unica cosa che si vedeva rotta» era l'unica che **avevo
   misurato**. Il comando non finiva sotto la barra, vero; finiva sopra le
   risposte, e questo il confronto fra due rettangoli non lo dice. Lo sticky è
   stato tolto (sezione 4), quindi il conto qui sopra non serve più a decidere
   niente — resta perché il ragionamento che l'ha prodotto vale ancora per
   qualunque altro elemento appiccicato del foglio, e perché è la misura che
   ha alzato il pianificatore di cento pixel.

   Le due righe qui sotto restano: stringere il blocco del comando è stato
   giusto comunque. */
@media (max-width: 799px) {
  .pt-piano-via {
    margin-top: var(--pt-2);
    padding-block: var(--pt-2);
  }
}


/* --- 38. v97 — «IL TUO PERCORSO»: LE TAPPE DIVENTANO UN GIRO -------------
   «La sezione Il tuo percorso lato mobile non mi piace.»

   Misurata a 390, prima di toccare niente:

   | | |
   |---|---|
   | la fila | **488 px in un riquadro da 324** |
   | la 4ª tappa | tagliata a un terzo |
   | la 5ª tappa | **fuori schermo di 131 px**, invisibile |
   | le miniature | **si sovrapponevano di 8 px** l'una all'altra |
   | i nomi | centrati sotto, ritagliati a due righe, «Chiesa di San Catal…» |

   Tre difetti, e due sono aritmetica:

   **La sovrapposizione.** `> li` era largo 84 e `> li > a` 104. Venti pixel di
   troppo per voce, meno i dodici di stacco: **otto di sovrapposizione**. Ecco
   perché le cinque miniature sembravano una striscia continua invece di cinque
   tappe — si toccavano davvero. I due numeri erano scritti in due punti
   diversi (sezione 2 e sezione 15), ognuno giusto per conto suo.

   **La quinta tappa.** La riga sopra annuncia «5 luoghi». Se ne vedevano tre e
   mezzo, e sul telefono non c'è niente che dica che ce ne sono altre: le
   frecce del carosello compaiono solo col mouse (v94), e la sfumatura di
   `data-sfuma` è larga sedici pixel su una tappa larga centoquattro. **Il
   numero e la cosa numerata si contraddicevano a due centimetri di distanza.**

   **E i nomi.** Centrati sotto miniature sovrapposte, tagliati a due righe:
   la didascalia non apparteneva più alla sua miniatura, e il nome più lungo
   finiva sotto quella accanto.

   CHE COSA È ADESSO. Le cinque tappe sono **una colonna**, una riga per tappa:
   numero sulla miniatura, nome per esteso accanto. Non è una disposizione
   nuova — **è quella che v94 aveva già scritto per il desktop**, e che stava
   dentro un `@media (min-width: 800px)`. La ragione scritta allora per non
   portarla sul telefono («una colonna di cinque tappe spingerebbe il comando
   fuori dallo schermo») non regge alla misura: il comando di questa sezione
   non è appiccicato, sta dentro la scheda e scorre con lei.

   Una colonna dice anche una cosa che una fila non dice: **l'ordine**. Un giro
   a piedi è «prima questo, poi questo», e i numeri della colonna sono gli
   stessi numeri disegnati sulla mappa qui sopra — la stessa terracotta, la
   stessa cifra. Si guarda la forma, si legge l'elenco, e i due si rispondono.

   IL DOM NON SI TOCCA, ed è un vincolo vero e non una preferenza: `app.js`
   ricostruisce questa lista a ogni cambio di durata e si aspetta
   `<a><span class="pt-percorso-tessera"><i/><b/></span><small/></a>`, e una
   prova del progetto verifica quel contratto. Tutto quello che c'è qui è
   foglio di stile: la stessa lista, un'altra forma. */
:root {
  /* La larghezza della miniatura di una tappa, scritta UNA volta. La griglia
     della riga e la miniatura la leggono dallo stesso posto: è il modo per cui
     gli otto pixel di sovrapposizione non possono tornare. L'altezza è 3/4
     della larghezza, cioè la proporzione di una fotografia. */
  --pt-tappa-foto: 64px;
}

/* IL NUMERO ESCE DALLA MINIATURA E DIVENTA IL FILO DEL GIRO.

   Con il bollo nell'angolo della miniatura la colonna era un ELENCO di cinque
   posti. Portandolo fuori, a sinistra, i cinque bolli si incolonnano e fra uno
   e l'altro passa un filo: la stessa colonna diventa un GIRO — «prima questo,
   poi questo». È l'informazione che il titolo promette («Il tuo percorso») e
   che nessuna fila orizzontale può dare, perché in orizzontale l'ordine lo
   legge solo chi legge i numeri.

   Il filo è disegnato una volta sulla lista, non riga per riga: i bolli sono
   opachi e ci passano sopra, quindi si vede solo nei vuoti fra una tappa e
   l'altra. `inset-block: 28px` è mezza riga — così parte dal centro del primo
   bollo e finisce al centro dell'ultimo, senza sporgere.

   `overflow: visible` sulla miniatura serve perché il bollo ne esce. Il velo
   della fotografia prende `border-radius: inherit`, che è la cosa che
   l'overflow nascosto faceva per lui. */
.pt-percorso-tappe { position: relative; }
.pt-percorso-tappe::before {
  content: "";
  position: absolute;
  z-index: 0;
  inset-block: 28px;
  inset-inline-start: 10px;
  width: 2px;
  background: var(--pt-line);
}
.pt-percorso-tappe > li { position: relative; z-index: 1; }
.pt-percorso-tappe a { padding-inline-start: 26px; }
.pt-percorso-tessera { overflow: visible; }
.pt-percorso-tessera.is-foto::before { border-radius: inherit; }
.pt-percorso-tessera > b {
  inset-block: 0;
  inset-inline-start: -26px;
  margin-block: auto;
  width: 22px;
  min-width: 0;
  height: 22px;
  padding: 0;
  border: 2px solid var(--pt-paper-2);
  border-radius: var(--pt-r-icona);
}

/* Una sola tappa non è un giro: senza secondo bollo il filo sarebbe un
   trattino sospeso nel vuoto. */
.pt-percorso-tappe:not(:has(> li + li))::before { display: none; }

/* LA RIGA «ALTRE N»: la forma di una tappa, senza la miniatura.

   Tiene la griglia — quindi il «+14» cade sul filo, incolonnato con gli altri
   numeri, e il testo comincia dove cominciano i nomi — ma il riquadro resta
   vuoto: non c'è un luogo da ritrarre, e disegnarne uno finto sarebbe una
   promessa. Il bollo è cavo invece che pieno, perché non è una tappa: è quello
   che resta fuori. */
.pt-percorso-altre .pt-percorso-tessera {
  background: none;
  box-shadow: none;
}
/* Il bollo qui non è un numero d'ordine ma una somma: «+14» in un disco da 22
   non ci sta, e stretto a forza diventa illeggibile. Cresce in pastiglia —
   e resta centrato sul filo, perché `translateX(-50%)` lo centra sul punto
   invece di ancorarlo a un bordo. Con «+114» funziona uguale. */
.pt-percorso-altre .pt-percorso-tessera > b {
  inset-inline-start: -15px;
  transform: translateX(-50%);
  width: auto;
  min-width: 22px;
  padding: 0 6px;
  border-radius: var(--pt-r-pill);
  background: var(--pt-paper-2);
  border-color: var(--pt-sg);
  color: var(--pt-sg);
  font-size: 11px;
}
.pt-percorso-altre small { color: var(--pt-ink-70); }
/* Il filo arriva fino a lei: la riga è la continuazione del giro, non un
   bottone appiccicato in fondo. */

/* A-bis — L'INVITO DELL'EVENTO DIFFUSO.
   Una riga di spiegazione sopra il comando: dice perché non c'è un luogo da
   aprire, invece di lasciare che l'assenza parli da sola. Corpo secondario,
   come ogni testo che accompagna un comando senza esserne il titolo. */
.pt-evento-diffuso {
  margin: var(--pt-3) 0;
  font-size: 15px;
  line-height: 1.5;
  color: var(--pt-ink-70);
}

/* A-bis — L'OFFERTA DI CONSERVARE, sotto il comando di avvio.
   Non è un avviso e non è un errore: è una riga che dice dove finiscono le
   spunte di chi non ha ancora un account. Corpo secondario e collegamento
   nel colore operativo, come ogni altro invito ad accedere del foglio. */
.pt-pronto-conserva {
  display: flex;
  align-items: flex-start;
  gap: var(--pt-2);
  margin: var(--pt-3) 0 0;
  font-size: 13.5px;
  line-height: 1.45;
  color: var(--pt-ink-55);
}
.pt-pronto-conserva > i { flex: 0 0 auto; margin-top: 1px; font-size: 15px; }
.pt-pronto-conserva a { color: var(--pt-sg); font-weight: 600; white-space: nowrap; }
/* FASE H — «Accedi» dentro la frase era un bersaglio da 43×20. L'area
   sensibile cresce di 13 px sopra e sotto e di 2 ai lati, e i margini negativi
   la restituiscono: la riga resta alta e larga com'era, il dito trova 47×45.
   Tredici e non dodici: la riga è alta 19,6 px (13,5 × 1,45), e con dodici il
   bersaglio faceva 43,6 — `audit_mobile` lo contava giusto, sotto i 44. */
.pt-pronto-conserva a { display: inline-block; padding: 13px 2px; margin: -13px -2px; }

/* A-bis — IL PERCORSO È COMINCIATO.
   `#pt-avvia-anonimo` si preme una volta sola: da lì in poi la pagina è in
   modalità cammino e il comando non ha più niente da avviare. Se restasse
   identico a prima, direbbe «premimi» a chi ha già premuto — e chi torna sulla
   pagina il giorno dopo, con lo stato ripescato dal browser, non saprebbe di
   averlo già fatto.

   Diventa quello che è: una conferma. Perde il rosso pieno del comando
   primario — quel rosso in questa app vuol dire «la cosa da fare adesso», e la
   cosa da fare adesso ora sono le tappe, non questo bottone — e prende il
   contorno del riquadro con l'inchiostro normale. Resta premibile (riporta
   all'inizio del giro), ma smette di chiamare.

   `aria-pressed="true"` lo dice già a chi legge con la voce: questa regola lo
   dice a chi guarda. */
#pt-avvia-anonimo.is-iniziato {
  background: var(--pt-card);
  border-color: var(--pt-line-2);
  color: var(--pt-ink);
  box-shadow: none;
}
#pt-avvia-anonimo.is-iniziato small { color: var(--pt-ink-55); }
/* `\ea67` = `ti-circle-check`, lo stesso segno che `pt-nav-finito` usa per
   dire «fatto» quando un giro si chiude: preso dal foglio del font, non a
   memoria. Vince sul `content` di `.ti-player-play` per specificita' (un id
   contro una classe), quindi il triangolo «parti» diventa una spunta. */
#pt-avvia-anonimo.is-iniziato > i::before { content: "\ea67"; content: "\ea67" / ""; }


/* ============================================================================
   FASE H — RESPONSIVE E ACCESSIBILITÀ
   Misurato con `tools/audit_accessibilita.py`: sette larghezze più il telefono
   girato, la tastiera premendo Tab su ogni pagina, i nomi letti dall'albero di
   Chrome, e axe-core. Qui le regole che non stanno meglio accanto a un
   componente: la barra fissa, il salto al contenuto, i pallini, la pausa della
   copertina, i segnaposto della mappa.
   ========================================================================== */

/* --- IL FUOCO NON FINISCE SOTTO LE BARRE ------------------------------------
   Sul telefono la barra in basso è fissa e l'intestazione è appiccicata in
   alto. Premendo Tab il browser porta in vista la cosa col fuoco quanto basta,
   cioè fino al bordo dello schermo — e lì sotto c'è la barra: su ventidue
   pagine una o più fermate del fuoco finivano coperte del tutto (WCAG 2.4.11).
   `scroll-padding` dice al browser quale parte dello schermo è davvero libera.
   L'altezza dell'intestazione la scrive `app.js` (`--pt-header-h`), e così
   quella del blocco del comando appiccicato sopra la barra, dove c'è
   (`--pt-fondo-h`: il comando di un tour, di un luogo, di un evento).
   Vale anche per i salti ai paragrafi e per `scrollIntoView`: la prima tappa
   di un giro appena cominciato arriva sotto l'intestazione, non dietro. */
html { scroll-padding-top: var(--pt-header-h); }
@media (max-width: 799px) {
  html { scroll-padding-bottom: calc(var(--pt-sopra-nav) + var(--pt-fondo-h, 0px)); }
}

/* --- I PALLINI DELLA COPERTINA: 44 PX SOTTO IL DITO -------------------------
   Erano larghi 26: la soglia di WCAG 2.2 (24) sì, quella del progetto per il
   dito (44, da v16) no — ed era l'ultima cosa che `audit_mobile` elencava.
   Sotto gli 800 px l'area sensibile di ogni pallino è un quadrato da 44; il
   bollo resta da 7, e i sei pallini si distanziano di più. Sul largo, col
   mouse, restano com'erano. */
@media (max-width: 799px) {
  .pt-rail-punti { gap: 0; }
  .pt-rail-punto { width: 44px; }
}
/* Il pallino «sei qui» non è un comando (debito 1): niente manina. */
.pt-rail-punto[aria-disabled="true"] { cursor: default; }

/* --- LA PAUSA DELLA COPERTINA (WCAG 2.2.2) ----------------------------------
   Il bottone lo crea `app.js` solo se la copertina scorre da sola. In alto a
   destra sulla fotografia — in alto a sinistra c'è la targhetta — con la
   stessa pelle delle frecce, più piccolo: 44 di bersaglio, 32 di disco. */
.pt-rail-pausa {
  position: absolute;
  z-index: 3;
  inset-block-start: 4px;
  inset-inline-end: 4px;
  display: grid;
  place-items: center;
  width: 44px;
  height: 44px;
  padding: 0;
  border: 0;
  background: none;
  cursor: pointer;
}
.pt-rail-pausa > i {
  display: grid;
  place-items: center;
  width: 32px;
  height: 32px;
  border: 1px solid var(--pt-line);
  border-radius: var(--pt-r-icona);
  background: var(--pt-card);
  color: var(--pt-ink);
  box-shadow: var(--pt-shadow-pop);
  font-size: 16px;
}
.pt-eroe-galleria .pt-rail-pausa:focus-visible { outline-color: #fff; }

/* --- I SEGNAPOSTO DELLA MAPPA: QUELLO COL FUOCO STA SOPRA -------------------
   Su una mappa fitta i segnaposto si coprono l'un l'altro, e Leaflet scrive
   l'ordine nello stile di ognuno: col fuoco, uno poteva restare sotto il
   vicino. `!important` perché lo `z-index` di Leaflet è scritto nell'elemento. */
.leaflet-marker-icon:focus-visible { z-index: 100000 !important; }
/* E l'avviso «mappa senza rete», che sta sopra la mappa intera, si fa da
   parte mentre un segnaposto ha il fuoco: col Tab ci si arrivava sotto (il
   sesto del giro di Monreale, misurato), e torna appena il fuoco esce. */
.leaflet-container:has(.leaflet-marker-icon:focus-visible) .pt-mappa-offline { visibility: hidden; }
