/* ==========================================================================
   CartoNoir — Design System editoriale luxury
   Direzione: noir e blu notte di fondo, avorio che respira, oro firma e
   verde accento (45·25·20·7·3). Tipografia Cormorant Garamond + Archivo, angoli vivi.
   Fotografia protagonista, con slot e segnaposti eleganti pronti a ricevere
   le immagini reali (CSP: img-src 'self' data:; nessuna immagine remota).

   Uso: <link rel="stylesheet" href="/brand.css"> e <body class="ed">.
   Componenti prefissati "ed-". Script complementare: /brand.js.
   ========================================================================== */

@import url('https://fonts.googleapis.com/css2?family=Cormorant+Garamond:ital,wght@0,300;0,400;0,500;0,600;1,300;1,400;1,500&family=Archivo:wght@400;500;600;700&display=swap');

:root {
  /* ---- Colori di marca (brandbook, tavola 04) ---------------------------
     Proporzioni d'uso: noir 45 · blu notte 25 · avorio 20 · oro 7 · verde 3.
     Il noir domina, l'avorio respira, l'oro firma. Un solo elemento oro per
     schermata (folio escluso).
     NB: il prefisso --cn-* è già occupato da public/app.css per la palette
     adattiva della guida; la marca vive sotto --brand-*. */
  --brand-noir: #0D0E10;
  --brand-blu-notte: #101B29;
  --brand-avorio: #F2ECDF;
  --brand-oro: #C9A662;
  --brand-verde: #3A4F42;

  /* Derivati: né l'oro pieno né --brand-oro-deep raggiungono AA come TESTO
     su avorio (oro pieno ~1.9:1, oro-deep ~2.88:1 — sotto il 4.5:1 richiesto
     per il testo normale e sotto il 3:1 per il testo grande). Restano quindi
     i colori giusti per filetti, stelle, bordi, pulsanti e fondi: su noir e
     blu notte l'oro pieno va bene anche come testo. */
  --brand-oro-deep: #A8873F;
  --brand-oro-soft: #E0C68C;
  /* Terzo oro, riservato al SOLO caso "oro che fa da testo su fondo chiaro"
     (avorio o paper-raise): #7A6229 misura 4.95:1 su --brand-avorio e 5.45:1
     su --paper-raise (calcolo con la funzione di contrasto di
     scripts/browser-qa.mjs), sopra la soglia 4.5:1 del testo normale.
     Non tocca filetti/bordi/icone/pulsanti/fondi, che restano oro pieno o
     oro-deep — e non tocca l'oro che fa da testo su noir/blu notte, dove
     l'oro pieno legge già bene. */
  --brand-oro-testo: #7A6229;
  --brand-avorio-2: #E6DECD;
  --brand-noir-2: #16181C;
  --brand-blu-2: #0A121C;

  /* Velatura obbligatoria sotto il testo che sta su fotografia (tavola 17). */
  --brand-velo: rgba(13, 14, 16, .55);

  /* ---- Alias storici ---------------------------------------------------
     I nomi usati da 3.000 righe di CSS restano vivi e puntano ai token di
     marca: cambiare un valore qui sopra ricolora tutto il sito. La pulizia
     dei nomi avviene lotto per lotto, non in un colpo solo. */
  --paper: var(--brand-avorio);
  --paper-raise: #FBF7EF;
  --paper-2: var(--brand-avorio-2);
  --paper-3: #D8CDB6;

  --ink: var(--brand-noir);
  --ink-soft: #4A4F57;
  --ink-faint: #8A8F98;

  --navy: var(--brand-blu-notte);
  --navy-2: var(--brand-blu-2);
  --espresso: var(--brand-blu-notte);
  --espresso-2: var(--brand-blu-2);

  --accent: var(--brand-oro);
  --accent-deep: var(--brand-oro-deep);
  --accent-soft: var(--brand-oro-soft);
  --brass: var(--brand-oro);

  /* Linee */
  --line: rgba(13, 14, 16, .14);
  /* --line-strong era .26, e a .26 il filetto di OGNI comando secondario e di
     OGNI campo dei moduli misurava 1,79:1 sull'avorio — 59 elementi su 6 rotte,
     censiti uno per uno in docs/brand/qa/r-rifiniture-sistema.md §2. WCAG
     1.4.11 chiede 3:1 al confine di un comando.
     .46 è il primo valore con un margine: .45 cade esatto su 3,000:1 e
     qualunque ritocco futuro a un fondo lo riporterebbe sotto. Misurato
     rendendo le alfa sul sito vero, non calcolato a tavolino.
     Perché proprio questa soglia e non una a piacere: lo STESSO componente su
     fondo scuro stava già a 3,19:1 (`.hero-brand-testo .ed-btn-outline`, riga
     ~735, rgba(242,236,223,.38)). Il chiaro era rimasto indietro: è una svista
     di simmetria, non una scelta.
     Nessun colore nuovo — la palette lo vieta: è lo stesso --brand-noir
     (#0D0E10), cambia solo la velatura.
     ⚠ CHI TOCCA QUESTO VALORE GUARDI ANCHE public/crea-guida.css (.cg-custom-apply:disabled):
     lì il token era finito a fare da FONDO invece che da filetto, e alzarlo
     insieme avrebbe portato quel pulsante da 1,54:1 a 1,09:1. Decisione del
     committente del 30/07/2026. */
  --line-strong: rgba(13, 14, 16, .46);
  --line-light: rgba(242, 236, 223, .18);
  /* --line-light-strong era .34, ed è ESATTAMENTE la stessa svista di simmetria
     che il 30/07 ha portato --line-strong da .26 a .46, guardata dall'altro
     lato. Su fondo scuro .34 misura 2,815:1 (button.ed-pill della prima
     schermata, censimento del 03/08), sotto il 3:1 di WCAG 1.4.11 — mentre lo
     STESSO componente, il pulsante secondario dell'hero, dichiara a mano
     rgba(242,236,223,.38) e sta a 3,188:1 (riga ~735). Il token era rimasto
     indietro rispetto al valore scritto per esteso a due schermate di distanza.
     .38 non è quindi un valore scelto a piacere: è quello che il sito già usa,
     reso e misurato il 03/08 su ogni superficie scura in cui il token arriva —
     .ed-pill 3,195:1, i campi e i pulsanti del Memory Book 3,16-3,22:1, le
     frecce del visore di /anteprima 3,195:1. Nessun colore nuovo: è lo stesso
     avorio di marca (#F2ECDF), cambia solo la velatura.
     LA TRAPPOLA DI --line-strong QUI NON C'È, e la si è cercata PRIMA di
     muovere il token, non dopo: --line-light-strong compare in tre punti
     (.ed-btn-ghost qui sotto, .ed-dark .ed-pill, .prezzi span di home.html) e
     in tutti e tre fa da BORDO, mai da fondo. Nessuna riga compagna serve —
     e questa frase esiste perché la prossima persona non debba rifare la
     ricerca per scoprire che non serviva.
     Il fratello chiaro --line (.14) invece NON si può alzare, e la ragione sta
     scritta in public/crea-guida.css accanto alle pastiglie del configuratore.
     Sorvegliato da test/r-filetto-comandi.test.js, regole C e D. */
  --line-light-strong: rgba(242, 236, 223, .38);

  /* Stati */
  --error: #A3402E;
  --error-bg: #F6E5DF;
  /* --ok era #4D7C52: 4,16-4,17:1 su --ok-bg e su --paper, sotto il 4,5:1
     richiesto (misurato da .ed-note-ok e .avviso-ok, audit lotto 2 task 6).
     Scurito a parità di tinta a 4,88-4,93:1 su entrambi gli sfondi chiari in
     cui il token compare oggi: la correzione vive qui, non nei due usi. */
  --ok: #437049;
  --ok-bg: #E7F0E5;

  /* Tipografia — vedi Task 3 per il caricamento dei font */
  --serif: 'Cormorant Garamond', 'Iowan Old Style', Garamond, Georgia, serif;
  --sans: 'Archivo', 'Segoe UI', -apple-system, system-ui, sans-serif;
  --mono: 'Consolas', ui-monospace, monospace;

  /* Spazio */
  --s1: 4px; --s2: 8px; --s3: 12px; --s4: 16px; --s5: 24px;
  --s6: 32px; --s7: 48px; --s8: 64px; --s9: 96px; --s10: 128px;
  --section: clamp(72px, 10vw, 144px);

  /* Angoli vivi ovunque: le uniche eccezioni del brandbook sono l'icona
     dell'app e il tag bagaglio. */
  --r-xs: 0; --r-sm: 0; --r-md: 0; --r-lg: 0; --r-pill: 0;
  --r-app-icon: 22%;
  --r-tag: 12px;

  /* Ombre: mai sul marchio, discrete altrove. */
  --shadow-sm: 0 2px 12px rgba(13, 14, 16, .10);
  --shadow-md: 0 18px 44px rgba(13, 14, 16, .16);
  --shadow-lg: 0 40px 90px rgba(10, 18, 28, .34);

  /* Contenitore */
  --maxw: 1240px;
  --maxw-text: 68ch;

  /* Motion */
  --ease: cubic-bezier(.16, 1, .3, 1);
  --ease-soft: cubic-bezier(.32, .72, 0, 1);
  --dur-1: .2s; --dur-2: .4s; --dur-3: .8s;

  /* Z */
  --z-header: 50; --z-overlay: 80; --z-skip: 100;

  /* Altezza dell'header fisso — unica fonte di verità. .ed-header-inner usa
     questo token per la propria min-height (invece di un padding verticale
     fisso) e body.ed-shell-solid lo riusa identico per l'offset del
     contenuto: un solo numero, non due che devono restare uguali per
     coincidenza. 97px = 1px di bordo + 96px di inner (60px del lockup
     .ed-brand, centrato verticalmente in min-height 96px). */
  --header-h: 97px;
}

/* ==========================================================================
   Base
   ========================================================================== */

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

body.ed {
  margin: 0;
  font-family: var(--sans);
  font-size: 17px;
  line-height: 1.65;
  color: var(--ink);
  background: var(--paper);
  -webkit-font-smoothing: antialiased;
  text-rendering: optimizeLegibility;
  overflow-x: hidden;
}

/* Peso 500: è il Display della tavola 04 («DISPLAY — CORMORANT 500 · 44/48»).
   Fino al 29/07 questa riga diceva 400 e, con specificità (0,1,2), schiacciava a
   400 anche le pagine che dichiaravano 500 sul proprio h1 (ordine, regalo,
   feedback, legali, agenzie): il peso prescritto non arrivava mai a video.
   Il CORPO non cambia: resta 17/28,05 (body.ed sopra), per decisione presa. */
body.ed h1, body.ed h2, body.ed h3, body.ed h4 {
  font-family: var(--serif);
  font-weight: 500;
  line-height: 1.02;
  letter-spacing: -.005em;
  margin: 0;
  text-wrap: balance;
}
body.ed p { margin: 0; }
/* ---- Il colore dei link: un DEFAULT, non una regola che vince su tutti ------
   A che serve. Il foglio del browser colora ogni <a> di blu (rgb(0,0,238)). Su
   un sito dove il colore lo decide il contesto — header noir, footer noir,
   sezioni .ed-dark — quel blu va sostituito da "prendi il colore di chi ti
   contiene". Questo è tutto ciò che serve.
   Perché :where(). La versione precedente scriveva
       body.ed a:not(.ed-btn) { color: inherit }
   che ha specificità (0,2,2) e quindi batteva OGNI regola scritta sul singolo
   link. Le vittime documentate sono TREDICI. Il numero è stato contato una
   voce per volta il 29/07 perché ne circolavano due sbagliati: «undici» qui
   (l'elenco ne nominava dieci) e «otto» nel rapporto C1 e nell'indice
   dell'audit — dove otto non era un totale, era l'ORDINE d'arrivo di
   `.ed-textlink`, l'ottava. Eccole, con la fonte:
     1  la navigazione                    | documento di apertura §3.1
     2  il bottone dell'hero              | (sette difetti già pagati)
     3  l'hover della navigazione         |
     4  l'hover del footer                |
     5  lo skip-link                      |
     6  l'anello di focus                 |
     7  i pulsanti-link                   |
     8  `.ed-textlink`, che la tavola 23 vuole oro   | audit v1 §5 (l'ottava)
     9  i link nel corpo di /privacy-policy, /terms,
        /agency-pilot: stessa tinta del testo, nessuna
        sottolineatura — WCAG 1.4.1 non soddisfatto | audit v4 §4
    10  quattro link di /crea-guida, fra cui quello
        all'informativa privacy                      | audit v2 §20
    11  la voce di fase attiva di /crea-guida
        (`.cg-steps-list a.is-active`, mai navy)     | audit v2 §21
    12  `.dcard`, le nove mete della home: noir su
        fotografia scura                             | revisione lotto 3
    13  `<a class="ed-btn">` senza variante: rendeva
        in BLU browser rgb(0,0,238) — prodotto dal
        `:not(.ed-btn)` della stessa regola           | controprova C1 §A
   Tredici, per una regola che doveva solo scavalcare il foglio del browser.
   :where() azzera la specificità di tutto ciò che contiene: questa regola vale
   (0,0,0). Basta e avanza per battere il foglio del browser (che è di origine
   inferiore, quindi perde a prescindere dalla specificità), e perde contro
   qualunque regola d'autore — comprese quelle di una sola classe, che è dove il
   colore dei link è giusto che viva. Il perimetro resta identico a prima
   (`body.ed a`), perché anche `body.ed` sta dentro il :where().
   Perché non c'è più :not(.ed-btn). Serviva quando questa regola vinceva su
   tutto: senza, i CTA-link ereditavano l'ink e sparivano sul fondo del bottone.
   A specificità zero il problema non può ripresentarsi — .ed-btn-primary,
   .ed-btn-ink, .ed-btn-outline e .ed-btn-ghost dichiarano il colore con una
   classe (0,1,0) e vincono. Toglierlo ha anzi chiuso un difetto vivo: sulla home
   `<a class="ed-btn">` senza variante rendeva in BLU browser, rgb(0,0,238)
   misurato ("Scegli i tuoi capitoli").
   AGGIORNAMENTO 29/07 (cantiere Z): quel pulsante era l'UNICO `.ed-btn` senza
   variante di tutto il sito, e la variante l'ha presa — `ed-btn-ink`, perché
   senza fondo restava a 1,00:1 dal testo vicino (WCAG 1.4.1). Chi cercasse qui
   il caso di prova non lo trova più nelle pagine; la ragione per cui questa
   regola sta a specificità zero resta però esattamente questa. */
:where(body.ed a) { color: inherit; }
body.ed img { display: block; max-width: 100%; }
/* I controlli di modulo NON ereditano font-family dal contenitore: il foglio del
   browser gliene impone una propria, e il calcolato esce "Arial". Misurati 53
   elementi su /crea-guida, .ed-nav-toggle su ogni pagina a 390, 14 su /anteprima
   e 6 su /memory-book. Oggi nessun glifo Arial è visibile perché quei nodi non
   contengono testo diretto — basta aggiungerne uno perché lo diventi, ed è il
   modo tipico in cui una terza famiglia entra in un sito a due famiglie.
   Solo `font-family`: `font: inherit` porterebbe con sé anche corpo e
   interlinea e rifarebbe la misura dei campi.
   :where() la tiene a specificità zero: è il default di sistema, e qualunque
   regola di pagina può ancora scavalcarla di proposito (per esempio un campo
   che vuole il monospazio). */
:where(button, input, select, textarea) { font-family: inherit; }
/* Anello di focus di sistema (Task 3 Step 2, corretto alla fonte in sede di
   revisione lotto 2): di default è oro-testo, l'unico oro che raggiunge 3:1
   (soglia richiesta per gli anelli di focus) sui fondi CHIARI dove il body
   nasce — avorio e paper-raise. L'oro pieno (--accent) usato prima misurava
   1,96:1 lì: sotto soglia su ogni pagina che non lo sovrascrive esplicitamente.
   Le regole sotto coprono gli UNICI due casi in cui oro-testo smette di
   leggersi: i fondi scuri di marca (dove torna l'oro pieno, già verificato
   leggibile su noir/blu notte — stessa nota della riga ~30) e i fondi già
   oro pieno (CTA primario, skip-link), dove l'anello deve essere noir per
   non sparire su se stesso.
   Geometria: 2px, offset 2px, angolo vivo (decisione del committente, 29/07).
   Non 1px come la riga in calce alla tavola 23: a 1px l'anello sparisce sui
   fondi chiari, ed è stato scartato dopo averlo guardato. */
body.ed :focus-visible { outline: 2px solid var(--brand-oro-testo); outline-offset: 2px; border-radius: 0; }
body.ed .ed-header :focus-visible,
body.ed .ed-footer :focus-visible,
body.ed .ed-dark :focus-visible,
body.ed .on-dark:focus-visible,
body.ed .hero-brand :focus-visible,
body.ed .ed-card-dark :focus-visible,
body.ed[data-shell-theme="dark"] :focus-visible {
  outline-color: var(--accent);
}
/* Superfici chiare annidate in una pagina/sezione scura (stessa famiglia di
   .ed-surface-light usata più sotto per i titoli): l'anello torna oro-testo
   perché il fondo lì sotto è di nuovo chiaro. */
body.ed[data-shell-theme="dark"] .ed-surface-light :focus-visible,
body.ed .ed-dark .ed-surface-light :focus-visible {
  outline-color: var(--brand-oro-testo);
}
/* Fondi già oro pieno: l'anello deve essere noir, altrimenti oro-su-oro è
   invisibile (misurato 1,00:1). Dichiarata per ultima apposta: a specificità
   pari con le regole "fondo scuro" qui sopra (un CTA primario può stare
   dentro l'header), l'ordine nel foglio decide ed è questa a dover vincere.
   L'anello va DENTRO. Con l'offset positivo del default, il filetto noir del
   CTA d'intestazione cadeva fuori dal bottone, cioè sul noir dell'header:
   noir su noir, 1,00:1, nessun segno di fuoco visibile su tutte le pagine
   (audit v3 §1, misurato). Con offset negativo il filetto resta sul fondo oro
   del bottone, dove il noir legge (8,38:1 misurato). -3px e non -2px perché
   .ed-btn ha 1,5px di bordo: l'anello deve stare dentro il bordo, non sopra. */
body.ed .ed-btn-primary:focus-visible,
body.ed .ed-skip:focus-visible {
  outline-color: var(--brand-noir);
  outline-offset: -3px;
}

/* ==========================================================================
   Layout
   ========================================================================== */

.ed-wrap { width: 100%; max-width: var(--maxw); margin-inline: auto; padding-inline: clamp(20px, 5vw, 64px); }
.ed-section { padding-block: var(--section); position: relative; }
.ed-section--tight { padding-block: clamp(48px, 6vw, 88px); }

.ed-dark { background: var(--espresso); color: var(--paper); }
.ed-dark h1, .ed-dark h2, .ed-dark h3, .ed-dark h4 { color: var(--paper); }

/* Occhiello di sezione. STESSA TRACCIATURA DI .ed-label: la tavola 04 definisce
   UNA riga sola per questo ruolo — «UI label · Archivo 600 · 12 · tracking 220
   (0,22em) · maiuscolo». Fino al 29/07 qui c'era .28em, cioè 3,3152px su
   11,84px, contro i 2,64px su 12px di .ed-label: due componenti con la stessa
   funzione e due tracciature diverse, su tutte le pagine e tutte le larghezze
   (audit v1 §17). Unificata a .22em. Il corpo resta .74rem: è un occhiello di
   sezione, non l'etichetta di un campo, e cambiarlo sarebbe una decisione di
   scala, non la chiusura di questo scostamento. */
.ed-eyebrow {
  display: inline-block; font-family: var(--sans);
  font-size: .74rem; font-weight: 600; letter-spacing: .22em;
  text-transform: uppercase; color: var(--brand-oro-testo);
}
.ed-dark .ed-eyebrow, .ed-eyebrow.on-dark { color: var(--accent-soft); }

/* 500 come i titoli: è lo stesso Display della tavola 04, usato anche fuori dai
   tag h1-h4 (occhielli display, numeri, aperture di sezione). */
.ed-display { font-family: var(--serif); font-weight: 500; line-height: .98; letter-spacing: -.03em; }
.ed-h1 { font-size: clamp(2.8rem, 6.5vw, 5.6rem); line-height: .98; }
.ed-h2 { font-size: clamp(2.1rem, 4.6vw, 3.6rem); }
.ed-h3 { font-size: clamp(1.5rem, 2.6vw, 2.2rem); }
/* Di norma il titolo sta su avorio, quindi l'enfasi in corsivo usa l'oro-testo
   (oro pieno qui sotto AA anche per il testo grande, 1.9:1). Dentro .ed-dark
   (o .on-dark) il titolo sta su noir/blu notte, dove l'oro pieno legge bene:
   qui torna l'oro di marca, non l'oro-testo pensato per fondi chiari. */
.ed-display em, .ed-h1 em, .ed-h2 em, .ed-h3 em { font-style: italic; color: var(--brand-oro-testo); }
.ed-dark .ed-display em, .ed-dark .ed-h1 em, .ed-dark .ed-h2 em, .ed-dark .ed-h3 em,
.ed-display.on-dark em, .ed-h1.on-dark em, .ed-h2.on-dark em, .ed-h3.on-dark em { color: var(--accent); }

.ed-lead { max-width: 56ch; color: var(--ink-soft); font-size: clamp(1.05rem, 1.3vw, 1.25rem); line-height: 1.7; }
.ed-dark .ed-lead { color: rgba(242, 236, 223, .82); }
.ed-muted { color: var(--ink-soft); }

/* ==========================================================================
   Skip link
   ========================================================================== */

/* Noir, non avorio: lo skip-link appare su fondo oro (--accent), e oro con
   testo chiaro non raggiunge AA (stessa ragione di .ed-btn-primary sotto).
   Il colore torna qui dentro, con una sola classe: serviva un aggancio
   `html body.ed a.ed-skip` (0,1,3) finché il default dei link valeva (0,2,2).
   Ora quel default è a specificità zero e una classe basta. */
.ed-skip {
  position: absolute; left: -9999px; top: 0; z-index: var(--z-skip);
  background: var(--accent); color: var(--brand-noir); padding: 12px 18px;
  font-family: var(--sans); font-weight: 600; text-decoration: none; border-radius: 0 0 var(--r-xs) 0;
}
.ed-skip:focus { left: 0; top: 0; }

/* ==========================================================================
   Header — noir pieno, filetto oro sottilissimo, nessuna ombra (tavola 21)
   ========================================================================== */

/* Colore dichiarato qui, sul contenitore, non sui singoli link (trappola §3.1
   del documento di apertura: «su fondo scuro il colore si dichiara sul
   contenitore»). Il testo dell'header arriva per eredità naturale da questa
   riga; i link non ne dichiarano uno proprio, così non c'è una seconda fonte
   di verità da tenere allineata quando l'header cambia fondo. */
.ed-header {
  position: fixed; top: 0; left: 0; right: 0; z-index: var(--z-header);
  background: var(--brand-noir);
  color: var(--brand-avorio);
  transition: border-color var(--dur-2) var(--ease);
  border-bottom: 1px solid rgba(201, 166, 98, .22);
}
/* LA NAVIGAZIONE SFORA A DESTRA, E QUANTO: dichiarato, non lasciato ambiguo.
   Il marchio è a filo con la colonna dei contenuti (--maxw 1240px) a OGNI
   larghezza — misurato su 11 rotte, 0px di scarto. La navigazione no: sopra i
   ~1200px esce dal bordo destro della colonna e arriva a +70,2px a 1440 e oltre.
   È un EFFETTO COLLATERALE, non una scelta: una fascia a tutta larghezza voluta
   avrebbe spostato anche il marchio, e la colonna è dichiarata proprio qui col
   `max-width` che la nav sfora per traboccamento del flex.
   Perché non è azzerato. Il riquadro di contenuto della colonna vale 1112px
   fissi da 1280px in su (1240 − 2×64 di padding). Il lockup ne prende 206,1 e il
   gap dell'header 36: alla navigazione ne restano 869,9. Le SETTE voci al
   tracking pieno .22em della tavola 04 misurano 820,1px di soli glifi; sei passi
   al minimo leggibile di 8px ne aggiungono 48, per 868,1 — cioè un header con le
   voci attaccate. Il tracking pieno con sette voci NON entra nella colonna da
   1240. Le uscite erano tre: scendere a ≈.146em (si perde la forma della tavola),
   ridurre le voci a tre (scelta di prodotto, rifiutata dal committente il 29/07),
   o allargare la fascia oltre la colonna (sposta il marchio su tutte le 11 rotte).
   Nessuna è una rifinitura di CSS.
   LA REGOLA CHE VALE, ed è sorvegliata da test/n-navigazione.test.js: la
   navigazione può entrare nel margine destro, mai superarlo, e lascia sempre
   almeno 20px di respiro al CTA — barra di scorrimento classica compresa.
   Misurato oggi: sforo 118,2px → 70,2px, respiro minimo −5px → +23,3px. */
.ed-header-inner {
  max-width: var(--maxw); margin-inline: auto;
  min-height: calc(var(--header-h) - 1px); /* -1px: il bordo inferiore vive su .ed-header */
  padding-inline: clamp(20px, 5vw, 64px);
  display: flex; align-items: center; gap: clamp(16px, 3vw, 36px);
}
.ed-header.is-solid, .ed-header--solid {
  background: var(--brand-noir);
  border-bottom-color: rgba(201, 166, 98, .22);
}

/* Lockup composto: simbolo vettoriale + logotipo tipografico. Il clear space
   vale metà altezza del simbolo su tutti i lati (tavola 03). Testo avorio
   sempre (header e footer sono noir pieno, mai un fondo chiaro sotto).

   LE MISURE VENGONO DALLA TAVOLA 21, LETTE SUI PIXEL — non scelte a occhio.
   La tavola è un PNG 1500×844 in cui la scheda del sito misura 758px ed è
   etichettata «DESKTOP 1440»: 1px di tavola = 1,900px CSS. Con quella scala
   (campionamento in docs/brand/qa/marchio-scatti/tavola21-misure.json):
       simbolo ≈30-34 · logotipo largo 186,2 con maiuscole alte 15,2
       lockup intero 220,4 · altezza dell'intestazione 108,3
   Il sito stava a simbolo 30, maiuscole 14, lockup 206,1. Con 22px di
   logotipo e 32 di simbolo il lockup misura 221,2 contro i 220,4 della tavola
   e le maiuscole 15 contro 15,2: la tavola riprodotta, non interpretata.

   E QUI STA LA COSA DA NON DIMENTICARE. Il committente ha detto «il logo è
   piccolo e poco visibile». La misura dice che nella tavola il marchio NON è
   più grande del nostro: +2px di simbolo e +1px di maiuscole. Quello che
   cambia davvero è (a) il tratto del simbolo, che a 30px valeva un terzo di
   pixel — vedi TRATTO_RIDOTTO in scripts/brand/geometry.mjs — e (b) il peso
   della navigazione accanto, che sul sito era 1,25× il logotipo dove la
   tavola la tiene a 0,56× (vedi .ed-nav a più sotto). Ingrandire il marchio
   oltre queste misure è stato provato e scartato: a 28/42px il clear space
   della tavola 03 passa da 21px a 8,7 a 390, e il simbolo resta sottile
   comunque (quota di segno sopra 3:1 al 47%, contro il 70% col tratto giusto).

   Il gap scende da 12 a 10 perché il simbolo è cresciuto di 2: lo stacco fra
   segno e logotipo resta lo stesso a video, e il lockup non sfonda i 220,4
   della tavola.

   L'altezza dell'intestazione NON cambia: il lockup passa da 60 a 62px di
   ingombro (15+32+15) e --header-h vale 97, cioè 96 di inner — 62 ci sta
   dentro con lo stesso margine di prima. Misurato, non dedotto. */
.ed-brand {
  display: inline-flex;
  align-items: center;
  gap: 10px;
  padding: 15px;
  text-decoration: none;
}
/* Vale anche per il simbolo del piè di pagina (.ed-footer-brand usa la stessa
   classe): header e footer restano lo stesso lockup, com'è sempre stato. */
.ed-brand-simbolo { width: 32px; height: 32px; display: block; }
.ed-brand .ed-logotype { font-size: 22px; color: var(--brand-avorio); }
/* Non scoperto a .ed-brand: il lockup si ripete identico nel footer
   (.ed-footer-brand), dove "NOIR" deve restare oro e non corsivo. */
.ed-logotype em { font-style: normal; color: var(--brand-oro); }

/* Il passo fra le voci cresce con la finestra, come il tracking qui sotto e con
   la stessa rampa 1120→1440 (10px → 17px). Prima erano due valori a scalino
   (clamp(12,1.4vw,20) sotto la soglia, clamp(14,2vw,28) sopra) che saltavano
   INSIEME al tracking nello stesso pixel: due salti sommati fanno i 114px di
   respiro che sparivano in un pixel. Il tetto è 17 e non 28 perché il conto lo
   impone: vedi il commento sul tracking.

   ERA 13→20, ED È SCESO DI 3 IL 30/07. È il prezzo del marchio alla misura
   della tavola 21, ed è giusto che lo paghi la navigazione.
   Il lockup è passato da 206,1 a 220,5px: +14,4px presi al budget orizzontale
   della barra. Subito sopra la soglia del pannello quel budget non ha margine,
   e il conto è tornato alla cifra — misurato con la barra di scorrimento
   classica, cioè con innerWidth 1121 e clientWidth 1104:
       marchio com'era  →  respiro del CTA 23,3px a 1121
       marchio nuovo    →  respiro del CTA  8,9px a 1121   (23,3 − 14,4)
   La guardia N chiede almeno 20px e diventava rossa su 26 larghezze, da 1121 a
   1146. NON è stata aggirata: è stato misurato dove il difetto comincia e
   finisce (docs/brand/qa/marchio-applicato/respiro-cta.json) e sono stati
   provati a runtime tutti i rimedi possibili, con questo esito a 1121:
       passo della nav −3px .................. 26,9px   ← scelto
       stacco header 3vw → 1,6vw ............. 24,5px
       padding del marchio 15 → 6 ............ 26,9px
   Perché questo e non gli altri. Lo stacco a 1,6vw porta la distanza fra
   marchio e prima voce a 17,9px contro i 16 che la tavola 03 pretende: 1,9px di
   margine sul clear space, cioè nessuno — e a 1440 toglie aria al marchio
   (36 → 23) proprio nella riga che il committente ha scelto guardandola.
   Il padding a 6 fa peggio: il clear space scenderebbe SOTTO il minimo.
   Il passo invece non tocca né il clear space del marchio (resta 33,6-36) né il
   tracking della tavola 04: stringe soltanto il respiro fra una voce e l'altra,
   che è la cosa che deve stare un passo indietro. A 10,06px nel punto più
   stretto resta sopra gli 8px dichiarati qui sotto come minimo leggibile.
   La PENDENZA della rampa non cambia (2,2vw): è una traslazione di −3px, quindi
   l'argomento di monotonia del commento sul tracking resta valido tale e quale
   e la prova 3 della guardia N — «nessun burrone» — continua a leggere la
   stessa derivata. Effetto collaterale: a 1440 il CTA guadagna 18px di respiro
   (70,9 → 88,9). */
.ed-nav { margin-left: auto; display: flex; align-items: center; gap: clamp(10px, calc(2.2vw - 14.6px), 17px); }
/* LA VOCE DI MENU STA UN PASSO INDIETRO AL MARCHIO — e il numero è uno solo.

   Fino al 30/07 qui non c'era `color` e la voce ereditava l'avorio pieno di
   .ed-header: 16,41:1 sul noir. Sembra un pregio e invece è il difetto che il
   committente ha visto a occhio («il logo è piccolo e poco visibile»).
   Si misura sull'INCHIOSTRO reso, non sul corpo dichiarato: si contano i pixel
   che si staccano dal fondo e si somma di quanto se ne staccano (stesso metodo
   del totale del carrello, c-rifiniture-residue.md §1). A 1440, misurato:

       logotipo «CARTONOIR»   20px peso 400   massa d'inchiostro  63 207
       voce    «DESTINAZIONI» 12px peso 600   massa d'inchiostro  79 214

   Una voce di menu pesava 1,25× il logotipo intero. Sulla tavola 21 ne pesa
   0,56×. La gerarchia non era debole: era ROVESCIATA, di un fattore 2,2 — con
   un corpo di 12px contro 20, perché il peso 600 e il maiuscolo riempiono più
   inchiostro di quanto il corpo lasci credere.

   .67 di avorio rende rgb(166,163,155) = 7,68:1 sul noir (misurato a video,
   non calcolato). Tre conti dicono che è il valore giusto e non uno qualsiasi:
     · è DENTRO la forbice della tavola 21, dove le voci stanno fra 6,5 e 8,8:1
       — la variante non è più spenta della tavola, è la tavola;
     · resta 1,7 volte il 4,5:1 che le WCAG chiedono a un testo di 12px, e
       nessuna violazione di contrasto nasce da qui (verificato con
       `npm run test:contrasto` e `npm run test:browser`);
     · porta il rapporto voce÷logotipo a 0,70×, il più vicino allo 0,56× della
       tavola fra tutte le varianti provate il 30/07.
   I glifi NON rimpiccioliscono: corpo, peso e tracking sono identici e l'area
   d'inchiostro cala dello 0,6%, cioè il rumore dell'antialiasing. Cambia solo
   la luminosità (massa −33%).

   SPECIFICITÀ (0,2,1), e va tenuta lì. Sotto i 1120px questa navigazione non è
   una barra: è un pannello a fondo AVORIO, dove l'avorio attenuato sarebbe
   illeggibile (~1,2:1). Quel pannello si riprende il colore con
   `.ed-header .ed-nav a` — anch'essa (0,2,1) ma dichiarata dopo, quindi vince.
   Con `.ed-header` davanti questa riga salirebbe a (0,3,1), batterebbe il
   pannello e spegnerebbe il menu di ogni telefono. Provato di proposito: la
   guardia in test/r-marchio-intestazione.test.js è nata da lì.
   Il tema scuro (0,4,1) e il CTA oro (escluso dal :not) restano sopra. */
.ed-nav a:not(.ed-btn-primary) { color: rgba(242, 236, 223, .67); }
/* Voci di navigazione nella forma della tavola 21: Archivo 600, 12px,
   maiuscolo, tracking .22em — la stessa riga "Label UI" della tavola 04, che
   il resto del sistema applica già a .ed-label e .ed-eyebrow.
   Il sito ne ha SETTE dove la tavola ne mostra tre: il committente ha deciso
   (29/07) di adottarne la forma senza toccare l'architettura, perché quelle
   sette voci portano a pagine che esistono e servono — ridurle a tre sarebbe
   una scelta di prodotto, non di veste. Misurato dopo il cambio: a 1440 le
   sette voci maiuscole con tracking stanno su una riga sola e non schiacciano
   il CTA. Sotto i 1120px la navigazione passa comunque al pannello mobile.

   IL TRACKING CRESCE, NON SALTA — e il perché sta nei numeri.
   Il tracking pieno .22em costa 114px sulle sette voci (706,3px a .1em →
   820,1px a .22em, misurati). La prima correzione lo dava tutto in un pixel con
   `@media (max-width: 1340px)`: a 1340 il CTA aveva 114px di respiro, a 1341 ne
   aveva 3,5 — e con una barra di scorrimento classica da 17px ne aveva **−5**,
   cioè usciva dall'area utile. Invisibile a ogni misura sommaria, perché
   l'header ritaglia: eccedenza orizzontale 0 e `elementFromPoint` sul bordo del
   CTA = null. Il difetto era doppio, perché nello stesso pixel saltava anche il
   passo fra le voci (≈19px → ≈27px): due salti sommati.
   Qui il tracking è una rampa lineare fra 1120px (dove comincia la barra: sotto
   c'è il pannello) e 1440px, dove vale il valore pieno della tavola 04:
       .1em a 1120  →  .22em a 1440      (.45vw − 3,84px, agli estremi esatto)
   La pendenza NON è libera. Il margine del CTA cresce di 0,5px per pixel di
   finestra e la navigazione se ne mangia 79,03px per ogni px di tracking più
   6px per ogni px di passo: perché il respiro non cali mai, deve valere
       79,03 · (dtracking/dW) + 6 · (dpasso/dW) ≤ 0,5
   che con .0045 e .021875 fa 0,4876. Il margine resta quindi monotòno crescente
   a ogni larghezza: niente più soglia da cui cadere.
   Effetto collaterale utile: la barra di scorrimento non è più un burrone. Le
   media query di Chrome contano i 17px della barra, il layout no; su una rampa
   quei 17px valgono 0,077px di tracking (≈8px di navigazione), assorbiti dal
   margine. Su uno scalino valevano 114px. */
.ed-nav a { text-decoration: none; font-family: var(--sans); font-size: 12px; font-weight: 600; letter-spacing: clamp(.1em, calc(.45vw - 3.84px), .22em); text-transform: uppercase; white-space: nowrap; transition: color var(--dur-1) var(--ease); }
/* LO STATO ATTIVO SALE, NON SCENDE. Regola, non preferenza: un elemento non
   può essere più forte da fermo di quando ci passi sopra.

   C'ERA UNA SECONDA RIGA QUI, ed è stata tolta il 30/07:
       .ed-header.is-solid .ed-nav a:hover, .ed-header--solid .ed-nav a:hover,
       .ed-header.is-solid .ed-nav a[aria-current="page"],
       .ed-header--solid .ed-nav a[aria-current="page"] { color: var(--accent-deep); }
   Dava --accent-deep (#A8873F) alle intestazioni solide. Era l'eredità di
   quando «solida» voleva dire fondo CHIARO. Oggi non è più vero e si legge tre
   righe sopra: `.ed-header` e `.ed-header.is-solid, .ed-header--solid` hanno
   lo stesso identico `background: var(--brand-noir)`. Su quel noir #A8873F
   misura 5,70:1 — cioè su /ordine, /regalo, /crea-guida e ogni altra pagina a
   intestazione solida la voce indicata era **più spenta** di quelle che non
   stavi indicando (16,41 a riposo → 5,70 sotto il mouse). Ed era incoerente
   con se stessa: la riga non copriva `:focus-visible`, quindi la stessa voce
   valeva 5,70 col mouse e 11,66 col Tab.
   Misurato a video il 30/07 su / (trasparente) e /ordine (solida):
   marchio-applicato/misure-prima.json → `stati.hover`.
   Tolta la riga, l'unico colore attivo della barra è --accent-soft (#E0C68C,
   11,66:1 sul noir) e il verso è giusto ovunque: 7,68 → 11,66.

   :not(.ed-btn-primary) — il CTA oro pieno non è una voce di menu: il suo
   testo resta noir (riga più sotto), sennò oro chiaro su fondo oro fa 1,00:1.
   Prima ci si arrivava per ordine nel foglio; ora è detto.
   Prefissate con .ed-header (0,3,1): restano sopra la riga del riposo (0,2,1)
   e sopra il default dei link, che è :where(...) e vale zero. */
.ed-header .ed-nav a:not(.ed-btn-primary):hover,
.ed-header .ed-nav a:not(.ed-btn-primary):focus-visible,
.ed-header .ed-nav a:not(.ed-btn-primary)[aria-current="page"] { color: var(--accent-soft); }
@media (max-width: 1120px) { .ed-nav .ed-nav-hide { display: none; } }

/* ==========================================================================
   Bottoni
   ========================================================================== */

.ed-btn {
  display: inline-flex; align-items: center; justify-content: center; gap: 10px;
  min-height: 52px; padding: 15px 28px;
  font-family: var(--sans); font-size: .98rem; font-weight: 600; line-height: 1;
  text-decoration: none; white-space: nowrap; cursor: pointer;
  border: 1.5px solid transparent; border-radius: var(--r-pill);
  transition: transform var(--dur-1) var(--ease), background var(--dur-2) var(--ease), color var(--dur-2) var(--ease), border-color var(--dur-2) var(--ease), box-shadow var(--dur-2) var(--ease);
}
.ed-btn:hover { transform: translateY(-2px); }
.ed-btn:active { transform: translateY(0) scale(.985); }

.ed-btn-primary { background: var(--brand-oro); color: var(--brand-noir); border-color: var(--brand-oro); }
.ed-btn-primary:hover { background: var(--brand-oro-soft); border-color: var(--brand-oro-soft); box-shadow: 0 16px 34px rgba(201, 166, 98, .35); }

.ed-btn-ink { background: var(--ink); color: var(--paper); border-color: var(--ink); }
.ed-btn-ink:hover { background: var(--ink); border-color: var(--brand-oro); color: var(--brand-oro); box-shadow: var(--shadow-md); }

.ed-btn-outline { background: transparent; color: var(--ink); border-color: var(--line-strong); }
.ed-btn-outline:hover { border-color: var(--accent); color: var(--accent-deep); }

.ed-btn-ghost { background: transparent; color: var(--paper); border-color: var(--line-light-strong); }
.ed-btn-ghost:hover { border-color: var(--accent-soft); color: var(--accent-soft); }

/* Stato disabilitato (tavola 23): fondo smorzato, testo attenuato, nessun
   effetto al passaggio del mouse, cursore vietato — vale per tutte le
   varianti. :disabled copre i <button>; [aria-disabled="true"] copre i CTA
   marcati come <a class="ed-btn"> che restano visitabili da tastiera ma sono
   logicamente disattivati. I grigi sono token già in palette, non nuovi
   esadecimali.

   DISABILITATO NON VUOL DIRE ILLEGGIBILE. Fino al 29/07 la coppia era
   --ink-faint (#8A8F98) su --ink-soft (#4A4F57): **2,54:1** misurato sulla
   tavola di controllo e su #btn-generate di /memory-book — sotto qualunque
   soglia. Le WCAG esentano i controlli disabilitati, quindi non era una
   violazione formale: era il componente di SISTEMA che valeva meno di ciò che
   due cantieri consegnavano a mano (C3 ha portato i propri a 5,23:1 scrivendo
   «lo stato dev'essere leggibile, non solo visibile»; C4 ha fatto migrare
   #btn-generate qui proprio per ereditare questo stato). Oggi il testo è
   --paper-2 sullo stesso fondo: **6,16:1**, sopra i 5,23:1 già scelti altrove.
   Il fondo NON è cambiato, perché sulla tavola avorio stacca 7:1 e schiarirlo
   l'avrebbe portato a 2,76:1: la correzione doveva alzare il testo, non
   abbassare il pulsante.
   Il bordo passa a --ink-faint per la ragione opposta: su fondo scuro
   (/memory-book) il fondo del pulsante staccava 2,16:1 dalla pagina e la sagoma
   quasi non si vedeva; il filetto chiaro la ridisegna senza toccare il fondo.
   Nessun oro, come vuole la tavola 23. */
.ed-btn:disabled,
.ed-btn[aria-disabled="true"] {
  background: var(--ink-soft);
  color: var(--paper-2);
  border-color: var(--ink-faint);
  cursor: not-allowed;
}
.ed-btn:disabled:hover,
.ed-btn[aria-disabled="true"]:hover,
.ed-btn:disabled:active,
.ed-btn[aria-disabled="true"]:active {
  background: var(--ink-soft);
  color: var(--paper-2);
  border-color: var(--ink-faint);
  transform: none;
  box-shadow: none;
}
.ed-btn:disabled .ed-btn-ico,
.ed-btn[aria-disabled="true"] .ed-btn-ico { background: rgba(242, 236, 223, .12); }
.ed-btn:disabled:hover .ed-btn-ico,
.ed-btn[aria-disabled="true"]:hover .ed-btn-ico { transform: none; }

/* Angoli vivi anche qui. Il cerchietto della freccia era `border-radius: 50%`:
   l'ULTIMO raggio non-zero delle due pagine della vetrina e uno dei 75 di
   /crea-guida, rimandato a questo foglio da due cantieri. Il brandbook (regola
   3 della tavola 28) ammette due sole eccezioni — icona app 22% e tag bagaglio
   12px — e questa non è nessuna delle due: non è la FORMA di un segno (come la
   bussola del risguardo o l'ombra a terra del libro, che sono cerchio ed
   ellisse per disegno), è un contenitore quadrato che era stato smussato fino
   in fondo. Verificato a video dentro i sei pulsanti che lo usano: il chip
   quadrato tiene, e alla scala di 24px con la freccia dentro cambia poco
   l'ingombro e molto la coerenza. */
.ed-btn .ed-btn-ico { display: grid; place-items: center; width: 24px; height: 24px; border-radius: 0; background: rgba(242, 236, 223, .18); transition: transform var(--dur-2) var(--ease); }
.ed-btn-outline .ed-btn-ico { background: rgba(16, 27, 41, .1); }
.ed-btn:hover .ed-btn-ico { transform: translateX(3px); }
.ed-btn .ed-btn-ico svg { width: 13px; height: 13px; }

/* Il link terziario della tavola 23 è oro con la freccia. L'oro però non basta:
   WCAG 1.4.1 (tecnica G183) chiede che un link dentro un blocco di testo si
   stacchi dal testo VICINO di almeno 3:1, oppure porti un segno che non sia
   colore. Misurato dalla revisione del lotto 3: sul fondo scuro l'oro chiaro
   #E0C68C contro l'avorio #F2ECDF del testo circostante fa **1,41:1** — si
   vede benissimo sul proprio fondo (10,43:1), ma non si distingue da ciò che
   gli sta accanto. Col colore non si chiude: servirebbe una luminanza dentro
   una finestra larga 0,025 che nessuno dei tre ori di marca centra, e
   inventarne un quarto sarebbe un token nuovo che la palette vieta.
   Decisione del committente (29/07): sottolineatura. È un segno non cromatico,
   vale anche per chi non distingue l'oro dall'avorio, e dà finalmente un posto
   all'hover del terziario, che prima muoveva solo la freccia. */
.ed-textlink { display: inline-flex; align-items: center; gap: 9px; min-height: 44px; font-family: var(--sans); font-weight: 600; color: var(--brand-oro-testo); text-decoration: underline; text-decoration-thickness: 1px; text-underline-offset: 4px; }
.ed-dark .ed-textlink, .ed-textlink.on-dark { color: var(--accent-soft); }
.ed-textlink span { transition: transform var(--dur-2) var(--ease); }
.ed-textlink:hover { text-decoration-thickness: 2px; }
.ed-textlink:hover span { transform: translateX(4px); }
/* Gli stessi due motivi valgono per i link scritti dentro un paragrafo o un
   elenco: sono quelli che il lettore incontra in mezzo alla lettura, ed erano
   rimasti indistinguibili dal testo sulle tre pagine di lettura lunga. */
body.ed :where(p, li) a:not(.ed-btn):not(.ed-textlink) { text-decoration: underline; text-decoration-thickness: 1px; text-underline-offset: 3px; }

/* ==========================================================================
   Pill / tag
   ========================================================================== */

.ed-pill {
  display: inline-flex; align-items: center; min-height: 44px;
  padding: 10px 20px; border-radius: var(--r-pill);
  font-family: var(--sans); font-size: .88rem; cursor: pointer;
  border: 1.5px solid var(--line-strong); background: transparent; color: var(--ink);
  transition: background var(--dur-2) var(--ease), color var(--dur-2) var(--ease), border-color var(--dur-2) var(--ease);
}
.ed-pill:hover { border-color: var(--accent); }
.ed-pill[aria-pressed="true"] { background: var(--ink); color: var(--paper); border-color: var(--ink); }
.ed-dark .ed-pill, .on-dark .ed-pill { color: rgba(242, 236, 223, .9); border-color: var(--line-light-strong); }
.ed-dark .ed-pill[aria-pressed="true"], .on-dark .ed-pill[aria-pressed="true"] { background: var(--paper); color: var(--ink); border-color: var(--paper); }
/* Le pastiglie del selettore di livello vivono dentro .ed-dark: lì
   `.ed-pill:hover` (0,2,0) pareggiava `.ed-dark .ed-pill` (0,2,0) e perdeva per
   ordine nel foglio, quindi il passaggio del mouse non cambiava NULLA (misurato
   su tre larghezze, audit v1 §6). Con il contesto scritto nel selettore la
   regola sale a (0,2,1) e vince senza !important. */
.ed-dark .ed-pill:hover, .on-dark .ed-pill:hover { border-color: var(--accent); }

.ed-tag { display: inline-block; padding: 6px 13px; border-radius: var(--r-pill); font-family: var(--sans); font-size: .7rem; font-weight: 600; letter-spacing: .16em; text-transform: uppercase; background: rgba(201, 166, 98, .12); color: var(--brand-oro-testo); }

/* ==========================================================================
   Fotografia — figura con segnaposto elegante e fallback
   Uso:
     <figure class="ed-photo" data-label="Tokyo">
       <img src="/assets/..." alt="..." loading="lazy">
     </figure>
   brand.js aggiunge .is-missing se l'immagine non c'è: resta il segnaposto.
   ========================================================================== */

.ed-photo {
  position: relative; overflow: hidden; margin: 0;
  border-radius: var(--r-md);
  background:
    radial-gradient(120% 90% at 30% 15%, rgba(201, 166, 98, .16), transparent 60%),
    linear-gradient(160deg, var(--paper-3), var(--paper-2));
  isolation: isolate;
}
.ed-photo::before {
  /* grana sottile sul segnaposto */
  content: ''; position: absolute; inset: 0; z-index: 0; opacity: .5; pointer-events: none;
  background-image: url("data:image/svg+xml,%3Csvg viewBox='0 0 120 120' xmlns='http://www.w3.org/2000/svg'%3E%3Cfilter id='n'%3E%3CfeTurbulence type='fractalNoise' baseFrequency='.9' numOctaves='2'/%3E%3C/filter%3E%3Crect width='100%25' height='100%25' filter='url(%23n)' opacity='.5'/%3E%3C/svg%3E");
  mix-blend-mode: soft-light;
}
.ed-photo::after {
  /* marca + etichetta del segnaposto */
  content: '◈ ' attr(data-label); position: absolute; z-index: 1; inset: auto 0 0 0;
  padding: 14px 18px; font-family: var(--sans); font-size: .72rem; letter-spacing: .14em;
  text-transform: uppercase; color: var(--ink-soft);
}
.ed-photo img {
  position: relative; z-index: 2; width: 100%; height: 100%; object-fit: cover; display: block;
  transition: transform var(--dur-3) var(--ease), opacity var(--dur-2) var(--ease);
}
.ed-photo.is-missing img { display: none; }
.ed-photo.is-missing::after { color: var(--ink-soft); }
/* quando l'immagine c'è, nasconde l'etichetta */
.ed-photo:not(.is-missing)::after { content: none; }
.ed-photo:not(.is-missing)::before { content: none; }

.ed-photo--wide { aspect-ratio: 16 / 10; }
.ed-photo--tall { aspect-ratio: 3 / 4; }
.ed-photo--square { aspect-ratio: 1 / 1; }
.ed-photo--hero { aspect-ratio: auto; height: 100%; }

.ed-photo-hover:hover img { transform: scale(1.04); }

/* ==========================================================================
   Card / superfici
   ========================================================================== */

.ed-card { background: var(--paper-raise); border: 1px solid var(--line); border-radius: var(--r-md); padding: clamp(24px, 3vw, 40px); box-shadow: var(--shadow-sm); transition: border-color var(--dur-2) var(--ease), box-shadow var(--dur-2) var(--ease); }
/* La carta risponde al passaggio del mouse: prima non cambiava alcuna delle
   otto proprietà misurate (audit v1 §6, carte "Regalo" e "Agenzie"). Solo
   filetto e ombra — nessuno spostamento — perché la carta non è cliccabile:
   il comando è il pulsante che contiene, e un sollevamento suggerirebbe
   un'affordance che non c'è. */
.ed-card:hover { border-color: rgba(201, 166, 98, .45); box-shadow: var(--shadow-md); }
.ed-card-dark { background: var(--brand-blu-notte); border: 1px solid rgba(201, 166, 98, .22); color: var(--paper); border-radius: var(--r-md); padding: clamp(24px, 3vw, 40px); box-shadow: var(--shadow-md); }

/* ==========================================================================
   Form
   ========================================================================== */

.ed-field { display: block; margin-top: var(--s5); }
/* Etichette UI: Archivo 600, maiuscolo, tracking 220 (tavola 04). */
.ed-label {
  font-family: var(--sans);
  font-weight: 600;
  font-size: 12px;
  letter-spacing: .22em;
  text-transform: uppercase;
  line-height: 1.4;
  color: var(--ink);
  margin-bottom: 7px;
  display: block;
}

/* Logotipo: Cormorant, maiuscolo, tracking 260, altezza capitale 3x
   rispetto al modulo del simbolo (tavola 09). */
.ed-logotype {
  font-family: var(--serif);
  font-weight: 400;
  letter-spacing: .26em;
  text-transform: uppercase;
  line-height: 1;
  white-space: nowrap;
}

/* Il corsivo è riservato alla voce del concierge (tavola 17). */
.ed-concierge { font-family: var(--serif); font-style: italic; }
.ed-input, .ed-select, .ed-textarea {
  width: 100%; min-height: 52px; padding: 14px 16px; font: inherit; font-size: 1rem; color: var(--ink);
  background: var(--paper-raise); border: 1.5px solid var(--line-strong); border-radius: var(--r-sm);
  transition: border-color var(--dur-2) var(--ease), box-shadow var(--dur-2) var(--ease);
}
.ed-textarea { min-height: 130px; resize: vertical; }
.ed-input:focus, .ed-select:focus, .ed-textarea:focus { border-color: var(--accent); box-shadow: 0 0 0 3px rgba(201, 166, 98, .16); outline: none; }

.ed-note { border-radius: var(--r-sm); padding: 14px 16px; font-size: .92rem; }
.ed-note-error { background: var(--error-bg); color: var(--error); }
.ed-note-ok { background: var(--ok-bg); color: var(--ok); }
.ed-note-info { background: rgba(201, 166, 98, .1); color: var(--brand-oro-testo); }

/* ==========================================================================
   Footer
   ========================================================================== */

/* Footer: noir, testo avorio smorzato. */
.ed-footer {
  background: var(--brand-noir);
  color: rgba(242, 236, 223, .7);
  border-top: 1px solid rgba(201, 166, 98, .22);
  font-family: var(--sans); font-size: .9rem; padding-block: var(--s9) var(--s6);
}
.ed-footer-grid { max-width: var(--maxw); margin-inline: auto; padding-inline: clamp(20px, 5vw, 64px); display: grid; grid-template-columns: 1.4fr 1fr 1fr; gap: var(--s7); }
@media (max-width: 720px) { .ed-footer-grid { grid-template-columns: 1fr; gap: var(--s5); } }
.ed-footer h5 { color: var(--paper); font-family: var(--sans); font-size: .76rem; font-weight: 600; letter-spacing: .18em; text-transform: uppercase; margin: 0 0 14px; }
.ed-footer a { color: rgba(242, 236, 223, .7); text-decoration: none; display: block; margin-bottom: 9px; transition: color var(--dur-1) var(--ease); }
/* body.ed prefisso: stessa ragione della nav sopra, sale a (0,3,2) e vince
   su body.ed a:not(.ed-btn) (0,2,2) senza !important. */
body.ed .ed-footer a:hover, body.ed .ed-footer a:focus-visible { color: var(--accent-soft); }
.ed-footer-legal { grid-column: 1 / -1; border-top: 1px solid rgba(242, 236, 223, .14); padding-top: var(--s5); font-size: .8rem; color: rgba(242, 236, 223, .68); line-height: 1.6; }
.ed-footer-brand { display: inline-flex; align-items: center; gap: 11px; color: var(--paper); text-decoration: none; margin-bottom: 14px; }

/* ==========================================================================
   Hero della tavola 21 — testo su noir, rotta su blu notte, nessuna foto.
   Riusata dalla home e dalla landing (Task 10): .hero-brand / .hero-rotta.
   ========================================================================== */

.hero-brand {
  display: grid;
  grid-template-columns: 1fr 1fr;
  min-height: 78vh;
  background: var(--brand-noir);
  color: var(--brand-avorio);
}
.hero-brand-testo {
  display: flex;
  flex-direction: column;
  justify-content: center;
  gap: var(--s5);
  padding: clamp(32px, 6vw, 96px);
}
.hero-brand .ed-lead { color: rgba(242, 236, 223, .76); max-width: 34ch; }
.hero-azioni { display: flex; gap: var(--s3); flex-wrap: wrap; }
/* .ed-btn-outline è tarato per fondi chiari (testo/bordo ink): sul noir va
   dichiarato qui il colore, altrimenti il pulsante "Sfoglia un esempio"
   sparisce (ink su noir) — la stessa trappola della nav su fondo scuro. */
.hero-brand-testo .ed-btn-outline { color: var(--brand-avorio); border-color: rgba(242, 236, 223, .38); }
.hero-brand-testo .ed-btn-outline:hover { border-color: var(--accent-soft); color: var(--accent-soft); }
.hero-rotta {
  position: relative;
  background: var(--brand-blu-notte) url('/assets/brand/pattern/griglia-nautica.svg') repeat;
  border-left: 1px solid rgba(201, 166, 98, .18);
}
/* La rotta tracciata (tavola 21): stessi segni del marchio (rotta tratteggiata,
   punto di partenza pieno, stella a quattro punte — formula identica a
   scripts/brand/geometry.mjs:stella()), sopra il pattern nautico. SVG inline
   (non <img>) perché le etichette sono testo vero: ereditano i font della
   pagina invece di essere disegnate dentro un bitmap, come il lockup. */
.hero-rotta-svg { position: absolute; inset: 0; width: 100%; height: 100%; }
.hero-rotta-linea { fill: none; stroke: var(--brand-oro); stroke-width: 2.2; stroke-linecap: round; stroke-dasharray: 4 6; }
.hero-rotta-partenza, .hero-rotta-stella { fill: var(--brand-oro); }
.hero-rotta-testo {
  font-family: var(--sans);
  font-weight: 600;
  letter-spacing: .16em;
  text-transform: uppercase;
  fill: rgba(242, 236, 223, .74);
}
/* Sopra 860px le due colonne condividono la riga della griglia: la testo
   compensa da sé (vedi padding-top qui sotto), ma .hero-rotta non ha
   padding e parte da y:0 come lei — sotto l'header fisso. Sotto 860px le
   colonne impilano (hero-rotta è la seconda riga, già sotto la testo:
   nessuna sovrapposizione, verificato con getComputedStyle), quindi questo
   scostamento vale solo qui, altrimenti sottrae spazio già scarso al
   pannello basso di mobile. */
@media (min-width: 861px) {
  .hero-rotta-svg { top: var(--s10); height: calc(100% - var(--s10)); }
}
@media (max-width: 860px) {
  .hero-brand { grid-template-columns: 1fr; }
  /* L'header è fixed e sempre opaco (.ed-header, 97px anche su mobile): sotto
     860px il clamp() della testo scende a 46/32px e la testo finisce dietro
     l'header. Qui il padding-top torna a coprirlo per intero (verificato con
     getComputedStyle: nessuna sovrapposizione residua a 768 e 390). */
  .hero-brand-testo { padding-top: var(--s10); }
  .hero-rotta { min-height: 220px; }
}

/* Griglia "come nasce" (tavola 21): tre passi su fondo avorio. */
.come-nasce-griglia {
  display: grid;
  grid-template-columns: repeat(auto-fit, minmax(240px, 1fr));
  gap: var(--s6);
  margin-top: var(--s6);
}
.ed-numero {
  font-family: var(--serif);
  font-size: 2rem;
  color: var(--brand-oro-testo);
  margin-bottom: var(--s2);
}

/* ==========================================================================
   Motion (reveal on scroll, JS: body.ed-motion)
   ========================================================================== */

body.ed-motion .ed-reveal { opacity: 0; transform: translateY(28px); transition: opacity var(--dur-3) var(--ease), transform var(--dur-3) var(--ease); }
body.ed-motion .ed-reveal.is-in { opacity: 1; transform: none; }
body.ed-motion .ed-reveal-2 { transition-delay: .09s; }
body.ed-motion .ed-reveal-3 { transition-delay: .18s; }
body.ed-motion .ed-reveal-4 { transition-delay: .27s; }

/* ==========================================================================
   Utility
   ========================================================================== */

.ed-sr-only { position: absolute; width: 1px; height: 1px; padding: 0; margin: -1px; overflow: hidden; clip: rect(0,0,0,0); white-space: nowrap; border: 0; }
.ed-tabnum { font-variant-numeric: tabular-nums; }
.ed-center { text-align: center; }

/* ==========================================================================
   Reduced motion / transparency
   ========================================================================== */

@media (prefers-reduced-motion: reduce) {
  html { scroll-behavior: auto; }
  body.ed *, body.ed *::before, body.ed *::after { animation-duration: .01ms !important; animation-iteration-count: 1 !important; transition-duration: .01ms !important; }
  body.ed-motion .ed-reveal { opacity: 1 !important; transform: none !important; }
  .ed-btn:hover { transform: none; }
}
/* La regola prefers-reduced-transparency per .ed-header.is-solid/--solid è
   stata rimossa (audit round 2): l'header a tema chiaro non usa più
   backdrop-filter né trasparenza da quando è diventato noir pieno sempre
   (vedi .ed-header sopra) — non c'è nulla da "ridurre" per quegli utenti.
   Portarlo a fondo avorio mentre il testo del nav resta avorio (fix round 1)
   lo avrebbe reso illeggibile: una regola orfana diventata un bug attivo. */

/* ==========================================================================
   App Shell condivisa — toggle mobile (hamburger) + variante scura
   Markup iniettato da /brand-shell.js; qui vivono gli stili (fonte unica CSS).
   ========================================================================== */

/* Offset per header solido fisso iniettato dallo shell (evita che il contenuto ci finisca sotto).
   Stesso token --header-h che dimensiona .ed-header-inner: non può più divergere. */
body.ed.ed-shell-solid { padding-top: var(--header-h); }

/* Hamburger: nascosto da desktop, visibile <=1120px (la soglia è salita da 900
   a 1120 il 29/07 insieme alla navigazione maiuscola: le sette voci non ci
   stanno sotto quella larghezza. Il commento diceva ancora 900: corretto). */
.ed-nav-toggle {
  display: none; align-items: center; justify-content: center;
  width: 44px; height: 44px; margin-left: auto; padding: 0;
  background: none; border: 0; cursor: pointer; color: var(--paper);
}
.ed-nav-toggle svg { width: 26px; height: 26px; display: block; }

/* Il CTA primario nell'header usa sempre il testo noir del bottone primario:
   .ed-btn-primary è oro pieno (var(--brand-oro)), non più blu notte, quindi
   il testo chiaro qui sotto lo renderebbe illeggibile (contrasto ~1.96:1). */
.ed-header .ed-nav a.ed-btn-primary,
.ed-header.is-solid .ed-nav a.ed-btn-primary,
.ed-header--solid .ed-nav a.ed-btn-primary { color: var(--brand-noir); }

@media (max-width: 1120px) {
  .ed-header .ed-header-inner { position: relative; }
  .ed-header .ed-nav-toggle { display: inline-flex; }
  /* Il pannello nav diventa un menu a scomparsa che contiene TUTTI i link.
     Colore dichiarato QUI (non sui singoli <a>, per lo stesso motivo del
     commento su .ed-header): il pannello è un fondo chiaro sovrapposto a un
     header ora scuro, quindi non deve ereditare l'avorio dell'header — i
     link dentro erediteranno l'ink da questo contenitore, il loro genitore
     diretto, non dall'header. */
  .ed-header .ed-nav {
    position: absolute; top: 100%; left: 0; right: 0; margin-left: 0;
    flex-direction: column; align-items: stretch; gap: 0;
    background: rgba(242, 236, 223, .98);
    color: var(--ink);
    backdrop-filter: blur(14px); -webkit-backdrop-filter: blur(14px);
    border-bottom: 1px solid var(--line);
    padding: 6px clamp(20px, 5vw, 64px) 16px;
    max-height: 0; overflow: hidden; opacity: 0; pointer-events: none;
    transition: max-height var(--dur-2) var(--ease), opacity var(--dur-1) var(--ease);
  }
  .ed-header .ed-nav.is-open { max-height: 82vh; opacity: 1; pointer-events: auto; overflow-y: auto; }
  .ed-header .ed-nav .ed-nav-hide { display: block; }           /* nel menu mobile mostra tutto */
  .ed-header .ed-nav a {
    color: var(--ink); min-height: 48px; display: flex; align-items: center;
    /* Il filetto fra una voce e l'altra del pannello mobile misurava
       rgba(13,14,16,.08) = 1,180:1 sul fondo avorio del pannello: era IL NUMERO
       PEGGIORE di tutto il sito nel censimento del 03/08, e vestiva 18 dei 106
       comandi sotto soglia — questa riga sola.
       Va detto per intero che cos'è, perché il numero non basta a decidere: è
       un DIVISORE fra due collegamenti di testo, non il confine di un comando.
       WCAG 1.4.11 non chiede un contorno a un link identificato dal suo testo
       (le voci qui stanno a 16,4:1 sul pannello), quindi correggerlo è una
       scelta, non un obbligo. La si è fatta guardando, non deducendo
       (`s-menu-390-PRIMA.png` ↔ `s-menu-390-DOPO.png`): a .08 la riga non
       divideva niente — era un ornamento che non ornava — e alla soglia
       l'elenco acquista il ritmo che aveva già in tutti i moduli del sito.
       Il valore è il token che il committente ha già deciso il 30/07 per ogni
       confine su fondo chiaro: nessun nuovo numero da tenere allineato. */
    padding: 12px 0; border-bottom: 1px solid var(--line-strong); font-size: 1rem;
  }
  .ed-header .ed-nav a:last-child { border-bottom: 0; }
  /* Il CTA (unico .ed-btn nel nav) resta oro pieno con testo noir: niente
     override di colore qui, sennò vince su .ed-btn-primary a parità di
     specificità e il testo torna illeggibile nel pannello mobile. */
  .ed-header .ed-nav a.ed-btn { justify-content: center; margin-top: 12px; }
  /* Voce corrente/hover/focus nel pannello mobile: il fondo qui è SEMPRE
     chiaro (riga 616), non importa se l'header sopra è trasparente, .is-solid
     o --solid. Le righe 259/261 danno oro chiaro/oro-deep pensati per un
     fondo scuro, che su questo pannello avorio scendono a ~1,5-3,2:1. La
     classe .is-open alza la specificità a (0,4,1): pareggia la variante
     .is-solid di riga 261 e vince per ordine nel foglio (dichiarata dopo),
     batte a parità netta la variante --solid (0,3,1) — corretto ovunque il
     pannello sia davvero aperto, indipendentemente dallo stato dell'header
     sopra (audit lotto 2 task 6, famiglia "specificità nel pannello mobile").
     :not(.ed-btn-primary): sulla pagina il cui CTA punta a se stessa (es.
     /crea-guida) il pulsante prende aria-current="page" — deve restare oro
     pieno/testo noir (riga 601), non oro-testo, sennò diventa illeggibile
     sul proprio fondo oro (stesso guardrail del tema scuro a riga 665).
     body.ed:not([data-shell-theme="dark"]): oro-testo è tarato per il fondo
     avorio di QUESTO pannello (riga 620), non per quello del pannello scuro
     (riga 690, rgba(13,14,16,.98)) delle pagine data-shell-theme="dark" — lì
     scende a 3,32:1, sotto la soglia 4,5:1 (era una regressione introdotta
     da questa stessa correzione: saliva a specificità (0,5,1) e batteva la
     variante scura sotto, (0,4,1), indipendentemente dall'ordine nel foglio).
     Il tema scuro resta coperto dalla sua regola dedicata (riga ~695,
     accent-soft), non da questa. */
  body.ed:not([data-shell-theme="dark"]) .ed-header .ed-nav.is-open a:not(.ed-btn-primary):hover,
  body.ed:not([data-shell-theme="dark"]) .ed-header .ed-nav.is-open a:not(.ed-btn-primary):focus-visible,
  body.ed:not([data-shell-theme="dark"]) .ed-header .ed-nav.is-open a[aria-current="page"]:not(.ed-btn-primary) { color: var(--brand-oro-testo); }
}

/* Variante scura: pagine a fondo navy (data-shell-theme="dark") */
/* Impedisce che body.ed forzi lo sfondo avorio sulle pagine dark (RT-02) */
body.ed[data-shell-theme="dark"] { background: var(--navy); color: var(--paper); }
body.ed[data-shell-theme="dark"] h1, body.ed[data-shell-theme="dark"] h2,
body.ed[data-shell-theme="dark"] h3, body.ed[data-shell-theme="dark"] h4 { color: var(--paper); }

/* Superfici chiare annidate dentro sezioni scure: i titoli tornano a inchiostro scuro.
   Corregge il bug "testo bianco su bianco" (card guida-esempio, anteprima livelli,
   pagine-leaf dell'anteprima). Specificità volutamente > delle regole dark qui sopra. */
.ed-dark .ed-surface-light :is(h1, h2, h3, h4),
body.ed[data-shell-theme="dark"] .ed-surface-light :is(h1, h2, h3, h4),
.ed-surface-light :is(h1, h2, h3, h4) { color: var(--ink); }

/* Header noir (non più il navy ritirato, rgb 7,36,78): stessi colori di marca
   dell'header standard, con backdrop-filter perché su /anteprima e
   /memory-book il contenuto scorre sotto e la leggibilità serve comunque. */
[data-shell-theme="dark"] .ed-header,
[data-shell-theme="dark"] .ed-header.is-solid,
[data-shell-theme="dark"] .ed-header--solid {
  background: rgba(13, 14, 16, .86);
  backdrop-filter: blur(14px); -webkit-backdrop-filter: blur(14px);
  border-bottom-color: rgba(201, 166, 98, .22);
}
[data-shell-theme="dark"] .ed-header .ed-brand,
[data-shell-theme="dark"] .ed-header .ed-nav-toggle { color: var(--paper); }
/* :not(.ed-btn-primary): a parità di specificità (0,3,1) con la regola del
   CTA sopra, questa vincerebbe per ordine nel foglio e rimetterebbe il testo
   chiaro sul CTA oro pieno — lo stesso bug del contrasto, versione tema scuro.

   .67 e non più .86, ed è la stessa correzione della barra chiara — trovata
   solo perché è stata MISURATA anche qui. Il 30/07, con la barra già sistemata,
   /anteprima a 1440 dava ancora: voce a riposo **12,18:1**, voce sotto il mouse
   **11,61:1**. Rovesciato, di poco ma rovesciato: la voce che indichi era più
   spenta delle altre. Il fondo di questa intestazione è rgba(13,14,16,.86) sul
   blu notte, cioè rgb(13,16,20) reso — a un soffio dal noir della barra
   normale: non c'era alcuna ragione perché l'inchiostro secondario valesse un
   numero diverso. Ora è uno solo su tutto il sito, .67, e il verso è giusto
   anche qui: 7,6 → 11,66.
   Il pannello mobile del tema scuro tiene la sua riga a .9 (più sotto, dentro
   la @media): è un'altra superficie, con un altro fondo. */
[data-shell-theme="dark"] .ed-header .ed-nav a:not(.ed-btn-primary) { color: rgba(242, 236, 223, .67); }
/* :not(.ed-btn-primary) anche qui, per la stessa ragione della riga sopra e con
   una prova a video: senza, questa regola (0,4,1) colpiva pure il CTA, il cui
   hover porta il FONDO a --brand-oro-soft (.ed-btn-primary:hover). Testo
   #E0C68C su fondo #E0C68C = 1,00:1: su /anteprima e /memory-book la scritta
   del CTA spariva al passaggio del mouse (audit v4 §1, misurato). */
/* :focus-visible MANCAVA, e mancava da sempre. Su /anteprima e /memory-book la
   voce indicata col mouse si accendeva e la stessa voce raggiunta col Tab no:
   restava del colore di riposo e l'unico segno era l'anello. Non era una svista
   innocua di specificità — la riga di riposo qui sopra vale (0,4,1) esattamente
   come `.ed-header .ed-nav a:not(.ed-btn-primary):focus-visible` della barra
   normale, ed essendo dichiarata dopo la batteva: la regola generale c'era e
   non arrivava mai a video. Trovata il 30/07 dalla prova 3 di
   test/r-marchio-intestazione.test.js, che misura il fuoco da tastiera oltre al
   mouse e su tutte e tre le forme di intestazione. Chi prova solo col mouse,
   o solo sulla home, non lo vede. */
[data-shell-theme="dark"] .ed-header .ed-nav a:not(.ed-btn-primary):hover,
[data-shell-theme="dark"] .ed-header .ed-nav a:not(.ed-btn-primary):focus-visible,
[data-shell-theme="dark"] .ed-header .ed-nav a:not(.ed-btn-primary)[aria-current="page"] { color: var(--accent-soft); }
@media (max-width: 1120px) {
  /* Stesso noir del pannello mobile chiaro sostituito sopra: era ancora il navy ritirato. */
  [data-shell-theme="dark"] .ed-header .ed-nav { background: rgba(13, 14, 16, .98); border-bottom-color: rgba(201, 166, 98, .22); }
  /* Il gemello scuro del divisore di riga ~1009: stessa riga, stessa decisione,
     stesso verso. rgba(242,236,223,.1) misurava 1,247:1 sul pannello noir di
     /memory-book e /anteprima — 4 comandi del censimento del 03/08 — e passa al
     token che questo foglio usa per ogni confine su fondo scuro. */
  [data-shell-theme="dark"] .ed-header .ed-nav a:not(.ed-btn-primary) { color: rgba(242, 236, 223, .9); border-bottom-color: var(--line-light-strong); }
}

/* ==========================================================================
   Trasparenza ridotta
   Chi chiede prefers-reduced-transparency non deve vedere né sfocature né
   fondi semitrasparenti. Restavano due punti scoperti (debito §4-C10 del
   documento di apertura, riconfermato dagli audit v1 §18, v3 §20 e v4 §17):
   il pannello del menu mobile (#ed-shell-nav, blur 14px su tutte le pagine e
   tutte le larghezze sotto 1120px — la soglia, alzata da 900 il 29/07, è
   quella dichiarata dalle @media qui sopra) e l'header delle pagine a tema scuro (blur
   14px + fondo all'86%). In entrambi i casi la resa senza sfocatura è già
   decisa: il fondo diventa il colore di marca pieno, che è la stessa tinta al
   100% invece che al 98/86%. Nessun nuovo colore, nessuna animazione toccata.
   Le regole stanno in fondo al foglio di proposito: pareggiano in specificità
   quelle che sostituiscono e devono vincere per ordine di dichiarazione.
   Nota storica: una regola prefers-reduced-transparency sull'header chiaro era
   stata rimossa perché orfana (vedi il commento più su). Queste no: coprono
   due superfici che la trasparenza ce l'hanno davvero, misurata.
   ========================================================================== */
@media (prefers-reduced-transparency: reduce) {
  [data-shell-theme="dark"] .ed-header,
  [data-shell-theme="dark"] .ed-header.is-solid,
  [data-shell-theme="dark"] .ed-header--solid {
    background: var(--brand-noir);
    backdrop-filter: none; -webkit-backdrop-filter: none;
  }
}
@media (max-width: 1120px) and (prefers-reduced-transparency: reduce) {
  .ed-header .ed-nav {
    background: var(--brand-avorio);
    backdrop-filter: none; -webkit-backdrop-filter: none;
  }
  [data-shell-theme="dark"] .ed-header .ed-nav { background: var(--brand-noir); }
}
