/*
  Distretto Biologico del Territorio Fiorentino — foglio di stile v0

  Principi seguiti (vedi README):
  - Nessun font esterno: solo stack di sistema (0 richieste di rete, 0 KB extra).
  - Nessun framework CSS: ~150 righe scritte a mano, facili da modificare.
  - Palette provvisoria ispirata al suolo e alle colture del territorio,
    non al verde "bio da stock fotografico". Da sostituire quando il
    template di identità visiva in Notion sarà completato.
*/

/*
  Font Biancoenero (Biancoenero Edizioni) — font ad alta leggibilità,
  pensato per l'accessibilità di lettura (dislessia compresa), licenza
  gratuita per uso non commerciale — vedi il credito
  nel footer (partials/footer.html). File auto-ospitati in
  static/fonts/: woff2 come formato primario (convertito da .ttf con
  fonttools, stesso disegno dei caratteri, ~70% più leggero), .ttf come
  ripiego per browser che non supportano woff2.
  4 varianti disponibili: Regular, Italic, Bold, Bold Italic — tutti
  pesi veri (non sintetici).
  Eccezione intenzionale al principio "zero font esterni": qui
  l'accessibilità pesa più del peso della pagina. Vedi CLAUDE.md.
*/
@font-face {
  font-family: "Biancoenero";
  src: url("/fonts/Biancoenero-Regular.woff2") format("woff2"),
       url("/fonts/Biancoenero-Regular.ttf") format("truetype");
  font-weight: 400;
  font-style: normal;
  font-display: swap;
}
@font-face {
  font-family: "Biancoenero";
  src: url("/fonts/Biancoenero-Italic.woff2") format("woff2"),
       url("/fonts/Biancoenero-Italic.ttf") format("truetype");
  font-weight: 400;
  font-style: italic;
  font-display: swap;
}
@font-face {
  font-family: "Biancoenero";
  src: url("/fonts/Biancoenero-Bold.woff2") format("woff2"),
       url("/fonts/Biancoenero-Bold.ttf") format("truetype");
  font-weight: 700;
  font-style: normal;
  font-display: swap;
}
@font-face {
  font-family: "Biancoenero";
  src: url("/fonts/Biancoenero-BoldItalic.woff2") format("woff2"),
       url("/fonts/Biancoenero-BoldItalic.ttf") format("truetype");
  font-weight: 700;
  font-style: italic;
  font-display: swap;
}

:root {
  /* Palette — terra, ulivo, crosta. --colore-ulivo è il verde reale del
     logo (#677821, estratto dal file static/img/logo/DBTF_logo.png),
     formalizzato il 2026-07-07. --colore-ulivo-scuro è la stessa
     tonalità scurita della stessa proporzione usata nella palette
     provvisoria precedente (~12 punti di lightness in meno), non un
     verde inventato a parte. Un solo colore di sfondo neutro
     (--colore-crosta) in tutto il sito, non più due toni diversi —
     --colore-grano è stato rimosso. Il resto della palette (terra/
     crosta/confine) resta provvisorio, in attesa del template Notion
     "Sistema di Identità Visiva DBTF". */
  --colore-terra: #5b4636;      /* testo principale, ispirato al suolo */
  --colore-ulivo: #677821;      /* verde reale del logo — accento primario */
  --colore-ulivo-scuro: #3f4a14;
  --colore-crosta: #f4efe4;     /* sfondo pagina, unico in tutto il sito */
  --colore-confine: #d8c9a8;    /* linee, divisori */
  --colore-bio: #677821;        /* marker mappa: azienda bio */
  --colore-non-bio: #a8967a;    /* marker mappa: azienda non bio */
  --colore-in-conversione: #8d9a5a; /* marker mappa: SAU in conversione (evoluzione-del-biologico) */
  /* Asse diverso da bio/in-conversione/non-bio sopra (utilizzata/non
     utilizzata, non biologico/convenzionale) — colori distinti apposta,
     non riusano quelli sopra: --colore-sau coincide altrimenti con
     --colore-bio (stesso hex) e confonderebbe le due classificazioni
     nella legenda "SAU su superficie condotta". */
  --colore-sau: var(--colore-terra);
  --colore-non-sau: var(--colore-confine);
  /* Per il delta anno su anno (chip BioInSau + retino diagonale
     nell'istogramma) — non più --colore-ulivo per il positivo (troppo
     simile al colore del segmento "Biologico", stesso hex: un retino
     verde sopra quel segmento sarebbe stato quasi invisibile) né il
     rosso troppo desaturato di prima (poco contrasto, segnalato
     2026-07-30) — due toni più decisi, ma restano nella stessa
     famiglia calda/naturale della palette, non un verde/rosso acceso
     fuori tono. */
  --colore-positivo: #3f8f24;
  --colore-negativo: #9c4a3c;
  /* Colore SOLO per le barre (riempimento istogramma + fascia BioInSau,
     entrambe con opacity, non colore pieno — vedi
     layouts/atlante/moduli.html): scelto a parte da --colore-positivo
     (2026-08-04, via il simulatore con color picker) — il testo delle
     bandierine/chip resta sul tono originale più scuro, la barra usa
     questo verde più acceso apposta, non la stessa variabile con
     opacity diversa. Nessun --colore-negativo-barra equivalente: non
     richiesto, il rosso resta un'unica variabile per testo e barra. */
  --colore-positivo-barra: #a3d756;

  /* Pagina Comunità/Membri: Comitato ⊂ Assemblea ⊂ Comunità è un
     contenimento vero, non tre categorie diverse — una rampa che passa
     dal vero verde del logo (Assemblea) prima di scurire verso
     ulivo-scuro (Comitato, il livello più "concentrato"), non tinte
     inventate a parte. Provvisorio quanto il resto della palette. */
  --colore-comunita: color-mix(in srgb, var(--colore-ulivo) 40%, var(--colore-crosta));
  --colore-assemblea: var(--colore-ulivo);
  --colore-comitato: var(--colore-ulivo-scuro);
  /* Il bordo della membrana resta il verde chiaro sopra (fa parte
     dell'identità della forma) — ma come colore del testo è troppo
     poco contrastato sullo sfondo crema. Stessa tinta, più scura, solo
     dove --colore-comunita serve a leggere una scritta. */
  --colore-comunita-testo: color-mix(in srgb, var(--colore-ulivo) 75%, var(--colore-crosta));

  /* Atlante: provato un colore diverso per ciascuna delle tre
     categorie (terra/ulivo/ulivo-scuro), poi scartato il 2026-07-15 —
     "usa solo il colore di base per tutto": le tre variabili sotto
     puntano tutte allo stesso `--colore-ulivo` (l'accento primario del
     sito), di proposito, per restare un esperimento facile da annullare
     (basta cambiare queste tre righe) se il test convince a tornare
     indietro. L'impianto (--colore-categoria per pagina, vedi
     `list.html`) resta quello di prima, cambia solo il valore. */
  --colore-indagini: var(--colore-ulivo);
  --colore-sguardi: var(--colore-ulivo);
  --colore-scenari: var(--colore-ulivo);

  /* Unica eccezione deliberata alla palette terra/ulivo/crosta: il
     banner notizie in home deve "saltare all'occhio" più di qualunque
     altro elemento del sito (è un richiamo a un evento con una data,
     non un contenuto da leggere con calma) — nessuna parentela
     cromatica cercata col resto, di proposito. Un giallo/miele acceso
     invece del terracotta iniziale: con testo scuro sopra (deciso dopo,
     vedi .banner-notizie__voce) un fondo più chiaro dà più contrasto —
     proposta, non l'ultima parola: se non convince, si cambia solo
     questa riga. */
  --colore-notizie: #e8b94a; /* dorato, eccede la palette del sito apposta ma resta leggibile */

  /* Fallback di sistema: se un file font non è presente, il sito
     resta comunque leggibile e a zero download extra. */
  --font-titoli: "Biancoenero", -apple-system, "Segoe UI", Roboto, Helvetica, Arial, sans-serif;
  --font-testo: "Biancoenero", -apple-system, "Segoe UI", Roboto, Helvetica, Arial, sans-serif;
  --font-dati: ui-monospace, "SF Mono", Consolas, monospace;

  --misura-max: 42rem;
  /* Larghezza propria per le tabelle che escono dalla colonna di
     lettura (.tabella-scroll, >980px) — più ampia di --misura-max ma
     non edge-to-edge come .banner-notizie: una tabella a piena
     larghezza viewport su un monitor ampio sarebbe comunque poco
     leggibile (celle troppo distanziate). */
  --misura-tabella: 62rem;
  --spazio: 1.25rem;
}

* { box-sizing: border-box; }

/* Scrollbar in linea con l'identità grafica (marroncino chiaro
   --colore-confine su crosta, stesso colore dei bordi/divisori nel
   resto del sito) invece del grigio di sistema — vale su tutta la
   pagina e su qualunque contenitore con scroll proprio (es. la
   colonna testo/tabelle del template Atlante "moduli"). Due sintassi
   separate perché non esiste ancora uno standard unico: Firefox usa
   scrollbar-width/scrollbar-color, gli altri browser (Chrome/Safari/
   Edge, motore WebKit/Blink) le pseudo-classi ::-webkit-scrollbar-*. */
* {
  scrollbar-width: thin;
  scrollbar-color: var(--colore-confine) var(--colore-crosta);
}
::-webkit-scrollbar { width: 10px; height: 10px; }
::-webkit-scrollbar-track { background: var(--colore-crosta); }
::-webkit-scrollbar-thumb {
  background: var(--colore-confine);
  border-radius: 5px;
  border: 2px solid var(--colore-crosta);
}
::-webkit-scrollbar-thumb:hover { background: var(--colore-terra); }

/* Per i link con #ancora (es. "↑ Filtri" su /comunita/) — la regola
   che la disattiva per chi preferisce meno movimento era già pronta
   più sotto (prefers-reduced-motion), mancava solo questa base. */
html { scroll-behavior: smooth; }

body {
  margin: 0;
  background: var(--colore-crosta);
  color: var(--colore-terra);
  font-family: var(--font-testo);
  font-size: 1.05rem;
  line-height: 1.6;
  /* Gli elementi "full bleed" (.banner-notizie, .tabella-scroll in
     stampa, i moduli Atlante) escono a piena larghezza con
     "width: 100vw; margin: 0 calc(-50vw + 50%)" — 100vw misura il
     viewport INCLUSA l'area della scrollbar verticale, mentre "50%"
     (percentuale sul contenitore, che la scrollbar la esclude già) no:
     quando la pagina è abbastanza alta da avere una scrollbar verticale,
     i due calcoli non si compensano più esattamente e l'elemento sporge
     di pochi pixel oltre il bordo reale, creando una scrollbar
     orizzontale fantasma. overflow-x:hidden qui taglia quei pochi
     pixel invisibili (nessun contenuto vero perso, è già oltre il
     bordo) invece di dover ricalcolare la larghezza via JS. */
  overflow-x: hidden;
}

h1, h2, h3, h4, h5, h6 {
  font-family: var(--font-titoli);
  font-weight: 700;
  line-height: 1.25;
}
/* h1/h2/h3 restano sul verde scuro (in .corpo-evento diventano
   un'etichetta piena, sfondo ulivo, vedi evento.css) — da h4 in giù
   niente più badge, solo testo marrone semplice, nessuno sfondo
   (2026-09-18, richiesta esplicita: "h4 in poi senza sfondo e colore
   marrone"). */
h1, h2, h3 { color: var(--colore-ulivo-scuro); }
h4, h5, h6 { color: var(--colore-terra); }
/* margin-bottom ridotto rispetto al default del browser (~0.67em):
   allinea l'h1 al sottotitolo subito sotto, che è pensato per leggersi
   come un'unica intestazione con l'h1, non come un paragrafo separato. */
h1 { font-size: 1.6rem; margin-bottom: 0.3rem; }

/* Sottotitolo facoltativo (front matter "subtitle") sotto un h1 di
   sezione — oggi usato solo da Atlante, ma generico: qualunque
   _index.md può impostarlo. Stessa dimensione dell'h1 (1.6rem) e stesso
   margine, corsivo e non in grassetto per restare leggibile come
   sottotitolo e non come un secondo titolo. */
.sottotitolo {
  font-style: italic;
  font-weight: 400;
  font-size: 1.6rem;
  margin-top: 0;
  color: var(--colore-terra);
}
/* Scala esplicita h2-h6, tutta in rem (2026-09-18, bug corretto e poi
   affinato lo stesso giorno): prima solo h1/h2 avevano un font-size
   proprio, h3-h6 restavano al default del browser, "em" RELATIVO al
   font-size del contenitore che li ospita — dove il contenitore ha un
   font-size più grande del solito (es. .corpo-evento .colonna-lettura,
   1.15rem invece dell'1.05rem di body) quell'em relativo poteva
   superare il rem fisso del livello sopra (h3 più grande del suo
   stesso h2 genitore). Ogni livello ora ha il proprio rem fisso,
   indipendente dal contenitore, con un salto sempre percepibile da un
   livello al successivo (margin-top più ampio del default del browser
   su h2: più respiro tra una sezione e la successiva in testi lunghi). */
h2 { font-size: 1.4rem; margin-top: 2.5rem; border-bottom: 1px solid var(--colore-confine); padding-bottom: 0.3rem; }
h3 { font-size: 1.1rem; }
h4 { font-size: 1rem; }
h5 { font-size: 0.95rem; }
h6 { font-size: 0.9rem; }

/* Puntini degli elenchi più piccoli del testo che accompagnano —
   ::marker si può dimensionare a parte dal testo della riga. */
li::marker { font-size: 0.85em; }

a { color: var(--colore-ulivo-scuro); }
a:focus-visible, button:focus-visible { outline: 3px solid var(--colore-ulivo); outline-offset: 2px; }

/* Nessun vincolo di larghezza: solo un padding fisso ai lati, come
   il body di solar.lowtechmagazine.com — è così che il sito arriva
   davvero "edge to edge" su schermi larghi. */
.contenitore {
  width: 100%;
  margin: 0 auto;
  padding: 0 var(--spazio);
}

/* Colonna di lettura: vincola il testo lungo a una larghezza leggibile
   dentro il contenitore ora fluido — stessa idea del vincolo su
   .entry-content di solar.lowtechmagazine.com, applicata qui con un
   div wrapper invece di una lista di selettori figli. */
.colonna-lettura {
  max-width: var(--misura-max);
  margin: 0 auto;
}

/* Intestazione: stesso sfondo del corpo pagina, nessun colore a parte. */
.intestazione {
  background: var(--colore-crosta);
}
.intestazione .contenitore {
  position: relative;
  display: flex;
  align-items: center;
  justify-content: space-between;
  flex-wrap: wrap;
  gap: 0.75rem;
  padding-top: 1rem;
  padding-bottom: 1rem;
}
.intestazione__nome {
  display: flex;
  align-items: center;
  gap: 0.75rem;
  font-family: var(--font-titoli);
  font-size: 1.4rem;
  text-decoration: none;
  color: var(--colore-terra);
  /* Senza questo, un figlio flex non si restringe mai sotto la propria
     dimensione "naturale" di contenuto (default min-width:auto) — su
     schermi stretti costringeva l'intera intestazione ad andare a capo
     (il pulsante hamburger finiva su una riga sotto al logo) invece di
     lasciare che il solo titolo si stringesse/andasse a capo lui. */
  min-width: 0;
}
/* Altezza in em, non rem né "100% del contenitore": dentro un flex la
   percentuale non si risolve perché l'altezza del contenitore dipende
   a sua volta dal testo (riferimento circolare) — il browser ignora il
   100% e torna alla dimensione naturale dell'immagine (enorme). "em"
   (non "rem"!) lo lega al font-size di .intestazione__nome — quando
   quello si riduce su mobile, il logo si riduce insieme, mantenendo le
   proporzioni, invece di restare fisso e sembrare staccato dal testo.
   Il testo (.intestazione__titolo) invece NON eredita più il
   font-size di .intestazione__nome: ha una sua dimensione esplicita
   (sotto), indipendente da quella del logo. */
.intestazione__logo { display: block; flex-shrink: 0; }
.intestazione__logo svg { display: block; height: 5em; width: auto; }
/* Il logo (DBTF_logo.svg) è disegnato con fill="currentColor" apposta —
   eredita il colore del testo di default. Il colore si cambia qui, in
   ".intestazione__nome" (non nel solo logo): il titolo lo eredita a sua
   volta per la stessa ragione, quindi un solo "color" sull'hover del
   link basta a far diventare verde ulivo sia icona sia testo insieme,
   senza toccare l'SVG. */
.intestazione__nome { transition: color 0.3s ease; }
.intestazione__nome:hover,
.intestazione__nome:focus-visible {
  color: var(--colore-ulivo);
}
.intestazione__titolo { display: block; max-width: 12rem; font-size: 1.3rem; line-height: 1.2; text-wrap: balance; }
.linee-di-livello {
  height: 10px;
  background:
    repeating-linear-gradient(
      to right,
      transparent 0, transparent 18px,
      var(--colore-confine) 18px, var(--colore-confine) 19px
    );
}
nav.principale ul {
  list-style: none;
  display: flex;
  gap: 1.25rem;
  padding: 0;
  margin: 0;
  flex-wrap: wrap;
}
nav.principale a { text-decoration: none; font-size: 0.95rem; }
nav.principale a:hover { text-decoration: underline; }

/* Menu mobile rifatto da zero (2026-08-22, dopo tre bug reali diversi
   nati dallo stesso approccio precedente — "la lista si espande dentro
   il flusso, spingendo giù il resto della pagina": fragile per natura,
   qualunque cosa condivida quel flusso (il bottone compreso) rischiava
   di spostarsi con lei. Ora la lista è un pannello a comparsa
   POSIZIONATO SOPRA il contenuto (position:absolute rispetto a
   .intestazione .contenitore, già position:relative) — non fa mai
   parte del flusso, non può spingere né spostare nient'altro. Icona
   hamburger↔X classica (tre linee vere, non il fiorellino delle
   finalità): più immediatamente riconoscibile come "menu" — richiesta
   esplicita dopo aver visto il fiorellino in pratica. */
.menu-hamburger {
  display: none;
  position: relative;
  width: 1.6rem;
  height: 1.6rem;
  background: none;
  border: none;
  cursor: pointer;
  padding: 0;
  flex-shrink: 0;
}
.menu-hamburger__linea {
  position: absolute;
  left: 0;
  width: 100%;
  height: 2px;
  background: var(--colore-terra);
  transition: transform 0.3s ease, opacity 0.2s ease, top 0.3s ease;
}
.menu-hamburger__linea:nth-child(1) { top: 15%; }
.menu-hamburger__linea:nth-child(2) { top: calc(50% - 1px); }
.menu-hamburger__linea:nth-child(3) { top: calc(85% - 2px); }
/* Aperto: le linee 1/3 ruotano a 45°/-45° incrociandosi al centro (una
   X), la 2 sfuma — stesso [aria-expanded="true"] già letto da menu.js,
   nessun JS in più per l'icona. */
.menu-hamburger[aria-expanded="true"] .menu-hamburger__linea:nth-child(1) {
  top: calc(50% - 1px);
  transform: rotate(45deg);
}
.menu-hamburger[aria-expanded="true"] .menu-hamburger__linea:nth-child(2) {
  opacity: 0;
}
.menu-hamburger[aria-expanded="true"] .menu-hamburger__linea:nth-child(3) {
  top: calc(50% - 1px);
  transform: rotate(-45deg);
}
@media (prefers-reduced-motion: reduce) {
  .menu-hamburger__linea { transition: none; }
}

/* Stessa soglia del resto del sito (980px), invece della soglia a sé
   usata prima — un solo numero da ricordare, e copre anche i tablet. */
@media only screen and (max-width: 980px) {
  /* Il logo si ridimensiona da solo (è in em, vedi sopra) seguendo
     questo font-size — non serve più un'altezza fissa a parte. */
  .intestazione__nome { font-size: 1.1rem; gap: 0.5rem; }
  .intestazione__titolo { max-width: 9rem; font-size: 1.02rem; }

  .menu-hamburger { display: block; }

  /* Il pannello: position:absolute rispetto a .intestazione .contenitore
     (già position:relative) — "left:0; right:0" lo allinea ai bordi
     dell'header, "top:100%" lo aggancia appena sotto. Non essendo nel
     flusso, non serve che <nav> o il bottone abbiano una propria
     posizione: restano esattamente dove sono, sempre. visibility (non
     solo opacity) toglie i link dalla tabulazione/dal click quando è
     chiuso, non solo dalla vista. */
  nav.principale ul {
    position: absolute;
    top: 100%;
    left: 0;
    right: 0;
    z-index: 30;
    list-style: none;
    display: flex;
    flex-direction: column;
    align-items: flex-end;
    gap: 0.1rem;
    margin: 0;
    padding: 1rem 1.25rem;
    background: var(--colore-crosta);
    border-top: 1px solid var(--colore-confine);
    border-bottom: 1px solid var(--colore-confine);
    box-shadow: 0 8px 16px rgba(0, 0, 0, 0.08);
    opacity: 0;
    visibility: hidden;
    transform: translateY(-6px);
    transition: opacity 0.25s ease, transform 0.25s ease, visibility 0s linear 0.25s;
  }
  nav.principale.aperto ul {
    opacity: 1;
    visibility: visible;
    transform: translateY(0);
    transition: opacity 0.25s ease, transform 0.25s ease;
  }
  nav.principale a { display: block; padding: 0.4rem 0; }
  @media (prefers-reduced-motion: reduce) {
    nav.principale ul { transition: opacity 0.2s ease, visibility 0s linear 0.2s; }
    nav.principale.aperto ul { transition: opacity 0.2s ease; }
  }
}

main { padding: 2rem 0 3rem; }

.riquadro {
  border: 1px solid var(--colore-confine);
  background: #fff;
  padding: 1.25rem;
  border-radius: 2px;
}

/* "Il DBTF in pratica" (Il Distretto, 2026-08-21): 4 card sempre
   aperte in colonna, non <details> — eccezione al principio di
   divulgazione progressiva per pubblico, vedi CLAUDE.md. Stesso
   linguaggio di .riquadro-griglia (bordo sottile, nessuno sfondo
   proprio — lascia trasparire --colore-crosta della pagina, unico
   sfondo neutro in tutto il sito), non di .riquadro: quella classe ha
   sfondo bianco ma non è usata da nessuna parte nel sito, scartata qui
   di proposito dopo averla copiata per errore la prima volta. */
.schede-pubblico {
  display: flex;
  flex-direction: column;
  gap: 1rem;
  margin: 2rem 0;
}
.scheda-pubblico {
  border: 1px solid var(--colore-confine);
  padding: 1.25rem;
  border-radius: 2px;
}
/* Freccia tra i passaggi di un percorso in sequenza (Partecipa,
   2026-09-16) — un .schede-pubblico usato non per card indipendenti ma
   per passaggi uno dopo l'altro: la freccia rende visibile l'ordine. */
.freccia-passaggio {
  text-align: center;
  font-size: 1.4rem;
  line-height: 1;
  color: var(--colore-ulivo);
  margin: -0.5rem 0;
}
.scheda-pubblico__titolo {
  font-family: var(--font-titoli);
  font-weight: 700;
  font-size: 1.05rem;
  color: var(--colore-ulivo-scuro);
  margin: 0 0 0.5rem;
}
.scheda-pubblico p { margin: 0; }
/* Link di download dentro una scheda (Governance, 2026-09-16): solo
   testo con un divisore tratteggiato sopra, non un pulsante — titolo e
   descrizione della card restano in primo piano, il download è
   un'azione secondaria subito sotto. Stesso linguaggio della variante
   mobile di .riquadro-download__azione (divisore tratteggiato +
   colore ulivo-scuro), qui usato direttamente invece del riquadro
   completo, che qui risultava ridondante. */
.scheda-pubblico__scarica {
  display: block;
  margin-top: 0.75rem;
  padding-top: 0.75rem;
  border-top: 1px dashed var(--colore-confine);
  font-family: var(--font-dati);
  font-size: 0.85rem;
  color: var(--colore-ulivo-scuro);
  text-decoration: none;
  text-align: right;
}
.scheda-pubblico__scarica:hover,
.scheda-pubblico__scarica:focus-visible { text-decoration: underline; }
.scheda-pubblico .scheda-pubblico__domanda {
  color: var(--colore-terra);
  opacity: 0.75;
  margin-bottom: 0.5rem;
}

.legenda-mappa {
  display: flex;
  gap: 1.5rem;
  font-family: var(--font-dati);
  font-size: 0.85rem;
  margin: 0.75rem 0 1.25rem;
}
.legenda-mappa span { display: inline-flex; align-items: center; gap: 0.4rem; }
.pallino { width: 10px; height: 10px; border-radius: 50%; display: inline-block; }
.pallino--bio { background: var(--colore-bio); }
.pallino--non-bio { background: var(--colore-non-bio); }
.pallino--in-conversione { background: var(--colore-in-conversione); }

#mappa-aziende,
#mappa-evoluzione {
  width: 100%;
  height: 60vh;
  min-height: 320px;
  border: 1px solid var(--colore-confine);
}

/* Elenchi puntati/numerati nel testo (2026-08-21): non più un margine
   esplicito sul contenitore (provato da 1.25rem fino a 4rem, era un
   fraintendimento — il problema non era lo spazio prima/dopo l'intero
   elenco, torna al margine di default del browser) ma spazio tra una
   voce e l'altra, per una lettura più chiara riga per riga. Regola
   generica su tutti i <li> del sito, con eccezioni esplicite per i
   componenti "pillola"/flex (tag, menu, correlati) e per la timeline,
   che hanno già un proprio meccanismo di spaziatura (border/padding o
   gap del flex) — un margin-top qui li disallineerebbe. */
li + li { margin-top: 0.4rem; }
.tag-elenco li,
.scheda-atlante__tag li,
.linee-collegate li,
.moduli-atlante__correlati li,
nav.principale li {
  margin-top: 0;
}
.timeline__voce + .timeline__voce { margin-top: 0; }

/* Elenco delle finalità (Il Distretto e home, stessa classe): non è una
   lista gerarchica (nessun ordine tra le finalità), quindi niente numeri
   — un simbolo invece del pallino di default, ulivo come il resto degli
   accenti del sito. Due caratteri in dissolvenza incrociata sull'hover
   (2026-08-22, richiesta esplicita: un fiorellino più scarno/leggero a
   riposo, quello pieno di prima all'hover — "tipo le animazioni della
   mappa home") invece di un list-style statico: non si può animare un
   cambio di carattere dentro list-style/::marker, quindi due pseudo-
   elementi sovrapposti che si scambiano opacità/scala. */
.elenco-finalita { list-style: none; }
.elenco-finalita li { position: relative; padding-left: 1.4em; }
.elenco-finalita li::before,
.elenco-finalita li::after {
  position: absolute;
  left: 0;
  top: 0;
  color: var(--colore-ulivo);
  transition: opacity 0.35s ease, transform 0.35s ease;
}
.elenco-finalita li::before {
  content: "\2733\FE0E"; /* ✳ scarno/leggero, a riposo — \FE0E = variante testo, senza iOS lo disegna come emoji (2026-09-23) */
  opacity: 1;
  transform: scale(1);
}
.elenco-finalita li::after {
  content: "\273D\FE0E"; /* ✽ pieno, quello di prima — solo all'hover */
  opacity: 0;
  transform: scale(0.6);
}
.elenco-finalita li:hover::before { opacity: 0; transform: scale(1.3); }
.elenco-finalita li:hover::after { opacity: 1; transform: scale(1); }
@media (prefers-reduced-motion: reduce) {
  .elenco-finalita li::before,
  .elenco-finalita li::after { transition: none; }
}
/* Mobile (2026-09-03, rivisto due volte sullo stesso giorno su feedback
   diretto): niente più spazio riservato al simbolo via padding-left su
   li — ogni voce diventa un riquadro a sé, stesso linguaggio di
   .scheda-pubblico/.riquadro (bordo sottile, nessuno sfondo proprio,
   border-radius 2px). Il simbolo resta (richiesto esplicitamente), in
   una colonna a sé stante che occupa TUTTA l'altezza della riga — non
   più una scatoletta piccola staccata dal testo, ma una rotaia continua
   senza bordo proprio (tolto: stava sugli stessi pseudo-elementi
   animati, si muoveva insieme al simbolo durante il "brulicare" — resta
   solo il bordo esterno di li): position:absolute con top/bottom:0
   rispetto a li (position:relative), non più dentro il flusso — il
   padding-left sposta sull'<a> invece, che riserva lo spazio per la
   rotaia.
   "Brulicare" periodico (richiesto esplicitamente, per attirare
   l'attenzione): ogni simbolo fiorisce da ✳ a ✽ e ritorna, non in hover
   ma in automatico, in sequenza da cima a fondo lista — stessa tecnica
   già in uso per lo scintillio delle parcelle sulla mappa home
   (mappa-home-scintillio in questo stesso file): un'unica animazione
   CSS condivisa, ritardo diverso per elemento, MAI un setInterval JS
   che aggiunge/rimuove nodi o ricalcola stili in loop. Sono solo 6 voci
   fisse, quindi il ritardo è scritto a mano per nth-child invece di
   generarlo — non serve generalizzare per un numero che non cambia.
   L'hover del desktop (sopra, cross-fade istantaneo al passaggio del
   mouse) va neutralizzato qui sotto: su un browser desktop ridotto
   sotto i 550px per test il mouse può ancora scatenarlo e altrimenti
   confliggerebbe con l'animazione ambientale. Link senza sottolineatura
   sotto i 550px: dentro un riquadro bordato la sottolineatura di
   default del link è ridondante/stonata. */
@media only screen and (max-width: 550px) {
  .elenco-finalita {
    /* Il vero colpevole del padding-left "che non se ne va mai": non è
       (solo) quello di li sotto, è il padding-left di DEFAULT del
       browser sull'elemento <ul> stesso — list-style:none (sopra) toglie
       il pallino ma non l'indentazione. Mai toccato finora. */
    padding-left: 0;
  }
  .elenco-finalita li {
    padding: 0;
    border: 1px solid var(--colore-confine);
    border-radius: 2px;
    margin-bottom: 0.6rem;
    position: relative;
    overflow: hidden;
  }
  .elenco-finalita li:last-child { margin-bottom: 0; }

  .elenco-finalita li a {
    display: flex;
    align-items: center;
    line-height: 1.3;
    padding: 0.6rem 0.9rem 0.6rem calc(0.9rem + 2.6em);
    min-height: 2.6em;
    text-decoration: none;
    /* Compensazione ottica (2026-09-03): il calcolo dalle metriche OS/2
       del font (usWinAscent/Descent) prevedeva testo troppo in basso e
       una correzione verso l'alto — verificato sul browser reale, era
       il verso sbagliato (il browser evidentemente non usa quelle
       metriche per il calcolo della riga). Invertito verso il basso,
       valore dimezzato per prudenza: verificare ancora e aggiustare. */
    transform: translateY(0.08em);
  }

  .elenco-finalita li::before,
  .elenco-finalita li::after {
    top: 0;
    bottom: 0;
    left: 0;
    /* Larghezza uguale al padding-left dell'<a> sopra (2.6em + 0.9rem,
       non solo 2.6em): altrimenti il simbolo si centrava solo dentro
       una fetta più stretta della colonna riservata, lasciando vuoto
       asimmetrico prima del testo invece di stare in mezzo tra il
       bordo sinistro e dove inizia davvero il testo. */
    width: calc(2.6em + 0.9rem);
    display: flex;
    align-items: center;
    justify-content: center;
    line-height: 1;
    /* Niente più bordo qui (era border-right): stava sugli stessi
       pseudo-elementi che animano transform:scale, quindi si muoveva
       insieme al simbolo durante il "brulicare" — richiesto di
       toglierlo, resta solo il bordo esterno di li. */
  }

  /* Stessa coppia di keyframe, valori di opacity/scale copiati 1:1 dalle
     regole :hover sopra (desktop): lì scattano al passaggio del mouse,
     qui vanno da soli in loop — "sbocciare" è lo stesso movimento,
     scala compresa, solo automatico invece che a comando. --ritardo per
     item (nth-child, sono 6 fisse) scagliona la sequenza da cima a
     fondo; stessa durata su entrambi i pseudo-elementi così restano
     sincronizzati (l'uno sparisce mentre l'altro compare). */
  .elenco-finalita li:nth-child(1) { --ritardo: 0s; }
  .elenco-finalita li:nth-child(2) { --ritardo: 0.175s; }
  .elenco-finalita li:nth-child(3) { --ritardo: 0.35s; }
  .elenco-finalita li:nth-child(4) { --ritardo: 0.525s; }
  .elenco-finalita li:nth-child(5) { --ritardo: 0.7s; }
  .elenco-finalita li:nth-child(6) { --ritardo: 0.875s; }

  .elenco-finalita li::before {
    opacity: 1;
    animation: elenco-finalita-asterisco 1.75s ease-in-out infinite;
    animation-delay: var(--ritardo, 0s);
  }
  .elenco-finalita li::after {
    opacity: 0;
    animation: elenco-finalita-fiore 1.75s ease-in-out infinite;
    animation-delay: var(--ritardo, 0s);
  }

  .elenco-finalita li:hover::before,
  .elenco-finalita li:hover::after {
    opacity: unset;
    transform: unset;
  }
}
@media only screen and (max-width: 550px) and (prefers-reduced-motion: reduce) {
  .elenco-finalita li::before,
  .elenco-finalita li::after { animation: none; }
}
/* translateY prima di scale in ogni step (non dopo): così lo scarto di
   0.08em resta costante in pixel a schermo indipendentemente dalla
   scala del momento — stessa compensazione ottica applicata al testo
   sopra, qui sui simboli. L'ordine dentro transform conta: scale()
   prima di translateY() moltiplicherebbe lo scarto per il fattore di
   scala invece di lasciarlo fisso. */
@keyframes elenco-finalita-asterisco {
  0%, 78%, 100% { opacity: 1; transform: translateY(0.08em) scale(1); }
  40% { opacity: 0; transform: translateY(0.08em) scale(1.3); }
}
@keyframes elenco-finalita-fiore {
  0%, 78%, 100% { opacity: 0; transform: translateY(0.08em) scale(0.6); }
  40% { opacity: 1; transform: translateY(0.08em) scale(1); }
}

/* Divulgazione progressiva: apertura piana per tutti i pubblici,
   approfondimento tecnico/normativo apribile solo per chi lo cerca.
   Nessun JavaScript: <details> è nativo del browser. */
details {
  border-left: 1px solid var(--colore-confine);
  padding: 0.75rem 1rem;
  margin: 1.25rem 0;
}
/* Stesso linguaggio già usato altrove nel sito per lo stato hover
   (es. i pulsanti filtro della mappa Atlante): non un colore/sfondo
   diverso, solo lo stile del bordo che passa a tratteggiato. */
details:hover,
details:focus-within {
  border-left-style: dotted;
}
/* Più leggero di prima (colore più chiaro, niente grassetto, font più
   piccolo): troppo pesante nel testo, un <details> è un
   approfondimento facoltativo, non deve pesare quanto il testo
   principale. La freccetta nativa (::marker) segue la stessa idea. */
details summary {
  cursor: pointer;
  font-weight: 400;
  font-size: 0.95rem;
  color: var(--colore-terra); /* stesso colore del testo principale, non più verde */
}
details summary::marker { font-size: 0.85em; }
details[open] summary { margin-bottom: 0.75rem; }

/* Alternativa a <details> per testo che è contenuto centrale (non un
   approfondimento facoltativo) ma lungo: si vede sempre l'inizio, sfuma
   dopo poche righe, un bottone espande il resto — <details> resta
   riservato a note/approfondimenti davvero opzionali. Richiede JS
   (static/js/leggi-di-piu.js) per il bottone: senza, il testo resta
   sempre troncato (nessun fallback CSS-only, a differenza di <details>
   che è nativo). */
.leggi-di-piu__testo {
  position: relative;
  max-height: 4.8rem;
  overflow: hidden;
  /* Riga tratteggiata proprio dove il testo viene tagliato — un segnale
     in più, oltre alla sfumatura, che lì sotto il contenuto continua. */
  border-bottom: 1px dotted var(--colore-confine);
  /* Anima solo tra due valori fissi (mai "none": non è interpolabile,
     un salto istantaneo anche con transition impostata) — 60rem è oltre
     qualunque testo realistico di questa sezione. */
  transition: max-height 0.4s ease, border-color 0.3s ease;
}
.leggi-di-piu__testo::after {
  content: "";
  position: absolute;
  left: 0;
  right: 0;
  bottom: 0;
  height: 2.5rem;
  background: linear-gradient(to bottom, transparent, var(--colore-crosta));
  transition: opacity 0.3s ease;
}
.leggi-di-piu.espanso .leggi-di-piu__testo {
  max-height: 60rem;
  border-bottom-color: transparent; /* niente più taglio, niente più riga */
}
.leggi-di-piu.espanso .leggi-di-piu__testo::after {
  opacity: 0;
}
.leggi-di-piu__bottone {
  display: block;
  width: fit-content;
  margin: 0.5rem 0 0 auto; /* allineato a destra */
  background: none;
  border: none;
  padding: 0;
  font: inherit;
  font-size: 0.85rem; /* più piccolo del testo che introduce */
  font-weight: 600;
  /* --colore-terra: lo stesso marrone del testo principale del sito —
     più deciso in hover, per dare comunque un segnale di interattività. */
  color: var(--colore-terra);
  text-decoration: none;
  cursor: pointer;
}
.leggi-di-piu__bottone:hover,
.leggi-di-piu__bottone:focus {
  color: var(--colore-ulivo-scuro);
  text-decoration: underline;
  text-decoration-style: dotted;
}

/* Sezioni separate da una riga sottile, senza contenitore — per
   raggruppare parti di una pagina (Il Piano, la pagina di una Linea di
   Azione) senza il trattamento "contenitore/bordo verde" di <details>
   sopra, che resta riservato alla divulgazione progressiva. Si applica
   sia a <details> (resta collassabile) sia a <section> (non lo è). */
.sezione-divisa {
  border-top: 1px solid var(--colore-confine);
  border-left: none;
  padding: 1.25rem 0;
  margin: 0;
  background: none;
}
.sezione-divisa:first-of-type { border-top: none; padding-top: 0; }
.sezione-divisa > summary,
.sezione-divisa > h2 {
  font-family: var(--font-titoli);
  font-weight: 700;
  font-size: 1.1rem;
  color: var(--colore-ulivo-scuro);
  margin: 0 0 0.75rem;
  border-bottom: none;
  padding-bottom: 0;
}
.sezione-divisa > summary { cursor: pointer; }

/* Sezioni espandibili senza <details> (Il Piano, 2026-08-21): stesso
   linguaggio visivo di .sezione-divisa, ma un <section>/<button> invece
   di <details>/<summary> — <details> erediterebbe la regola
   "details:hover { border-left-style: dotted }" pensata per la
   divulgazione progressiva sopra, che su queste sezioni (bordo
   superiore, non laterale) faceva comparire un bordo sinistro indesiderato
   all'hover. Stesso pattern già in uso per le sezioni stile Wikipedia
   dell'articolo Evoluzione del Biologico (vedi
   layouts/atlante/_markup/render-heading.html), qui generico e riusabile.
   Toggle in static/js/sezioni-espandibili.js. */
.sezione-espandibile__bottone {
  display: flex;
  align-items: baseline;
  gap: 0.5rem;
  width: 100%;
  text-align: left;
  background: none;
  border: none;
  padding: 0;
  font: inherit;
  font-family: var(--font-titoli);
  font-weight: 700;
  font-size: 1.1rem;
  color: var(--colore-ulivo-scuro);
  cursor: pointer;
  margin: 0 0 0.75rem;
}
.sezione-espandibile__bottone::before {
  content: "▾";
  flex: 0 0 auto;
  font-size: 0.75em;
  color: var(--colore-terra);
}
.sezione-espandibile.chiusa .sezione-espandibile__bottone {
  margin-bottom: 0;
}
.sezione-espandibile.chiusa .sezione-espandibile__bottone::before {
  transform: rotate(-90deg);
}
.sezione-espandibile.chiusa .sezione-espandibile__corpo {
  display: none;
}

/* Tag cliccabili (Ambiti di intervento / Finalità sulla pagina di una
   Linea di Azione) — stesso linguaggio visivo di .riquadro-griglia:
   bordo sottile, tratteggiato in hover/focus. */
.tag-elenco {
  display: flex;
  flex-wrap: wrap;
  gap: 0.5rem;
  list-style: none;
  padding: 0;
  margin: 0.75rem 0 0;
}
.tag-elenco a,
.tag-elenco span {
  display: inline-block;
  font-family: var(--font-dati);
  border: 1px solid var(--colore-confine);
  /* Stesso padding/dimensione di .etichetta in Comunità (le targhette
     sulle card, non .tag-prodotto che sono i pulsanti filtro cliccabili
     — .tag-elenco è solo testo, come .etichetta): box quadrati, non
     più pillole arrotondate. */
  padding: 0.2rem 0.5rem;
  border-radius: 0;
  text-decoration: none;
  font-size: 0.68rem;
  color: inherit;
}
.tag-elenco a:hover,
.tag-elenco a:focus-visible { border-style: dotted; }

/* Breadcrumb minimale: etichetta il tipo di contenuto (Linea di Azione,
   Ambito di intervento, Finalità) e riporta a Il Piano con un click —
   niente libreria, un link + un separatore. */
.briciole {
  font-family: var(--font-dati);
  font-size: 0.85rem;
  color: var(--colore-terra);
  opacity: 0.7;
  margin: 0 0 0.25rem;
}
.briciole a { color: inherit; }

/* Elenco automatico delle Linee di Azione collegate, nelle pagine
   "Chiavi di lettura" */
.linee-collegate {
  list-style: none;
  padding: 0;
  margin: 1rem 0;
}
.linee-collegate li {
  border-top: 1px solid var(--colore-confine);
  padding: 0.6rem 0;
}
.linee-collegate a { text-decoration: none; font-weight: 600; }
.linee-collegate a:hover { text-decoration: underline; }

/* Griglia in stile solar.lowtechmagazine.com: 4 colonne fisse, che
   diventano 2 sotto i 980px e 1 (impilate) sotto i 550px — stessi
   breakpoint del riferimento. */
.griglia {
  display: grid;
  grid-template-columns: repeat(4, 1fr);
  gap: var(--spazio);
  margin: 1.5rem 0;
}
@media only screen and (max-width: 980px) {
  .griglia { grid-template-columns: repeat(2, 1fr); }
}
@media only screen and (max-width: 550px) {
  .griglia { grid-template-columns: 1fr; }
}

/* "Cover": la riga in evidenza della Home, copiata dal riferimento —
   testo nella prima colonna, immagine (per ora un segnaposto) nelle
   altre tre. Occupa tutta la larghezza della griglia (grid-column:
   1/-1) e al suo interno ha una propria griglia a 4 colonne. */
.riquadro-cover {
  grid-column: 1 / -1;
  display: grid;
  grid-template-columns: repeat(4, 1fr);
  gap: var(--spazio);
}
.riquadro-cover__testo { grid-column: 1 / 3; }
.riquadro-cover__immagine {
  grid-column: 3 / -1;
  min-height: 260px;
  /* Un solo figlio ora: .riquadro-cover__link-mappa (vedi sotto). Basta
     "display:flex" (stretch è il default) per farlo alto quanto questo
     contenitore — il resto del layout (colonna, spaziatura) vive su di
     lui, non più qui. */
  display: flex;
}
/* Tutto il blocco — mappa/immagine E pulsante — è UN SOLO link verso
   /partecipa/ (2026-08-22, richiesta esplicita: prima erano due elementi
   separati, mappa muta + pulsante-link a parte). Passare il mouse
   ovunque nel blocco attiva le stesse animazioni di prima
   (scintillio/iperstizione — mappa-home.js si aggancia a
   QUESTO elemento, non più al solo pulsante) e fa "accendere" il
   pulsante come se il mouse fosse su di lui (vedi la regola
   :hover/:focus-visible più sotto). */
.riquadro-cover__link-mappa {
  display: flex;
  flex-direction: column;
  align-items: stretch;
  justify-content: space-between;
  gap: 0.75rem;
  width: 100%;
  text-decoration: none;
  color: inherit;
}
.riquadro-cover__link-mappa img {
  display: block;
  width: 100%;
  height: 100%;
  object-fit: cover;
}
/* Il pulsante è ora uno <span> (non un <a> annidato — HTML non lo
   permette dentro un altro link), ma resta visivamente identico
   (.bottone, .bottone-partecipa-mappa invariate). Qui solo l'aggancio in
   più: l'hover/focus del link intero lo "accende" come se il mouse
   fosse proprio su di lui — stessa regola di .bottone:hover, ripetuta
   qui perché quella si attiva solo sull'hover diretto dell'elemento. */
.riquadro-cover__link-mappa:hover .bottone-partecipa-mappa,
.riquadro-cover__link-mappa:focus-visible .bottone-partecipa-mappa {
  background: var(--colore-terra);
  color: var(--colore-crosta);
}
.riquadro-cover__immagine--segnaposto {
  border: 1px dashed var(--colore-confine);
  background: var(--colore-crosta);
  font-family: var(--font-dati);
  font-size: 0.8rem;
  color: var(--colore-terra);
  opacity: 0.7;
}

/* Mappa "copertina" della home (2026-08-21): confini comunali +
   parcelle bio/in conversione dell'ultimo anno, tutte disegnate una
   sola volta (non più aggiunte/rimosse a ciclo — vedi
   static/js/mappa-home.js per il perché), ciascuna con un'opacità che
   oscilla per un effetto "scintillio". Adattata SOLO in larghezza (100%
   della colonna) — l'altezza non è più forzata a coincidere con quella
   del testo a fianco (era la scelta di un giro precedente: "stretch"
   sul genitore + SVG a "height:100%" + preserveAspectRatio "slice",
   cioè riempire tutta l'altezza tagliando i lati se serve): quella
   tecnica *tagliava* la mappa quando la colonna di testo era più alta
   del rapporto naturale larghezza/altezza della mappa. Qui l'SVG ha
   "height:auto": il browser calcola l'altezza dal viewBox (che è
   sempre il rapporto naturale del contenuto, vedi mappa-home.js) — mai
   un pixel tagliato, l'altezza segue la larghezza invece di essere
   imposta dall'esterno. */
.mappa-home {
  width: 100%;
  overflow: hidden; /* rete di sicurezza: con height:auto non dovrebbe più servire, ma costa zero tenerla */
}
.mappa-home svg { display: block; width: 100%; height: auto; }
/* Dal 2026-09-23 la mappa è un SVG già pronto con viewBox fisso (1300
   unità, vedi scripts/genera_mappa_home_svg.py) invece di un viewBox
   ricalcolato sulla larghezza reale in pixel: "vector-effect:
   non-scaling-stroke" tiene tratteggio e spessori in pixel veri, come
   prima, qualunque sia la larghezza a cui la mappa è mostrata. */
.mappa-home__confini { fill: none; stroke: var(--colore-confine); stroke-width: 1; stroke-dasharray: 3 3; vector-effect: non-scaling-stroke; }
/* Confine dell'intero distretto (unione dei 7 comuni): linea solida,
   stesso spessore del bordo delle card (.riquadro-griglia, 1px) ma in
   scala SVG — stesso colore ulivo per farlo leggere come "il" confine
   che conta, contro il tratteggio più tenue dei confini comunali
   interni (solo di orientamento). Questo stroke-width fisso vale solo
   da 981px in su: in mobile il preferito era invece uno spessore
   proporzionale alla mappa (il viewBox combacia 1:1 coi pixel reali del
   contenitore, quindi un valore fisso qui sembra relativamente più
   marcato su un contenitore stretto) — mappa-home.js lo sovrascrive
   inline sotto i 980px, vedi FATTORE_BORDO_DISTRETTO lì. */
.mappa-home__confine-distretto { fill: none; stroke: var(--colore-ulivo); stroke-width: 1.5; vector-effect: non-scaling-stroke; }
/* Sotto i 1300px spessore proporzionale alla mappa (prima calcolato in
   JS, FATTORE_BORDO_DISTRETTO = 1.5px ogni 650px di larghezza): con il
   viewBox fisso basta lasciar scalare lo stroke — 3 unità su 1300 =
   1.5px su una mappa larga 650px, proporzionale altrove. */
@media only screen and (max-width: 1300px) {
  .mappa-home__confine-distretto { stroke-width: 3; vector-effect: none; }
}

/* Scintillio (2026-08-21): un'unica animazione CSS condivisa, applicata
   a ogni parcella con durata/ritardo casuali impostati una sola volta
   in JS (non un ciclo continuo di setInterval che crea/rimuove nodi —
   quella prima versione aveva un bug reale di accumulo, vedi
   mappa-home.js) — il motore CSS del browser gestisce l'animazione in
   modo molto più leggero di migliaia di transizioni D3 indipendenti.
   Il "delay" negativo impostato in JS scala la fase di partenza di ogni
   particella, altrimenti partirebbero tutte sincronizzate allo stesso
   punto del ciclo. */
@keyframes mappa-home-scintillio {
  0%, 100% { opacity: 0.15; }
  50% { opacity: 0.85; }
}
.mappa-home__particelle path {
  fill: var(--colore-ulivo); /* niente più colore per specie (versione precedente): tinta unica del tema */
  animation-name: mappa-home-scintillio;
  animation-timing-function: ease-in-out;
  animation-iteration-count: infinite;
}
@media (prefers-reduced-motion: reduce) {
  .mappa-home__particelle path { animation: none; opacity: 0.6; }
}

/* Parcelle tradizionali + effetto hover "iperstizione" (2026-08-22):
   campione decorativo di ~1500 (non tutte le 5.847 reali — provate per
   intero nella stessa sessione, tornate indietro: percepibilmente lente,
   vedi tools/prepara_particelle_home.py in Mixité), invisibili a riposo
   (opacity: 0 — non devono leggersi come "sfondo tradizionale" quando
   non si interagisce). Passando il mouse su "Scopri come partecipare"
   (vedi mappa-home.js) 500 di loro, scelte a caso, prendono la classe
   --convertita e attraversano TRE fasi in sequenza, non uno scatto
   secco: 1) dissolvenza a piena opacità nel loro colore tradizionale
   (--colore-non-bio, stesso tono già usato per i marker azienda non-bio
   altrove nel sito); 2) il colore vira al verde ulivo (transition su
   "fill", con un ritardo che la fa iniziare verso la fine della
   dissolvenza — si sovrappongono un poco invece di essere due scatti
   separati); 3) una volta verdi, iniziano a scintillare come le
   parcelle bio (stessa animazione mappa-home-scintillio) — l'
   "animation-delay" per questo è assegnato in JS con un'attesa iniziale
   apposta (ATTESA_PRIMA_DELLO_SCINTILLIO_S), perché lo scintillio non
   parta prima che il colore sia già verde. Reversibile al mouseleave
   (tornano invisibili, scintillio compreso) — un gioco di
   "iperstizione", non un rito permanente. */
.mappa-home__particelle-tradizionali path {
  fill: var(--colore-non-bio);
  opacity: 0;
  transition: opacity 0.5s ease;
}
.mappa-home__particelle-tradizionali path.mappa-home__particelle-tradizionali--convertita {
  opacity: 1;
  fill: var(--colore-ulivo);
  transition: opacity 0.5s ease, fill 0.6s ease 0.35s;
  animation-name: mappa-home-scintillio;
  animation-timing-function: ease-in-out;
  animation-iteration-count: infinite;
  /* animation-delay/-duration: assegnati per-elemento da JS, non qui. */
}
@media (prefers-reduced-motion: reduce) {
  /* L'effetto resta (appaiono/scompaiono e cambiano colore comunque), ma
     di scatto e senza scintillio — stessa eccezione già fatta per le
     parcelle bio. */
  .mappa-home__particelle-tradizionali path { transition: none; }
  .mappa-home__particelle-tradizionali path.mappa-home__particelle-tradizionali--convertita {
    animation: none;
  }
}

/* Pulsante "Partecipa" sotto la mappa (2026-08-21): stessa larghezza
   della colonna, e un pulsare di opacità che fa eco allo scintillio
   delle particelle sopra — stesso linguaggio visivo, la colonna
   "respira" come un unico elemento invece di mappa e bottone separati.
   Ampiezza più contenuta di quella delle particelle (0.15-0.85): qui
   c'è del testo da leggere, deve restare leggibile in ogni istante
   dell'animazione, non solo ai picchi. */
@keyframes mappa-home-pulsa {
  0%, 100% { opacity: 1; }
  50% { opacity: 0.7; }
}
.bottone-partecipa-mappa {
  width: 100%;
  animation: mappa-home-pulsa 2.4s ease-in-out infinite;
}
@media (prefers-reduced-motion: reduce) {
  .bottone-partecipa-mappa { animation: none; }
}

/* Un "riverbero del confine" (eco della forma del distretto che si
   espandevano dal baricentro attraverso tutta la pagina, all'hover di
   "Scopri come partecipare") è stato provato e poi tolto del tutto il
   2026-08-22 — giudicato brutto da chi lo ha visto. Resta solo
   l'iperstizione sulle parcelle tradizionali, sopra. */

/* Titolo della home (2026-09-23): ora un vero h1 (prima un h2, e la home
   non aveva nessun titolo principale), con lo stesso aspetto di prima. */
.riquadro-cover__testo h1 {
  font-size: 1.4rem;
  margin: 0 0 1rem;
  border-bottom: 1px solid var(--colore-confine);
  padding-bottom: 0.3rem;
}

/* Soglia propria, più alta dei 980px sitewide (2026-08-22, richiesta
   esplicita — "la mappa rimane molto piccola"): tra 980px e questa
   soglia la colonna mappa è comunque solo metà di una finestra non
   ancora larghissima (schermi da laptop compresi, ~1280-1366px), quindi
   la mappa risultava piccola/compressa pur essendo già "desktop" per il
   resto del sito (nav, header...). Solo per l'eroe della home: il resto
   del sito continua a collassare a 980px come sempre. */
@media only screen and (max-width: 1300px) {
  .riquadro-cover__testo,
  .riquadro-cover__immagine { grid-column: 1 / -1; }
}

/* Copertina di sezione: come .riquadro-cover della Home, ma generica —
   ogni sezione decide via front matter cosa mostrare in ciascuna metà
   (testo del corpo pagina, uno "statement" breve in evidenza, o
   un'immagine segnaposto a 3 colonne). Vedi partials/copertina-sezione.html. */
.copertina-sezione {
  grid-column: 1 / -1;
  display: grid;
  grid-template-columns: repeat(4, 1fr);
  gap: var(--spazio);
  margin: 1.5rem 0;
}
.copertina-sezione__blocco--meta { grid-column: span 2; }
.copertina-sezione__blocco--stretto { grid-column: span 1; }
/* Colonna di testo (sempre il primo blocco): flex in colonna solo per
   permettere a un elemento al suo interno di centrarsi nello spazio
   avanzato sotto il testo (margin:auto, vedi .riquadro-download) —
   quello spazio esiste perché la colonna è "stirata" (align-items:
   stretch di default) all'altezza della foto a fianco, se questa è più
   alta del testo. Selettore per posizione, non per classe, per non
   toccare .copertina-sezione__blocco--meta usato anche altrove (foto,
   statement a destra). */
.copertina-sezione > .copertina-sezione__blocco:first-child {
  display: flex;
  flex-direction: column;
}
/* display:flex in colonna: la figura è un elemento di griglia "stirato"
   (align-items:stretch di default) all'altezza dell'intera riga — se
   img prendesse il 100% di quell'altezza (come prima) non resterebbe
   spazio per la didascalia, che finiva a sovrapporsi al contenuto
   sotto (bug segnalato il 2026-09-08). Con flex-direction:column la
   foto (flex:1, vedi sotto) occupa lo spazio restante DOPO la
   didascalia, mai sopra. */
.copertina-sezione__blocco--immagine {
  display: flex;
  flex-direction: column;
  min-height: 260px;
  margin: 0;
}
.copertina-sezione__blocco--immagine--segnaposto {
  grid-column: span 3;
  border: 1px dashed var(--colore-confine);
  background: var(--colore-crosta);
  display: flex;
  align-items: center;
  justify-content: center;
  font-family: var(--font-dati);
  font-size: 0.8rem;
  color: var(--colore-terra);
  opacity: 0.7;
}
/* Wrapper di posizionamento per il canvas dell'hover "iperstizione"
   (static/js/copertina-iperstizione.js) — flex/min-height spostati qui
   dall'img (era diretto figlio di --immagine prima dell'introduzione del
   canvas), l'img resta semplicemente width/height:100% al suo interno. */
.copertina-sezione__media {
  position: relative;
  display: block;
  flex: 1 1 auto;
  min-height: 0;
  border: 1px solid var(--colore-confine);
}
.copertina-sezione__blocco--immagine img {
  display: block;
  width: 100%;
  height: 100%;
  object-fit: cover;
}
/* Puramente decorativo (aria-hidden, vedi partial): non deve mai
   intercettare hover/click, che restano sull'img/figure sottostante.
   Vuoto finché JS non lo riempie al primo hover (caricamento lazy). */
.copertina-sezione__canvas-iperstizione {
  position: absolute;
  inset: 0;
  width: 100%;
  height: 100%;
  pointer-events: none;
}
@media (prefers-reduced-motion: reduce) {
  .copertina-sezione__canvas-iperstizione { transition: none; }
}
.copertina-sezione__didascalia {
  display: block;
  margin-top: 0.5rem;
  font-family: var(--font-dati);
  font-size: 0.75rem;
  color: var(--colore-terra);
  opacity: 0.7;
}
.copertina-sezione__statement {
  font-family: var(--font-titoli);
  font-weight: 700;
  font-size: 1.8rem;
  line-height: 1.2;
  color: var(--colore-ulivo-scuro);
}
@media only screen and (max-width: 980px) {
  .copertina-sezione__blocco--meta,
  .copertina-sezione__blocco--stretto,
  .copertina-sezione__blocco--immagine { grid-column: 1 / -1; }
}

/* Tile: bordo sottile invece di un blocco di colore pieno — al passaggio
   del mouse/focus il bordo diventa tratteggiato. Nessuna immagine oggi,
   ma il modificatore --con-immagine sotto è pronto per quando ce ne
   saranno. */
.riquadro-griglia {
  display: block;
  border: 1px solid var(--colore-ulivo);
  padding: 1.25rem;
  text-decoration: none;
  color: inherit;
  transition: border-style 0.15s ease;
}
.riquadro-griglia:hover,
.riquadro-griglia:focus-visible {
  border-style: dotted;
}
/* Necessaria perché .riquadro-griglia ha già un display esplicito, che
   altrimenti scavalca il default del browser per l'attributo hidden —
   senza questa riga il filtro JS su /comunita/ non nascondeva nulla. */
.riquadro-griglia[hidden] { display: none; }
.riquadro-griglia__etichetta {
  display: block;
  font-family: var(--font-dati);
  font-size: 1.4rem;
  color: var(--colore-ulivo-scuro);
  margin-bottom: 0.5rem;
}
.riquadro-griglia__titolo {
  display: block;
  font-family: var(--font-titoli);
  font-weight: 700;
  color: var(--colore-terra);
}
.riquadro-griglia__testo {
  display: -webkit-box;
  font-size: 0.9rem;
  margin-top: 0.4rem;
  color: var(--colore-terra);
  -webkit-line-clamp: 4;
  line-clamp: 4;
  -webkit-box-orient: vertical;
  overflow: hidden;
}

/* Riquadro download (Il Piano, 2026-09-08): stesso linguaggio minimale
   di .riquadro-griglia (bordo sottile, bordo tratteggiato in hover,
   nessuno sfondo pieno) ma disposizione a riga (icona, testo, azione)
   invece che a tessera — una singola voce di download, non una griglia
   di card. */
.riquadro-download {
  display: flex;
  align-items: center;
  gap: 1rem;
  width: 100%;
  max-width: var(--misura-max);
  border: 1px solid var(--colore-ulivo);
  padding: 1rem 1.25rem;
  /* Margini automatici, non un valore fisso: dentro la colonna di testo
     (ora flex, vedi sopra) questo centra il riquadro sia in
     orizzontale sia — soprattutto — in verticale nello spazio che
     avanza tra la fine del testo e il fondo della colonna, invece di
     restare incollato subito sotto l'ultimo paragrafo. Se la colonna
     non ha spazio in avanzo (es. in mobile, dove le due metà della
     copertina si impilano) i margini auto si annullano da soli e resta
     un normale spaziamento verticale. */
  margin: auto;
  text-decoration: none;
  color: inherit;
  transition: border-style 0.15s ease;
}
.riquadro-download:hover,
.riquadro-download:focus-visible {
  border-style: dotted;
}
.riquadro-download__icona {
  flex-shrink: 0;
  display: flex;
  color: var(--colore-ulivo-scuro);
}
.riquadro-download__testo {
  display: flex;
  flex-direction: column;
  flex-grow: 1;
}
.riquadro-download__titolo {
  font-family: var(--font-titoli);
  font-weight: 700;
  color: var(--colore-terra);
}
.riquadro-download__nota {
  font-family: var(--font-dati);
  font-size: 0.8rem;
  color: var(--colore-terra);
  opacity: 0.7;
  margin-top: 0.2rem;
}
.riquadro-download__azione {
  flex-shrink: 0;
  font-family: var(--font-dati);
  font-size: 0.85rem;
  color: var(--colore-ulivo-scuro);
  white-space: nowrap;
}
/* Sotto i 550px "Scarica ↓" va a capo su una riga propria, in fondo al
   riquadro — icona e info restano insieme sopra, come su desktop, solo
   l'azione scende invece di stare stretta accanto al testo. L'icona
   sparisce del tutto (è solo decorativa, aria-hidden già in origine):
   a quella larghezza il riquadro serve solo titolo+nota+azione. */
@media only screen and (max-width: 550px) {
  .riquadro-download {
    flex-wrap: wrap;
  }
  .riquadro-download__icona {
    display: none;
  }
  .riquadro-download__azione {
    flex-basis: 100%;
    text-align: center;
    margin-top: 0.75rem;
    padding-top: 0.75rem;
    border-top: 1px dashed var(--colore-confine);
  }
}

/* Schema della struttura del Piano (Il Piano, 2026-09-08): tre livelli
   in cascata, non un funnel proporzionale ai numeri — 18 Linee di
   Azione non è "meno" di 20 Ambiti in senso gerarchico stretto (è una
   relazione molti-a-molti, non un albero), quindi niente larghezze
   scalate sui conteggi che implicherebbero il contrario. role="img" +
   aria-label riassume tutto il diagramma in una frase sola: i numeri e
   i nomi qui sotto sono già annunciati per esteso nel paragrafo
   accanto, ripeterli per chi usa uno screen reader sarebbe ridondante. */
.schema-piano {
  display: flex;
  flex-direction: column;
  align-items: stretch;
  gap: 0.25rem;
  max-width: 20rem;
  margin: 1.5rem 0;
}
.schema-piano__livello {
  display: flex;
  align-items: baseline;
  gap: 0.6rem;
  border: 1px solid var(--colore-ulivo);
  padding: 0.6rem 0.9rem;
}
.schema-piano__numero {
  flex-shrink: 0;
  font-family: var(--font-titoli);
  font-weight: 700;
  font-size: 1.5rem;
  color: var(--colore-ulivo-scuro);
}
.schema-piano__nome {
  font-family: var(--font-dati);
  font-size: 0.9rem;
  color: var(--colore-terra);
}
.schema-piano__freccia {
  align-self: center;
  font-size: 0.9rem;
  color: var(--colore-terra);
  opacity: 0.6;
}

/* Dormiente: nessuna pagina imposta ancora "immagine" nel front matter,
   pronto per quando succederà (vedi CLAUDE.md/README, "cosa manca
   ancora"). */
.riquadro-griglia--con-immagine {
  background-size: cover;
  background-position: center;
  color: #fff;
  text-shadow: 0 1px 3px rgba(0, 0, 0, 0.6);
}

/* Card di Atlante: piena larghezza dentro .griglia, divisa in due metà
   (testo+tag a sinistra, immagine larga a destra) — l'etichetta di
   categoria sta FUORI dal riquadro cliccabile, in alto a sinistra, il
   numero manuale d'indice (front matter "indice", facoltativo) in alto
   a destra. Deciso il 2026-07-15, esteso lo stesso giorno. */
.scheda-atlante { grid-column: 1 / -1; }
.scheda-atlante__intestazione {
  display: flex;
  justify-content: space-between;
  align-items: baseline;
  margin-bottom: 0.4rem;
}
.scheda-atlante__etichetta {
  display: block;
  font-family: var(--font-dati);
  font-size: 0.8rem;
  text-transform: uppercase;
  letter-spacing: 0.05em;
  /* Colore per categoria (2026-07-15), non più un colore unico fisso —
     --colore-categoria è impostato inline sul .scheda-atlante (vedi
     list.html), lo stesso usato per il bordo del box qui sotto. */
  color: var(--colore-categoria, var(--colore-ulivo-scuro));
}
.scheda-atlante__numero {
  font-family: var(--font-dati);
  font-size: 0.8rem;
  color: var(--colore-terra);
  opacity: 0.7;
}
.scheda-atlante__box {
  display: grid;
  grid-template-columns: repeat(2, 1fr);
  gap: var(--spazio);
  border: 1px solid var(--colore-categoria, var(--colore-ulivo));
  padding: 1.25rem;
  text-decoration: none;
  color: inherit;
  transition: border-style 0.15s ease;
}
/* Categoria "indagini": immagine a sinistra, testo a destra — inverso
   delle altre due categorie. Solo visivo (l'ordine nel markup resta
   testo-poi-immagine, invariato per chi naviga con screen reader).
   grid-row esplicito su entrambi: senza, il posizionamento automatico
   li spingeva su due righe diverse (immagine in basso a sinistra,
   testo in alto a destra) invece di affiancarli sulla stessa riga. */
.scheda-atlante__box--inversa .scheda-atlante__testo { grid-column: 2; grid-row: 1; }
.scheda-atlante__box--inversa .scheda-atlante__immagine { grid-column: 1; grid-row: 1; }
.scheda-atlante__box:hover,
.scheda-atlante__box:focus-visible { border-style: dotted; }
.scheda-atlante__titolo {
  display: block;
  font-family: var(--font-titoli);
  font-weight: 700;
  font-size: 1.2rem;
  color: var(--colore-terra);
}
.scheda-atlante__descrizione {
  display: block;
  margin-top: 0.5rem;
  color: var(--colore-terra);
}
.scheda-atlante__meta {
  display: block;
  margin-top: 0.5rem;
  font-family: var(--font-dati);
  font-size: 0.75rem;
  color: var(--colore-terra);
  opacity: 0.7;
}
.scheda-atlante__tag {
  display: flex;
  flex-wrap: wrap;
  gap: 0.4rem;
  margin: 0.75rem 0 0;
  padding: 0;
  list-style: none;
}
.scheda-atlante__tag li {
  font-family: var(--font-dati);
  font-size: 0.75rem;
  border: 1px solid var(--colore-confine);
  padding: 0.15rem 0.5rem;
  color: var(--colore-terra);
}
.scheda-atlante__immagine {
  min-height: 220px;
  border: 1px dashed var(--colore-confine);
  background: var(--colore-crosta);
  display: flex;
  align-items: center;
  justify-content: center;
  font-family: var(--font-dati);
  font-size: 0.8rem;
  color: var(--colore-terra);
  opacity: 0.7;
}
.scheda-atlante__immagine img {
  width: 100%;
  height: 100%;
  object-fit: cover;
}
@media only screen and (max-width: 980px) {
  .scheda-atlante__box { grid-template-columns: 1fr; }
  /* Su mobile tutte le card sono identiche, qualunque categoria:
     immagine sempre prima, testo dopo. Serve azzerare grid-column
     (non solo impostare "order") perché la variante --inversa lo
     imposta a 2/1 per schermi larghi — lasciato attivo, in una
     griglia a una sola colonna creava una colonna implicita in più e
     rompeva l'impaginazione invece di impilare semplicemente i due
     blocchi. */
  .scheda-atlante__box--inversa .scheda-atlante__testo,
  .scheda-atlante__box--inversa .scheda-atlante__immagine {
    grid-column: 1;
    grid-row: auto;
  }
  .scheda-atlante__immagine { order: 1; }
  .scheda-atlante__testo { order: 2; }
}

/* Card nascoste dal filtro/ricerca JS su Atlante (vedi atlante-filtri.js).
   Necessaria per lo stesso motivo di .riquadro-griglia[hidden] sopra: la
   card non ha un "display" esplicito proprio, ma è più sicuro non
   fidarsi del default del browser per l'attributo hidden. */
.scheda-atlante[hidden] { display: none; }

/* "Scala" di Atlante, quinta versione (2026-07-15): ripristinato
   l'effetto scala perso nella quarta versione, ma con CSS Grid invece
   di flexbox+justify-content — tre righe condivise da tutta
   .scala-atlante (non tre colonne indipendenti che si allineano ognuna
   per conto suo): ogni categoria occupa una sola riga (Indagini
   l'ultima/più bassa, Scenari la prima/più alta), le celle delle altre
   righe restano vuote nella sua colonna. Le tre colonne condividono
   sempre la stessa altezza totale perché sono nello stesso grid, non
   per un calcolo a parte. Una sola dimensione di font ovunque (quella
   del testo normale, 1.05rem) — non più 1.8rem per la descrizione. */
.scala-atlante {
  display: grid;
  grid-template-columns: repeat(3, 1fr);
  grid-template-rows: repeat(3, auto);
  gap: 0.75rem;
}
.scala-atlante__colonna {
  display: flex;
  flex-direction: column;
  gap: 0.3rem;
  text-align: left;
  background: none;
  border: none;
  padding: 0;
  cursor: pointer;
  font-family: inherit;
}
.scala-atlante__colonna:focus-visible { outline: 3px solid var(--colore-categoria); outline-offset: 3px; }
.scala-atlante__colonna--indagini { grid-column: 1; grid-row: 3; --colore-categoria: var(--colore-indagini); }
.scala-atlante__colonna--sguardi { grid-column: 2; grid-row: 2; --colore-categoria: var(--colore-sguardi); }
.scala-atlante__colonna--scenari { grid-column: 3; grid-row: 1; --colore-categoria: var(--colore-scenari); }
.scala-atlante__descrizione {
  font-family: var(--font-titoli);
  font-weight: 400;
  font-style: italic;
  font-size: 1.05rem;
  line-height: 1.2;
  color: var(--colore-categoria);
  padding-bottom: 0.4rem;
  /* Bordo fine di base (1px, non 3px) — cambia STILE (solid → dashed)
     su hover/selezione, non SPESSORE: uno spessore che cresce occupa
     più spazio nel box e spinge in basso tutto quello che segue (bug
     corretto nel giro precedente passando a box-shadow). Cambiare solo
     lo stile del bordo risolve lo stesso problema restando su un vero
     border-bottom (necessario per il tratteggio: box-shadow non può
     essere dashed). */
  border-bottom: 1px solid var(--colore-categoria);
}
.scala-atlante__colonna:hover .scala-atlante__descrizione,
.scala-atlante__colonna[aria-pressed="true"] .scala-atlante__descrizione { border-bottom-style: dashed; }
.scala-atlante__nome {
  font-family: var(--font-testo);
  font-size: 1.05rem;
  font-weight: 700;
  color: var(--colore-categoria);
}
/* Pallino solo quando la categoria è selezionata (non su hover) —
   stesso linguaggio di ".etichetta-organo" in Comunità. Corretto qui
   dopo un fraintendimento: era stato applicato ai pulsanti di
   ordinamento invece che ai filtri di categoria. */
.scala-atlante__colonna[aria-pressed="true"] .scala-atlante__nome::before { content: "● "; }
/* Niente media query per .scala-atlante: la griglia 3×3 con la
   diagonale SO→NE (indagini col1/riga3, sguardi col2/riga2, scenari
   col3/riga1) è la stessa a ogni larghezza — sotto i 980px le colonne
   si stringono (CSS Grid le rende comunque, solo più strette), non
   collassano a una sola colonna. Due giri precedenti nello stesso
   giorno (2026-07-15) avevano prima azzerato la griglia a una colonna
   piena, poi tentato di simularla con un rientro (margin-left) —
   entrambi scartati: non serve nessuna simulazione, la vera griglia
   diagonale regge anche stretta. */

/* Spazio in fondo alla griglia perché l'ultima riga di card non finisca
   nascosta sotto la barra fissa (stesso motivo di #membri-griglia in
   Comunità). */
#atlante-griglia.griglia { margin-bottom: 4.5rem; }

/* ====================================================================
   Comunità — pagina Membri (griglia/card riusano .griglia e
   .riquadro-griglia sopra). Aggiunto 2026-07-08, vedi bozza discussa
   in chat prima di essere portata qui. ==================================================================== */

/* Aree nominate invece di semplici grid-column: permettono di
   riordinare testo/cellula/filtri in modo diverso da desktop a
   mobile senza toccare l'HTML. Desktop: testo e filtri impilati a
   sinistra (stessa colonna), la cellula alta quanto entrambi a destra.
   Mobile: sempre testo, poi cellula, poi filtri — la cellula non deve
   mai finire sotto ai filtri. */
.comunita-intro {
  grid-column: 1 / -1;
  display: grid;
  grid-template-columns: repeat(4, 1fr);
  grid-template-areas:
    "testo testo cellula cellula"
    "filtri filtri cellula cellula";
  gap: var(--spazio);
  align-items: stretch;
  margin: 1.5rem 0;
}
.comunita-intro__testo { grid-area: testo; }
.sezione-filtri { grid-area: filtri; }
.comunita-intro__cellula {
  grid-area: cellula;
  display: flex;
  align-items: center;
  justify-content: center;
}
@media only screen and (max-width: 980px) {
  .comunita-intro {
    grid-template-columns: 1fr;
    grid-template-areas: "testo" "cellula" "filtri";
  }
}

/* Barra fissa in fondo alla viewport, sempre raggiungibile mentre si
   scorre — separata dai filtri a bottone, che restano nel flusso
   normale della pagina. Una sola riga, stessa su desktop e mobile. */
.barra-fissa {
  position: fixed;
  left: 0;
  right: 0;
  bottom: 0;
  z-index: 20;
  display: flex;
  flex-wrap: wrap;
  gap: 0.6rem;
  align-items: center;
  padding: 0.85rem 1.25rem;
  background: var(--colore-crosta);
  border-top: 1px solid var(--colore-confine);
}
@media only screen and (max-width: 980px) {
  /* La ricerca prende sempre tutta la riga da sola, i pulsanti e il
     contatore vanno tutti insieme a capo sotto — altrimenti a seconda
     della larghezza qualche pulsante restava a fianco della ricerca. */
  .barra-fissa .ricerca { flex-basis: 100%; }
  /* I pulsanti si allargano fino a occupare la stessa larghezza della
     ricerca sopra — il contatore resta compatto, è solo testo. */
  .barra-fissa .bottone { flex: 1 1 0; }
}

/* Spazio in fondo alla griglia perché l'ultima riga di card non finisca
   nascosta sotto la barra fissa. */
#membri-griglia.griglia { margin-bottom: 4.5rem; }

.cellula {
  position: relative;
  width: 70%;
  height: 80%;
  min-height: 14rem;
  margin: 0 auto;
}
@media only screen and (max-width: 980px) {
  /* Margini anche impilata su mobile stretto — non deve toccare i bordi. */
  .cellula { width: calc(100% - 2rem); height: 16rem; margin: 1rem auto; }
}
@media only screen and (min-width: 551px) and (max-width: 980px) {
  /* Su tablet (più largo di un telefono, ma sempre nel layout
     impilato) il 100% risultava stirato — qui un po' più stretta. */
  .cellula { width: calc(70% - 2rem); }
}

.cellula button {
  position: absolute;
  display: flex;
  background: none;
  cursor: pointer;
  padding: 1rem 1.2rem;
  transition: border-width 0.12s ease;
}
.cellula button:focus-visible { outline: 3px solid var(--colore-organo); outline-offset: 3px; }
/* Nessun riempimento, mai: l'unico segnale di hover/selezione è il
   bordo che si ispessisce. In hover per chi sta solo passandoci sopra,
   persistente su [aria-pressed] per correlarlo alla stessa selezione
   dell'etichetta-filtro sotto, che resta ispessita finché è attiva. */
.cellula button:hover,
.cellula button[aria-pressed="true"] { border-width: 5px; }

/* Etichette dentro gli anelli — rendono lo schema leggibile da solo,
   senza dover guardare per forza la legenda sotto. Ogni anello mette
   la propria in un angolo libero, così non si sovrappongono a quelli
   annidati dentro. Maschera dello stesso colore dello sfondo dietro al
   testo, perché resti leggibile anche dove passa il bordo della forma. */
.cellula__etichetta {
  font-family: var(--font-dati);
  font-size: 0.72rem;
  font-weight: 700;
  color: var(--colore-organo);
  line-height: 1.2;
  background: var(--colore-crosta);
  padding: 0.1rem 0.35rem;
}
/* L'etichetta Assemblea è ancorata all'angolo in basso a destra del suo
   anello (vedi .strato--assemblea) — a certi rapporti larghezza/altezza
   quell'angolo esatto finisce dentro lo spazio di Comitato. position:
   relative + left/top la spostano in diagonale senza toccare
   l'ancoraggio flex stesso — non basta padding-left/top: su un
   elemento ancorato a destra/basso, quel lato di padding aggiunge solo
   spazio invisibile, il testo resta fermo. Vale sempre, non solo sotto
   un breakpoint. */
.cellula__etichetta--assemblea { position: relative; left: 1.2rem; top: 0.8rem; }

/* Suggerimento che compare solo al passaggio del mouse su un punto
   qualsiasi della cellula, per far capire che è cliccabile senza
   doverlo scrivere sempre. */
.cellula__suggerimento {
  position: absolute;
  left: 50%;
  bottom: -1.6rem;
  transform: translateX(-50%);
  margin: 0;
  font-family: var(--font-dati);
  font-size: 0.72rem;
  color: var(--colore-terra);
  opacity: 0;
  transition: opacity 0.15s ease;
  pointer-events: none;
  white-space: nowrap;
}
.cellula:hover .cellula__suggerimento { opacity: 0.65; }
@media (hover: none) { .cellula__suggerimento { display: none; } }

.membrana { align-items: flex-start; justify-content: flex-start; }
/* In basso a destra invece che in alto (lì la curva della forma si
   allontanava troppo e l'etichetta finiva tagliata fuori dal contorno
   visibile) — più padding generale sui bottoni della cellula dovrebbe
   aiutare a restare dentro il contorno anche qui. */
.strato--assemblea { align-items: flex-end; justify-content: flex-end; text-align: right; }
.strato--comitato { align-items: center; justify-content: center; text-align: center; }

/* Bordo punteggiato, largo e molto trasparente = permeabilità verso
   l'esterno (Comunità, la base aperta a tutti). Bordo pieno = l'organo
   più "in risalto" (Assemblea, solenne). Punteggiato fine, opacità
   ridotta = concentrazione/precisione (Comitato, il nucleo). */
.membrana {
  --colore-organo: var(--colore-comunita);
  inset: 0;
  border: 3px dotted var(--colore-organo);
  border-radius: 40% 60% 55% 45% / 55% 45% 60% 40%;
}

.strato--assemblea {
  --colore-organo: var(--colore-assemblea);
  top: 16%; right: 30%; bottom: 24%; left: 8%;
  border: 2px solid var(--colore-organo);
  border-radius: 44% 56% 40% 60% / 62% 38% 66% 34%;
}

.strato--comitato {
  --colore-organo: var(--colore-comitato);
  opacity: 0.7;
  top: 32%; right: 50%; bottom: 36%; left: 28%;
  border: 2px dotted var(--colore-organo);
  border-radius: 46% 54% 44% 56% / 58% 42% 60% 40%;
}

/* Pagina Assemblea (.pagina-assemblea su <article>, vedi
   layouts/assemblea/single.html): stesso componente .cellula di
   Comunità, ma qui "Comunità" è un anello disabilitato (non un filtro
   funzionante come in Comunità) e il testo introduttivo è più lungo —
   rifiniture scopate a questa sola pagina, non toccano l'anello
   Comunità realmente cliccabile su Comunità. */
.pagina-assemblea .cellula {
  /* .comunita-intro__cellula si allunga quanto testo+filtri insieme
     (vedi .comunita-intro, grid-template-areas) — qui il testo è
     cresciuto e la cellula diventava sproporzionata. Il contenitore
     flex (align-items/justify-content: center) la centra già in
     verticale da solo, basta darle un tetto. */
  max-height: 20rem;
}
.pagina-assemblea .strato--assemblea { border-width: 1.5px; }
.pagina-assemblea .membrana {
  /* L'anello "Comunità" qui è puramente decorativo (disabled): niente
     reazione al passaggio del mouse, per non suggerire un'interazione
     che non esiste. */
  pointer-events: none;
}
.pagina-assemblea .riquadro-griglia:hover,
.pagina-assemblea .riquadro-griglia:focus-visible {
  /* Le card qui non sono cliccabili (a differenza di Comunità, dove
     .riquadro-griglia è un link): tolto l'hover tratteggiato per non
     suggerirlo, per ora — vedi nota in CLAUDE.md/diario se si
     riconsidera in futuro. */
  border-style: solid;
}

/* Un po' di margine sopra quando si salta qui con "↑ Filtri" in fondo
   alla pagina — altrimenti il salto arriva troppo preciso, a filo.
   Selettore su #filtri (non .sezione-filtri): in Comunità l'ancora è
   sulla sezione-filtri stessa, in Atlante è più in alto, sul blocco
   della scala delle categorie — #filtri funziona in entrambi i casi
   perché punta a dove l'id atterra davvero, non a una classe condivisa
   con un ruolo diverso pagina per pagina. */
#filtri { scroll-margin-top: 1.5rem; }

/* Etichette fuori dalla forma, sotto, stesso colore del bordo che
   rappresentano — il testo colorato è il vero controllo cliccabile,
   le forme sopra sono l'eco visivo. Sottolineatura = "è cliccabile". */
.legenda-governance {
  display: flex;
  flex-wrap: wrap;
  gap: 0.4rem 1.6rem;
  margin: 1.5rem 0 0;
}

.etichetta-organo {
  font-family: var(--font-dati);
  font-size: 0.85rem;
  background: none;
  border: none;
  border-bottom: 2px solid var(--colore-organo);
  color: var(--colore-organo);
  padding: 0.1rem 0.05rem 0.2rem;
  cursor: pointer;
  font-weight: 700;
}
.etichetta-organo:hover,
.etichetta-organo[aria-pressed="true"] { border-bottom-width: 4px; }
.etichetta-organo:focus-visible { outline: 3px solid var(--colore-organo); outline-offset: 3px; }
/* Con tre stili di bordo diversi (punteggiato/pieno/punteggiato
   trasparente), "più spesso" da solo non si legge sempre come "questo
   è selezionato" — un pallino davanti al testo lo rende inequivocabile. */
.etichetta-organo[aria-pressed="true"]::before { content: "● "; }
.etichetta-organo__conteggio { font-weight: 400; opacity: 0.75; }
/* Stesso linguaggio della cellula: punteggiato per Comunità (permeabile),
   pieno per Assemblea (in risalto), punteggiato e più trasparente per
   Comitato (il nucleo). */
.etichetta-organo[data-organo=""] { border-bottom-style: dotted; }
.etichetta-organo[data-organo="Comitato di Indirizzo"] { border-bottom-style: dotted; opacity: 0.7; }

/* Comuni rappresentati in Comitato: dimensione trasversale, un solo
   colore condiviso (non uno per organo). */
.sezione-comuni { margin: 1.75rem 0 0; }
.sezione-comuni__titolo {
  font-family: var(--font-dati);
  font-size: 0.72rem;
  letter-spacing: 0.03em;
  color: var(--colore-terra);
  opacity: 0.8;
  margin: 0 0 0.5rem;
}
.lista-comuni { display: flex; flex-wrap: wrap; gap: 0.3rem 1rem; }
.etichetta-comune {
  font-family: var(--font-dati);
  font-size: 0.8rem;
  background: none;
  border: none;
  border-bottom: 2px solid var(--colore-terra);
  color: var(--colore-terra);
  padding: 0.05rem 0.05rem 0.15rem;
  cursor: pointer;
}
.etichetta-comune:hover,
.etichetta-comune[aria-pressed="true"] { border-bottom-width: 4px; }

/* Ricerca, ordina, mescola — tutti bottoni/input diretti, mai un menu
   a tendina. */
.ricerca {
  box-sizing: border-box;
  height: 2.7rem;
  flex: 1 1 14rem;
  font-family: var(--font-testo);
  font-size: 0.95rem;
  padding: 0 0.8rem;
  background: var(--colore-crosta);
  color: var(--colore-terra);
  border: 1px solid var(--colore-confine);
  border-radius: 0;
}
/* Niente anello di outline qui: sui campi di testo il browser considera
   "focus-visible" anche il click del mouse, non solo la tastiera — un
   cambio di colore del bordo resta un segnale chiaro senza il bordo
   spesso che risultava fastidioso. */
.ricerca:focus-visible { outline: none; border-color: var(--colore-ulivo); }

.bottone {
  box-sizing: border-box;
  height: 2.7rem;
  display: inline-flex;
  align-items: center;
  justify-content: center;
  font-family: var(--font-dati);
  font-size: 0.78rem;
  letter-spacing: 0.03em;
  text-transform: uppercase;
  text-decoration: none;
  background: transparent;
  color: var(--colore-terra);
  border: 1px solid var(--colore-terra);
  border-radius: 0;
  padding: 0 0.85rem;
  cursor: pointer;
}
/* Variante piena larghezza, per una call-to-action (es. "Partecipa" in
   fondo a una sezione) invece di un controllo di UI stretto sul
   contenuto come i filtri/l'ordinamento — stesso linguaggio visivo di
   .bottone (bordo che si riempie in hover), solo più grande e a piena
   larghezza della colonna di lettura. */
.bottone--pieno {
  display: flex;
  width: 100%;
  height: 3.2rem;
  font-size: 0.85rem;
  margin: 1rem 0;
}
.bottone:hover { background: var(--colore-terra); color: var(--colore-crosta); }
/* Variante verde (Partecipa, 2026-09-16): per una call-to-action che
   deve risaltare rispetto al bordo neutro di .bottone — pieno di
   colore fin da subito (non solo in hover), sull'accento primario del
   Distretto invece del colore testo. */
.bottone--verde {
  background: var(--colore-ulivo);
  color: var(--colore-crosta);
  border-color: var(--colore-ulivo);
}
.bottone--verde:hover { background: var(--colore-terra); border-color: var(--colore-terra); color: var(--colore-crosta); }
/* Testo del pulsante in un elemento a sé (2026-09-16): dentro un
   flex container (.bottone--pieno) il flusso inline (corsivo, a capo)
   si comporta in modo imprevedibile — qui invece il testo ha un
   proprio blocco (inline-block, quindi comunque trattato come un unico
   flex item dal genitore) dentro cui il flusso inline normale torna a
   funzionare come nel resto del sito. */
.bottone__testo { display: inline-block; }
/* "Compila" e "manifestazione di interesse" separati da un divisore
   (2026-09-16): una barra verticale in linea, solo su desktop — vedi
   sotto per la strategia mobile, completamente diversa. */
.bottone__divisore {
  display: inline-block;
  width: 1px;
  height: 1em;
  vertical-align: -0.15em;
  background: currentColor;
  opacity: 0.6;
  margin: 0 0.6em;
}
/* Mobile: niente più testo su più righe dentro il flusso — il
   pulsante diventa una barra ancorata in fondo, con solo
   "manifestazione di interesse" (niente "Compila", niente divisore: su
   una barra così stretta il testo extra è solo rumore). "sticky" e non
   "fixed" apposta: il pulsante vive dentro <article> (dentro <main>),
   che finisce subito prima del <footer> — un elemento sticky non può
   restare ancorato oltre i bordi del proprio contenitore, quindi si
   stacca da solo e scorre via PRIMA che il footer appaia, senza alcun
   JS per "nascondersi" manualmente in quel punto. I due <hr
   class="divisore"> che nel flusso normale stavano ai lati del
   pulsante vanno nascosti insieme a lui: da ancorato non c'è più
   niente, ai suoi lati nel flusso, da separare. */
@media only screen and (max-width: 550px) {
  .bottone--fiorito em,
  .bottone--fiorito .bottone__divisore,
  hr.divisore {
    display: none;
  }
  .bottone--pieno.bottone--fiorito {
    position: sticky;
    bottom: 0;
    z-index: 20;
    margin: 0;
    height: 4.8rem;
    border-radius: 0;
  }
}
/* Spazio in fondo alla pagina (solo mobile) perché l'ultima sezione
   (newsletter) non finisca nascosta sotto il pulsante ancorato mentre
   è ancora "agganciato" (prima di staccarsi vicino al footer). */
.spazio-bottone-fisso { display: none; }
@media only screen and (max-width: 550px) {
  .spazio-bottone-fisso { display: block; height: 5.8rem; }
}

/* Divisore semplice, stesso linguaggio tratteggiato di
   .scheda-pubblico__scarica sopra — usato attorno al pulsante
   "Manifestazione di interesse" per separarlo dal testo intorno. */
.divisore {
  border: none;
  border-top: 1px dashed var(--colore-confine);
  margin: 1.5rem 0;
}

/* Contatti in evidenza (Partecipa, 2026-09-16): email e telefono
   su una riga sola separati da "|", centrati e più grandi del corpo
   del testo su desktop — in mobile niente separatore né centratura
   (spazio più stretto, meglio allineati a sinistra come il resto del
   testo). */
.contatti-evidenza {
  text-align: center;
  font-size: 1.25rem;
  margin: 1.5rem 0;
}
.contatti-evidenza a { text-decoration: none; }
.contatti-evidenza__separatore {
  display: inline-block;
  margin: 0 0.5em;
  opacity: 0.5;
}
@media only screen and (max-width: 550px) {
  .contatti-evidenza { text-align: left; }
  .contatti-evidenza__separatore { display: none; }
  .contatti-evidenza a { display: block; margin-top: 0.4rem; }
}

/* Iscrizione diretta alla newsletter in home (2026-08-21) — componente
   NON ancora collegato a un backend vero: su rsr.bio esiste già un
   form newsletter (Forminator, un plugin WordPress) ma è protetto da
   un nonce che scade e non è pensato per essere richiamato da un altro
   dominio, e non ha un gruppo/lista dedicato al Distretto. In attesa
   che venga creato un form Forminator apposta (collegato al gruppo
   DBTF), questo componente valida e mostra un esito plausibile ma non
   invia l'email da nessuna parte — vedi static/js/newsletter-home.js.
   Il campo è deliberatamente minimale (solo un sottolineato, niente
   riquadro) per leggersi come "scrivi qui" dentro il testo, non come un
   controllo di UI a sé stante — pulsanti e campo restano quindi stretti
   al loro contenuto (.bottone semplice, non .bottone--pieno: quello è
   per call-to-action isolate a piena larghezza, qui sono azioni dentro
   una riga di testo). */
.form-newsletter { margin: 1rem 0; }
.form-newsletter__etichetta {
  display: block;
  font-family: var(--font-dati);
  font-size: 0.85rem;
  color: var(--colore-terra);
  margin-bottom: 0.4rem;
}
.form-newsletter__riga {
  display: flex;
  align-items: center;
  gap: 1rem;
  flex-wrap: wrap;
}
.form-newsletter__campo {
  box-sizing: border-box;
  /* Stessa altezza di .bottone (2.7rem, anch'esso border-box): messi
     nella stessa riga flex, i due bordi finiscono esattamente sulla
     stessa linea invece di sfalsarsi in base al padding interno di
     ciascuno. */
  height: 2.7rem;
  flex: 1 1 14rem;
  min-width: 0; /* un input dentro flex non si restringe mai sotto il proprio contenuto senza questo, sporgendo dalla riga sotto i breakpoint stretti */
  font-family: var(--font-testo);
  font-size: 1.05rem; /* stessa dimensione del corpo del testo, non una dimensione da "controllo UI" a parte */
  font-style: italic;
  padding: 0 0 0.3rem;
  background: var(--colore-crosta);
  color: var(--colore-terra);
  border: none;
  /* Stesso colore del bordo di .bottone (--colore-terra), non più
     --colore-confine: campo e pulsante devono leggersi come due pezzi
     dello stesso controllo, non come due elementi indipendenti. */
  border-bottom: 1px solid var(--colore-terra);
  border-radius: 0;
}
.form-newsletter__campo::placeholder { font-style: italic; opacity: 0.6; }
.form-newsletter__campo:focus-visible { outline: none; border-bottom-color: var(--colore-ulivo); }
/* Il browser (autofill di Chrome) colora di celestino lo sfondo del
   campo appena riconosce un'email salvata — il trucco standard per
   sovrascriverlo è un box-shadow interno enorme dello stesso colore
   di sfondo della pagina, perché il background-color dell'autofill non
   è sovrascrivibile direttamente. */
.form-newsletter__campo:-webkit-autofill,
.form-newsletter__campo:-webkit-autofill:hover,
.form-newsletter__campo:-webkit-autofill:focus {
  -webkit-text-fill-color: var(--colore-terra);
  -webkit-box-shadow: 0 0 0 1000px var(--colore-crosta) inset;
  box-shadow: 0 0 0 1000px var(--colore-crosta) inset;
  transition: background-color 5000s ease-in-out 0s;
}
.form-newsletter .bottone { flex: 0 0 auto; }
.form-newsletter__esito {
  font-family: var(--font-dati);
  font-size: 0.85rem;
  color: var(--colore-ulivo-scuro);
  margin: 0.5rem 0 0;
  min-height: 1.2em; /* riserva lo spazio fin da subito, il testo che arriva al submit non deve far saltare il layout sotto */
}
.form-newsletter__esito--errore { color: #a33; }
/* Mobile (2026-08-22): quando .form-newsletter__riga va in wrap (sotto i
   550px, stesso breakpoint di .griglia), il pulsante "Iscriviti" va a
   piena larghezza sulla propria riga invece di restare stretto al testo —
   più facile da toccare, coerente con l'input sopra che occupa già tutta
   la larghezza disponibile. */
@media only screen and (max-width: 550px) {
  .form-newsletter .bottone {
    flex: 1 1 100%;
    width: 100%;
  }
}

/* Stampa + modalità lettura per pagine semplici (Il Distretto,
   Governance, 2026-08-21) — stesso pattern già in uso per l'articolo
   Atlante "Evoluzione del Biologico", qui senza il pannello grafici/
   mappa che lì serviva la sua CSS dedicata. Vedi
   static/js/azioni-articolo-generico.js per il comportamento. */
.azioni-articolo {
  display: flex;
  gap: 0.5rem;
  margin-bottom: 1.5rem;
}
/* Il vero schermo intero del browser (Fullscreen API, non una classe
   che finge il fullscreen): senza sfondo esplicito il browser
   mostrerebbe il nero di sistema attorno/dietro al contenuto se questo
   non riempie tutto lo schermo. overflow-y perché il testo è quasi
   sempre più alto della viewport. */
.pannello-lettura:fullscreen {
  background: var(--colore-crosta);
  overflow-y: auto;
  padding: 2rem var(--spazio);
}
.bottone[aria-pressed="true"] { background: var(--colore-terra); color: var(--colore-crosta); }
/* Senza questa regola un bottone disabled (es. "Isola"/"Reset" prima di
   un filtro, vedi mappa-evoluzione.js) è indistinguibile da uno attivo:
   stesso colore pieno, stesso cursore a mano — sembra cliccabile anche
   se non lo è. Niente cursore "divieto" (scartato esplicitamente): la
   sola opacità ridotta basta come segnale. */
.bottone:disabled { opacity: 0.4; }
.bottone:disabled:hover { background: transparent; color: var(--colore-terra); }
/* Necessaria perché .bottone ha già un display esplicito, che altrimenti
   scavalca il default del browser per l'attributo hidden — senza questa
   riga "Isola" (mappa-evoluzione.js) restava visibile anche senza
   filtro attivo, stesso problema già risolto per .riquadro-griglia. */
.bottone[hidden] { display: none; }

/* I tre pulsanti di ordinamento (Titolo/Data/Numero) usano ".bottone"
   tale quale — niente stile a parte: corretto dopo un fraintendimento,
   il grassetto+pallino "come in Comunità" era inteso per i filtri di
   categoria della scala (Indagini/Sguardi/Scenari), non per questi. */

.contatore-risultati {
  font-family: var(--font-dati);
  font-size: 0.78rem;
  opacity: 0.65;
  margin-left: auto;
}

/* "Cosa offre il territorio": filtro prodotti/risorse con conteggi,
   i più diffusi per primi. Oltre un certo numero si comprimono dietro
   "+ N altri". */
/* .sezione-prodotti sta ora a piena larghezza sopra le card (non più
   nella colonna filtri: con molti prodotti/servizi diversi sarebbe
   stata troppo stretta). .sezione-tipo resta nella colonna, ultima
   della lista quindi solo margine sopra, non sotto. */
.sezione-prodotti {
  grid-column: 1 / -1;
  margin: 0.5rem 0 2rem;
  padding-bottom: 1rem;
  border-bottom: 1px solid var(--colore-confine);
}
.sezione-tipo {
  margin: 1.75rem 0 0;
  padding-bottom: 1rem;
  border-bottom: 1px solid var(--colore-confine);
}
.sezione-prodotti__titolo,
.sezione-tipo__titolo,
.sezione-tag__titolo,
.sezione-autori__titolo {
  font-family: var(--font-dati);
  font-size: 0.72rem;
  letter-spacing: 0.04em;
  text-transform: uppercase;
  opacity: 0.65;
  margin: 0 0 0.6rem;
}
.sezione-prodotti__titolo--risorse { margin-top: 1.25rem; }

.lista-prodotti,
.lista-risorse,
.lista-tipi,
.lista-tag,
.lista-autori { display: flex; flex-wrap: wrap; gap: 0.4rem; align-items: center; }

/* Sezione Autori/Tag su Atlante — stesso pattern di "Cosa offre il
   territorio" in Comunità (elenco costruito da JS con conteggi, "+ N
   altri"), raggiungibile con "Filtri" nella barra fissa. L'id="filtri"
   non è su questa sezione ma più in alto, sul blocco della scala delle
   categorie (vedi layouts/atlante/list.html) — così il salto include
   anche la scala e non solo Tag/Autori. */
.sezione-tag { margin: 1.5rem 0 0; }
.sezione-autori {
  margin-top: 1.25rem;
  padding-bottom: 1rem;
  border-bottom: 1px solid var(--colore-confine);
}

.tag-prodotto {
  font-family: var(--font-dati);
  font-size: 0.78rem;
  background: transparent;
  color: var(--colore-terra);
  border: 1px solid var(--colore-confine);
  border-radius: 0;
  padding: 0.35rem 0.65rem;
  cursor: pointer;
}
.tag-prodotto:hover { border-color: var(--colore-terra); }
.tag-prodotto[aria-pressed="true"] { background: var(--colore-terra); color: var(--colore-crosta); border-color: var(--colore-terra); }
.tag-prodotto__conteggio { opacity: 0.6; }

/* Risorse condivisibili: stesso comportamento del facet prodotti, ma
   colore diverso (verde ulivo) per restare distinguibile — anche sulle
   card, vedi .etichetta--risorsa sotto. */
.tag-risorsa {
  font-family: var(--font-dati);
  font-size: 0.78rem;
  background: transparent;
  color: var(--colore-ulivo-scuro);
  border: 1px solid var(--colore-confine);
  border-radius: 0;
  padding: 0.35rem 0.65rem;
  cursor: pointer;
}
.tag-risorsa:hover { border-color: var(--colore-ulivo-scuro); }
.tag-risorsa[aria-pressed="true"] { background: var(--colore-ulivo-scuro); color: var(--colore-crosta); border-color: var(--colore-ulivo-scuro); }

.mostra-altri {
  font-family: var(--font-dati);
  font-size: 0.78rem;
  background: transparent;
  color: var(--colore-terra);
  border: 1px dashed var(--colore-confine);
  border-radius: 0;
  padding: 0.35rem 0.65rem;
  cursor: pointer;
}

/* Badge sulle card membro: rettangoli senza smussatura, colorati e
   pieni per l'organo, a contorno sottile e monocromatici per
   prodotti/risorse — deliberatamente diverso da .tag-elenco (che è
   arrotondato), non un'incoerenza. */
/* Pagina del singolo membro: ogni categoria (organo, tipo, prodotti,
   risorse) nel proprio gruppo con una micro-etichetta — evita di
   scaricare tutto in un elenco indistinto quando le categorie sono
   più di una. */
.etichette-gruppo { margin-top: 1rem; }
.etichette-gruppo__titolo {
  font-family: var(--font-dati);
  font-size: 0.72rem;
  letter-spacing: 0.04em;
  text-transform: uppercase;
  opacity: 0.65;
  margin: 0 0 0.5rem;
}

.etichette { display: flex; flex-wrap: wrap; gap: 0.35rem; margin-top: 0.7rem; }

.etichetta {
  font-family: var(--font-dati);
  font-size: 0.68rem;
  letter-spacing: 0.02em;
  /* Niente text-transform: uppercase (tolto il 2026-07-15) — i valori
     in front matter arrivano già scritti con l'iniziale maiuscola
     (es. "Az. Agricola Bio Certificata"), non serve forzare il
     maiuscolo pieno: "solo la capital letter", non tutto maiuscolo. */
  padding: 0.2rem 0.5rem;
  border-radius: 0;
  line-height: 1.5;
}
.etichetta--organo {
  color: var(--colore-crosta);
  background: var(--colore-organo);
  font-weight: 700;
}
/* Prodotti in vendita: marrone scuro pieno, il colore "principale" del
   sito — risorse condivisibili: verde ulivo a contorno, per restare
   distinguibile a colpo d'occhio senza aggiungere un terzo colore. */
.etichetta--prodotto {
  color: var(--colore-crosta);
  background: var(--colore-terra);
}
.etichetta--risorsa {
  color: var(--colore-ulivo-scuro);
  background: transparent;
  border: 1px solid var(--colore-ulivo-scuro);
}
.etichetta--tipo {
  color: var(--colore-terra);
  background: transparent;
  border: 1px solid var(--colore-confine);
}
/* Indicatore muto (non cliccabile) quando ci sono più etichette di
   quante ne mostriamo sulla card — il dettaglio completo è comunque a
   un click, sulla pagina del membro. */
.etichetta--altre {
  color: var(--colore-terra);
  background: transparent;
  border: 1px dashed var(--colore-confine);
  opacity: 0.7;
}

/* Comune sulla card: piccolo, sotto il nome — non l'etichetta grande
   in cima a .riquadro-griglia (quella resta per codici tipo "A-13"). */
.riquadro-membro__comune {
  display: block;
  font-family: var(--font-dati);
  font-size: 0.78rem;
  opacity: 0.7;
  margin-top: 0.2rem;
}

footer.piede {
  border-top: 1px solid var(--colore-confine);
  font-family: var(--font-dati);
  font-size: 0.8rem;
  color: var(--colore-terra);
  /* Basso uguale al padding-top di .piede__nota-fine (2026-08-22,
     richiesta esplicita): l'ultima riga risulta così centrata tra il
     filo sopra di lei e il fondo della pagina, non più più vicina
     all'uno che all'altro. */
  padding: 1.5rem 0 1.5rem;
}
footer.piede .contenitore { display: flex; flex-direction: column; gap: 0.75rem; }
/* Solo in stampa: a schermo l'indirizzo della pagina si vede già nella
   barra del browser. */
.piede__link-pagina { display: none; }

/* Dati organizzativi (2026-08-22, compattato lo stesso giorno da 3 a 4
   colonne per stare tutto — vecchio blocco "meta" e sostenitore
   compresi — nello stesso filo): sede legale/operativa, contatti,
   sostenitore. Stessi breakpoint del resto del sito (980px, 550px) per
   coerenza, non una soglia propria come nel primo giro. */
.piede__organizzazione {
  display: grid;
  grid-template-columns: repeat(4, 1fr);
  gap: var(--spazio);
}
@media only screen and (max-width: 980px) {
  .piede__organizzazione { grid-template-columns: repeat(2, 1fr); }
}
@media only screen and (max-width: 550px) {
  .piede__organizzazione { grid-template-columns: 1fr; gap: 1rem; }
}
.piede__colonna p { margin: 0; line-height: 1.6; }
.piede__colonna p + p { margin-top: 0.3rem; }
.piede__colonna .piede__titolo-colonna {
  font-size: 0.72rem;
  text-transform: uppercase;
  letter-spacing: 0.06em;
  color: var(--colore-ulivo-scuro);
  margin-bottom: 0.5rem;
}
.piede__colonna .piede__fiscale {
  margin-top: 0.6rem;
  opacity: 0.75;
  font-size: 0.75rem;
}
/* Quarta colonna, il sostenitore: stessa struttura etichetta+contenuto
   delle altre tre (non più un blocco a parte allineato a destra) —
   colori del logo lasciati invariati, sono quelli del marchio del
   sostenitore, non della palette del sito. Stessa classe riusata anche
   nella colonna "Sede legale" per il logo di Rete Semi Rurali (stessa
   dimensione, coerenza tra i due loghi in footer). */
.piede__logo-sostenitore {
  display: block;
  height: 3.2rem;
  width: auto;
  flex-shrink: 0;
}

/* Colonna "Sede legale": logo e testo affiancati invece che impilati
   (unico caso in footer con questa combinazione, le altre colonne sono
   solo testo o solo logo). */
.piede__riga-logo {
  display: flex;
  align-items: center;
  gap: 0.75rem;
}

/* Nota di chiusura compatta (copyright/licenza/peso pagina/credito
   font): una sola riga con separatori "·", più piccola e attenuata —
   sono informazioni minori, non hanno bisogno di una riga ciascuna.
   padding-top uguale al padding-bottom di footer.piede, vedi sopra. Sulle
   pagine Atlante prende anche .colonna-lettura (vedi footer.html): qui
   basta non sovrascriverne margin/max-width. */
.piede__nota-fine {
  margin: 0;
  padding-top: 1.5rem;
  border-top: 1px solid var(--colore-confine);
  font-size: 0.72rem;
  line-height: 1.7;
  opacity: 0.8;
}
.piede__nota-fine.colonna-lettura { margin: 0 auto; }
@media print {
  .piede__link-pagina { display: block; }
  /* Il peso della pagina è una metrica di trasparenza per chi la legge
     a schermo (byte scaricati) — su carta non ha senso, sarebbe solo
     rumore. Sitewide: il footer con questa riga compare su ogni
     pagina, non solo su quelle Atlante. */
  #peso-pagina { display: none; }

  /* Bottoni Stampa/Modalità lettura: non hanno senso su carta (vedi
     .azioni-articolo, static/js/azioni-articolo-generico.js). */
  .azioni-articolo { display: none; }

  /* Tabelle (Il Distretto, Governance): .tabella-scroll a schermo
     forza min-width: 38rem per leggibilità (vedi sopra) — in stampa
     non c'è scroll, quella soglia farebbe uscire la tabella dal
     margine del foglio invece di adattarsi. Il breakout "full bleed"
     (.tabella-scroll, media screen and min-width:981px) non si applica
     già di suo in stampa, essendo un media "screen" — qui basta
     annullare il min-width e ridurre font/padding perché una tabella a
     4 colonne (es. "Approfondimento normativa") entri nella pagina. */
  .tabella-scroll table {
    min-width: 0;
    font-size: 0.7rem;
  }
  .tabella-scroll th,
  .tabella-scroll td {
    padding: 0.3rem 0.4rem;
  }
}

/* Banner notizie/eventi in home — a piena larghezza, esce da
   .contenitore (42rem) con lo stesso trucco "full bleed" già usato per
   il template Atlante "moduli" (margine negativo pari a metà viewport). */
.banner-notizie {
  width: 100vw;
  margin: 0 calc(-50vw + 50%);
  overflow: hidden;
  background: var(--colore-notizie);
  /* Altezza riservata fin dal primo paint (padding + una riga di testo,
     stessa geometria di .banner-notizie__voce sotto): il fetch degli
     eventi veri (static/js/banner-notizie.js) ci mette un momento a
     rispondere, senza questo il banner comparirebbe vuoto e poi
     "salterebbe" in altezza quando arriva il contenuto. */
  min-height: 2.6rem;
}
/* Solo mentre carica: il ticker vero è "width: max-content" (allineato
   a sinistra per costruzione, la larghezza segue il contenuto), ma un
   segnaposto solo non deve stare incollato al bordo — qui il
   contenitore si allarga a piena larghezza e centra quell'unica voce. */
.banner-notizie--caricamento .banner-notizie__scorrimento {
  width: 100%;
  justify-content: center;
}
.banner-notizie__scorrimento {
  display: flex;
  /* "center" centra il RIQUADRO di ogni voce, non il testo dentro di
     esso — con un solo rigo, senza a capo, il riquadro coincide col
     testo solo se il font non ha spazio ascendente/discendente
     asimmetrico intorno alla riga: il font della pagina (come molti
     font) ne ha, e "center" lascia leggermente più margine sotto che
     sopra. "baseline" allinea sulla base dei caratteri invece che sul
     riquadro: elimina quello scarto ottico verso l'alto. */
  align-items: baseline;
  width: max-content;
  gap: 3rem;
  padding: 0.65rem 0;
  animation: banner-notizie-scorri 110s linear infinite;
  cursor: grab; /* si può trascinare per cercare una notizia, vedi banner-notizie.js */
  touch-action: pan-y; /* lo scorrimento verticale della pagina resta al browser, quello orizzontale lo gestisce lo script */
}
/* In pausa (con rallentamento graduale via JS, vedi
   static/js/banner-notizie.js — questa regola resta come base/fallback
   se lo script non è ancora partito o è disabilitato) passandoci sopra
   il mouse o navigando a tastiera dentro — dà il tempo di leggere una
   voce specifica invece di rincorrerla. */
.banner-notizie:hover .banner-notizie__scorrimento,
.banner-notizie:focus-within .banner-notizie__scorrimento {
  animation-play-state: paused;
}
.banner-notizie__voce {
  flex: 0 0 auto;
  white-space: nowrap;
  padding: 0 1.5rem;
  font-family: var(--font-dati);
  font-size: 1.05rem; /* stessa dimensione (ereditata dal corpo del testo) dei titoli delle altre card in home — .riquadro-griglia__titolo non ha una sua dimensione esplicita */
  color: var(--colore-terra); /* testo scuro, non bianco: più leggibile sul fondo chiaro */
  text-decoration: none;
}
/* Segnaposto "Prossimi eventi…" mostrato finché il fetch non risponde
   (vedi banner-notizie.html/js) — stessa geometria/tipografia della
   voce vera per non far saltare l'altezza quando viene sostituito,
   colore più tenue per segnalare che è transitorio, non un evento
   vero. Dissolvenza alla rimozione invece di uno scatto secco. */
.banner-notizie__caricamento {
  flex: 0 0 auto;
  padding: 0 1.5rem;
  font-family: var(--font-dati);
  font-size: 1.05rem;
  color: var(--colore-terra);
  opacity: 0.55;
  transition: opacity 0.4s ease;
}
.banner-notizie__caricamento--esce { opacity: 0; }
.banner-notizie__voce:hover,
.banner-notizie__voce:focus {
  text-decoration: underline; /* le voci sono ora link veri — un segnale di interattività aiuta a scoprirlo */
}
/* Le maiuscole occupano tutta l'altezza fino alla riga superiore, il
   testo normale accanto no (poche lettere come "l"/"b"/"d" arrivano
   altrettanto in alto): stessa linea di base, ma il titolo "pesa" di
   più in alto — un po' più piccolo lo riequilibra otticamente, tecnica
   tipografica comune per titoli in maiuscolo accanto a testo normale. */
.banner-notizie__voce strong { font-weight: 700; text-transform: uppercase; font-size: 0.92em; }
@keyframes banner-notizie-scorri {
  from { transform: translateX(0); }
  to { transform: translateX(-50%); } /* le voci sono duplicate una volta: -50% riporta esattamente all'inizio del "giro" successivo, senza scatti */
}

/* Tabelle (Il Distretto, Governance): nessuno stile di default esisteva
   finora (larghezza automatica sul contenuto, testo centrato
   verticalmente dal browser) — testo sempre allineato in alto a
   sinistra invece che al centro. Pensate mobile-first (2026-08-21): il
   wrapper .tabella-scroll (da aggiungere a mano nel markdown attorno a
   ogni <table>, nessun modo CSS-only di avvolgere un elemento
   esistente) scorre in orizzontale sotto una certa larghezza — le
   colonne restano leggibili invece di schiacciarsi — e su schermi più
   larghi (>980px, stesso punto di rottura già in uso nel resto del
   sito) esce dalla colonna di lettura (--misura-max, 42rem: pensata per
   il testo lungo, stretta per una tabella a più colonne) con lo stesso
   trucco "full bleed" già usato per .banner-notizie, ma centrata su una
   misura propria più ampia (--misura-tabella) invece di andare
   edge-to-edge come il banner. */
.tabella-scroll {
  overflow-x: auto;
  margin: 1.25rem 0;
}
table {
  width: 100%;
  border-collapse: collapse;
  margin: 0;
}
.tabella-scroll table {
  /* Sotto questa soglia le colonne diventerebbero illeggibili: meglio
     forzare lo scroll del wrapper che schiacciare il testo. */
  min-width: 38rem;
}
th, td {
  text-align: left;
  vertical-align: top;
  padding: 0.6rem 0.85rem;
  border: 1px solid var(--colore-confine);
}
th { font-family: var(--font-titoli); font-weight: 700; }

/* Cella con il requisito più stringente tra le due normative a
   confronto (Governance, tabella LR/DM) — solo una tinta leggera di
   --colore-ulivo sullo sfondo, per restare leggibile e non competere
   con il grassetto già usato dentro le celle. */
td.cella-selettiva {
  background: color-mix(in srgb, var(--colore-ulivo) 10%, var(--colore-crosta));
}

@media only screen and (min-width: 981px) {
  .tabella-scroll {
    width: 100vw;
    margin-left: calc(-50vw + 50%);
    margin-right: calc(-50vw + 50%);
    padding: 0 var(--spazio);
  }
  .tabella-scroll table {
    max-width: var(--misura-tabella);
    min-width: 0;
    margin: 0 auto;
  }
  /* Dentro un <details> (es. "Approfondimento: confronto tra normativa
     regionale e nazionale"): il calcolo del "full bleed" ignora il
     bordo/padding del <details> che la contiene, la tabella sfondava
     verso sinistra oltre la riga del bordo invece di restare dentro il
     riquadro. Qui niente uscita dalla colonna: solo lo scroll
     orizzontale del wrapper, dentro i confini del <details>. */
  details .tabella-scroll {
    width: auto;
    margin-left: 0;
    margin-right: 0;
    padding: 0;
  }
  details .tabella-scroll table {
    max-width: none;
    margin: 0;
  }
}

/* Timeline verticale (Il Distretto, sezione "Il percorso", 2026-08-21):
   una linea continua con un pallino per voce, stesso linguaggio visivo
   del resto del sito (pallino pieno come .pallino della legenda mappa,
   non un'icona). Nessun JS: solo CSS.
   Linea (::after) e pallino (::before) erano prima due sistemi di
   posizionamento indipendenti (border-left sull'elemento + left in rem
   calcolato a mano sullo pseudo-elemento): l'arrotondamento tra i due
   li disallineava di un paio di pixel, la linea non passava nel centro
   del pallino (segnalato dopo la prima versione). Ora condividono lo
   stesso riferimento — entrambi a `left: 0` rispetto a
   `.timeline__voce`, centrati con `translateX(-50%)`, che centra
   sempre sulla propria larghezza calcolata dal browser invece che su
   un valore scritto a mano: concentrici per costruzione, non serve più
   che i conti tornino. */
.timeline {
  list-style: none;
  margin: 1.5rem 0;
  padding: 0;
}
.timeline__voce {
  position: relative;
  padding: 0 0 1.5rem 1.75rem;
}
.timeline__voce:last-child { padding-bottom: 0; }
/* Il markdown dentro ogni <li> produce un <p> (serve perché il testo
   abbia link/corsivo funzionanti, non solo HTML grezzo — vedi
   content/il-distretto/_index.md): tolto il margine di default per non
   aggiungere spazio, lo spaziamento tra le voci è già dato dal padding
   sopra. */
.timeline__voce p { margin: 0; }
.timeline__voce::before {
  content: "";
  position: absolute;
  left: 0;
  top: 0.3rem;
  width: 0.6rem;
  height: 0.6rem;
  border-radius: 50%;
  background: var(--colore-ulivo);
  transform: translateX(-50%);
  /* Senza z-index il pallino (::before, generato per primo) dipinge
     sotto la linea (::after, generato per secondo) dove si
     sovrappongono — ordine di generazione, non di scrittura nel CSS. */
  z-index: 1;
}
.timeline__voce::after {
  content: "";
  position: absolute;
  left: 0;
  top: 0;
  bottom: 0;
  width: 1px;
  background: var(--colore-confine);
  transform: translateX(-50%);
}
.timeline__voce:last-child::after { display: none; }
.timeline__periodo {
  display: block;
  font-family: var(--font-dati);
  font-size: 0.78rem;
  letter-spacing: 0.03em;
  text-transform: uppercase;
  font-weight: 700;
  color: var(--colore-ulivo-scuro);
  margin-bottom: 0.3rem;
}

@media (prefers-reduced-motion: reduce) {
  * { scroll-behavior: auto !important; transition: none !important; }
  /* Il banner notizie usa "animation", non "transition" — non coperto
     dalla regola sopra. Ferma lo scorrimento e lascia leggere tutte le
     voci senza dover aspettare né passarci sopra col mouse. */
  .banner-notizie__scorrimento {
    animation: none;
    flex-wrap: wrap;
    width: auto;
  }
}
