/* =============================================================================
   MARCA GROUP — DESIGN SYSTEM · CLASSI DI SISTEMA
   Griglia, tipografia e componenti. Dipende da tokens.css: caricalo PRIMA.

   Questo file è pensato per essere copiato così com'è in un progetto nuovo.
   Non contiene nulla della pagina di documentazione (quello sta in specimen.css).

   PREFISSO: tutte le classi iniziano con mg- (Marca Group).

   REGOLE STRUTTURALI APPLICATE QUI
   · gutter = 0: i campi si toccano, si separano con un filo da 1px
   · nessuna ombra, nessuna elevazione
   · raggio solo su controlli (4px) e pill di stato (20px)
   · allineamento a bandiera sinistra
   · ogni spazio è un multiplo di U = 8px
   ============================================================================= */

/* -----------------------------------------------------------------------------
   RESET MINIMO
   -------------------------------------------------------------------------- */

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

/* `clip` e non `hidden`: hidden rende <body> un contenitore di scorrimento e
   disattiva ogni `position: sticky` al suo interno — corsie, testate e barre
   di strumenti comprese. Il taglio serve perché .mg-bleed esce dal margine. */
html,
body {
  margin: 0;
  padding: 0;
  overflow-x: clip;
}

body {
  background: var(--marca-surface);
  color: var(--marca-text);
  font-family: var(--marca-font-primary);
  font-size: var(--marca-type-text-size);
  line-height: var(--marca-type-text-lh);
  -webkit-font-smoothing: antialiased;
  text-rendering: optimizeLegibility;
}

/* Il reset sta in `:where()` — specificità ZERO — perché non deve battere le
   regole di flusso. Con i selettori di tipo nudi (0,0,1) vinceva su
   `:where(.mg-field) > * + *` (0,0,0), e centouno figli su centoventiquattro
   restavano attaccati: il ritmo verticale era dichiarato e inerte. */
/* `legend` sta in questo elenco per una ragione misurabile: il browser gli dà
   `padding-inline: 2px` di suo, e 2 non è nulla e non è U. Un `.mg-field-label`
   scritto su un elemento `legend` — è la forma che §17 prescrive per l'etichetta
   di un gruppo — rientrava di 2px rispetto ai campi che intesta: l'unica
   etichetta della pagina che non partiva dal filo di sinistra. */
:where(h1, h2, h3, h4, h5, h6, p, figure, ul, ol, legend) {
  margin: 0;
  padding: 0;
}

ul, ol {
  list-style: none;
}

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

button {
  font: inherit;
  color: inherit;
  background: none;
  border: none;
  padding: 0;
  cursor: pointer;
}

a {
  color: inherit;
}

/* Indicatore di focus — [PROPOSTA]: il brand system non lo definisce, ma senza
   non c'è accessibilità da tastiera.
   Due fili contigui: verde all'interno perché il focus è «segnale di
   attivazione», grafite all'esterno perché il verde da solo dà 2,43:1 su carta
   e WCAG 1.4.11 ne chiede 3. Nessuna ombra: due linee, come ovunque nel sistema.
   Il filo esterno usa `outline` sul livello sottostante tramite un pseudo-
   elemento che non partecipa al layout e non sposta nulla. */
:where(a, button, input, select, textarea, summary, [tabindex]):focus-visible {
  outline: var(--marca-focus-width) solid var(--marca-focus-ring);
  outline-offset: var(--marca-focus-offset);
  position: relative;
}

:where(a, button, input, select, textarea, summary, [tabindex]):focus-visible::after {
  content: '';
  position: absolute;
  inset: calc(-1 * (var(--marca-focus-width) + var(--marca-focus-offset) + var(--marca-border-width)));
  border: var(--marca-border-width) solid var(--marca-focus-ring-contrast);
  border-radius: inherit;
  pointer-events: none;
}

/* Chi ha già un ::after proprio dichiara di gestirlo da sé: il secondo filo
   passa allora al contenitore, che lo disegna con la stessa geometria. */
:where([data-focus-frame]):focus-visible::after {
  content: none;
}

/* ELEMENTI RIMPIAZZATI — input, select, textarea.
   Non generano pseudo-elementi: su di loro la regola qui sopra non disegnava
   nulla, e restava il solo filo verde, che da solo vale 2,43:1 su carta —
   sotto i 3:1 di WCAG 1.4.11, cioè esattamente la ragione per cui l'anello è
   a due fili.
   La coppia si sposta allora a cavallo del bordo del campo, nello stesso
   ordine dichiarato: il verde è il filo del campo portato allo spessore del
   focus, il filo di contenimento è l'outline che gli sta a contatto, fuori.
   Due fili contigui, nessuna ombra, stessa grammatica.
   Il filo più spesso non sposta niente: `box-sizing: border-box` tiene ferma
   la scatola e il padding riassorbe il millimetro in più (R2), campo per
   campo. E non tocca chi non ha un filo — senza `border-style` dichiarato,
   `border-width` e `border-color` non disegnano: casella, scelta esclusiva e
   cursore restano ai propri anelli, dichiarati in controls.css. */
input:focus-visible,
select:focus-visible,
textarea:focus-visible {
  outline: var(--marca-border-width) solid var(--marca-focus-ring-contrast);
  outline-offset: 0;
  border-color: var(--marca-focus-ring);
  border-width: var(--marca-focus-width);
}

/* DENTRO UN CONTENITORE CHE RITAGLIA l'anello si rivolta all'interno.
   Un `overflow` diverso da `visible` su un antenato taglia l'`outline` e i
   pseudo-elementi dei discendenti: una striscia di segmenti, uno stepper, una
   tendina, un menu e una sezione che si apre ritagliano tutte per ragioni
   proprie — e i controlli che ci vivono dentro restavano **senza alcun
   indicatore di focus**, che è il difetto più grave che questo sistema possa
   avere.
   La coppia non cambia né ordine né spessore: si sposta dentro la scatola.
   Verde nei 2px più esterni dell'interno, contenimento subito dentro di lui.

   CHI PORTA LA CONFORMITÀ CAMBIA CON LA CONDIZIONE, e va detto per intero.
   In CHIARA è il filo di contenimento: l'anello da solo — Green/500 su carta —
   vale 2,43:1, sotto i 3:1 di WCAG 1.4.11, e la grafite lo riscatta da
   entrambi i lati, 7,06:1 sul verde e 18,73:1 sul campo bianco.
   In SCURA la conformità è già dell'anello: Green/400 vale 7,61:1 sul campo e
   8,43:1 sul fondo pagina, e non serve nessun riscatto. Il filo bianco resta
   perché stacca l'anello dalla superficie — 16,91:1 sul campo — non perché lo
   stacchi dal verde: là fa 2,22:1, e nessun colore soddisfa 3:1 verso Green/400
   e verso il campo insieme. Non è un difetto: al buio quel compito non c'è.

   La cornice della pagina ha i propri contenitori che ritagliano e se li
   dichiara da sé, in specimen.css: qui dentro sta solo il sistema. */
:where(
  .mg-segmented,
  .mg-stepper,
  .mg-inputgroup,
  .mg-tablist,
  .mg-iconbar,
  .mg-listbox > *,
  .mg-menu > *,
  .mg-accordion-panel > *,
  .mg-row-detail-inner > *,
  .mg-progress
) :where(a, button, input, select, textarea, summary, [tabindex]):focus-visible {
  outline-offset: calc(-1 * var(--marca-focus-width));
}

:where(
  .mg-segmented,
  .mg-stepper,
  .mg-inputgroup,
  .mg-tablist,
  .mg-iconbar,
  .mg-listbox > *,
  .mg-menu > *,
  .mg-accordion-panel > *,
  .mg-row-detail-inner > *,
  .mg-progress
) :where(a, button, input, select, textarea, summary, [tabindex]):focus-visible::after {
  inset: var(--marca-focus-width);
}

.mg-sr-only {
  position: absolute;
  width: 1px;
  height: 1px;
  padding: 0;
  overflow: hidden;
  clip: rect(0 0 0 0);
  white-space: nowrap;
  border: 0;
}

/* -----------------------------------------------------------------------------
   TIPOGRAFIA
   Cinque livelli dichiarati più i corpi di lavoro dell'interfaccia.
   La gerarchia nasce da griglia, scala, posizione e spazio: non dal font.
   -------------------------------------------------------------------------- */

.mg-display {
  font-family: var(--marca-font-primary);
  font-weight: var(--marca-weight-bold);
  font-size: var(--marca-type-display-size);
  line-height: var(--marca-type-display-lh);
  letter-spacing: var(--marca-type-display-tracking);
  text-transform: uppercase;
  text-align: start;
}

.mg-title {
  font-family: var(--marca-font-primary);
  font-weight: var(--marca-weight-bold);
  font-size: var(--marca-type-title-size);
  line-height: var(--marca-type-title-lh);
  letter-spacing: var(--marca-type-title-tracking);
  text-align: start;
}

/* Titoletto: stesso corpo del testo corrente, Medium — MAI Bold. */
.mg-subhead {
  font-family: var(--marca-font-primary);
  font-weight: var(--marca-weight-medium);
  font-size: var(--marca-type-subhead-size);
  line-height: var(--marca-type-subhead-lh);
  letter-spacing: var(--marca-type-subhead-tracking);
  text-transform: uppercase;
}

.mg-body {
  font-size: var(--marca-type-body-size);
  line-height: var(--marca-type-body-lh);
  letter-spacing: var(--marca-type-body-tracking);
}

.mg-body-l {
  font-size: var(--marca-type-body-l-size);
  line-height: var(--marca-type-body-l-lh);
  letter-spacing: var(--marca-type-body-l-tracking);
}

.mg-body-m {
  font-size: var(--marca-type-body-m-size);
  line-height: var(--marca-type-body-m-lh);
  letter-spacing: var(--marca-type-body-m-tracking);
}

.mg-text {
  font-size: var(--marca-type-text-size);
  line-height: var(--marca-type-text-lh);
}

.mg-text-s {
  font-size: var(--marca-type-text-s-size);
  line-height: var(--marca-type-text-s-lh);
}

.mg-caption {
  font-size: var(--marca-type-caption-size);
  line-height: var(--marca-type-caption-lh);
  color: var(--marca-text-subtle);
}

/* Registro tecnico — Config Mono. Solo con funzione informativa reale. */
.mg-label {
  font-family: var(--marca-font-mono);
  font-weight: var(--marca-weight-regular);
  font-size: var(--marca-type-label-size);
  line-height: var(--marca-type-label-lh);
}

.mg-mono-l {
  font-family: var(--marca-font-mono);
  font-size: var(--marca-type-mono-l-size);
  line-height: var(--marca-type-mono-l-lh);
}

.mg-mono {
  font-family: var(--marca-font-mono);
  font-size: var(--marca-type-mono-size);
  line-height: var(--marca-type-mono-lh);
}

.mg-mono-s {
  font-family: var(--marca-font-mono);
  font-size: var(--marca-type-mono-s-size);
  line-height: var(--marca-type-mono-s-lh);
}

.mg-mono-xs {
  font-family: var(--marca-font-mono);
  font-size: var(--marca-type-mono-xs-size);
  line-height: var(--marca-type-mono-xs-lh);
}

/* Eyebrow: il codice di sezione in alto a sinistra. Vive nella corsia. */
.mg-eyebrow {
  font-family: var(--marca-font-mono);
  font-size: var(--marca-type-mono-s-size);
  line-height: var(--marca-type-mono-s-lh);
  letter-spacing: 0.04em;
  text-transform: uppercase;
  color: var(--marca-text-subtle);
}

.mg-muted { color: var(--marca-text-muted); }
.mg-subtle { color: var(--marca-text-subtle); }
.mg-identity { color: var(--marca-identity); }
.mg-deep { color: var(--marca-depth); }

/* -----------------------------------------------------------------------------
   GRIGLIA P·12
   Dodici micro-colonne, gutter zero. La corsia orienta, la campata racconta.
   Il margine di mezza colonna non cambia mai.
   -------------------------------------------------------------------------- */

/* Il margine NON è padding del contenitore: se lo fosse, le dodici colonne si
   dividerebbero 1920 − 160 = 1760px e una colonna varrebbe 146,66px, non i 160
   dichiarati. Le colonne dividono l'intero formato; il margine di mezza colonna
   è ricavato DENTRO le due colonne di bordo, dai campi che le occupano.
   Così «colonna 160 · margine mezza colonna · formato 1920» sono veri insieme. */
.mg-page {
  width: 100%;
  max-width: var(--marca-grid-max);
  margin-inline: auto;
}

/* Il margine, a carico dei campi di bordo. */
.mg-page > .mg-grid > :first-child { padding-inline-start: var(--marca-grid-margin); }
.mg-page > .mg-grid > :last-child { padding-inline-end: var(--marca-grid-margin); }

/* Un contenuto che non è dentro una griglia porta il margine su di sé. */
.mg-page > :not(.mg-grid) { padding-inline: var(--marca-grid-margin); }

.mg-grid {
  display: grid;
  grid-template-columns: repeat(var(--marca-grid-columns), minmax(0, 1fr));
  gap: var(--marca-grid-gutter); /* zero, regola 01 */
}

.mg-grid > * {
  min-width: 0;
}

/* Partizioni */
.mg-rail { grid-column: span 3; }
.mg-bay { grid-column: span 9; }
.mg-third { grid-column: span 4; }
.mg-half { grid-column: span 6; }
.mg-full { grid-column: 1 / -1; }

.mg-span-1 { grid-column: span 1; }
.mg-span-2 { grid-column: span 2; }
.mg-span-3 { grid-column: span 3; }
.mg-span-4 { grid-column: span 4; }
.mg-span-5 { grid-column: span 5; }
.mg-span-6 { grid-column: span 6; }
.mg-span-7 { grid-column: span 7; }
.mg-span-8 { grid-column: span 8; }
.mg-span-9 { grid-column: span 9; }
.mg-span-10 { grid-column: span 10; }
.mg-span-11 { grid-column: span 11; }
.mg-span-12 { grid-column: 1 / -1; }

/* Campo: la superficie che contiene. Non fluttua, non ha raggio, non ha ombra.
   Il testo dentro mantiene un padding interno costante (regola 05).
   Il padding passa da una variabile locale così le varianti lo cambiano in un
   punto solo, e R2 può assorbire il filo senza sapere quale variante è. */
.mg-field {
  position: relative;
  --mg-field-pad: var(--marca-field-padding);
  border-radius: var(--marca-radius-field);
  box-shadow: var(--marca-shadow);
  text-align: start;
  padding: var(--mg-field-pad);
  background: transparent;
}

.mg-field--surface { background: var(--marca-field); }
.mg-field--alt { background: var(--marca-field-alt); }

/* CHI PORTA LA SUPERFICIE SECONDARIA PORTA ANCHE I PROPRI INCHIOSTRI.
   È la stessa regola delle superfici sovrapposte (surfaces.css), applicata un
   gradino invece che due: un ruolo si calibra sulla superficie che ha sotto, e
   se la superficie cambia il ruolo deve seguirla.
   In condizione CHIARA il terziario è calibrato sul campo — Neutral/500 sul
   bianco, 5,00:1 — e sul campo secondario scendeva a 4,30:1, sotto la soglia
   di lettura. Neutral/600 lo riporta a 6,87:1 senza collassare sul ruolo
   «etichetta», che vive su una superficie diversa.
   In condizione SCURA la correzione non serve e sarebbe dannosa: là il
   terziario è già Neutral/400 e sul campo secondario (Neutral/800) vale
   4,91:1, mentre Neutral/600 darebbe 1,80:1. Per questo la regola è scritta
   sulla condizione, non su tutte e due. */
:root:not([data-theme='dark']) :where(
  .mg-field--alt,
  .mg-note,
  .mg-banner,
  .mg-statusbar,
  .mg-tag,
  .mg-affix,
  .mg-input:disabled,
  .mg-table tbody tr:hover
) {
  --marca-text-subtle: var(--marca-neutral-600);
}
.mg-field--invert {
  background: var(--marca-surface-invert);
  color: var(--marca-text-invert);
}
.mg-field--bare { --mg-field-pad: 0px; }
.mg-field--l { --mg-field-pad: var(--marca-field-padding-l); }

/* Fili: la separazione strutturale. Mai spazio vuoto tra campi. */
/* R2 sul perimetro pieno: i fili sono quattro e il padding li assorbe tutti e
   quattro, come .mg-empty e .mg-dropzone. Senza, il campo bordato chiudeva su
   24 + 24 + 1 + 1 = 50 su entrambi gli assi — l'unico campo del sistema fuori
   ritmo, mentre .mg-rule-t e .mg-rule-b accanto a lui chiudono su 48.
   `max()` tiene il conto valido anche per il campo senza padding. */
.mg-field--bordered {
  border: var(--marca-border-width) solid var(--marca-border);
  padding: max(0px, calc(var(--mg-field-pad) - var(--marca-border-width)));
}
.mg-rule-t { border-top: var(--marca-border-width) solid var(--marca-border); }
.mg-rule-b { border-bottom: var(--marca-border-width) solid var(--marca-border); }
.mg-rule-s { border-inline-start: var(--marca-border-width) solid var(--marca-border); }
.mg-rule-e { border-inline-end: var(--marca-border-width) solid var(--marca-border); }

/* R2 sul filo singolo, su tutti e quattro i lati: il filo è assorbito dal
   padding, così una fascia di campi impilati o affiancati chiude su U invece
   che su U + 1 a ogni giunto — 23 dichiarati più 1 di filo fanno i 24 del
   campo, 15 più 1 fanno i 16 sotto i 640. `max()` tiene il conto valido anche
   per il campo senza padding.
   I fili in linea valgono quanto quelli in blocco: senza le ultime due regole
   un campo con .mg-rule-s chiudeva su 25 da quel lato e su 24 dagli altri tre. */
.mg-field.mg-rule-t {
  padding-block-start: max(0px, calc(var(--mg-field-pad) - var(--marca-border-width)));
}
.mg-field.mg-rule-b {
  padding-block-end: max(0px, calc(var(--mg-field-pad) - var(--marca-border-width)));
}
.mg-field.mg-rule-s {
  padding-inline-start: max(0px, calc(var(--mg-field-pad) - var(--marca-border-width)));
}
.mg-field.mg-rule-e {
  padding-inline-end: max(0px, calc(var(--mg-field-pad) - var(--marca-border-width)));
}

/* Campi adiacenti dentro una griglia: il filo nasce dal secondo in poi, così i
   campi si toccano senza raddoppiare la linea.
   Il margine negativo non è un vezzo: la regola conta i campi in ordine di
   MARKUP, non di riga, e quando la fascia avvolge il primo campo di ogni riga
   successiva si ritrova un filo verticale che va ad affiancare il perimetro —
   due linee da 1px contigue, cioè un bordo spesso il doppio. Tirando il campo
   di un pixel il suo filo si SOVRAPPONE a quello che trova, invece di
   sommarsi: dentro la riga cade sul giunto, in testa alla riga cade sul
   perimetro. Una linea sola in entrambi i casi. */
.mg-fields > .mg-field + .mg-field {
  border-inline-start: var(--marca-border-width) solid var(--marca-border);
  margin-inline-start: calc(-1 * var(--marca-border-width));
}

/* Filo orizzontale isolato. Separa contenuti reali: non è decorazione. */
.mg-divider {
  height: var(--marca-border-width);
  background: var(--marca-border);
  border: 0;
}

/* Ritmo verticale: le sezioni chiudono sulla baseline. */
.mg-section { padding-block: var(--marca-space-12); }
.mg-section--s { padding-block: var(--marca-space-8); }

/* -----------------------------------------------------------------------------
   RITMO DI FLUSSO — la scala delle relazioni
   Lo spazio verticale fra due elementi impilati è una RELAZIONE, e una
   relazione vale UNA distanza sola in tutto il sistema. Si dichiara qui.
   Non si scrive nel markup: mai.

     8   ciò che intesta → ciò che è intestato (etichetta, marcatore, didascalia)
    16   elemento → elemento dentro lo stesso blocco   ← flusso predefinito
    24   sotto-blocco → sotto-blocco
    48   blocco → blocco
    96   sezione → sezione, e lì è padding, non margine: `.mg-section` porta
         `--marca-space-12` sopra e sotto, 96 + 96. La variante compatta
         `.mg-section--s` chiude su 64 + 64 (`--marca-space-8`), e sotto i
         640 entrambe scendono a 48 + 48.

   I selettori generali stanno dentro :where(): specificità zero. Così una
   relazione più stretta — un'etichetta, una didascalia — vince senza
   !important e senza gare di specificità, e un componente che porta la
   propria geometria (una griglia, una pila con gap) la sovrascrive con una
   riga sola. Documentazione: File_MD/04.
   -------------------------------------------------------------------------- */

:where(.mg-stack-xs) > * + * { margin-top: var(--marca-space-1); }
:where(.mg-stack-s) > * + * { margin-top: var(--marca-space-2); }
:where(.mg-stack) > * + * { margin-top: var(--marca-space-3); }
:where(.mg-stack-l) > * + * { margin-top: var(--marca-space-6); }

/* Dentro un campo il flusso predefinito è 16: due contenuti impilati non si
   toccano mai, e nessuno deve ricordarsi di dichiararlo. È la correzione del
   difetto che rendeva le pagine «attaccate e schiacciate»: il ritmo stava nel
   markup, riscritto a mano su cinque valori diversi, invece che qui. */
:where(.mg-field) > * + * { margin-top: var(--marca-space-2); }

/* La relazione più stretta della scala: un'etichetta, un marcatore o un
   valore stanno a 8 da ciò che intestano. È la stessa distanza che
   .mg-field-label porta già su di sé. */
.mg-eyebrow + *,
.mg-progress-label + *,
.mg-slider-head + * { margin-top: var(--marca-space-1); }

/* Due coppie chiave-valore si susseguono senza margine: il ritmo lo dà il
   loro padding (8 + 8 = 16), come dichiarato in .mg-kv. E una chiave e il suo
   valore sono un oggetto solo: fra loro non c'è relazione da spaziare. */
.mg-kv + .mg-kv { margin-top: 0; }
.mg-kv-key + .mg-kv-value { margin-top: 0; }

/* Griglia di CONTROLLI. Il divieto di gutter riguarda i campi: fra controlli
   lo spazio esiste, e vale solo 16 (controlli indipendenti) o 24 (blocchi di
   modulo). Vedi la tabella di File_MD/17. */
.mg-grid--controlli { gap: var(--marca-space-2); }
.mg-grid--blocchi { gap: var(--marca-space-3); }

/* Pila di controlli: verticale, a bandiera sinistra. Fra controlli
   indipendenti lo spazio esiste e vale 16 — vedi File_MD/17. */
.mg-stack-controls {
  display: flex;
  flex-direction: column;
  align-items: flex-start;
  gap: var(--marca-space-2);
}

/* Perimetro: chiude una fascia di campi che si toccano. Il filo esterno sta
   sul contenitore, quelli interni nascono dal secondo campo in poi. */
.mg-bordered { border: var(--marca-border-width) solid var(--marca-border); }

/* Un codice non si spezza mai su due righe: è la stringa che l'utente copia.
   Regola dichiarata in File_MD/10. */
.mg-nowrap { white-space: nowrap; }

/* Impianto applicativo 3|6|3 — corsia · campata · terzo destro */
.mg-app-shell {
  display: grid;
  grid-template-columns: minmax(0, 3fr) minmax(0, 6fr) minmax(0, 3fr);
  gap: 0;
  min-height: 0;
}
.mg-app-shell > * + * {
  border-inline-start: var(--marca-border-width) solid var(--marca-border);
}

/* Toolbar: riga da 64px, chiusa da un filo.
   L'altezza è un MINIMO, non una gabbia: con `height` fissa un percorso di
   navigazione che va a tre righe misura 112 dentro 64 e stampa il proprio
   testo sopra i due fili strutturali. Il padding da 8 sopra e 8 meno il filo
   sotto (R2) tiene la riga esattamente a 64 finché il contenuto sta su una
   riga (48 + 8 + 7 + filo), e la fa crescere di multipli interi di U quando
   avvolge. */
.mg-toolbar {
  display: flex;
  align-items: center;
  flex-wrap: wrap;
  gap: var(--marca-space-2);
  min-block-size: var(--marca-row);
  /* R2: il filo inferiore è assorbito dal padding, così la riga chiude su 64
     esatti invece che su 65. */
  padding-block: var(--marca-space-1) calc(var(--marca-space-1) - var(--marca-border-width));
  padding-inline: var(--marca-space-3);
  border-bottom: var(--marca-border-width) solid var(--marca-border);
  background: var(--marca-field);
}

/* L'ultimo elemento della riga strumenti si appoggia al bordo opposto.
   Quando la riga avvolge la spinta sparisce: su una riga propria diventerebbe
   una centratura di fatto, e il sistema non centra. */
.mg-toolbar-end { margin-inline-start: auto; }

/* -----------------------------------------------------------------------------
   CONTROLLI
   La CTA primaria è verde. Non esiste una seconda CTA equivalente in arancio:
   l'arancio è accento tecnico, non azione.
   -------------------------------------------------------------------------- */

.mg-btn {
  display: inline-flex;
  align-items: center;
  justify-content: center;
  gap: var(--marca-space-1);
  min-height: var(--marca-control-height);
  padding-inline: var(--marca-space-3);
  border-radius: var(--marca-radius-control);
  font-family: var(--marca-font-primary);
  font-size: var(--marca-type-text-size);
  line-height: var(--marca-type-text-lh);
  font-weight: var(--marca-weight-medium);
  border: var(--marca-border-width) solid transparent;
  transition: background-color var(--marca-motion-base) var(--marca-motion-ease),
    border-color var(--marca-motion-base) var(--marca-motion-ease),
    color var(--marca-motion-base) var(--marca-motion-ease);
}

/* IL PULSANTE NON SCEGLIE I PROPRI COLORI: LI CHIEDE AI RUOLI.
   `--marca-mark`, `--marca-mark-hover` e `--marca-mark-text` sono già
   dichiarati in tokens.css come «il riempimento che porta un segno», e si
   rimappano da sé con la condizione: fondo Green/700 → Green/500, passaggio
   Green/800 → Green/400, inchiostro bianco → grafite. Riscrivere qui gli
   stessi tre valori a mano violava la regola di tokens.css — «nei componenti
   si usano SOLO questi» — teneva `--marca-mark-hover` a zero usi in tutta la
   repo e obbligava a ripetere l'inversione in un blocco scuro che ora non
   serve più.
   In chiaro: bianco su Green/700 dà 6,95:1 ed è una combinazione approvata;
   su Green/500 darebbe 2,65:1, sotto ogni soglia.
   Al buio, per la stessa via: grafite su Green/500 7,06:1, al passaggio
   8,43:1, e lo stacco dal campo sale da 2,43:1 a 6,37:1. */
.mg-btn--primary {
  background: var(--marca-mark);
  color: var(--marca-mark-text);
}
.mg-btn--primary:hover { background: var(--marca-mark-hover); }
.mg-btn--primary:active { background: var(--marca-green-900); }

/* Premuto è l'unico gradino che i ruoli non portano: non esiste un
   --marca-mark-active. In chiaro scende a Green/900 e il verde profondo resta
   leggibile; al buio deve SALIRE a Green/300, perché scendere significa
   sparire — sul campo scuro Green/800 stacca 1,56:1 e Green/900 1,09:1, e il
   pulsante scompare nell'istante in cui viene premuto. Con Green/300: 9,93:1.
   La guardia `:not([disabled])` non è cosmetica: senza, questa regola (0,6,0)
   coprirebbe `.mg-btn[disabled]` (0,2,0) e al buio il pulsante primario spento
   continuerebbe a rispondere alla pressione — uno stato disabilitato che si
   comporta da abilitato. Sugli altri due gradini la guardia non serve più:
   `.mg-btn--primary` (0,1,0) e `.mg-btn--primary:hover` (0,2,0) perdono
   entrambi contro `.mg-btn[disabled]`, che è scritto più sotto. */
:root[data-theme='dark'] .mg-btn--primary:not([disabled]):not([aria-disabled='true']):active {
  background: var(--marca-green-300);
}

.mg-btn--secondary {
  background: var(--marca-field);
  border-color: var(--marca-border-control);
  color: var(--marca-text-muted);
}
.mg-btn--secondary:hover {
  border-color: var(--marca-text-muted);
  color: var(--marca-text);
  background: var(--marca-field-alt);
}

.mg-btn--ghost {
  background: transparent;
  color: var(--marca-text-muted);
}
.mg-btn--ghost:hover { color: var(--marca-text); }

/* CHI APRE QUALCOSA LO DICHIARA.
   Un pulsante che apre un menu portava solo la propria etichetta: si leggeva
   come un pulsante che ESEGUE, non come uno che ESPANDE, e l'unica differenza
   era nel markup. Il segno è disegnato — due fili ad angolo, la stessa
   grammatica del glifo della tendina nativa e della combobox — e non ruota mai:
   aperto e chiuso si distinguono per il colore del segno, non per il moto.
   Sta su ::before perché ::after è il secondo filo dell'anello di focus;
   `order: 1` lo porta dopo l'etichetta senza toccare il markup. */
:where(.mg-btn, .mg-iconbtn)[aria-haspopup='true']::before {
  content: '';
  order: 1;
  flex-shrink: 0;
  inline-size: var(--marca-mark-square);
  block-size: var(--marca-mark-square);
  border-inline-end: 2px solid currentColor;
  border-block-end: 2px solid currentColor;
  rotate: 45deg;
  margin-block-start: -3px;
}

:where(.mg-btn, .mg-iconbtn)[aria-haspopup='true'][aria-expanded='true']::before {
  border-color: var(--marca-mark);
}

.mg-btn--s {
  min-height: var(--marca-control-height-s);
  padding-inline: var(--marca-space-2);
  font-size: var(--marca-type-text-s-size);
}

.mg-btn[disabled],
.mg-btn[aria-disabled='true'] {
  background: var(--marca-field-alt);
  border-color: var(--marca-border);
  color: var(--marca-text-disabled);
  cursor: not-allowed;
}

/* Campi di input */
.mg-input {
  width: 100%;
  min-height: var(--marca-control-height);
  padding: var(--marca-space-1) var(--marca-space-2);
  border: var(--marca-border-width) solid var(--marca-border-control);
  border-radius: var(--marca-radius-control);
  background: var(--marca-field);
  color: var(--marca-text);
  font-family: var(--marca-font-primary);
  font-size: var(--marca-type-text-size);
  transition: border-color var(--marca-motion-control) var(--marca-ease-state),
    background-color var(--marca-motion-control) var(--marca-ease-state);
}
/* Il passaggio è lo stato più debole del contratto: cede al focus e non copre
   mai l'errore. Senza le due guardie `.mg-input:hover` (0,4,0) batteva sia
   l'anello di focus sia `[aria-invalid]` (0,2,0), e il filo rosso di un campo
   non valido si spegneva proprio mentre l'utente ci portava sopra il
   puntatore — l'unico segnale cromatico dell'errore, perso nel momento in cui
   lo si sta guardando. */
.mg-input:hover:not(:disabled):not([readonly]):not(:focus-visible):not([aria-invalid='true']) {
  border-color: var(--marca-text-muted);
}
/* Il segnaposto non usa il ruolo «disabilitato»: quello è riservato a ciò che
   non si può usare, e a 2,94:1 non sarebbe leggibile. */
.mg-input::placeholder { color: var(--marca-text-subtle); }
.mg-input:disabled {
  background: var(--marca-field-alt);
  border-color: var(--marca-border);
  color: var(--marca-text-disabled);
  cursor: not-allowed;
}
/* Sola lettura ≠ disabilitato: il dato c'è, va letto e copiato, resta nella
   tabulazione e mantiene il pieno contrasto. */
.mg-input[readonly] {
  background: var(--marca-surface);
  border-color: var(--marca-border);
  color: var(--marca-text);
}
.mg-input[aria-invalid='true'] {
  border-color: var(--marca-error);
  border-width: var(--marca-focus-width);
}

/* Sola lettura non è disabilitato: resta nella tabulazione, quindi deve
   mostrare il focus. Senza questa riga il filo grigio di `[readonly]` (0,2,0)
   copriva il verde della regola generica (0,1,1). */
.mg-input[readonly]:focus-visible { border-color: var(--marca-focus-ring); }

/* A fuoco vince il FOCUS, non l'errore. Tenendo il rosso, l'unica differenza
   fra «non a fuoco» e «a fuoco» sarebbe stata un capello grafite da 1px: il
   contratto dichiara un anello a due fili col verde dentro, e qui non c'era.
   L'errore non si perde — resta nel messaggio obbligatorio e in `aria-invalid`,
   che è dove WCAG 3.3.1 chiede che stia — e torna visibile appena il fuoco se
   ne va. Il colore non è mai l'unico segnale dell'errore: è la regola 1 del
   contratto di accessibilità. */

/* Le due condizioni in cui il filo del campo passa da 1 a 2px — errore e
   focus — chiudono sul ritmo invece di spostare il testo di un pixel: il
   padding riassorbe il filo, come ogni scatola del sistema (R2).
   Vale per i soli elementi rimpiazzati, che sono quelli a cui il filo cresce
   davvero: un `<button class="mg-input">` — la combobox — tiene il proprio
   filo da 1px e il secondo anello dal pseudo-elemento, e non deve stringersi. */
:is(input, select, textarea).mg-input[aria-invalid='true'],
:is(input, select, textarea).mg-input:focus-visible {
  padding: calc(var(--marca-space-1) - var(--marca-border-width))
    calc(var(--marca-space-2) - var(--marca-border-width));
}

/* Un valore numerico dentro un input resta in Config Mono: è un dato. */
.mg-input--numeric {
  font-family: var(--marca-font-mono);
  text-align: end;
}

.mg-field-label {
  display: block;
  font-family: var(--marca-font-mono);
  font-size: var(--marca-type-mono-s-size);
  line-height: var(--marca-type-mono-s-lh);
  text-transform: uppercase;
  letter-spacing: 0.04em;
  color: var(--marca-text-label);
  margin-bottom: var(--marca-space-1);
}

/* Campo obbligatorio: la parola, non l'asterisco. Un asterisco è un simbolo
   che va spiegato una volta in cima al modulo; l'etichetta si spiega da sola. */
.mg-field-label[data-required]::after {
  content: ' · obbligatorio';
  color: var(--marca-text-subtle);
  text-transform: none;
  letter-spacing: 0;
}

/* Messaggio sotto il campo. Lo stato di errore non è mai affidato al solo
   colore del filo: il testo è obbligatorio e va legato con aria-describedby.

   È un PARAGRAFO, non una riga di elementi. Con `display: flex` ogni tag
   dentro la frase — un codice, un valore, un'unità — diventa un elemento a sé
   e viene spinto all'estremo opposto della riga: «usa il formato» da una
   parte e «MI-000» dall'altra. Il glifo si aggancia con un rientro sporgente,
   che tiene le righe successive allineate al testo e non al glifo. */
.mg-field-hint,
.mg-field-error {
  margin-top: var(--marca-space-1);
  font-family: var(--marca-font-mono);
  font-size: var(--marca-type-mono-s-size);
  line-height: var(--marca-type-mono-s-lh);
}

.mg-field-hint { color: var(--marca-text-subtle); }

.mg-field-error {
  color: var(--marca-error-text);
  font-weight: var(--marca-weight-bold);
  padding-inline-start: var(--marca-space-3); /* glifo 16 + 8 */
  text-indent: calc(-1 * var(--marca-space-3));
}

/* Il glifo è il secondo segnale, dopo il testo e prima del colore. */
.mg-field-error::before {
  content: '!';
  display: inline-grid;
  place-items: center;
  inline-size: var(--marca-space-2);
  block-size: var(--marca-space-2);
  margin-inline-end: var(--marca-space-1);
  vertical-align: top;
  text-indent: 0;
  border: var(--marca-border-width) solid currentColor;
  border-radius: 50%;
  font-size: var(--marca-type-mono-xs-size);
  line-height: 1;
}

/* -----------------------------------------------------------------------------
   NAVIGAZIONE
   Lo stato attivo è fondo Green/50 più barra verticale da 4px in Green/700
   (--marca-mark): Green/500 sul proprio wash darebbe 2,41:1.
   Mai solo colore del testo: la barra è il secondo segnale.
   -------------------------------------------------------------------------- */

.mg-nav {
  display: flex;
  flex-direction: column;
}

.mg-nav-item {
  position: relative;
  display: flex;
  align-items: center;
  gap: var(--marca-space-2);
  min-height: var(--marca-control-height);
  padding: var(--marca-space-1) var(--marca-space-2);
  padding-inline-start: calc(var(--marca-space-2) + var(--marca-active-bar));
  width: 100%;
  text-align: start;
  color: var(--marca-text-muted);
  text-decoration: none;
  transition: background-color var(--marca-motion-base) var(--marca-motion-ease),
    color var(--marca-motion-base) var(--marca-motion-ease);
}

.mg-nav-item:hover {
  background: var(--marca-field-alt);
  color: var(--marca-text);
}

/* `aria-current="false"` significa «non è quello corrente»: senza :not() la
   voce apparirebbe attiva mentre il lettore di schermo dice il contrario. */
.mg-nav-item[aria-current]:not([aria-current='false']) {
  background: var(--marca-identity-wash);
  color: var(--marca-text);
  font-weight: var(--marca-weight-medium);
}

.mg-nav-item[aria-current]:not([aria-current='false'])::before {
  content: '';
  position: absolute;
  inset-inline-start: 0;
  top: 0;
  bottom: 0;
  width: var(--marca-active-bar);
  background: var(--marca-mark);
}

/* -----------------------------------------------------------------------------
   STATI
   Ogni stato è ridondante: colore più etichetta. Il significato della tinta
   resta lo stesso su tutte le piattaforme.
   -------------------------------------------------------------------------- */

/* Altezza 24px = 3U: la pill chiude sul ritmo verticale.
   Il padding orizzontale è l'unico spazio dichiarato. */
.mg-status {
  display: inline-flex;
  align-items: center;
  gap: var(--marca-space-1);
  min-height: var(--marca-space-3);
  padding-inline: var(--marca-space-2);
  border-radius: var(--marca-radius-pill);
  font-family: var(--marca-font-mono);
  font-size: var(--marca-type-mono-s-size);
  line-height: var(--marca-type-mono-s-lh);
  font-weight: var(--marca-weight-bold);
  text-transform: uppercase;
  letter-spacing: 0.04em;
  white-space: nowrap;
  /* Allineata alla mediana del testo che la ospita: senza, il riquadro da 24
     si appoggia alla linea di base e alza la riga a 25,31 — è così che
     un'altezza intera diventa frazionaria. */
  vertical-align: middle;
}

.mg-status::before {
  content: '';
  width: var(--marca-space-1);
  height: var(--marca-space-1);
  border-radius: 50%;
  background: currentColor;
  flex-shrink: 0;
}

.mg-status--validated {
  background: var(--marca-success-wash);
  color: var(--marca-success-text);
}
.mg-status--pending {
  background: var(--marca-warning-wash);
  color: var(--marca-warning-text);
}
.mg-status--error {
  background: var(--marca-error-wash);
  color: var(--marca-error-text);
}
.mg-status--info {
  background: var(--marca-info-wash);
  color: var(--marca-info-text);
}
.mg-status--neutral {
  background: var(--marca-field-alt);
  color: var(--marca-text-muted);
}

/* Highlight tecnico: un dato che richiede attenzione.
   Config Mono bold in arancio. È un accento, non un'azione. */
.mg-highlight {
  font-family: var(--marca-font-mono);
  font-weight: var(--marca-weight-bold);
  color: var(--marca-accent-text);
}

/* Messaggio in linea: colore, filo laterale ed etichetta. Mai solo colore.
   Il filo laterale È il secondo segnale, quindi deve reggere i 3:1 di
   WCAG 1.4.11 sul proprio fondo — e su un fondo di stato, non sul bianco.
   `--marca-border-strong` dava 2,53:1 sul campo secondario: il filo che porta
   l'informazione era l'unica cosa che non si vedeva. `--marca-border-control`
   è il token il cui compito dichiarato è proprio reggere i 3:1: 4,30:1. */
.mg-note {
  border-inline-start: var(--marca-active-bar) solid var(--marca-border-control);
  padding: var(--marca-space-2) var(--marca-space-3);
  background: var(--marca-field-alt);
}
.mg-note--info { border-inline-start-color: var(--marca-info); background: var(--marca-info-wash); }
.mg-note--success { border-inline-start-color: var(--marca-success); background: var(--marca-success-wash); }
/* Attenzione è l'unico stato il cui colore di superficie non regge come filo:
   Amber/500 su Amber/100 dà 2,56:1, contro i 5,03 di info, 6,32 di validato e
   3,79 di errore. Il filo prende allora l'inchiostro dello stato, 6,58:1 —
   che è anche il colore con cui è scritta l'etichetta del messaggio.
   È QUESTA la ragione per cui `--marca-warning` non compare in nessun foglio,
   mentre `--marca-info`, `--marca-success` e `--marca-error` sì: non regge i
   3:1 di WCAG 1.4.11 in nessuno dei due posti dove i tre fratelli lo fanno —
   2,56:1 sul proprio fondo di stato e 2,99:1 sul campo bianco. Resta
   dichiarato perché è il colore della FAMIGLIA, non un ruolo di filo: chi
   disegna un segno di attenzione a superficie piena lo usa lì. La stessa
   deroga vale per la fascia e per la notifica, in surfaces.css. */
.mg-note--warning { border-inline-start-color: var(--marca-warning-text); background: var(--marca-warning-wash); }
.mg-note--error { border-inline-start-color: var(--marca-error); background: var(--marca-error-wash); }

.mg-note-title {
  font-family: var(--marca-font-mono);
  font-size: var(--marca-type-mono-s-size);
  font-weight: var(--marca-weight-bold);
  text-transform: uppercase;
  letter-spacing: 0.04em;
  margin-bottom: var(--marca-space-1);
}

/* -----------------------------------------------------------------------------
   DATI
   I dati vivono in blocchi modulari agganciati alla matrice e ai fili,
   senza contenitori superflui.
   -------------------------------------------------------------------------- */

.mg-table {
  width: 100%;
  /* `separate` e non `collapse`: un filo collassato si divide fra le due righe
     che separa — mezzo pixel per lato — e nessuna riga chiude più su un intero.
     Qui i fili sono solo orizzontali e ciascuna riga porta il proprio: separati
     non si raddoppiano, e la riga misura esattamente 40 o 64. */
  border-collapse: separate;
  border-spacing: 0;
  text-align: start;
}

/* Una riga di tabella non è un controllo: non deve rispettare i 48 del
   bersaglio minimo, deve chiudere sul ritmo. Il filo inferiore è assorbito
   dal padding — 8 sopra, 8 meno il filo sotto — così la cella misura
   esattamente 40 (riga compatta) con una riga di testo e 64 (riga base) con
   due. Nessuna altezza scritta a mano, nessuna frazione di pixel. */
.mg-table th {
  text-align: start;
  font-family: var(--marca-font-mono);
  font-size: var(--marca-type-mono-s-size);
  line-height: var(--marca-type-text-lh);
  font-weight: var(--marca-weight-regular);
  text-transform: uppercase;
  letter-spacing: 0.04em;
  color: var(--marca-text-subtle);
  padding: var(--marca-space-1) var(--marca-space-2)
    calc(var(--marca-space-1) - var(--marca-border-width));
  border-bottom: var(--marca-border-width) solid var(--marca-border-strong);
  vertical-align: bottom;
}

.mg-table td {
  padding: var(--marca-space-1) var(--marca-space-2)
    calc(var(--marca-space-1) - var(--marca-border-width));
  border-bottom: var(--marca-border-width) solid var(--marca-border);
  color: var(--marca-text-muted);
  vertical-align: top;
  font-size: var(--marca-type-text-s-size);
  line-height: var(--marca-type-text-s-lh);
}

.mg-table td:first-child { color: var(--marca-text); }

/* Numeri, codici e unità restano monospaziati e allineati a destra. */
/* Dentro una cella un oggetto in linea si allinea in ALTO. La riga è alta
   un'interlinea esatta; allineare alla linea di base la fa crescere di
   frazioni di pixel, perché famiglie e pesi diversi hanno metriche diverse —
   una pillola da 24 chiedeva 1,31px in più, un valore monospaziato bold mezzo
   pixel. Alti quanto l'interlinea, «in alto» e «al centro» coincidono. */
.mg-table td :is(.mg-status, .mg-highlight) { vertical-align: top; }

.mg-table .mg-num {
  font-family: var(--marca-font-mono);
  text-align: end;
  font-variant-numeric: tabular-nums;
}

.mg-table-wrap { overflow-x: auto; }

/* Coppia chiave-valore: la forma base del dato tecnico. */
/* Nessun gap: il ritmo lo danno le interlinee (16 + 24 = 40px, multiplo di U). */
.mg-kv {
  display: flex;
  flex-direction: column;
  padding-block: var(--marca-space-1);
}
.mg-kv-key {
  font-family: var(--marca-font-mono);
  font-size: var(--marca-type-mono-xs-size);
  line-height: var(--marca-type-mono-xs-lh);
  text-transform: uppercase;
  letter-spacing: 0.04em;
  color: var(--marca-text-subtle);
}
.mg-kv-value {
  font-family: var(--marca-font-mono);
  font-size: var(--marca-type-mono-size);
  line-height: var(--marca-type-mono-lh);
  color: var(--marca-text);
  font-variant-numeric: tabular-nums;
}

/* Serie di dati: il colore è il primo segnale, la forma il secondo. */
.mg-legend {
  display: flex;
  flex-wrap: wrap;
  gap: var(--marca-space-2) var(--marca-space-3);
}
.mg-legend-item {
  display: inline-flex;
  align-items: center;
  gap: var(--marca-space-1);
  font-family: var(--marca-font-mono);
  font-size: var(--marca-type-mono-s-size);
  color: var(--marca-text-muted);
}
.mg-legend-mark {
  width: var(--marca-space-2);
  height: var(--marca-space-2);
  flex-shrink: 0;
  background: var(--marca-data-1);
}
.mg-legend-mark--2 { background: var(--marca-data-2); }
/* La terza serie si distingue anche per riempimento, non solo per tinta. */
.mg-legend-mark--3 {
  background: repeating-linear-gradient(
    45deg,
    var(--marca-data-3) 0 2px,
    transparent 2px 4px
  );
  outline: 1px solid var(--marca-data-3);
  outline-offset: -1px;
}
.mg-legend-mark--compare { background: var(--marca-data-compare); }

/* -----------------------------------------------------------------------------
   GRAFICI
   Un grafico Marca è fatto di barre appoggiate a una baseline e nient'altro:
   nessuna griglia oltre la baseline, nessuna tacca, nessuna etichetta d'asse
   fluttuante. I valori stanno in tabella o accanto alla barra, dove si leggono.
   La sequenza dei colori è fissa e l'arancio arriva sempre per ultimo, perché
   è il confronto, non una terza serie.
   -------------------------------------------------------------------------- */

.mg-chart {
  display: flex;
  align-items: flex-end;
  gap: var(--marca-space-3);
  block-size: var(--marca-space-16);
  /* R2: la linea di base è assorbita dal padding. Senza, l'area delle barre
     valeva 128 − 8 − 1 = 119 e una barra al 50% misurava 59,5px: un'altezza
     intera diventava frazionaria proprio dove si legge la misura. Con 7,
     l'area è 120 = 15U e le percentuali cadono su pixel interi. */
  padding-block-end: calc(var(--marca-space-1) - var(--marca-border-width));
  border-block-end: var(--marca-border-width) solid var(--marca-data-grid);
}

.mg-chart-bar {
  inline-size: var(--marca-space-4);
  block-size: var(--mg-bar, 50%);
  background: var(--marca-data-1);
  border-radius: 0;
  flex-shrink: 0;
}

.mg-chart-bar:nth-child(even) { background: var(--marca-data-2); }
.mg-chart-bar[data-serie='confronto'] { background: var(--marca-data-compare); }

/* La terza serie porta un tratteggio: due serie si distinguono per tinta,
   dalla terza in poi serve anche la forma. */
.mg-chart-bar[data-serie='riferimento'] {
  background: repeating-linear-gradient(
    45deg,
    var(--marca-data-3) 0 3px,
    transparent 3px 6px
  );
  outline: var(--marca-border-width) solid var(--marca-data-3);
  outline-offset: calc(-1 * var(--marca-border-width));
}

/* Le etichette stanno sotto la baseline, allineate alle barre. */
.mg-chart-labels {
  display: flex;
  gap: var(--marca-space-3);
  margin-block-start: var(--marca-space-1);
}

.mg-chart-label {
  inline-size: var(--marca-space-4);
  flex-shrink: 0;
  font-family: var(--marca-font-mono);
  font-size: var(--marca-type-mono-xs-size);
  color: var(--marca-text-subtle);
  text-align: start;
}

/* Micro-grafico in linea: una tendenza, non una misura. Non porta mai valori:
   se il numero conta, va scritto accanto. */
.mg-micrografico {
  display: inline-flex;
  align-items: flex-end;
  gap: 2px;
  block-size: var(--marca-space-3);
  vertical-align: middle;
}

.mg-micrografico span {
  inline-size: 3px;
  block-size: var(--mg-bar, 50%);
  background: var(--marca-data-1);
}

/* -----------------------------------------------------------------------------
   LOGO
   L'area di rispetto è calcolata sul modulo X, che si ricava dall'altezza:
   X = altezza / 8. Nessun contenuto entra in questo spazio.
   -------------------------------------------------------------------------- */

.mg-logo {
  display: inline-flex;
  align-items: center;
  padding: var(--marca-logo-clear);
}
.mg-logo img,
.mg-logo svg {
  height: var(--marca-logo-height);
  width: auto;
}
.mg-logo--min { padding: var(--marca-logo-clear-min); }
.mg-logo--compact { padding: var(--marca-logo-clear-compact); }

/* Il logo per il tema opposto resta nel markup ma non è visibile,
   così il cambio di tema non richiede JavaScript sugli asset. */
.mg-logo [data-theme-asset='dark'] { display: none; }
:root[data-theme='dark'] .mg-logo [data-theme-asset='light'] { display: none; }
:root[data-theme='dark'] .mg-logo [data-theme-asset='dark'] { display: block; }

/* -----------------------------------------------------------------------------
   IMMAGINI IN INTERFACCIA
   L'immagine può attraversare il margine; il testo mai. Il testo sopra
   un'immagine richiede una maschera controllata: mai ombre di ripiego.
   -------------------------------------------------------------------------- */

.mg-media {
  position: relative;
  overflow: hidden;
  background: var(--marca-field-alt);
}
.mg-media img {
  width: 100%;
  height: 100%;
  object-fit: cover;
}
.mg-media--16-9 { aspect-ratio: 16 / 9; }
.mg-media--4-5 { aspect-ratio: 4 / 5; }
.mg-media--1-1 { aspect-ratio: 1 / 1; }
.mg-media--3-2 { aspect-ratio: 3 / 2; }

/* Maschera per il testo sopra l'immagine: velo uniforme e dichiarato, mai una
   sfumatura. Usa lo stesso token del velo sotto le superfici sovrapposte:
   nel sistema esiste una sola trasparenza. */
.mg-media-mask {
  position: absolute;
  inset: auto 0 0 0;
  padding: var(--marca-field-padding);
  background: var(--marca-mask);
  color: var(--marca-white);
}

/* Full-bleed: l'immagine esce dal margine, il testo resta dentro. */
.mg-bleed {
  width: 100vw;
  max-width: 100vw;
  margin-inline: calc(50% - 50vw);
}

/* -----------------------------------------------------------------------------
   RESPONSIVE
   Nel responsive collassano i ruoli spaziali, non la logica del sistema.
   La matrice resta: cambia chi occupa cosa.
   -------------------------------------------------------------------------- */

/* I corpi tipografici NON compaiono qui: vivono nei token, che cambiano da
   soli alle soglie. In questo file non esiste un solo font-size letterale.
   Qui cambiano solo i RUOLI spaziali. */

/* M — la corsia collassa in testata */
@media (max-width: 1024px) {
  .mg-rail { grid-column: 1 / -1; }
  .mg-bay { grid-column: 1 / -1; }
  .mg-third { grid-column: span 6; }

  /* Il margine passa dalle colonne di bordo al contenitore: impilando,
     «primo e ultimo figlio» non coincidono più con «sinistra e destra».
     PASSA, non si aggiunge: il figlio diretto che non è una griglia porta il
     margine per conto suo (riga 331) e va azzerato qui, o il rientro vale due
     volte il token — 32 + 32 a M e 16 + 16 a S, contro i 32 e i 16 che §04
     quota. Nello specimen non si vede, perché `.mg-page` in `index.html` vive
     solo dentro un blocco di codice; ma questo foglio si copia così com'è, e
     il doppio rientro lo eredita ogni progetto. */
  .mg-page > .mg-grid > :first-child,
  .mg-page > .mg-grid > :last-child,
  .mg-page > :not(.mg-grid) { padding-inline: 0; }
  .mg-page { padding-inline: var(--marca-grid-margin); }

  /* Il filo ruota con l'impilamento: la giunzione resta, cambia lato — e con
     lei R2, perché ora è un filo orizzontale.
     UNA sola assorbizione, non due. Il margine negativo serve sull'asse in
     linea, dove due campi affiancati porterebbero ciascuno il proprio filo
     sullo stesso giunto; impilati il filo nasce già dal secondo campo in poi e
     non c'è niente da tirare indietro. Tenendo insieme margine negativo e R2 il
     filo veniva sottratto due volte e la giunzione chiudeva su 47 invece di 48
     (31 invece di 32 a S, dove il padding di campo è 16). */
  .mg-fields > .mg-field + .mg-field {
    border-inline-start: 0;
    margin-inline-start: 0;
    border-top: var(--marca-border-width) solid var(--marca-border);
    padding-block-start: max(0px, calc(var(--mg-field-pad) - var(--marca-border-width)));
  }

  .mg-app-shell { grid-template-columns: minmax(0, 1fr); }
  .mg-app-shell > * + * {
    border-inline-start: 0;
    border-top: var(--marca-border-width) solid var(--marca-border);
  }
}

/* S — 6 colonne, contenuti impilati, leggibilità prioritaria.
   Tutto ciò che occupa più di due colonne passa a piena larghezza: la
   selezione è per attributo, così non c'è un elenco da tenere aggiornato
   ogni volta che si aggiunge una classe di span. */
@media (max-width: 640px) {
  .mg-grid { grid-template-columns: repeat(6, minmax(0, 1fr)); }

  .mg-grid > [class*='mg-span-']:not(.mg-span-1):not(.mg-span-2),
  .mg-third,
  .mg-half { grid-column: 1 / -1; }

  /* Il padding di campo scende a 16 per TUTTI, varianti comprese. La soglia
     cambia la VARIABILE, non il `padding`: così R2 continua ad assorbire il
     filo dove c'è, e il campo bordato e quello con .mg-rule-t / .mg-rule-b
     chiudono su 15 + 1 = 16 come tutti gli altri. Dichiarando `padding` sul
     solo `.mg-field` (0,1,0) restavano invece a 23, perché `.mg-field.mg-rule-t`
     (0,2,0) pesa di più e continuava a leggere il padding pieno: tre lati a 16
     e uno a 23, con il filo fuori ritmo.
     `--l` e `--bare` sono elencate perché la soglia le annulla entrambe: alla
     larghezza minore --l non è più 32 e --bare non è più zero. */
  .mg-field,
  .mg-field--l,
  .mg-field--bare { --mg-field-pad: var(--marca-space-2); }

  .mg-section { padding-block: var(--marca-space-6); }
}

/* -----------------------------------------------------------------------------
   MOVIMENTO RIDOTTO — IL CONTRATTO, E LE SUE DUE PORTE

   Il contratto è UNO. Le porte da cui si entra sono due: la preferenza vera
   del sistema operativo, e l'interruttore che permette di verificarne il
   comportamento senza cambiare le impostazioni della macchina.

   Lo stesso blocco è scritto due volte perché una media query non si può
   mettere in un elenco di selettori: le due copie devono restare identiche
   dichiarazione per dichiarazione, e chi tocca l'una tocca l'altra nello stesso
   intervento. Erano divergute, e la copia della simulazione non fermava i
   cicli: attivarla produceva uno stroboscopio.

   Comportamento completo: File_MD/16_MOVIMENTO.md
   -------------------------------------------------------------------------- */

/* PORTA 1 · la preferenza dichiarata dal sistema operativo */
@media (prefers-reduced-motion: reduce) {
  /* Non basta azzerare le durate.
     · Un CICLO con durata 1ms non si ferma: gira mille volte al secondo, ed è
       esattamente il difetto che questa preferenza esiste per evitare.
     · Una banda che completa la propria corsa esce dalla traccia e
       l'indicatore sparisce, mentre il caricamento sta ancora andando: il
       ciclo si ferma e la traccia si riempie, così l'informazione resta.
     · Un taglio secco fra due superfici intere è a sua volta un difetto: le
       superfici che stanno SOPRA perdono percorso e frontiera e tengono
       l'opacità. Quelle che stanno NEL FLUSSO no — lì la frontiera è il
       layout, e un layout non si dissolve: si apre e si chiude, senza durata. */

  *,
  *::before,
  *::after {
    transition-duration: 1ms !important;
    transition-delay: 0ms !important;
    animation-duration: 1ms !important;
    animation-delay: 0ms !important;
    animation-iteration-count: 1 !important;
    scroll-behavior: auto !important;
  }

  .mg-progress--indeterminate .mg-progress-bar,
  .mg-loading::after {
    animation: none !important;
    /* Il contratto vive in un foglio che carica PRIMA dei componenti:
       senza dichiararlo esplicito, la banda resterebbe al 33% della
       traccia — un indicatore fermo a un terzo mentre il caricamento
       sta ancora andando, che è un dato falso. */
    inline-size: 100% !important;
    translate: none !important;
  }

  .mg-menu,
  .mg-listbox:not(.mg-listbox--flusso),
  .mg-drawer,
  .mg-toast,
  .mg-tooltip,
  .mg-scrim {
    transition-property: opacity !important;
    transition-duration: var(--marca-motion-state) !important;
    translate: none !important;
    grid-template-rows: 1fr !important;
  }

  .mg-menu:not([data-open]),
  .mg-listbox:not(.mg-listbox--flusso):not([data-open]),
  .mg-drawer:not([data-open]),
  .mg-toast:not([data-open]),
  .mg-tooltip:not([data-open]) { opacity: 0; }

  .mg-menu[data-open],
  .mg-listbox[data-open],
  .mg-drawer[data-open],
  .mg-toast[data-open],
  .mg-tooltip[data-open] { opacity: 1; }

  .mg-accordion-panel[data-open],
  .mg-listbox--flusso[data-open],
  tr[aria-expanded='true'] + .mg-row-detail .mg-row-detail-inner { grid-template-rows: 1fr; }
}

/* PORTA 2 · la simulazione, per verificare senza toccare le impostazioni */
@media (prefers-reduced-motion: no-preference) {
  :root[data-motion='reduced'] {
    /* Non basta azzerare le durate.
       · Un CICLO con durata 1ms non si ferma: gira mille volte al secondo, ed è
         esattamente il difetto che questa preferenza esiste per evitare.
       · Una banda che completa la propria corsa esce dalla traccia e
         l'indicatore sparisce, mentre il caricamento sta ancora andando: il
         ciclo si ferma e la traccia si riempie, così l'informazione resta.
       · Un taglio secco fra due superfici intere è a sua volta un difetto: le
         superfici che stanno SOPRA perdono percorso e frontiera e tengono
         l'opacità. Quelle che stanno NEL FLUSSO no — lì la frontiera è il
         layout, e un layout non si dissolve: si apre e si chiude, senza durata. */

    *,
    *::before,
    *::after {
      transition-duration: 1ms !important;
      transition-delay: 0ms !important;
      animation-duration: 1ms !important;
      animation-delay: 0ms !important;
      animation-iteration-count: 1 !important;
      scroll-behavior: auto !important;
    }

    .mg-progress--indeterminate .mg-progress-bar,
    .mg-loading::after {
      animation: none !important;
      /* Il contratto vive in un foglio che carica PRIMA dei componenti:
         senza dichiararlo esplicito, la banda resterebbe al 33% della
         traccia — un indicatore fermo a un terzo mentre il caricamento
         sta ancora andando, che è un dato falso. */
      inline-size: 100% !important;
      translate: none !important;
    }

    .mg-menu,
    .mg-listbox:not(.mg-listbox--flusso),
    .mg-drawer,
    .mg-toast,
    .mg-tooltip,
    .mg-scrim {
      transition-property: opacity !important;
      transition-duration: var(--marca-motion-state) !important;
      translate: none !important;
      grid-template-rows: 1fr !important;
    }

    .mg-menu:not([data-open]),
    .mg-listbox:not(.mg-listbox--flusso):not([data-open]),
    .mg-drawer:not([data-open]),
    .mg-toast:not([data-open]),
    .mg-tooltip:not([data-open]) { opacity: 0; }

    .mg-menu[data-open],
    .mg-listbox[data-open],
    .mg-drawer[data-open],
    .mg-toast[data-open],
    .mg-tooltip[data-open] { opacity: 1; }

    .mg-accordion-panel[data-open],
    .mg-listbox--flusso[data-open],
    tr[aria-expanded='true'] + .mg-row-detail .mg-row-detail-inner { grid-template-rows: 1fr; }
  }
}
