/* Campo di luce: la pelle della piattaforma.

   Una luce morbida sul fondo e le cose disegnate a filo, trasparenti: la
   stessa luce passa attraverso le schede. Niente ombre, niente pieni: il
   pulsante principale e' un filo piu' chiaro con un velo appena acceso, non
   una tinta piena. Colori neutri -- bianco, nero, grigi -- finche' non si
   sceglie un accento: basta cambiare i token qui sotto.

   DUE TAVOLOZZE. Lo scuro e' quella di serie (:root); il chiaro arriva con
   data-tema="light" sull'<html>, che ogni pagina mette in <head> leggendo
   `qr_tema` prima del primo disegno. L'interruttore sta accanto alla lingua
   (i18n.js).

   Qui NON c'e' impaginazione: solo colori, fili e la luce del fondo. Le
   pagine restano padrone del proprio layout.

   I NOMI dei token sono quelli storici (--cyan, --violet, --grad-...): le
   pagine li usano in duecento punti. Il glossario:

       --cyan         l'ACCENTO: oggi l'inchiostro stesso (bianco sullo scuro)
       --grad-*       il velo dei pulsanti principali, non piu' una tinta piena
       --su-accento   la scritta sui pulsanti principali: l'inchiostro
       --ombra-*      non piu' ombre: il filo che disegna il pulsante
       --opaco        il fondo PIENO di tendine e finestre, che stanno sopra
                      al contenuto e trasparenti non si leggerebbero

   Chi riempie qualcosa di --cyan deve scriverci sopra in --bg, non in
   --su-accento: sarebbe bianco su bianco. */

/* ===================================================== lo scuro (di serie) */
:root {
  /* --- fondali e testo --- */
  --bg: #05070c;                        /* il fondo: nero appena bluastro */
  --surface: rgba(255, 255, 255, .025); /* le schede: un velo, la luce passa */
  --surface-2: rgba(255, 255, 255, .05);/* campi e chip: un velo in piu' */
  --ink: #f2f3f5;
  --ink-tenue: #b9bec5;                 /* testo secondario */
  --muted: #858b93;
  --line: rgba(255, 255, 255, .14);     /* il filo delle schede */
  --line-bright: rgba(255, 255, 255, .2);  /* il filo dei comandi */
  --placeholder: #6f757d;

  /* --- componenti RGB, per le velature --- */
  --cyan-rgb: 242, 243, 245;
  --violet-rgb: 185, 190, 197;
  --success-rgb: 127, 179, 154;
  --danger-rgb: 224, 122, 106;
  --ombra-rgb: 0, 0, 0;
  --lume-rgb: 255, 255, 255;

  /* Fondo dei campi quando hanno il fuoco. */
  --campo-fuoco: rgba(255, 255, 255, .07);

  /* --- accenti --- */
  --cyan: #f2f3f5;
  --cyan-chiaro: #ffffff;
  --violet: #b9bec5;
  --success: #7fb39a;                   /* verde spento: solo semantico */
  --danger: #e07a6a;                    /* rosso spento: solo semantico */

  /* La scritta sui pulsanti principali: l'inchiostro, sul loro velo. */
  --su-accento: #f2f3f5;
  --su-successo: #f2f3f5;

  /* --- i pulsanti principali: un velo, disegnati dal filo --- */
  --grad-accento: rgba(255, 255, 255, .07);
  --grad-successo: rgba(255, 255, 255, .07);
  --grad-marchio: #f2f3f5;
  --titolo-da: #f2f3f5;
  --titolo-a: #f2f3f5;

  /* --- velature: fondi tenui degli stati --- */
  --velo-cyan: rgba(255, 255, 255, .07);
  --velo-violet: rgba(255, 255, 255, .05);
  --velo-success: rgba(127, 179, 154, .12);
  --velo-danger: rgba(224, 122, 106, .10);

  /* --- bordi --- */
  --bordo-cyan: rgba(255, 255, 255, .38);
  --bordo-violet: rgba(255, 255, 255, .22);
  --bordo-success: rgba(127, 179, 154, .42);
  --bordo-danger: rgba(224, 122, 106, .45);

  /* --- niente ombre: i pulsanti principali li disegna un filo piu' chiaro --- */
  --ombra: none;
  --ombra-accento: inset 0 0 0 1px rgba(255, 255, 255, .38);
  --ombra-successo: inset 0 0 0 1px rgba(255, 255, 255, .38);
  --alone-cyan: 0 0 0 1px rgba(255, 255, 255, .38);
  --glow-cyan: 0 0 0 3px rgba(255, 255, 255, .12);
  /* L'unica ombra rimasta: sotto a quello che sta SOPRA la pagina. */
  --ombra-alta: 0 18px 50px rgba(0, 0, 0, .55);

  /* Il «Pro»: un velo anche lui. */
  --grad-violet: rgba(255, 255, 255, .07);
  --su-violet: #f2f3f5;

  --testo-successo: #a9d5bf;
  --testo-pericolo: #f3b3a8;
  --velo-modale: rgba(0, 0, 0, .62);
  --opaco: #0d1016;                     /* tendine e finestre */
  --vetro: rgba(5, 7, 12, .62);         /* le barre fisse, smerigliate */

  /* --- la luce del fondo: il colore e quanto e' forte --- */
  --luce: 120, 138, 170;
  --forza: .22;

  /* I titoli nel carattere del testo: il graziato da menu' stampato e'
     uscito col campo di luce. */
  --display: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Helvetica,
             Arial, sans-serif;
  color-scheme: dark;
}

/* ========================================================= il chiaro */
:root[data-tema="light"] {
  --bg: #f5f6f8;
  --surface: rgba(255, 255, 255, .45);
  --surface-2: rgba(15, 20, 30, .035);
  --ink: #15171b;
  --ink-tenue: #454a52;
  --muted: #6f757e;
  --line: rgba(15, 25, 45, .14);
  --line-bright: rgba(15, 25, 45, .22);
  --placeholder: #9a9fa6;

  --cyan-rgb: 21, 23, 27;
  --violet-rgb: 69, 74, 82;
  --success-rgb: 47, 107, 79;
  --danger-rgb: 161, 51, 34;
  --ombra-rgb: 15, 20, 30;
  --lume-rgb: 255, 255, 255;
  --campo-fuoco: rgba(255, 255, 255, .85);

  --cyan: #15171b;
  --cyan-chiaro: #000000;
  --violet: #454a52;
  --success: #2f6b4f;
  --danger: #a13322;
  --su-accento: #15171b;
  --su-successo: #15171b;

  --grad-accento: rgba(15, 20, 30, .05);
  --grad-successo: rgba(15, 20, 30, .05);
  --grad-marchio: #15171b;
  --titolo-da: #15171b;
  --titolo-a: #15171b;

  --velo-cyan: rgba(15, 20, 30, .06);
  --velo-violet: rgba(15, 20, 30, .045);
  --velo-success: rgba(47, 107, 79, .10);
  --velo-danger: rgba(161, 51, 34, .08);
  --bordo-cyan: rgba(15, 25, 45, .4);
  --bordo-violet: rgba(15, 25, 45, .24);
  --bordo-success: rgba(47, 107, 79, .35);
  --bordo-danger: rgba(161, 51, 34, .38);

  --ombra-accento: inset 0 0 0 1px rgba(15, 25, 45, .4);
  --ombra-successo: inset 0 0 0 1px rgba(15, 25, 45, .4);
  --alone-cyan: 0 0 0 1px rgba(15, 25, 45, .4);
  --glow-cyan: 0 0 0 3px rgba(15, 20, 30, .08);
  --ombra-alta: 0 18px 50px rgba(15, 20, 30, .16);
  --grad-violet: rgba(15, 20, 30, .05);
  --su-violet: #15171b;

  --testo-successo: #24523c;
  --testo-pericolo: #7c2718;
  --velo-modale: rgba(15, 20, 30, .38);
  --opaco: #ffffff;
  --vetro: rgba(245, 246, 248, .7);

  --luce: 60, 80, 120;
  --forza: .10;
  color-scheme: light;
}

/* ======================================================= la luce del fondo
   Sul <body>, con due selettori: le pagine scrivono «body { background:
   var(--bg) }» nel loro <style>, e qui la luce deve vincere senza
   !important. Ferma sullo schermo (fixed): si scorre la pagina, la luce
   resta dov'e'. Al centro della colonna di lavoro, un po' in alto; un
   riflesso piu' debole nell'angolo in basso a destra. */
html body {
  background:
    radial-gradient(ellipse 60% 58% at var(--luce-x, 58%) var(--luce-y, 44%),
      rgba(var(--luce), var(--forza)), rgba(var(--luce), calc(var(--forza) / 3)) 45%, transparent 76%) fixed,
    radial-gradient(ellipse 35% 30% at 92% 100%,
      rgba(var(--luce), calc(var(--forza) / 2.4)), transparent 70%) fixed,
    var(--bg);
}
/* LE TENDINE. L'elenco che si apre da un <select> lo disegna il browser, e
   prende il fondo del campo: i campi del campo di luce sono un velo quasi
   trasparente, e l'elenco usciva bianco accecante sul tema scuro. Le opzioni
   hanno il fondo PIENO delle finestre (--opaco) e l'inchiostro del tema, in
   tutte le pagine che caricano questo foglio. */
select option, select optgroup {
  background-color: var(--opaco);
  color: var(--ink);
}

/* Sulla carta la luce non si stampa. */
@media print {
  html body { background: #fff; }
}

/* ==========================================================================
   Interruttori di tema e lingua
   ========================================================================== */

.preferenze { display: inline-flex; align-items: center; gap: 6px; }

.pref-btn {
  display: inline-flex; align-items: center; justify-content: center; gap: 5px;
  height: 38px; padding: 0 11px;
  font-family: inherit; font-size: 12.5px; font-weight: 600;
  color: var(--muted);
  background: var(--surface-2);
  border: 1px solid var(--line-bright);
  border-radius: 999px;
  cursor: pointer;
  transition: color .18s, border-color .18s;
}
.pref-btn:hover { color: var(--cyan); border-color: var(--cyan); }
.pref-btn .simbolo { font-size: 14px; line-height: 1; display: inline-flex; }
.pref-btn .simbolo svg { display: block; }
/* Il tema: un tondo, come i comandi della piattaforma accanto. */
.pref-tema { width: 38px; padding: 0; }

/* La lingua non attiva resta leggibile ma spenta: si capisce che e' un
   interruttore a due stati e non un'etichetta. */
.pref-lingua b { color: var(--ink); font-weight: 700; }
.pref-lingua span { opacity: .45; }

/* ==========================================================================
   Selettore di destinazione (destinazione.js)
   ==========================================================================
   Vive in tre editor, quindi lo stile sta qui e non in una pagina: e' la
   stessa ragione per cui il componente e' uno solo. */

.dest select {
  width: 100%; font-family: inherit; font-size: 15px; color: var(--ink);
  padding: 11px 12px; border: 1px solid var(--line-bright); border-radius: 10px;
  background: var(--surface-2);
}
.dest select:focus { outline: none; border-color: var(--cyan); box-shadow: var(--glow-cyan); }

.dest-extra { margin-top: 9px; display: flex; align-items: center; gap: 10px; flex-wrap: wrap; }
.dest-extra[hidden] { display: none; }
.dest-extra input[type=text] {
  flex: 1; min-width: 160px; font-family: inherit; font-size: 15px; color: var(--ink);
  padding: 11px 12px; border: 1px solid var(--line-bright); border-radius: 10px;
  background: var(--surface-2);
}
.dest-nome {
  font-size: 13px; color: var(--muted); min-width: 0;
  overflow: hidden; text-overflow: ellipsis; white-space: nowrap;
}
.dest-nome.scelto { color: var(--ink); }

/* ---------------------------------------------------------------- scheda QR
   La scheda di un QR dinamico, disegnata da qr_scheda.js e usata da piu' di
   una pagina ("I miei QR", "I miei QR intelligenti"). Sta qui e non nello
   <style> delle pagine perche' due copie divergono: il comportamento e' gia'
   condiviso, e un aspetto diverso fra le due pagine confonderebbe.

   tema.css e' collegato PRIMA dello <style> di ogni pagina, quindi una pagina
   che ridefinisce una di queste regole vince comunque. Spostarle qui non puo'
   rompere chi ne aveva gia' una sua. */
/* UNA CARTA per codice. Prima era una riga con sette pulsanti in fila e un
   campo di testo sempre aperto: da lontano sette carte identiche, e per
   trovare quella giusta si leggeva ogni riga. Adesso in cima c'e' quello che
   serve a riconoscerlo -- il codice, il nome, dove porta -- e le azioni
   stanno sotto, con le meno usate raccolte in «Altro». */
.qr-griglia { display: grid; gap: 14px; }
@media (min-width: 760px) { .qr-griglia { grid-template-columns: 1fr 1fr; } }

.qr-carta {
  display: flex; flex-direction: column; gap: 14px;
  padding: 18px; border-radius: 16px;
  background: var(--surface); border: 1px solid var(--line);
  transition: border-color .2s, box-shadow .2s, transform .2s;
}
.qr-carta:hover { border-color: var(--bordo-cyan); }
.qr-carta.spenta { opacity: .62; }
.qr-carta.spenta:hover { opacity: 1; }

.qr-testa { display: flex; gap: 14px; align-items: flex-start; text-align: left; }
.qr-mini {
  flex-shrink: 0; width: 84px; height: 84px; border-radius: 10px;
  padding: 6px; image-rendering: pixelated;
  /* Bianco fisso: un lettore si aspetta moduli scuri su chiaro. */
  background: #fff; border: 1px solid var(--line);
}
.qr-chi { min-width: 0; flex: 1; }
.qr-nome {
  font-size: 16px; font-weight: 700; margin: 0; color: var(--ink);
  word-break: break-word; line-height: 1.25;
}
.qr-carta.spenta .qr-nome { color: var(--muted); }
.qr-tag { margin-top: 6px; }
/* Dove porta: il codice breve in evidenza, la destinazione in tono minore.
   Quello che si riconosce e' il breve -- e' quello stampato sul tavolo. */
/* Due righe al massimo: un indirizzo lungo mangiava mezza carta, e da
   quattro righe in giu' non lo legge nessuno comunque. */
.qr-dove {
  font-family: var(--mono); font-size: 11.5px; line-height: 1.6;
  margin: 8px 0 0; word-break: break-all; color: var(--muted);
  display: -webkit-box; -webkit-line-clamp: 2; -webkit-box-orient: vertical;
  overflow: hidden;
}
.qr-dove .breve { color: var(--ink-tenue); font-weight: 600; }
.qr-dove .freccia { color: var(--cyan); margin: 0 6px; }
.qr-dove .meta { color: var(--muted); }

.qr-cambia { display: flex; gap: 8px; }
.qr-cambia[hidden] { display: none; }
.qr-cambia input {
  flex: 1; min-width: 0; font-family: var(--mono); font-size: 12.5px; color: var(--ink);
  padding: 10px 12px; border: 1px solid var(--line-bright); border-radius: 10px;
  background: var(--surface-2);
}
.qr-cambia input:focus { outline: none; border-color: var(--cyan); box-shadow: var(--glow-cyan); }

.qr-fondo {
  display: flex; gap: 7px; flex-wrap: wrap; align-items: center;
  margin-top: auto; padding-top: 2px;
}

/* «Altro»: un <details> nativo. Si apre da tastiera, si chiude da solo, e
   non serve una riga di codice per farlo funzionare. */
.piu { position: relative; }
.piu > summary {
  list-style: none; cursor: pointer;
  width: 38px; height: 38px; border-radius: 10px;
  display: inline-flex; align-items: center; justify-content: center;
  font-size: 17px; color: var(--muted);
  background: var(--surface-2); border: 1px solid var(--line-bright);
}
.piu > summary::-webkit-details-marker { display: none; }
.piu > summary:hover { color: var(--cyan-chiaro); border-color: var(--cyan); }
.piu-menu {
  position: absolute; right: 0; bottom: calc(100% + 6px); z-index: 20;
  min-width: 210px; padding: 6px;
  /* Sta sopra le carte vicine: piena, o ci si leggerebbe attraverso. */
  background: var(--opaco); border: 1px solid var(--line-bright);
  border-radius: 14px; box-shadow: var(--ombra-alta);
  display: flex; flex-direction: column;
}
.voce-piu {
  font-family: inherit; font-size: 13.5px; font-weight: 500; text-align: left;
  color: var(--ink); background: none; border: 0; border-radius: 9px;
  padding: 9px 11px; cursor: pointer;
}
.voce-piu:hover { background: var(--velo-cyan); }
.voce-piu.pericolo { color: var(--danger); }
.voce-piu.pericolo:hover { background: var(--velo-danger); }

.tag {
  display: inline-block; font-family: var(--mono); font-size: 10px; font-weight: 600;
  padding: 2px 8px; border-radius: 999px; text-transform: uppercase; letter-spacing: .04em;
  margin-left: 6px; vertical-align: 1px;
}
.tag-off { color: var(--muted); border: 1px solid var(--line-bright); }
/* La lingua di un menu' tradotto: si riconosce da lontano, in un elenco
   dove l'originale ha quasi lo stesso nome. */
.tag.lingua { color: var(--cyan-chiaro); background: var(--velo-cyan);
  border: 1px solid var(--bordo-cyan); }
.tag-sync { color: var(--danger); border: 1px solid rgba(var(--danger-rgb), .4); }
/* La stellina del QR intelligente. Viola come l'anteprima delle regole, per
   legare il segno al posto in cui si modificano. Non e' solo l'emoji: da sola
   sarebbe muta per chi legge con lo schermo, e il testo accanto dice cosa
   significa. */
.tag-regole {
  color: var(--violet); border: 1px solid var(--bordo-violet);
  background: var(--velo-violet);
}

.row-edit { display: flex; gap: 8px; margin-top: 12px; }
.row-edit input {
  flex: 1; min-width: 0; font-family: var(--mono); font-size: 12.5px; color: var(--ink);
  padding: 9px 11px; border: 1px solid var(--line-bright); border-radius: 9px;
  background: var(--surface-2);
}
.row-edit input:focus { outline: none; border-color: var(--cyan); box-shadow: var(--glow-cyan); }

.qr-azioni { display: flex; gap: 7px; margin-top: 10px; flex-wrap: wrap; }

.group-title {
  font-family: var(--mono); font-size: 12px; font-weight: 600; letter-spacing: .06em;
  text-transform: uppercase; color: var(--cyan); margin: 26px 0 12px;
  display: flex; align-items: center; gap: 8px;
}
.group-title:first-child { margin-top: 6px; }
.group-title .count { color: var(--muted); font-weight: 500; }
.empty { color: var(--muted); font-size: 14px; padding: 8px 0 4px; }
/* La riga sotto un'intestazione di gruppo: spiega cos'e' quel gruppo quando
   non e' ovvio, come i QR spenti (che sono una riserva, non uno scarto). */
/* Era un paragrafo lungo quattro righe, appoggiato a sinistra sotto un
   titolo centrato: si leggeva come un avviso legale in fondo a un modulo.
   Adesso e' un riquadro, con la frase che conta in grassetto e il resto
   sotto -- e sta in mezzo alla colonna come tutto il resto. */
.spiega-gruppo {
  color: var(--ink-tenue); font-size: 13.5px; line-height: 1.6;
  margin: 0 auto 16px; max-width: 62ch;
  padding: 14px 18px; border-radius: 12px;
  background: var(--surface-2); border: 1px solid var(--line);
}
.spiega-gruppo b { display: block; color: var(--ink); margin-bottom: 4px; }
.spiega-gruppo span { display: block; color: var(--muted); font-size: 12.5px; }

/* Un gruppo a tendina: l'intestazione resta sempre visibile, il contenuto si
   apre solo se serve. E' <details> nativo -- si apre da tastiera, lo screen
   reader lo annuncia, e la ricerca nella pagina lo trova anche da chiuso --
   invece di un pulsante nostro che dovrebbe rifare tutte e tre le cose. */
.gruppo-tendina { margin-top: 26px; }
/* Da sola l'intestazione sembrava un'etichetta come le altre e non si capiva
   che si apriva: qui ha il contorno di un pulsante, cosi' si vede che e' una
   cosa da premere. */
.gruppo-tendina > summary.group-title {
  cursor: pointer; margin: 0;
  padding: 11px 14px; border-radius: 11px;
  border: 1px solid var(--line-bright); background: var(--surface-2);
  transition: border-color .18s, color .18s, background .18s;
  /* Il triangolino predefinito lo disegniamo noi qui sotto, cosi' e' uguale
     nei due browser che lo rendono in modo diverso. */
  list-style: none;
}
.gruppo-tendina[open] > summary.group-title { margin-bottom: 12px; }
.gruppo-tendina > summary::-webkit-details-marker { display: none; }
.gruppo-tendina > summary.group-title::before {
  content: "\203A";                     /* › */
  display: inline-block; font-size: 17px; line-height: 1; font-weight: 700;
  transition: transform .18s; color: var(--cyan);
}
.gruppo-tendina[open] > summary.group-title::before { transform: rotate(90deg); }
.gruppo-tendina > summary.group-title:hover {
  border-color: var(--cyan); color: var(--cyan-chiaro);
}
.gruppo-tendina > summary.group-title:focus-visible {
  outline: none; border-color: var(--cyan); box-shadow: var(--glow-cyan);
}
/* La riga di spiegazione ha un margine negativo per stringersi sotto un
   .group-title normale. Qui l'intestazione e' un <summary> che ha gia' il suo
   margine sotto, e il negativo la faceva risalire sopra la riga. */
.gruppo-tendina[open] > .spiega-gruppo { margin-top: 0; }


/* ===========================================================================
   I comandi dell'aspetto: miniature dei colori, tendine dei caratteri,
   interruttori. Li disegna static/aspetto.js e li usano due editor -- quello
   dei menù e quello delle pagine di ingresso. Lo stile sta qui per lo stesso
   motivo per cui sta qui quello della scheda dei QR: due copie divergono alla
   prima modifica.
   =========================================================================== */
  /* --- le tre scelte dell'aspetto ----------------------------------------- */
  /* L'intestazione di un gruppo di scelte. Più grande del testo d'aiuto che
     le sta intorno: sono i quattro appigli con cui si trova a colpo d'occhio
     il gruppo che si cerca, e alla misura dell'aiuto ci si perdevano dentro.
     Due classi e non un !important: .aiuto è dichiarata più sotto e a parità
     di peso vincerebbe lei. */
  .aiuto.sotto-et {
    margin-top: 22px; font-size: 15px; color: var(--ink);
  }
  .scelte { display: flex; gap: 8px; flex-wrap: wrap; margin-top: 6px; }
  .scelta {
    cursor: pointer; font-family: inherit; font-size: 14px;
    padding: 9px 16px; border-radius: 9px; color: var(--ink);
    background: var(--surface-2); border: 1px solid var(--line-bright);
    transition: border-color .18s, box-shadow .18s;
  }
  .scelta:hover { border-color: var(--cyan); }
  .scelta.attiva { border-color: var(--cyan); box-shadow: var(--glow-cyan); }
  /* La tendina dei caratteri, scritta nel carattere scelto. Su desktop anche
     le voci si disegnano nel proprio; su Safari e sui telefoni no, ed è per
     quello che sotto c'è il campione. */
  .sel-font {
    font-size: 15px; padding: 9px 12px; border-radius: 9px; margin-top: 6px;
    color: var(--ink); background: var(--surface-2);
    border: 1px solid var(--line-bright); max-width: 280px; width: 100%;
  }
  .sel-font:focus { outline: none; border-color: var(--cyan); box-shadow: var(--glow-cyan); }
  /* Grassetto e corsivo: due quadratini, come in qualunque programma di
     scrittura. Quattro pulsanti con scritto «Normale» e «Grassetto» direbbero
     la stessa cosa in quattro volte lo spazio. */
  .scelta-gc { min-width: 42px; font-size: 15px; }
  /* Il cursore dell'aspetto (larghezza della colonna, grandezza delle voci).
     Lo stile stava scritto a mano dentro l'attributo `style` del comando: la
     classe c'era ma non stilava niente, ed era l'unica classe orfana del
     progetto. Qui vale per tutti e due gli editor, come le altre. */
  .cursore-aspetto {
    display: block; width: 100%; max-width: 300px;
    accent-color: var(--cyan);
  }
  /* Il selettore del colore di un gruppo di scritte: un quadrotto della
     stessa taglia dei pulsanti accanto, che MOSTRA il colore in uso. */
  .campo-colore {
    width: 52px; height: 40px; padding: 3px; cursor: pointer;
    background: var(--surface-2); border: 1px solid var(--line-bright);
    border-radius: 9px;
  }
  .campo-colore:hover { border-color: var(--cyan); }
  .campione {
    font-size: 19px; color: var(--ink); margin: 9px 0 0;
    padding: 10px 13px; border-radius: 9px;
    background: var(--surface-2); border: 1px dashed var(--line-bright);
    /* Un nome lungo non deve allargare la tendina fuori dalla pagina. */
    overflow-x: auto; white-space: nowrap;
  }

  .temi {
    display: grid; gap: 10px; margin-top: 12px;
    /* Tre per riga su telefono, sei su desktop: le miniature restano grandi
       abbastanza da riconoscere il tema, senza scendere sotto il bersaglio
       da 44 px con cui si preme col pollice. */
    grid-template-columns: repeat(auto-fit, minmax(88px, 1fr));
  }
  .tema {
    display: flex; flex-direction: column; gap: 7px; cursor: pointer;
    padding: 8px; border-radius: 11px; font-family: inherit;
    background: var(--surface-2); border: 1px solid var(--line-bright);
    transition: border-color .18s, box-shadow .18s;
  }
  .tema:hover { border-color: var(--cyan); }
  .tema.scelto { border-color: var(--cyan); box-shadow: var(--glow-cyan); }
  .tema-nome { font-size: 12.5px; font-weight: 600; color: var(--ink); }

  /* La miniatura e' il tema in piccolo: fondo, nome del locale, titolo di
     categoria, due righe di piatto. Bastano a riconoscerlo senza aprirlo, e i
     colori sono quelli veri -- arrivano dall'API, non sono ridipinti qui. */
  .mini {
    display: flex; flex-direction: column; gap: 4px; justify-content: center;
    height: 58px; padding: 9px 8px; border-radius: 7px;
    border: 1px solid var(--line);
  }
  .mini span { display: block; border-radius: 2px; }
  .mini-titolo { height: 6px; width: 62%; margin: 0 auto 3px; }
  .mini-cat { height: 3px; width: 34%; }
  .mini-riga { height: 3px; width: 100%; opacity: .85; }
  .mini-riga.corta { width: 70%; }

/* I MENU' E LE PAGINE COME TESSERE. L'elenco dei menu' era una colonna di
   righe, mentre i QR stavano gia' in carte affiancate: due sezioni vicine
   che parlavano due lingue. Adesso ogni menu' (e ogni pagina) e' un
   quadrato: il segno in alto, il nome, lo stato, e in fondo quanto contiene.
   Le categorie e i piatti restano righe: li' conta l'ordine, e una colonna
   lo dice meglio di una griglia. */
.tessere {
  display: grid; gap: 14px; margin-top: 18px;
  grid-template-columns: repeat(auto-fill, minmax(148px, 1fr));
}
.tessera {
  aspect-ratio: 1 / 1; min-width: 0;
  display: flex; flex-direction: column; align-items: flex-start; gap: 8px;
  padding: 18px; border-radius: 16px; text-align: left; cursor: pointer;
  font-family: inherit; color: var(--ink);
  background: var(--surface); border: 1px solid var(--line);
  transition: border-color .2s, box-shadow .2s, transform .2s;
}
.tessera:hover { border-color: var(--bordo-cyan); }
.tessera:focus-visible { outline: 3px solid var(--cyan); outline-offset: 3px; }
/* Il segno e' un disegno, non un carattere: un foglio di menu' in miniatura
   (testata, righe di voci col prezzo), o per le pagine uno schermo con i
   suoi pulsanti. Tratto in accento su una velatura dello stesso colore: la
   tinta piena, con un glifo bianco dentro, pesava piu' del nome. */
/* Col campo di luce il segno e' il solo disegno, senza piastrella: a filo
   come la tessera che lo contiene. Al passaggio si accende d'inchiostro. */
.tessera-segno {
  width: 44px; height: 44px; margin-bottom: 4px;
  display: inline-flex; align-items: center; justify-content: flex-start;
  color: var(--ink-tenue); background: none; border: 0;
  transition: color .2s;
}
.tessera-segno svg { width: 36px; height: 36px; display: block; }
.tessera:hover .tessera-segno { color: var(--ink); }
.tessera.spenta .tessera-segno,
.tessera.spenta:hover .tessera-segno { color: var(--muted); }
.tessera-nome {
  font-size: 16px; font-weight: 700; line-height: 1.25; word-break: break-word;
  display: -webkit-box; -webkit-line-clamp: 3; -webkit-box-orient: vertical; overflow: hidden;
}
.tessera-stato { display: flex; gap: 6px; flex-wrap: wrap; }
.tessera-stato .tag { margin-left: 0; }
.tessera-quanto { margin-top: auto; font-size: 12.5px; color: var(--muted); }

/* ==========================================================================
   LE LOCANDINE: i menù e le pagine come le copertine di un catalogo.
   Le usano due editor (menù e pagine di ingresso): la forma sta qui, le
   misure in anteprima.js (qrAnteprima.locandine).
   ========================================================================== */
/* Ogni menù (o pagina) si riconosce dalla sua faccia: dentro la locandina c'è
   l'anteprima vera (la bozza, la stessa del telefono dell'editor),
   disegnata alla larghezza di un telefono e rimpicciolita. La sua finestra
   è grande quanto la parte che si vede: una pagina corta ci sta centrata,
   una lunga al passaggio del mouse scorre piano fino al fondo, e si vede
   tutto il menù senza aprirlo. Scala, finestra e scorrimento li fa lo
   script (qrAnteprima.locandine). */
.locandine {
  display: grid; gap: 18px; margin-top: 20px;
  grid-template-columns: repeat(auto-fill, 206px); justify-content: center;
}
.locandina {
  position: relative; display: flex; flex-direction: column; gap: 10px;
  padding: 10px; border-radius: 18px; text-align: left;
  background: var(--surface); border: 1px solid var(--line);
  transition: border-color .2s, transform .25s cubic-bezier(.2, .8, .2, 1);
}
.locandina:hover, .locandina:focus-within { border-color: var(--bordo-cyan); transform: translateY(-4px) scale(1.02); }
.locandina.spenta .locandina-schermo { opacity: .5; filter: grayscale(1); }
.locandina-schermo {
  position: relative; overflow: hidden; aspect-ratio: 7 / 10;
  border-radius: 11px; background: var(--surface-2);
  display: flex; align-items: center; justify-content: center; color: var(--muted);
}
/* Finché l'anteprima non arriva si vede il foglio disegnato, tenue. */
.locandina-schermo > svg { width: 44px; height: 44px; opacity: .5; }
.locandina-schermo iframe {
  position: absolute; left: 0; top: 0;
  width: 390px; height: var(--alto, 560px); border: 0; background: #fff;
  pointer-events: none; transform-origin: 0 0;
  transform: scale(var(--scala, .5));
  opacity: 0; transition: opacity .4s ease;
}
.locandina-schermo iframe.pronta { opacity: 1; }
.locandina-testo { display: flex; flex-direction: column; gap: 6px; padding: 2px 4px 4px; }
.locandina-testo .tessera-quanto { margin-top: 0; }
/* Il clic su tutta la locandina: un pulsante vero steso sopra, perché un
   <iframe> dentro un <button> non è HTML valido. */
.locandina-apri {
  position: absolute; inset: 0; z-index: 2; cursor: pointer;
  background: none; border: 0; border-radius: 18px; padding: 0;
}
.locandina-apri:focus-visible { outline: 2px solid var(--cyan); outline-offset: 3px; }
/* L'ultima locandina è quella vuota: «+ Nuovo menù». */
.locandina.nuova {
  align-items: center; justify-content: center; min-height: 320px; cursor: pointer;
  font: inherit; font-size: 15px; font-weight: 600; color: var(--ink-tenue);
  border-style: dashed; border-color: var(--line-bright); background: transparent;
}
.locandina.nuova:hover { color: var(--ink); }
/* Sul telefono una fila da sfogliare col dito, una locandina alla volta. */
@media (max-width: 560px) {
  .locandine {
    grid-template-columns: none; grid-auto-flow: column; grid-auto-columns: 72%;
    justify-content: start; overflow-x: auto; scroll-snap-type: x mandatory;
    padding: 4px 2px 12px; scrollbar-width: none;
  }
  .locandine::-webkit-scrollbar { display: none; }
  .locandina { scroll-snap-align: center; }
  .locandina:hover, .locandina:focus-within { transform: none; }
}
@media (prefers-reduced-motion: reduce) {
  .locandina, .locandina:hover { transform: none; }
}
