/* ---------------------------------------------------------------------------
   Layout del pannello.

   Consuma esclusivamente token semantici: nessun valore esadecimale, nessun
   primitivo, nessuna classe di tema. Il test di conformità del design system
   vale anche qui — cambiando `data-kit` su <html> tutto deve ripitturarsi, e
   se qualcosa resta fermo non appartiene ancora al sistema.

   Le classi `.sv-*` vengono dalla libreria del brand kit e non sono
   ridefinite: quanto segue aggiunge solo la griglia e i pochi elementi che il
   pannello ha in più (misuratori, righe di servizio).
--------------------------------------------------------------------------- */

/* ── Nascosto vuol dire nascosto ──────────────────────────────────────── */
/*
   `[hidden] { display: none }` vive nel foglio del browser, e ha la stessa
   specificità di una classe. Qualunque regola d'autore che dichiari un
   display — `.pannello-accesso { display: grid }`, qui sotto — vince, e
   l'elemento resta visibile mentre il DOM giura che è nascosto.

   È il guasto che teneva fuori dal pannello: l'accesso riusciva, il pannello
   veniva costruito, mostraPannello() metteva hidden sulla schermata di
   accesso — e il browser continuava a disegnarla, alta quanto lo schermo, con
   il pannello sotto la piega. Dal lato di chi guarda: premi Entra e non
   succede niente. Il server rispondeva 200 a ogni tentativo.
*/
[hidden] {
  display: none !important;
}

/* ── Il margine che nessuno aveva chiesto ─────────────────────────────── */
/*
   Gli 8px che il browser mette sul <body> per difetto. Su un documento di
   testo hanno senso; su un'applicazione a tutto schermo no — e finché la
   barra scorreva via con la pagina non se ne accorgeva nessuno.

   Con la barra appiccicata diventano visibili: misurato, la barra stava a
   `top: 8` da ferma e a `top: 0` una volta incollata, quindi SALTAVA di otto
   pixel nell'istante esatto in cui si comincia a scorrere, in cima allo
   schermo, mentre la si sta guardando. È il tipo di difetto che si nota
   benissimo e non si sa nominare.

   I margini orizzontali li mette già .sv-container, quindi qui non si perde
   niente.
*/
body.sv-app {
  margin: 0;
}

/* ── Accesso ─────────────────────────────────────────────────────────── */

.pannello-accesso {
  min-height: 100dvh;
  display: grid;
  place-items: center;
  padding: var(--sv-s5);
}

.pannello-accesso__carta {
  width: min(26rem, 100%);
}

/* Il kit espone la scala tipografica come token, non come classi: `sv-t-h2` è
   una misura, e metterla nell'attributo class non dipinge niente. Il titolo si
   compone qui, dai token, che è il livello a cui l'applicazione può farlo. */
.pannello-titolo {
  margin: 0;
  font-family: var(--sv-font-ui);
  font-weight: 600;
  font-size: var(--sv-t-h2);
  line-height: var(--sv-t-h2-lh);
  color: var(--sv-text-1);
}

/* Il payoff è `space-between`: le due parole vanno agli estremi, e con la
   larghezza `max-content` che il kit dà alla firma di spazio da distribuire
   non ce n'è — si leggeva SVILUPPIAMOAPPLICAZIONI, tutto attaccato. Una
   larghezza definita è la condizione perché «estremi allineati» voglia dire
   qualcosa: la scritta si adatta (è una forma), il payoff si distende.
   Il tetto tiene la scritta in proporzione al resto della carta. */
.pannello-accesso__firma {
  width: 100%;
  max-width: 17rem;
}

/* La versione del design system arriva dal token, non da una stringa
   ricopiata: così non resta indietro di due rilasci senza che nessuno se ne
   accorga. È l'uso per cui il kit la espone come custom property. */
.pannello-accesso__versione::after {
  content: "Design system " var(--sv-kit-version);
}

/* ── Telaio: barra laterale e colonna ────────────────────────────────── */
/*
   Il pannello è passato da «una pagina lunga con la barra in cima» a «una
   barra laterale e una vista alla volta».

   La ragione non è estetica. Con sei sezioni impilate, per arrivare alla
   sorveglianza si attraversavano tutte le altre; ogni sezione cresceva e
   rimpiccioliva sotto il cursore a ogni giro di aggiornamento (il diario del
   watchdog passa da quattro a tredici righe da solo), e la pagina saltava
   mentre si stava premendo un bottone. Con le viste, ciò che cresce cresce
   dentro il proprio schermo e non sposta niente di quello che si sta usando.

   La larghezza della barra è una variabile perché la usa anche il cassetto su
   schermo stretto: due numeri uguali scritti in due posti diventano due numeri
   diversi al primo ripensamento.
*/
.telaio {
  --fianco: 15.5rem;
  display: grid;
  grid-template-columns: var(--fianco) minmax(0, 1fr);
  min-height: 100dvh;
}

/*
   Appiccicata e alta quanto lo schermo: la navigazione non scorre via mai. È
   la differenza fra «dove sono» e «dove posso andare» — la seconda domanda
   non deve costare uno scorrimento all'insù.

   `overflow-y:auto` perché su schermi bassi (un portatile con la finestra
   dimezzata) sei voci più i comandi non ci stanno, e ciò che non ci sta deve
   poter scorrere DENTRO la barra invece di essere tagliato.
*/
.fianco {
  position: sticky;
  inset-block-start: 0;
  /*
     `border-box`, e non è pedanteria: né il kit né questo foglio dichiarano un
     `box-sizing` globale, quindi vale `content-box` e i 24 px di respiro sopra
     e sotto si SOMMANO ai 100dvh. Misurato su una finestra alta 900: barra alta
     948, e il collegamento al changelog — l'unico che porta alla sua pagina —
     finiva 24 px sotto il bordo dello schermo, irraggiungibile. `overflow-y`
     non salva niente: a scorrere non è il contenuto dentro la barra, è la barra
     stessa a sporgere.
  */
  box-sizing: border-box;
  block-size: 100dvh;
  display: flex;
  flex-direction: column;
  gap: var(--sv-s4);
  padding: var(--sv-s5) var(--sv-s4);
  background: var(--sv-surface-1);
  border-inline-end: 1px solid var(--sv-line);
  overflow-y: auto;
  overscroll-behavior: contain;
}

.fianco__testa {
  padding-inline: var(--sv-s2);
}

/* `flex:1` sulla navigazione: è lei a prendersi lo spazio che avanza, così i
   comandi e la versione restano incollati in fondo alla barra invece di
   galleggiare subito sotto l'ultima voce. */
.fianco__nav {
  flex: 1;
  display: flex;
  flex-direction: column;
  gap: 2px;
  min-block-size: 0;
}

.voce {
  display: flex;
  align-items: center;
  gap: var(--sv-s3);
  min-block-size: 40px;
  padding: var(--sv-s2) var(--sv-s3);
  border-radius: var(--sv-r2);
  color: var(--sv-text-2);
  font-family: var(--sv-font-ui);
  font-size: var(--sv-t-bs);
  line-height: var(--sv-t-bs-lh);
  text-decoration: none;
  transition: background-color var(--sv-dur-1) var(--sv-ease),
              color var(--sv-dur-1) var(--sv-ease);
}

.voce:hover {
  background: var(--sv-surface-2);
  color: var(--sv-text-1);
}

.voce:focus-visible {
  outline: none;
  box-shadow: var(--sv-focus-ring);
}

/*
   `aria-current` e non una classe `.attiva`: lo stato «sei qui» va detto una
   volta sola, nel posto in cui lo legge anche chi usa un lettore di schermo.
   Una classe che dipinge e un attributo che annuncia sono due verità da tenere
   allineate a mano, e prima o poi divergono.

   Il filo a sinistra è un `box-shadow` interno e non un bordo: un bordo
   sposterebbe il testo di tre pixel all'attivazione, e le voci ballerebbero
   passando dall'una all'altra.
*/
.voce[aria-current="page"] {
  background: var(--sv-accent-1-tint);
  color: var(--sv-accent-1-text);
  font-weight: 600;
  box-shadow: inset 3px 0 0 0 var(--sv-accent-1);
}

.voce__segno {
  inline-size: 20px;
  block-size: 20px;
  flex: none;
  fill: none;
  stroke: currentColor;
  stroke-width: 1.6;
  stroke-linecap: round;
  stroke-linejoin: round;
}

.voce__nome {
  min-inline-size: 0;
  overflow-wrap: anywhere;
}

/* La pastiglia del livello di sorveglianza sta nella voce che porta alla
   sorveglianza. `margin-inline-start:auto` la spinge in fondo alla riga; è
   un'etichetta dentro un collegamento, quindi non intercetta il puntatore —
   il bersaglio cliccabile resta la voce intera. */
.voce__stato {
  margin-inline-start: auto;
  pointer-events: none;
  font-size: var(--sv-t-cap);
}

/* ── Piede della barra ───────────────────────────────────────────────── */

.fianco__piede {
  display: grid;
  gap: var(--sv-s3);
  padding-block-start: var(--sv-s3);
  border-block-start: 1px solid var(--sv-line);
}

/*
   L'aspetto sta chiuso. Sei pastiglie e un menù a tendina si toccano una volta
   ogni tanto, e aperti si prendevano un terzo della barra per un uso raro.
   Il triangolo di sistema è tolto: il segno lo dà la rotazione dell'icona, che
   è già lì e non aggiunge un secondo indicatore che dice la stessa cosa.
*/
.aspetto__linguetta {
  display: flex;
  align-items: center;
  gap: var(--sv-s3);
  min-block-size: 36px;
  padding: var(--sv-s2) var(--sv-s3);
  border-radius: var(--sv-r2);
  color: var(--sv-text-2);
  font-family: var(--sv-font-ui);
  font-size: var(--sv-t-bs);
  cursor: pointer;
  list-style: none;
}

.aspetto__linguetta::-webkit-details-marker { display: none; }

.aspetto__linguetta:hover { background: var(--sv-surface-2); color: var(--sv-text-1); }

.aspetto__linguetta:focus-visible { outline: none; box-shadow: var(--sv-focus-ring); }

.aspetto[open] .aspetto__linguetta .voce__segno { transform: rotate(180deg); }

.aspetto__corpo {
  display: grid;
  gap: var(--sv-s3);
  padding: var(--sv-s3);
}

.fianco__chi {
  margin: 0;
  padding-inline: var(--sv-s3);
  color: var(--sv-text-3);
  font-family: var(--sv-font-ui);
  font-size: var(--sv-t-cap);
  overflow-wrap: anywhere;
}

.fianco__chi:empty { display: none; }

.fianco__comandi {
  display: flex;
  gap: var(--sv-s2);
}

.fianco__comandi .sv-btn { flex: 1; }

/*
   Il numero di versione È il collegamento al changelog. La specifica lo chiede
   così, e il motivo si vede appena lo si prova: il numero è la domanda («quale
   versione sto usando?») e il changelog è la risposta. Separarli obbliga a
   cercare la seconda dopo aver letto la prima.
*/
.versione {
  display: flex;
  align-items: baseline;
  gap: var(--sv-s2);
  padding: var(--sv-s2) var(--sv-s3);
  border-radius: var(--sv-r2);
  text-decoration: none;
  color: var(--sv-text-3);
}

.versione:hover { background: var(--sv-surface-2); }

.versione:focus-visible { outline: none; box-shadow: var(--sv-focus-ring); }

.versione__numero {
  font-family: var(--sv-font-mono);
  font-size: var(--sv-t-code);
  color: var(--sv-text-2);
}

.versione:hover .versione__numero { color: var(--sv-text-1); }

.versione__nota {
  font-family: var(--sv-font-ui);
  font-size: var(--sv-t-cap);
  color: var(--sv-accent-1-text);
}

/* ── Colonna e testata ───────────────────────────────────────────────── */

.colonna {
  display: flex;
  flex-direction: column;
  min-inline-size: 0;
}

/*
   La testata NON ripete il titolo della vista: quello sta dentro la vista, una
   volta sola. Qui ci sta solo ciò che vale in tutte le viste — su quale
   macchina siamo e se il pannello si sta ancora aggiornando. Un titolo
   duplicato in cima allo schermo è una riga che nessuno legge due volte e che
   toglie spazio ai numeri.

   z-index dalla scala del kit: 100, sotto i toast (900) e lo scrim (1000).
   Niente 9999, e niente backdrop-filter: il fondo è opaco in tutte e dodici le
   palette, quindi una sfocatura non si vedrebbe e in cambio creerebbe un
   contesto di impilamento e un blocco contenitore per i discendenti `fixed`.
*/
.testata {
  position: sticky;
  inset-block-start: 0;
  z-index: var(--sv-z-sticky);
  display: flex;
  align-items: center;
  gap: var(--sv-s3);
  min-block-size: 52px;
  padding: var(--sv-s2) var(--sv-s6);
  background: var(--sv-surface-1);
  border-block-end: 1px solid var(--sv-line);
}

.testata__spazio { flex: 1; }

.testata__host {
  font-family: var(--sv-font-mono);
  font-size: var(--sv-t-code);
  color: var(--sv-text-3);
  overflow-wrap: anywhere;
}

/* Il bottone del cassetto esiste solo dove il cassetto esiste. */
.testata__menu { display: none; }

/*
   Gli avvisi vivono FUORI dalle viste, fra la testata e il contenuto: quello
   che non va si deve leggere anche mentre si guarda l'allocazione. Prima
   stavano solo dentro la sorveglianza, cioè nell'unico posto in cui si va
   quando si sospetta già che qualcosa non vada.
*/
.striscia-avvisi {
  display: grid;
  gap: var(--sv-s2);
  padding: var(--sv-s4) var(--sv-s6) 0;
}

.striscia-avvisi:empty { display: none; }

.avviso-riga {
  display: flex;
  align-items: baseline;
  gap: var(--sv-s3);
  padding: var(--sv-s3) var(--sv-s4);
  border: 1px solid;
  border-radius: var(--sv-r2);
  font-family: var(--sv-font-ui);
  font-size: var(--sv-t-bs);
  line-height: var(--sv-t-bs-lh);
}

.avviso-riga__testo { overflow-wrap: anywhere; }

.avviso-riga__quando {
  margin-inline-start: auto;
  font-family: var(--sv-font-mono);
  font-size: var(--sv-t-code);
  white-space: nowrap;
  opacity: .8;
}

.avviso-riga--critico {
  color: var(--sv-err);
  border-color: var(--sv-err);
  background: var(--sv-err-tint);
}

.avviso-riga--attenzione {
  color: var(--sv-warn);
  border-color: var(--sv-warn);
  background: var(--sv-warn-tint);
}

/* ── Viste ───────────────────────────────────────────────────────────── */

.vista {
  display: grid;
  gap: var(--sv-s5);
  align-content: start;
}

.vista__testa {
  display: grid;
  gap: var(--sv-s2);
  max-inline-size: 62ch;
}

/* Un riquadro largo 1900 pixel con dentro tre righe di testo non è generoso, è
   illeggibile: l'occhio deve tornare a capo attraversando mezzo schermo. Le
   griglie (tessere, siti) NON sono limitate — lì la larghezza in più diventa
   un'altra colonna, che è spazio speso bene. */
.vista > .sv-card {
  max-inline-size: 78rem;
}

/* Il titolo della vista è il titolo della pagina: è l'unico posto in cui il
   nome della sezione compare, quindi ha il corpo di un titolo e non quello di
   un'etichetta di servizio. */
.vista__titolo {
  font-family: var(--sv-font-ui);
  font-weight: 600;
  font-size: var(--sv-t-h3);
  line-height: var(--sv-t-h3-lh);
  color: var(--sv-text-1);
}

.vista__nota {
  margin: 0;
  color: var(--sv-text-3);
  font-family: var(--sv-font-ui);
  font-size: var(--sv-t-bs);
  line-height: var(--sv-t-bs-lh);
}

/* ── Legenda delle soglie ────────────────────────────────────────────── */
/*
   Presa dal pannello GTM, dove risolve un problema che qui esisteva identico:
   i numeri cambiano colore, e da nessuna parte era scritto a quale valore.
   Le soglie non sono ricopiate — arrivano dal watchdog, che è quello che le fa
   scattare davvero, quindi la tabella non può dire una cosa e l'allarme farne
   un'altra.
*/
.legenda {
  border: 1px solid var(--sv-line);
  border-radius: var(--sv-r3);
  background: var(--sv-surface-1);
}

.legenda__linguetta {
  padding: var(--sv-s3) var(--sv-s4);
  color: var(--sv-text-2);
  font-family: var(--sv-font-ui);
  font-size: var(--sv-t-bs);
  cursor: pointer;
}

.legenda__linguetta:hover { color: var(--sv-text-1); }

.legenda__linguetta:focus-visible { outline: none; box-shadow: var(--sv-focus-ring); }

.legenda__corpo {
  display: grid;
  gap: var(--sv-s3);
  padding: 0 var(--sv-s4) var(--sv-s4);
}

/* Una tabella larga scorre DENTRO il proprio riquadro. Senza, è la pagina a
   scorrere in orizzontale, e con la barra laterale appiccicata questo vuol
   dire che si scolla tutto il pannello per leggere una colonna. */
.tabella-scorrevole {
  overflow-x: auto;
  overscroll-behavior-x: contain;
}

.legenda__tabella td:nth-child(3),
.legenda__tabella td:nth-child(4),
.legenda__tabella th:nth-child(3),
.legenda__tabella th:nth-child(4) {
  font-family: var(--sv-font-mono);
  white-space: nowrap;
}

/* ── Changelog ───────────────────────────────────────────────────────── */

.changelog {
  display: grid;
  gap: var(--sv-s6);
  max-inline-size: 62rem;
}

.rilascio {
  display: grid;
  gap: var(--sv-s4);
  padding-block-end: var(--sv-s6);
  border-block-end: 1px solid var(--sv-line);
}

.rilascio:last-child { border-block-end: none; padding-block-end: 0; }

.rilascio__testa {
  display: flex;
  align-items: baseline;
  gap: var(--sv-s3);
  flex-wrap: wrap;
}

.rilascio__numero {
  font-family: var(--sv-font-display);
  font-size: var(--sv-t-h3);
  line-height: var(--sv-t-h3-lh);
  color: var(--sv-text-1);
}

/* La versione in esecuzione si segnala una volta sola, accanto al suo numero:
   chi apre il changelog per sapere «cosa mi è cambiato» deve trovare subito il
   punto della lista in cui si trova. */
.rilascio__corrente {
  padding: 1px var(--sv-s3);
  border-radius: var(--sv-r-full);
  background: var(--sv-accent-1-tint);
  color: var(--sv-accent-1-text);
  font-family: var(--sv-font-ui);
  font-size: var(--sv-t-cap);
  font-weight: 600;
}

.rilascio__data {
  font-family: var(--sv-font-mono);
  font-size: var(--sv-t-code);
  color: var(--sv-text-3);
}

.rilascio__titolo {
  margin: 0;
  color: var(--sv-text-2);
  font-family: var(--sv-font-ui);
  font-size: var(--sv-t-b);
  line-height: var(--sv-t-b-lh);
}

.rilascio__voci {
  display: grid;
  gap: var(--sv-s3);
}

/*
   Etichetta e testo su due colonne, con l'etichetta a larghezza fissa: così le
   etichette si incolonnano e la lista si scorre per tipo di modifica senza
   leggerla tutta. In colonna singola sotto i 40rem, dove una colonna da 8rem
   lascerebbe al testo meno di metà riga.
*/
.voce-log {
  display: grid;
  grid-template-columns: 7.5rem minmax(0, 1fr);
  gap: var(--sv-s3);
  align-items: start;
}

.voce-log__tipo {
  justify-self: start;
  padding: 2px var(--sv-s3);
  border-radius: var(--sv-r-full);
  font-family: var(--sv-font-ui);
  font-size: var(--sv-t-cap);
  font-weight: 600;
  letter-spacing: .02em;
  white-space: nowrap;
}

/* I quattro colori della specifica. Sono i token semantici del kit e non
   quattro tinte scelte qui: cambiando brand kit le etichette restano
   distinguibili fra loro e in tono con il resto, cosa che quattro esadecimali
   scritti a mano non farebbero su nessuna delle dodici palette. */
.voce-log__tipo[data-tipo="aggiunto"]   { color: var(--sv-ok);   background: var(--sv-ok-tint); }
.voce-log__tipo[data-tipo="modificato"] { color: var(--sv-info); background: var(--sv-info-tint); }
.voce-log__tipo[data-tipo="corretto"]   { color: var(--sv-warn); background: var(--sv-warn-tint); }
.voce-log__tipo[data-tipo="rimosso"]    { color: var(--sv-err);  background: var(--sv-err-tint); }

.voce-log__testo { display: grid; gap: 2px; min-inline-size: 0; }

/* `margin: 0` non è pulizia: sono <p>, e il margine dell'agente utente dentro
   una griglia NON si fonde con quello del fratello. Titolo e descrizione si
   ritrovavano 32 pixel di vuoto in mezzo — misurati — e le due righe della
   stessa voce sembravano due voci diverse. */
.voce-log__titolo {
  margin: 0;
  color: var(--sv-text-1);
  font-family: var(--sv-font-ui);
  font-size: var(--sv-t-bs);
  line-height: var(--sv-t-bs-lh);
  font-weight: 600;
}

.voce-log__descrizione {
  margin: 0;
  color: var(--sv-text-2);
  font-family: var(--sv-font-ui);
  font-size: var(--sv-t-bs);
  line-height: var(--sv-t-bs-lh);
  max-inline-size: 68ch;
}

@media (max-width: 40rem) {
  .voce-log { grid-template-columns: 1fr; gap: var(--sv-s2); }
}


/* ── Selettore del kit ───────────────────────────────────────────────── */
/*
   Sei pastiglie, una per kit, ognuna dipinta con la firma del proprio kit.
   L'anello di selezione deve invece stare nei colori della PAGINA, non del kit
   che rappresenta, altrimenti su Ardesia sparisce contro la barra. Le due
   variabili sotto sono dichiarate qui, dove i token sono ancora quelli della
   pagina, e arrivano dentro le pastiglie già risolte.
*/
.scelta-kit {
  --anello: var(--sv-accent-1);
  display: flex;
  align-items: center;
  flex-wrap: wrap;
  gap: var(--sv-s2);
  border: 0;
  padding: 0;
  margin: 0;
}

/* Il selettore vive nel piede della barra laterale, largo circa 13rem: sei
   pastiglie da 22px più i distacchi ne chiedono 172, quindi ci stanno su una
   riga sola — ma `flex-wrap` sopra è la rete per il giorno in cui i kit
   diventano sette. La legenda di un <fieldset> non è un elemento flessibile:
   il browser la dispone comunque sopra il contenuto, e serve solo staccarla. */
.scelta-kit legend {
  padding: 0;
  margin-block-end: var(--sv-s2);
}

.kit {
  display: block;
  line-height: 0;
  cursor: pointer;
  border-radius: var(--sv-r-full);
}

.kit__segno {
  display: block;
  width: 22px;
  height: 22px;
  border-radius: var(--sv-r-full);
  /* La firma del kit: il gradiente che il kit stesso definisce. */
  background: var(--sv-gradient-kit);
  box-shadow: inset 0 0 0 1px var(--sv-line);
  transition: transform var(--sv-dur-2) var(--sv-ease);
}

.kit:hover .kit__segno {
  transform: scale(1.14);
}

.kit input:checked + .kit__segno {
  outline: 2px solid var(--anello);
  outline-offset: 2px;
}

/* Il focus da tastiera non può coincidere con la selezione, o chi naviga con il
   tab non sa mai dove si trova fra sei pastiglie tutte tonde e tutte uguali. */
.kit input:focus-visible + .kit__segno {
  outline: 2px dashed var(--anello);
  outline-offset: 4px;
}

/* ── Salta al contenuto ──────────────────────────────────────────────── */
/*
   Il primo elemento focalizzabile della pagina. Non si nasconde con
   `display:none` né con `visibility:hidden`: un elemento nascosto così non
   prende il fuoco, e un salta-contenuto che non prende il fuoco non è un
   salta-contenuto — è un elemento morto che occupa la prima tabulazione.
   Esce dallo schermo con una traslazione e rientra quando è a fuoco.

   Sopra la barra: da quando la barra è appiccicata non scorre più via, quindi
   un collegamento con z-index minore comparirebbe DIETRO di lei, a fuoco e
   invisibile. --sv-z-overlay lo tiene davanti alla barra (100) e sotto la
   modale (1000), dove il fuoco è comunque intrappolato altrove.
*/
.salta {
  position: fixed;
  inset-block-start: var(--sv-s3);
  inset-inline-start: var(--sv-s3);
  z-index: var(--sv-z-overlay);
  /* Fuori dal bordo alto, non a coordinate negative fisse: quanto basta a
     uscire, qualunque sia la dimensione del testo tradotto. */
  transform: translateY(calc(-100% - var(--sv-s6)));
  padding: var(--sv-s2) var(--sv-s4);
  border: 1px solid var(--sv-line-strong);
  border-radius: var(--sv-r2);
  background: var(--sv-surface-1);
  color: var(--sv-text-1);
  font-family: var(--sv-font-ui);
  font-size: var(--sv-t-bs);
  text-decoration: none;
  box-shadow: var(--sv-e2);
}

/* `:focus` e non `:focus-visible`: qui il fuoco arriva sempre da tastiera o
   da codice — fuori dallo schermo non lo si può cliccare — e alcune messe a
   fuoco programmatiche non contano come «visibili». Se non rientra, non
   esiste. */
.salta:focus {
  transform: none;
  outline: none;
  box-shadow: var(--sv-focus-ring);
}

/* ── Titoli di sezione ───────────────────────────────────────────────── */
/*
   Erano <p class="sv-overline">: un pannello senza intestazioni è una pagina
   che un lettore di schermo non sa scorrere, e `sezione()` ha bisogno di un
   bersaglio stabile per marcare i dati vecchi. Promossi a <h2>, la classe del
   kit continua a dare corpo, spaziatura delle lettere e colore; il margine di
   default dell'agente utente no, e va tolto o le sezioni si scollano dai loro
   contenuti (1em su 11px sono 11px sopra e sotto, dentro una colonna che ha
   già il suo `gap`).
*/
.contenuto h2 {
  margin: 0;
}

/* Il marchio «non aggiornato» va sul TITOLO, non sui dati: abbassare
   l'opacità dei numeri romperebbe il contrasto AA che il kit dichiara
   misurato su tutte e dodici le palette, e per giunta proprio quando quei
   numeri servono di più. Il motivo è già dentro l'attributo — `sezione()` ci
   scrive «non aggiornato» o «errore di disegno» — e si legge da lì invece di
   costruire un nodo in più a ogni giro. */
.contenuto h2[data-vecchio]::after {
  content: " · " attr(data-vecchio);
  color: var(--sv-warn);
}

/* Il contenuto porta la propria spaziatura da quando non è più dentro
   `.sv-container`: con la barra laterale la colonna è già larga quanto deve,
   e un contenitore che ricentra a 72rem lascerebbe una banda vuota a destra
   larga quanto la barra a sinistra.

   `flex:1` perché la colonna è flessibile e questo è l'elemento che deve
   prendersi l'altezza che avanza: senza, una vista corta lascia la pagina più
   bassa dello schermo e il fondo cambia colore a metà. */
.contenuto {
  flex: 1;
  padding: var(--sv-s6) var(--sv-s6) var(--sv-s8);
  min-inline-size: 0;
}

/* Il fuoco che entra nel contenuto — dal salta-contenuto o da un cambio di
   vista — non deve atterrare dietro la testata appiccicata. Il numero insegue
   `min-block-size` di `.testata`. */
.contenuto,
.vista {
  scroll-margin-block-start: calc(52px + var(--sv-s4));
}

/* Il contenuto non prende contorno quando lo si mette a fuoco da codice: il
   fuoco ci arriva a ogni cambio di vista, e un rettangolo blu attorno a mezzo
   schermo a ogni clic della navigazione sembra un guasto. Resta focalizzabile,
   che è la parte che serve al lettore di schermo. */
.contenuto:focus { outline: none; }

/* ── KPI ─────────────────────────────────────────────────────────────── */

/* Le PRESSIONI: hanno una soglia, un livello e una scintilla dentro.
   Da 11rem a 14rem perché la scintilla va DENTRO la carta e non accanto: a
   11rem, tolto il padding, una sparkline è larga poco più di 140px e smette di
   essere una forma. */
/* 12rem, e il numero insegue la larghezza del contenuto: le pressioni sono
   cinque e cinque devono stare su UNA riga, o la quinta — I/O disco — finisce
   da sola sotto, larga quanto le altre quattro insieme, e sembra la più
   importante per il solo fatto di essere l'ultima.

   Il conto è cambiato con la barra laterale, ed è il tipo di rottura che non
   protesta: 13rem stavano dentro i 1136 pixel della pagina a tutta larghezza
   (5x208 + 4x16 = 1104), ma accanto alla barra la griglia ne misura 968 su uno
   schermo da 1280 — 248 di barra e 64 di respiro in meno. Ne servivano 1104, e
   la quinta tessera se ne andava a capo.
   A 11rem: 5x176 + 64 = 944, dentro i 968. Le tessere si distendono comunque a
   ~181 px l'una perché la traccia è `1fr`: 11rem è la soglia sotto cui la
   griglia rinuncia a una colonna, non la larghezza finale.
   Sotto i 1280 degrada da sé a tre e a due — lì la riga unica non ci sta
   comunque, e tre più due si legge come un blocco invece che come un orfano. */
.griglia-kpi {
  display: grid;
  grid-template-columns: repeat(auto-fit, minmax(11rem, 1fr));
  gap: var(--sv-s4);
  margin-block-start: var(--sv-s3);
}

/* I FATTI: attività e siti configurati. Nessuna soglia, nessun livello, non
   cambiano al minuto. Carte identiche a quelle delle pressioni direbbero che
   l'uptime conta quanto la memoria, che è il collo di bottiglia dichiarato di
   questa macchina. Più strette e più vicine, quindi: la differenza di peso
   visivo è l'informazione. */
/* auto-FILL, non auto-fit, ed è tutta la differenza fra l'intenzione e il
   risultato. auto-fit collassa a zero le tracce che restano vuote e lascia
   che le superstiti si spartiscano lo spazio: con due sole carte diventavano
   562 pixel l'una — misurato — cioè quasi il doppio di una tessera di
   pressione. Il tempo di accensione finiva disegnato come il dato più
   importante della pagina, che è l'opposto del motivo per cui è stato tolto
   dalle pressioni. auto-fill le tracce le tiene, e le due carte restano
   larghe le ~9rem che si erano chieste. */
.griglia-fatti {
  display: grid;
  grid-template-columns: repeat(auto-fill, minmax(9rem, 1fr));
  gap: var(--sv-s3);
  margin-block-start: var(--sv-s3);
  /* `start` e non lo stiramento di default. I fatti non hanno misuratore né
     scintilla né, alcuni, la nota: dentro la carta restano due righe. Misurato,
     la carta veniva comunque alta 196 px per 148 px di contenuto, e le due
     righe galleggiavano in mezzo a un riquadro vuoto — che accanto alle
     tessere piene delle pressioni si legge come «qui manca qualcosa». */
  align-items: start;
}

.kpi {
  background: var(--sv-surface-1);
  border: 1px solid var(--sv-line);
  border-radius: var(--sv-r2);
  padding: var(--sv-s4);
  display: grid;
  gap: var(--sv-s2);
}

/* L'etichetta e la pastiglia dell'evento (OOM ×2 · 5 min fa) sulla stessa
   riga. La pastiglia compare di rado e non deve allargare la carta quando non
   c'è: `flex:none` le impedisce di stringersi sotto il proprio testo, che è
   un conteggio e non si può troncare. */
.kpi__testa {
  display: flex;
  align-items: center;
  justify-content: space-between;
  gap: var(--sv-s2);
  min-width: 0;
}

.kpi__pastiglia {
  flex: none;
}

/* `font: var(--sv-t-ov)` non ha mai dipinto niente: la scorciatoia `font`
   pretende anche la famiglia, e senza di essa il browser scarta l'intera
   dichiarazione — l'etichetta ereditava il corpo del testo e la scala
   tipografica del kit qui non arrivava. Proprietà singole, quindi. */
.kpi__etichetta {
  font-family: var(--sv-font-mono);
  font-weight: 700;
  font-size: var(--sv-t-ov);
  line-height: var(--sv-t-ov-lh);
  letter-spacing: .12em;
  text-transform: uppercase;
  color: var(--sv-text-3);
}

.kpi__valore {
  font-family: var(--sv-font-display);
  font-size: var(--sv-t-h2);
  line-height: 1.1;
  color: var(--sv-text-1);
  font-variant-numeric: tabular-nums;
}

.kpi__unita {
  font-family: var(--sv-font-ui);
  font-size: var(--sv-t-bs);
  color: var(--sv-text-3);
  margin-inline-start: .15em;
}

.kpi__nota {
  font-family: var(--sv-font-ui);
  font-size: var(--sv-t-cap);
  line-height: var(--sv-t-cap-lh);
  color: var(--sv-text-3);
  font-variant-numeric: tabular-nums;
}

/* ── Misuratore ──────────────────────────────────────────────────────── */
/* Il colore comunica una soglia, quindi viene dai token di feedback e non da
   una scala inventata qui. Sotto il 75% resta l'accento: un misuratore che è
   sempre rosso non segnala più niente. */

.misuratore {
  height: 6px;
  border-radius: var(--sv-r-full);
  background: var(--sv-surface-3);
  overflow: hidden;
}

.misuratore__barra {
  height: 100%;
  border-radius: inherit;
  background: var(--sv-accent-1);
  transition: width var(--sv-dur-2) var(--sv-ease), background-color var(--sv-dur-2) var(--sv-ease);
}

.misuratore__barra[data-livello="attenzione"] { background: var(--sv-warn); }
.misuratore__barra[data-livello="critico"]    { background: var(--sv-err); }

/*
   NON MISURATO NON È ZERO — e non deve nemmeno SOMIGLIARE a zero.

   Il misuratore vuoto che c'era prima si leggeva «0% usato», e capitava
   esattamente sui container senza limite di memoria: `metrics._mem()` mette
   `percent` a None proprio per quelli, cioè per i container che due sezioni
   più su il pannello descrive come i più pericolosi perché possono esaurire
   la macchina. Li disegnava come i più tranquilli. Il pannello si
   contraddiceva da solo, a schermo, nello stesso momento.

   Il tratteggio non è decorazione: è il trattino «—» dei numeri, disegnato.
   Una superficie piena andrebbe letta come «pieno»; una vuota come «zero». Un
   tessuto non assomiglia a nessuna quantità.

   L'inchiostro del tratteggio è `--sv-text-3`, cioè LO STESSO con cui il
   pannello scrive il trattino «—» (vedi `.assente` più sotto): la stessa
   informazione, detta a parole o disegnata, si dice con la stessa tinta.
   Ed è anche l'unica scelta che porta con sé una garanzia già misurata:
   `tokens/kits.css` dichiara e verifica `--sv-text-3` ad AA su `--sv-surface-3`
   in tutte e dodici le palette, minimo 4.76. Con `--sv-line-strong` — la
   scelta istintiva, è pur sempre una riga — il tessuto scendeva a 1.70 su
   Smeraldo chiaro: un tratteggio che a quel contrasto, su una barra alta sei
   pixel, si legge come una barra vuota. Cioè come uno zero, che è
   esattamente il guasto che questa regola esiste per chiudere.
*/
.misuratore[data-assente] {
  background-image: repeating-linear-gradient(
    -45deg,
    var(--sv-text-3) 0, var(--sv-text-3) 1px,
    var(--sv-surface-3) 1px, var(--sv-surface-3) 4px
  );
}

/* Difesa, non ornamento: se un giorno qualcuno rimettesse la barra dentro un
   misuratore assente — o si dimenticasse di nasconderla — tornerebbe a
   disegnare uno zero, questa volta sopra il tratteggio. */
.misuratore[data-assente] .misuratore__barra {
  display: none;
}

/* ═══════════════════════════════════════════════════════════════════════
   DISEGNO NEL TEMPO — scintilla e grafico

   Quello che segue è il foglio contro cui `web/grafici.js` è scritto, e senza
   il quale quel file non disegna niente di leggibile. Tre premesse valgono
   per tutte le regole di qui in fondo.

   1. UN <path> SVG NASCE RIEMPITO DI NERO E SENZA TRATTO. È il valore
      iniziale della specifica, non una scelta di nessuno, e non lo si vede
      finché non lo si va a cercare: una polilinea con un riempimento diventa
      un blocco pieno fra la linea e la sua corda, e sul kit scuro è una
      macchia dentro una carta scura. Ogni tratto qui sotto dichiara
      `fill: none` E il suo `stroke`. Non è ridondanza: è l'unico modo di
      spegnere un colore che non ha scritto nessuno.

   2. IL TESTO DENTRO UN <svg> SI DIPINGE CON `fill`, NON CON `color`. `color`
      su un <text> non lo tocca: l'etichetta resta al valore iniziale — nero —
      e sparisce sul kit scuro. Sullo schermo di chi la scrive, che di giorno
      lavora in tema chiaro, si vede benissimo.

   3. NESSUNA TRANSIZIONE SU `d` NÉ SU NESSUNA GEOMETRIA SVG, e l'assenza è
      deliberata. Il browser non sa interpolare un tracciato con un numero di
      punti variabile: ne esce un salto, non un'animazione. E un grafico che
      si anima su mezza CPU è tempo tolto ai cinque stack WordPress che stanno
      sulla stessa macchina. Chi la aggiunge, la toglie di nuovo qui.
   ═══════════════════════════════════════════════════════════════════════ */

/*
   Dichiarato UNA VOLTA, qui, per i tratti di entrambi i formati — non da
   JavaScript su ogni nodo a ogni giro.

   La scintilla vive in un viewBox 1000×100 stirato con
   `preserveAspectRatio="none"`: la deformazione NON è uniforme, e un tratto di
   2 unità diventerebbe 2px in orizzontale e mezzo in verticale, cioè una linea
   che cambia spessore mentre la carta cambia larghezza. Con
   `non-scaling-stroke` lo spessore si calcola DOPO la trasformazione: 2px sono
   2px sempre. Sul grafico grande il viewBox è 1:1 coi pixel e la dichiarazione
   non fa niente — costa zero e toglie la domanda a chi un giorno cambierà quel
   viewBox.
*/
.scintilla__tela path,
.grafico__tela path {
  vector-effect: non-scaling-stroke;
}

/* ── Scintilla ───────────────────────────────────────────────────────── */
/*
   La sparkline dentro la carta KPI: nessun asse, nessuna etichetta, nessun
   numero — il numero grande ce l'ha già la carta, sopra. Risponde a un'altra
   domanda, «e prima?», e deve rispondere in un colpo d'occhio.

   L'ALTEZZA DICHIARATA NON È COSMESI. Un <svg> senza dimensioni è un elemento
   sostituito e si disegna a 300×150 px: dentro una griglia di carte KPI
   significa cinque riquadri alti quanto mezzo schermo, cioè la griglia che
   esplode. E i 32px non sono un numero qualsiasi: sono quelli su cui
   `grafici.js` ha calcolato i margini del proprio viewBox, dove cinque unità
   sopra e sotto valgono 1,6px, cioè metà del tratto, che a 0 e a 100
   verrebbe altrimenti tagliato dal bordo del riquadro.
*/
.scintilla {
  position: relative;
  margin-block-start: var(--sv-s1);
}

.scintilla__tela {
  /* Un <svg> nasce `display:inline`: si porta dietro la linea di base del
     testo e tre pixel di spazio per i discendenti, sotto il disegno. */
  display: block;
  width: 100%;
  height: 32px;
}

/*
   Nessuna misura valida in tutta la finestra. `grafici.js` svuota i tracciati
   e mette `data-assente`: un riquadro vuoto si legge «tutto a zero», e qui si
   legge «—», la stessa cosa che il pannello scrive quando manca un numero.
   Il trattino è un pseudo-elemento e non un nodo: la regola 4 di `grafici.js`
   dice che il numero di nodi è costante, e questo la rispetta anche quando lo
   stato cambia diciassette volte in un'ora.
*/
.scintilla[data-assente]::after {
  content: "—";
  position: absolute;
  inset: 0;
  display: grid;
  place-items: center;
  font-family: var(--sv-font-mono);
  font-size: var(--sv-t-bs);
  color: var(--sv-text-3);
}

.scintilla__linea {
  fill: none;
  stroke: var(--sv-accent-1);
  stroke-width: 2;
  stroke-linecap: round;
  stroke-linejoin: round;
}

.scintilla__area {
  /* Il velo è un token che porta già la sua trasparenza (accento all'86% di
     trasparenza): niente `fill-opacity` scritto a mano, e nessun numero da
     ritarare quando cambia la palette. */
  fill: var(--sv-accent-1-tint);
  stroke: none;
}

/* La punta è un sottotracciato di lunghezza zero: in uno spazio deformato un
   <circle> sarebbe un'ellisse. Con la testa tonda il browser la dipinge come
   un disco del diametro dello spessore, e lo spessore non si deforma (vedi
   `non-scaling-stroke` qui sopra). Perciò il diametro si sceglie QUI. */
.scintilla__punta {
  fill: none;
  stroke: var(--sv-accent-1);
  stroke-width: 5;
  stroke-linecap: round;
}

/*
   I buchi. Uno spazio bianco è ambiguo: può essere una linea sotto il fondo
   scala, o un pezzo di finestra senza dati. Una superficie neutra dice una
   cosa sola — qui non si è misurato — ed è il trattino, disegnato.

   La superficie da sola NON BASTA, ed è misurato: `--sv-surface-3` sul fondo
   della carta (`--sv-surface-1`) dà 1.17 di contrasto sulla peggiore delle
   dodici palette, cioè una fascia che non si vede. Non poteva andare
   diversamente — le superfici del kit stanno tutte entro il 12% di inchiostro
   l'una dall'altra per costruzione, sono fatte per non farsi notare. Il bordo
   è quello che rende la fascia trovabile (1.99, e sono due spigoli alti quanto
   tutto il disegno, non una riga isolata). Se un giorno risultasse ancora
   troppo silenzioso, il passo successivo è un <pattern> tratteggiato come
   quello del misuratore — ma è un nodo, e i nodi stanno in grafici.js.
*/
.scintilla__vuoti {
  fill: var(--sv-surface-3);
  stroke: var(--sv-line-strong);
  stroke-width: 1;
}

/* Il livello arriva da `data-livello` sul contenitore, mai da un colore
   scritto in JavaScript: cambiare kit o passare al tema scuro ridipinge le
   scintille come ridipinge il resto, senza un solo override. Stessa meccanica
   di `.misuratore__barra[data-livello]`. */
.scintilla[data-livello="attenzione"] .scintilla__linea,
.scintilla[data-livello="attenzione"] .scintilla__punta { stroke: var(--sv-warn); }
.scintilla[data-livello="attenzione"] .scintilla__area  { fill: var(--sv-warn-tint); }

.scintilla[data-livello="critico"] .scintilla__linea,
.scintilla[data-livello="critico"] .scintilla__punta { stroke: var(--sv-err); }
.scintilla[data-livello="critico"] .scintilla__area  { fill: var(--sv-err-tint); }

/* ── Andamento — i comandi ───────────────────────────────────────────── */
/*
   Le pastiglie della metrica a sinistra, le finestre a destra, su una riga
   sola quando c'è posto. Senza queste regole i due gruppi erano due blocchi
   impilati e allineati a sinistra: funzionava, ma la scelta della finestra
   sembrava una seconda fila di metriche invece di un asse diverso.

   `aria-pressed` porta lo stato, quindi lo stato lo si dipinge da lì e non da
   una classe parallela: due sorgenti di verità per «quale è selezionato» sono
   due sorgenti che possono discordare, e quella che vede il lettore di
   schermo sarebbe la seconda.
*/
.andamento__comandi {
  display: flex;
  flex-wrap: wrap;
  align-items: center;
  justify-content: space-between;
  gap: var(--sv-s3);
  margin-block-end: var(--sv-s4);
}

.andamento__metriche,
.andamento__finestre {
  display: flex;
  flex-wrap: wrap;
  gap: var(--sv-s2);
}

/* Le finestre sono tre e non devono mai spezzarsi: sono un asse, e un asse
   spezzato su due righe smette di leggersi come una scala. */
.andamento__finestre { flex-wrap: nowrap; }

/* `--sv-accent-1-tint`, non `--sv-accent-soft`: quest'ultimo non esiste in
   nessuno dei sei kit. Una custom property non definita non è un errore che
   qualcuno segnali — la dichiarazione diventa semplicemente invalida al
   momento del calcolo e la proprietà torna al valore iniziale. Lo sfondo del
   bottone selezionato non c'era, e si vedeva solo il bordo: il tipo di guasto
   che passa i controlli automatici perché il bordo, quello, cambiava. */
.andamento__comandi [aria-pressed="true"] {
  background: var(--sv-accent-1-tint);
  border-color: var(--sv-accent-1);
  color: var(--sv-text-1);
}

/* ── Stati di caricamento ────────────────────────────────────────────── */
/*
   Un contenitore che dichiara `data-stato="caricamento"` e non disegna niente
   è una pagina bianca sotto i titoli. Misurato: con le richieste rallentate,
   per otto secondi #griglia-kpi e #griglia-siti erano alti ZERO pixel — e una
   sezione vuota non si distingue da una sezione che ha finito di caricare e
   non ha niente da mostrare. Sono due cose diverse e vanno dette.

   Non uno scheletro animato: un'animazione che pulsa sotto
   prefers-reduced-motion va disattivata, e quel che resta è comunque un
   rettangolo grigio che finge di essere dei dati. Una riga di testo dice la
   stessa cosa senza fingere.
*/
[data-stato="caricamento"] {
  min-block-size: 4rem;
  display: grid;
  place-items: center;
}

[data-stato="caricamento"]::after {
  content: "caricamento…";
  font-family: var(--sv-font-mono);
  font-size: var(--sv-t-cap);
  letter-spacing: .08em;
  color: var(--sv-text-3);
}

/* ── Andamento — il grafico grande ───────────────────────────────────── */
/*
   Uno, non quattro. Quattro grafici impilati sono ~800px di scorrimento
   infilati fra lo stato macchina e i siti, che sono la parte su cui si opera.
*/
.grafico {
  /* <figure> nasce con 1em 40px di margine dell'agente utente: dentro una
     colonna che ha già il suo `gap`, quaranta pixel di rientro da un lato
     solo si notano subito e non si spiegano. */
  margin: 0;
  display: grid;
  gap: var(--sv-s2);
  background: var(--sv-surface-1);
  border: 1px solid var(--sv-line);
  border-radius: var(--sv-r2);
  padding: var(--sv-s4);
}

/* La nota sotto il grafico è un <p>, e il suo margine si sommerebbe al `gap`
   della griglia — i margini non collassano dentro un contenitore a griglia. */
.grafico > p {
  margin: 0;
}

.grafico__testa {
  display: flex;
  align-items: baseline;
  justify-content: space-between;
  gap: var(--sv-s3);
  flex-wrap: wrap;
}

/* Stessa etichetta delle carte KPI, perché è la stessa cosa: il nome di una
   misura. */
.grafico__titolo {
  font-family: var(--sv-font-mono);
  font-weight: 700;
  font-size: var(--sv-t-ov);
  line-height: var(--sv-t-ov-lh);
  letter-spacing: .12em;
  text-transform: uppercase;
  color: var(--sv-text-3);
}

/* La lettura: il valore corrente, oppure quello dell'istante puntato. Cifre
   tabellari perché cambia sotto il dito mentre ci si muove sopra, e con cifre
   a larghezza variabile il numero balla e diventa illeggibile proprio mentre
   lo si sta leggendo. */
.grafico__lettura {
  font-family: var(--sv-font-mono);
  font-size: var(--sv-t-bs);
  font-variant-numeric: tabular-nums;
  color: var(--sv-text-2);
}

/* Puntato ≠ corrente: senza questa differenza non si sa se il numero grande
   dice «adesso» o «l'istante che sto indicando». */
.grafico__lettura[data-stato="puntato"] { color: var(--sv-text-1); }

/*
   Stessa ragione della scintilla, moltiplicata: qui il ResizeObserver LEGGE
   questa altezza per costruire il viewBox in pixel. Senza, il riquadro nasce
   300×150, il grafico si disegna dentro quel rettangolo e poi si stira — e le
   etichette dell'asse con lui.
*/
.grafico__tela {
  display: block;
  width: 100%;
  height: 200px;
  cursor: crosshair;
  /*
     `touch-action: none` renderebbe il pannello IMMOBILE sotto il dito su
     metà schermo: il grafico è largo quanto la carta, e chi prova a scorrere
     la pagina partendo da lì non scorre più niente. `pan-y` lascia al browser
     lo scorrimento verticale e tiene per noi il movimento orizzontale, che è
     l'unico che il mirino legge.
     Dichiarato QUI oltre che sulla presa perché i gestori di puntatore di
     `grafici.js` — compresa `setPointerCapture` — stanno sulla tela: è la
     tela l'elemento di cui il browser deve conoscere le intenzioni.
  */
  touch-action: pan-y;
}

/* Il grafico prende il fuoco (`tabindex=0`) perché le frecce scorrono i
   campioni: un valore leggibile solo passandoci sopra il mouse è un valore
   che metà delle persone non può leggere. Se prende il fuoco, si deve vedere
   che ce l'ha, e con l'anello del kit come tutto il resto. */
.grafico__tela:focus-visible {
  outline: none;
  border-radius: var(--sv-r1);
  box-shadow: var(--sv-focus-ring);
}

.grafico__griglia {
  fill: none;
  stroke: var(--sv-line);
  stroke-width: 1;
}

/* Vedi la premessa 2: `fill`, non `color`. */
.grafico__tacca,
.grafico__soglia-nome {
  fill: var(--sv-text-3);
  font-family: var(--sv-font-mono);
  font-size: var(--sv-t-ov);
}

/* Stessa fascia e stessa ragione della scintilla: superficie neutra per dire
   «non misurato», bordo perché la superficie da sola dà 1.17 di contrasto e
   non si vede. */
.grafico__vuoti {
  fill: var(--sv-surface-3);
  stroke: var(--sv-line-strong);
  stroke-width: 1;
}

.grafico__area {
  fill: var(--sv-accent-1-tint);
  stroke: none;
}

.grafico__linea {
  fill: none;
  stroke: var(--sv-accent-1);
  stroke-width: 2;
  stroke-linecap: round;
  stroke-linejoin: round;
}

/* Le soglie sono l'UNICO tratteggio del grafico, e la griglia è a tratto
   pieno apposta: una griglia tratteggiata si legge come una soglia, e quando
   la soglia c'è davvero non si distingue più dalle righe di servizio. */
.grafico__soglia {
  fill: none;
  stroke-width: 1;
  stroke-dasharray: 4 4;
}

.grafico__soglia--attenzione { stroke: var(--sv-warn); }
.grafico__soglia--critica    { stroke: var(--sv-err); }

.grafico__mirino {
  fill: none;
  stroke: var(--sv-line-strong);
  stroke-width: 1;
}

/* L'anello NON è un colore: è la superficie che sta sotto, ripetuta. Il
   pallino cade sulla linea e dentro l'area, e senza questo stacco ci si fonde
   proprio quando lo si sta guardando. Va tenuto uguale al fondo di `.grafico`
   qui sopra: se cambia lì, cambia qui. */
.grafico__anello {
  fill: none;
  stroke: var(--sv-surface-1);
  stroke-width: 8;
  stroke-linecap: round;
}

.grafico__pallino {
  fill: none;
  stroke: var(--sv-accent-1);
  stroke-width: 5;
  stroke-linecap: round;
}

/*
   Il bersaglio del puntatore: un rettangolo che intercetta senza dipingere.
   `fill:none` DA SOLO NON RICEVE EVENTI — la regione riempita di un elemento
   senza riempimento è vuota anche per il test di collisione, e il rettangolo
   diventa un buco invisibile che lascia passare tutto. `pointer-events:all` lo
   rende colpibile pur restando trasparente, ed è il motivo per cui in
   `grafici.js` non compare nessun colore per questo nodo.
*/
.grafico__presa {
  fill: none;
  pointer-events: all;
  touch-action: pan-y;
}

/* Stesso contratto della scintilla: la tinta la decide il livello sul
   contenitore, non il JavaScript. */
.grafico[data-livello="attenzione"] .grafico__linea,
.grafico[data-livello="attenzione"] .grafico__pallino { stroke: var(--sv-warn); }
.grafico[data-livello="attenzione"] .grafico__area    { fill: var(--sv-warn-tint); }

.grafico[data-livello="critico"] .grafico__linea,
.grafico[data-livello="critico"] .grafico__pallino { stroke: var(--sv-err); }
.grafico[data-livello="critico"] .grafico__area    { fill: var(--sv-err-tint); }

.grafico__valori {
  font-size: var(--sv-t-cap);
}

.grafico__valori > summary {
  cursor: pointer;
  color: var(--sv-text-3);
  font-family: var(--sv-font-ui);
}

.grafico__valori > summary:focus-visible {
  outline: none;
  border-radius: var(--sv-r1);
  box-shadow: var(--sv-focus-ring);
}

/*
   La tabella è l'alternativa che non dipende dal disegno, ed è anche l'unica
   parte del pannello che può diventare più alta dello schermo: trecento righe
   sotto il grafico spingerebbero l'allocazione e i siti fuori dalla pagina
   ogni volta che qualcuno apre il riquadro. Scorre dentro di sé.
   `display:block` è ciò che rende scorrevole un <table>; le righe restano
   allineate perché stanno tutte in un solo <tbody>.
*/
.grafico__tabella {
  display: block;
  max-block-size: 16rem;
  overflow: auto;
  margin-block-start: var(--sv-s2);
  border-collapse: collapse;
  font-family: var(--sv-font-mono);
  font-size: var(--sv-t-cap);
  font-variant-numeric: tabular-nums;
  color: var(--sv-text-2);
}

.grafico__tabella th,
.grafico__tabella td {
  text-align: start;
  padding: var(--sv-s1) var(--sv-s3) var(--sv-s1) 0;
  white-space: nowrap;
}

/* Scorrendo trecento righe l'intestazione esce subito, e due colonne di
   numeri senza intestazione sono due colonne di numeri. Il fondo opaco serve:
   sotto ci passano le righe. */
.grafico__tabella th {
  position: sticky;
  inset-block-start: 0;
  background: var(--sv-surface-1);
  color: var(--sv-text-3);
  font-weight: 700;
}

/*
   Colori forzati (contrasto elevato di sistema).

   Il sistema sostituisce la propria coppia di colori e le trasparenze
   spariscono: `--sv-accent-1-tint`, che è l'accento all'86% di trasparenza,
   diventa un riempimento PIENO. Il velo dell'area smette di essere un velo e
   copre la linea, la griglia e le soglie — cioè copre il grafico. Si toglie:
   restano la linea e i punti, che sono tutto quello che serve a leggere una
   serie.

   Il tratteggio del non misurato si perde per lo stesso motivo (le immagini
   di sfondo non sono forzate, quindi il suo contrasto con la superficie
   forzata non lo garantisce più nessuno). Al suo posto un bordo tratteggiato,
   che invece è forzato insieme al testo e resta visibile per costruzione.
*/
@media (forced-colors: active) {
  .scintilla__area,
  .grafico__area {
    fill: none;
  }

  .misuratore[data-assente] {
    background-image: none;
    border: 1px dashed;
  }
}

/* ── Allocazione ─────────────────────────────────────────────────────── */

.allocazione-riga {
  display: grid;
  gap: var(--sv-s2);
}

.allocazione-riga__intestazione {
  display: flex;
  justify-content: space-between;
  align-items: baseline;
  gap: var(--sv-s3);
  font-size: var(--sv-t-bs);
  color: var(--sv-text-2);
  font-variant-numeric: tabular-nums;
}

/* ── Siti ────────────────────────────────────────────────────────────── */

/* DUE colonne, non tre e non una.
   Con `minmax(21rem, 1fr)` su uno schermo da tavolo entravano tre carte per
   riga: 21rem l'una, cioè 336 px in cui far stare un dominio, tre servizi con
   due misuratori ciascuno e un cassetto di otto campi. Tutto ci stava e niente
   si leggeva. A due colonne ogni carta ha ~470 px e le righe dei servizi
   possono avere etichetta, barra e cifre sulla stessa riga senza spezzarsi.

   29rem e non 30, e anche qui il numero l'ha spostato la barra laterale: la
   griglia dispone di 968 px su uno schermo da 1280, e due tracce da 30rem ne
   chiedevano 976. Mancavano OTTO pixel, e le carte tornavano in colonna unica
   larghe il doppio del necessario — cioè esattamente il contrario di ciò per
   cui erano state ridisegnate. A 29rem: 2x464 + 16 = 944, dentro i 968. */
.griglia-siti {
  display: grid;
  grid-template-columns: repeat(auto-fit, minmax(29rem, 1fr));
  gap: var(--sv-s4);
  margin-block-start: var(--sv-s3);
}

/* .sito__testa e .sito__dominio sono definiti una volta sola, più in basso.
   Erano definiti qui E là: la seconda vinceva sulle proprietà che dichiarava,
   la prima sopravviveva su tutte le altre, e il risultato era una regola che
   nessuno dei due file descriveva per intero. */

.servizi {
  display: grid;
  gap: var(--sv-s3);
}

/* Le regole della riga di servizio stanno più in basso, nella sezione «Siti —
   carta a due colonne», e sono state RISCRITTE, non affiancate: quelle di
   prima imponevano `grid-template-columns: 5.5rem 1fr auto`, cioè tre colonne.
   La riga nuova ha quattro figli — intestazione, misura della memoria, misura
   della CPU — e con tre colonne finivano tutti sulla stessa riga, uno accanto
   all'altro: si leggeva «NGINX assentemem ▨ – cpu –». Una regola vecchia che
   sopravvive a quella nuova non protesta, ridispone e basta. */

.sito__piede {
  display: flex;
  align-items: center;
  justify-content: space-between;
  gap: var(--sv-s3);
  flex-wrap: wrap;
}

/* L'editor di allocazione è riscritto nella sezione dei profili, più in basso.
   La versione di qui imponeva `grid-template-columns: repeat(auto-fit,
   minmax(8rem, 1fr))`: nata per quattro campi numerici affiancati, applicata
   ai figli nuovi — pastiglie dei profili, scheda, bottone, nota — li avrebbe
   messi tutti e quattro su una riga da 8rem l'uno. Non è stata affiancata: è
   stata tolta. */

/* ── Avvisi ──────────────────────────────────────────────────────────── */

.contenitore-avvisi {
  position: fixed;
  inset-block-end: var(--sv-s5);
  inset-inline-end: var(--sv-s5);
  display: grid;
  gap: var(--sv-s3);
  z-index: var(--sv-z-overlay);
  max-width: min(24rem, calc(100vw - 2 * var(--sv-s5)));
}

/* ── Utilità ─────────────────────────────────────────────────────────── */

.visivamente-nascosto {
  position: absolute;
  width: 1px; height: 1px;
  padding: 0; margin: -1px;
  overflow: hidden;
  clip-path: inset(50%);
  white-space: nowrap;
}

.assente { color: var(--sv-text-3); }

/* ── Freschezza ──────────────────────────────────────────────────────── */
/*
   L'ora dell'ultimo giro riuscito, in barra. Resta anche sotto i 52rem, dove
   sparisce il selettore del kit: quello è configurazione, questa è una MISURA
   — l'unica che dice se ciò che si sta guardando è ancora vero.
   Cifre tabellari e nessun a capo: cambia ogni cinque secondi, e con cifre a
   larghezza variabile la barra si allargherebbe e si stringerebbe da sola.
*/
.freschezza {
  font-family: var(--sv-font-mono);
  font-variant-numeric: tabular-nums;
  white-space: nowrap;
}

/* Un pannello che ha SMESSO di aggiornarsi è la cosa più importante che
   questa riga possa dire, e il testo da solo non basta: chi guarda un
   pannello di diagnosi guarda i numeri, non le didascalie. */
.freschezza[data-vecchio] { color: var(--sv-warn); }

@media (prefers-reduced-motion: reduce) {
  .misuratore__barra { transition: none; }
  /* Il cassetto compare invece di scivolare. Chi ha chiesto meno movimento ha
     chiesto anche questo: è il movimento più grande che il pannello faccia. */
  .fianco { transition: none; }
  .voce { transition: none; }
  .kit__segno { transition: none; }
}

/* ── Utenze ──────────────────────────────────────────────────────────── */

.utenti {
  display: grid;
  gap: var(--sv-s2);
  max-height: 22rem;
  overflow-y: auto;
  padding-block: var(--sv-s2);
}

.utente {
  display: flex;
  align-items: center;
  gap: var(--sv-s3);
  padding: var(--sv-s2) var(--sv-s3);
  border: 1px solid var(--sv-line);
  border-radius: var(--sv-r1);
  background: var(--sv-surface-2);
}

.utente__chi {
  display: grid;
  min-width: 0;
  margin-inline-end: auto;
}

.utente__login {
  font-family: var(--sv-font-mono);
  font-size: var(--sv-t-cap);
  color: var(--sv-text-1);
  overflow-wrap: anywhere;
}

.utente__email {
  font-size: var(--sv-t-cap);
  color: var(--sv-text-3);
  overflow-wrap: anywhere;
}

/* ── Watchdog ────────────────────────────────────────────────────────── */

.controlli,
.eventi {
  display: grid;
  gap: var(--sv-s2);
}

.controllo {
  display: grid;
  grid-template-columns: minmax(9rem, 1fr) auto auto minmax(6rem, auto);
  align-items: center;
  gap: var(--sv-s3);
  font-size: var(--sv-t-cap);
  color: var(--sv-text-2);
  font-variant-numeric: tabular-nums;
}

.controllo__nome { color: var(--sv-text-2); overflow-wrap: anywhere; }
.controllo__valore { font-family: var(--sv-font-mono); color: var(--sv-text-1); white-space: nowrap; }

.evento {
  display: grid;
  grid-template-columns: auto auto 1fr;
  gap: var(--sv-s3);
  align-items: baseline;
  font-size: var(--sv-t-cap);
  color: var(--sv-text-2);
}

.evento__quando { font-family: var(--sv-font-mono); color: var(--sv-text-3); white-space: nowrap; }
.evento__testo { overflow-wrap: anywhere; }

/* ═══════════════════════════════════════════════════════════════════════
   SOTTO I 52rem — UN SOLO BLOCCO, E STA IN FONDO AL FOGLIO

   La posizione non è ordine: è correttezza. Una media query NON aggiunge
   specificità. `.griglia-siti { grid-template-columns: 1fr }` qui dentro e
   `.griglia-siti { …minmax(21rem, 1fr) }` della sezione «Siti» pesano
   esattamente uguale, e fra due regole di pari peso vince l'ULTIMA scritta.
   Il blocco stava a metà foglio, prima delle sezioni che deve correggere:
   metà delle righe che seguono sarebbero state codice morto che non dipinge
   niente, non solleva niente e non si vede finché qualcuno non apre il
   pannello da un telefono.

   Uno solo, e quando serve una regola nuova per lo schermo stretto si
   aggiunge qui: due blocchi con la stessa condizione sono due posti dove
   cercare, e il secondo lo si trova sempre dopo.
   ═══════════════════════════════════════════════════════════════════════ */
@media (max-width: 52rem) {
  /* Si sposta il TOKEN, non le singole sezioni. Su 375px, 128px di margini
     lasciavano 247px di contenuto. */
  :root { --sv-grid-margin: var(--sv-s4); }

  /*
     La barra laterale diventa un CASSETTO.

     Su 375px una colonna fissa da 248px lascia al contenuto 127 pixel: non è
     una versione stretta del pannello, è un pannello che non si può usare.
     Sotto questa soglia la navigazione si chiama quando serve e per il resto
     del tempo non c'è — che è anche il modo in cui la si usa su un telefono,
     dove si apre il pannello per guardare UNA cosa.

     `--sv-z-modal` e non `--sv-z-overlay`: il cassetto scorre sopra lo scrim,
     che è un `.sv-scrim` del kit (z-modal) inserito da app.js come primo figlio
     del telaio. A pari z-index vince chi viene dopo nel documento, e il
     cassetto viene dopo.
  */
  .telaio { grid-template-columns: minmax(0, 1fr); }

  .fianco {
    position: fixed;
    inset-block: 0;
    inset-inline-start: 0;
    z-index: var(--sv-z-modal);
    inline-size: min(17rem, 84vw);
    transform: translateX(-100%);
    transition: transform var(--sv-dur-2) var(--sv-ease);
    box-shadow: var(--sv-e4);
  }

  .telaio[data-fianco="aperto"] .fianco { transform: none; }

  .testata__menu { display: inline-flex; }

  /* Il respiro orizzontale scende con lo schermo: a 375px, 24px per lato sono
     il 13% della larghezza tolto ai numeri. */
  .testata,
  .striscia-avvisi { padding-inline: var(--sv-s4); }
  .contenuto { padding: var(--sv-s5) var(--sv-s4) var(--sv-s7); }

  /* 247px di contenuto contro una traccia che ne chiedeva 336: la pagina
     scorreva in ORIZZONTALE su un telefono, che è il modo più veloce di
     rendere inutilizzabile un pannello che si guarda proprio quando si è
     fuori casa. */
  .griglia-siti { grid-template-columns: 1fr; }

  .servizio { grid-template-columns: 1fr auto; }
  .servizio__nome { grid-column: 1 / -1; }
  .controllo { grid-template-columns: 1fr auto auto; row-gap: var(--sv-s1); }
  .controllo > .sv-hint { grid-column: 1 / -1; }

  /* Il grafico perde 40px. Su uno schermo alto 667px, 200px di disegno più la
     testa, la nota e il riquadro dei valori sono già una schermata intera per
     una sezione sola. */
  .grafico__tela { height: 160px; }
}

/* ═══════════════════════════════════════════════════════════════════════
   SCHERMO BASSO — la guardia della testata appiccicata

   Un telefono in orizzontale ha ~330px di altezza utile: 52px di testata fissa
   sono un sesto dello schermo che non mostra mai un dato, per sempre. Qui la
   testata torna a scorrere via — che è esattamente il compromesso che una
   testata appiccicata evita quando lo schermo è alto abbastanza per
   permetterselo.

   `position:static` vince su `position:sticky` dichiarato più su per la
   stessa ragione per cui il blocco dei 52rem sta in fondo: pari specificità,
   ultima scritta.
   ═══════════════════════════════════════════════════════════════════════ */
@media (max-height: 30rem) {
  .testata { position: static; }

  /* Con la testata che scorre via, il bersaglio non ha più niente dietro cui
     nascondersi: il margine di scorrimento diventa spazio vuoto sopra, su uno
     schermo che di spazio non ne ha. */
  .contenuto,
  .vista { scroll-margin-block-start: 0; }
}

/* ═══ Siti — carta a due colonne ═══════════════════════════════════════ */
/*
   La carta è passata da un terzo di riga a metà, e il contenuto è stato
   ridisposto invece di essere semplicemente allargato: allargare avrebbe
   allungato le righe di testo senza rispondere alla domanda per cui si guarda
   un sito, che è «quanto sta consumando rispetto a quanto può».
*/

.sito__corpo {
  display: grid;
  gap: var(--sv-s4);
}

.sito__testa {
  display: flex;
  align-items: flex-start;
  justify-content: space-between;
  gap: var(--sv-s3);
  flex-wrap: wrap;
}

.sito__identita {
  display: grid;
  gap: 2px;
  min-width: 0;
}

.sito__dominio {
  font-family: var(--sv-font-mono);
  font-size: var(--sv-t-bs);
  color: var(--sv-text-1);
  text-decoration: none;
  overflow-wrap: anywhere;
}

.sito__dominio:hover { text-decoration: underline; }

.sito__stato {
  display: flex;
  align-items: center;
  gap: var(--sv-s2);
  flex: none;
}

/* Il profilo si riconosce dal peso, non solo dal nome: tre pastiglie che
   differiscono per una parola richiedono di leggerle: con un bordo che si
   ispessisce si distinguono con la coda dell'occhio. Nessun colore nuovo —
   il livello di enfasi viene dai token del kit. */
.profilo-chip { border-color: var(--sv-line-strong); }
.profilo-chip--medio { border-inline-start: 3px solid var(--sv-accent-1); }
.profilo-chip--grande { border-inline-start: 3px solid var(--sv-accent-2); }

/* ── Righe di servizio ───────────────────────────────────────────────── */
/*
   Prima: nome, una barra (che era la sola memoria) e una stringa con dentro
   CPU e memoria attaccate. La barra sembrava riferirsi a entrambe. Ora sono
   due misure dichiarate, ognuna con la propria barra e il proprio tetto.
*/
.servizio {
  display: grid;
  gap: var(--sv-s1);
  padding-block: var(--sv-s2);
  border-block-start: 1px solid var(--sv-line);
}

.servizio:first-child { border-block-start: none; }

.servizio__testa {
  display: flex;
  align-items: baseline;
  justify-content: space-between;
  gap: var(--sv-s2);
}

.servizio__nome {
  font-family: var(--sv-font-mono);
  font-size: var(--sv-t-cap);
  letter-spacing: .06em;
  text-transform: uppercase;
  color: var(--sv-text-3);
}

.servizio__stato {
  font-family: var(--sv-font-ui);
  font-size: var(--sv-t-cap);
  color: var(--sv-text-3);
}

.misura {
  display: grid;
  grid-template-columns: 2.5rem 1fr auto;
  align-items: center;
  gap: var(--sv-s3);
}

.misura__etichetta {
  font-family: var(--sv-font-mono);
  font-size: var(--sv-t-cap);
  color: var(--sv-text-3);
}

.misura__cifre {
  font-family: var(--sv-font-mono);
  font-size: var(--sv-t-cap);
  font-variant-numeric: tabular-nums;
  white-space: nowrap;
  color: var(--sv-text-2);
}

/* Il totale del sito: la somma che prima bisognava fare a mente. */
.sito__somma {
  display: grid;
  grid-template-columns: auto 1fr auto;
  align-items: center;
  gap: var(--sv-s3);
  padding-block-start: var(--sv-s2);
  border-block-start: 1px solid var(--sv-line-strong);
}

.sito__somma-etichetta {
  font-family: var(--sv-font-mono);
  font-size: var(--sv-t-cap);
  letter-spacing: .06em;
  text-transform: uppercase;
  color: var(--sv-text-2);
}

.sito__somma-cifre {
  font-family: var(--sv-font-mono);
  font-size: var(--sv-t-cap);
  font-variant-numeric: tabular-nums;
  white-space: nowrap;
  color: var(--sv-text-1);
}

.sito__comandi {
  display: flex;
  align-items: center;
  gap: var(--sv-s2);
  flex-wrap: wrap;
}

/* ── Assegnazione per sito ───────────────────────────────────────────── */
/*
   Un blocco per applicativo dentro la vista dell'allocazione. Prima l'editor
   viveva in un cassetto dentro la carta del sito: per cambiare una promessa
   bisognava andare nella pagina che racconta i consumi, trovare la carta
   giusta e aprire un dettaglio. Il comando adesso sta dove sta il discorso.
*/
.alloc-sito {
  display: grid;
  gap: var(--sv-s3);
  padding-block: var(--sv-s4);
  border-block-start: 1px solid var(--sv-line);
}

.alloc-sito:first-of-type { border-block-start: none; padding-block-start: var(--sv-s2); }

.alloc-sito__testa {
  display: flex;
  align-items: center;
  gap: var(--sv-s3);
  flex-wrap: wrap;
}

.alloc-sito__dominio {
  font-family: var(--sv-font-mono);
  font-size: var(--sv-t-bs);
  color: var(--sv-text-1);
  overflow-wrap: anywhere;
}

/* `margin-inline-start:auto` porta le cifre a fondo riga: incolonnate, i totali
   dei siti si confrontano fra loro con un colpo d'occhio invece che leggendoli
   uno per uno. */
.alloc-sito__cifre {
  margin-inline-start: auto;
  font-family: var(--sv-font-mono);
  font-size: var(--sv-t-code);
  color: var(--sv-text-3);
  white-space: nowrap;
}

/* ── Pastiglie dei profili ───────────────────────────────────────────── */
.profili {
  display: grid;
  grid-template-columns: repeat(auto-fit, minmax(7.5rem, 1fr));
  gap: var(--sv-s2);
  margin-block: var(--sv-s2) var(--sv-s3);
}

.profilo {
  display: grid;
  gap: 2px;
  text-align: start;
  padding: var(--sv-s2) var(--sv-s3);
  border: 1px solid var(--sv-line);
  border-radius: var(--sv-r1);
  background: var(--sv-surface-2);
  color: var(--sv-text-2);
  cursor: pointer;
  font: inherit;
}

.profilo:hover { border-color: var(--sv-line-strong); color: var(--sv-text-1); }

/* Lo stato premuto si dipinge da aria-pressed e non da una classe parallela:
   due sorgenti di verità per «quale è scelto» sono due che possono
   discordare, e quella che vede il lettore di schermo sarebbe la seconda. */
.profilo[aria-pressed="true"] {
  border-color: var(--sv-accent-1);
  background: var(--sv-accent-1-tint);
  color: var(--sv-text-1);
}

.profilo__nome {
  font-family: var(--sv-font-ui);
  font-weight: 600;
  font-size: var(--sv-t-bs);
}

.profilo__peso {
  font-family: var(--sv-font-mono);
  font-size: var(--sv-t-cap);
  color: var(--sv-text-3);
  font-variant-numeric: tabular-nums;
}

/* ── Scheda del profilo scelto ───────────────────────────────────────── */
.scheda-profilo { display: grid; gap: var(--sv-s2); }

.scheda-profilo__voci {
  display: grid;
  gap: 2px;
}

.scheda-profilo__riga {
  display: flex;
  justify-content: space-between;
  gap: var(--sv-s3);
  padding-block: 3px;
  border-block-end: 1px solid var(--sv-line);
  font-size: var(--sv-t-cap);
}

.scheda-profilo__riga:last-child {
  border-block-end: none;
  border-block-start: 1px solid var(--sv-line-strong);
  margin-block-start: 2px;
  padding-block-start: var(--sv-s2);
}

.scheda-profilo__chiave {
  font-family: var(--sv-font-mono);
  color: var(--sv-text-3);
}

.scheda-profilo__valore {
  font-family: var(--sv-font-mono);
  font-variant-numeric: tabular-nums;
  color: var(--sv-text-2);
  text-align: end;
}

/* ── Campi del profilo personalizzato ────────────────────────────────── */
.editor { display: grid; gap: var(--sv-s3); }

.editor__campi {
  display: grid;
  grid-template-columns: repeat(auto-fit, minmax(9rem, 1fr));
  gap: var(--sv-s3);
}

.campo-risorsa__guscio {
  display: flex;
  align-items: center;
  gap: var(--sv-s2);
}

.campo-risorsa__guscio .sv-input {
  width: 100%;
  min-width: 0;
}

.campo-risorsa__unita {
  font-family: var(--sv-font-mono);
  font-size: var(--sv-t-cap);
  color: var(--sv-text-3);
  flex: none;
}

.editor__totale {
  padding-block-start: var(--sv-s2);
  border-block-start: 1px solid var(--sv-line);
  font-variant-numeric: tabular-nums;
}

.editor__azioni {
  display: flex;
  align-items: center;
  gap: var(--sv-s3);
}

/* ═══ Allocazione della macchina ══════════════════════════════════════ */

.alloc {
  display: grid;
  gap: var(--sv-s2);
  padding-block: var(--sv-s3);
  border-block-start: 1px solid var(--sv-line);
}

.alloc:first-child { border-block-start: none; padding-block-start: 0; }

.alloc__titolo {
  margin: 0;
  font-family: var(--sv-font-mono);
  font-weight: 700;
  font-size: var(--sv-t-ov);
  letter-spacing: .12em;
  text-transform: uppercase;
  color: var(--sv-text-3);
}

.alloc__cifra {
  margin: 0;
  font-family: var(--sv-font-mono);
  font-size: var(--sv-t-bs);
  font-variant-numeric: tabular-nums;
  color: var(--sv-text-1);
}

/* Il giudizio porta il proprio livello, e il colore viene dai token di
   feedback: senza livello resta testo normale, perché una frase sempre
   colorata smette di segnalare. */
.alloc__giudizio {
  margin: 0;
  font-family: var(--sv-font-ui);
  font-size: var(--sv-t-cap);
  line-height: var(--sv-t-cap-lh);
  color: var(--sv-text-2);
}

.alloc__giudizio[data-livello="attenzione"] {
  color: var(--sv-text-2);
  border-inline-start: 3px solid var(--sv-warn);
  padding-inline-start: var(--sv-s3);
}

.alloc__giudizio[data-livello="critico"] {
  color: var(--sv-text-2);
  border-inline-start: 3px solid var(--sv-err);
  padding-inline-start: var(--sv-s3);
}

/* ── La barra a segmenti ─────────────────────────────────────────────── */
/*
   Una barra sola divisa per sito, invece di tre barre di avanzamento che
   misuravano grandezze diverse con lo stesso disegno. La domanda vera è «chi
   si sta prendendo la macchina», e a quella una barra segmentata risponde
   guardandola; tre percentuali no.
*/
.segmenti {
  display: flex;
  block-size: 1.75rem;
  border-radius: var(--sv-r1);
  overflow: hidden;
  border: 1px solid var(--sv-line);
  background: var(--sv-surface-2);
}

.segmenti__parte {
  display: block;
  block-size: 100%;
  min-inline-size: 2px;
  background: var(--sv-accent-1);
}

/* I ruoli si distinguono per intensità, non per tinte inventate: la scala è
   quella del kit e cambia con il kit. */
.segmenti__parte[data-ruolo="medio"]           { background: var(--sv-accent-2); }
.segmenti__parte[data-ruolo="grande"]          { background: var(--sv-accent-1-active); }
.segmenti__parte[data-ruolo="personalizzato"]  { background: var(--sv-info); }
.segmenti__parte[data-ruolo="infrastruttura"]  { background: var(--sv-text-3); }
.segmenti__parte[data-ruolo="riserva"]         { background: var(--sv-line-strong); }
.segmenti__parte[data-ruolo="libero"]          { background: transparent; }

.legenda {
  display: flex;
  flex-wrap: wrap;
  gap: var(--sv-s2) var(--sv-s4);
}

.legenda__voce {
  display: flex;
  align-items: center;
  gap: var(--sv-s2);
  font-size: var(--sv-t-cap);
}

.legenda__pastiglia {
  inline-size: .7rem;
  block-size: .7rem;
  border-radius: 2px;
  flex: none;
  border: 1px solid var(--sv-line);
  background: var(--sv-accent-1);
}

.legenda__pastiglia[data-ruolo="medio"]          { background: var(--sv-accent-2); }
.legenda__pastiglia[data-ruolo="grande"]         { background: var(--sv-accent-1-active); }
.legenda__pastiglia[data-ruolo="personalizzato"] { background: var(--sv-info); }
.legenda__pastiglia[data-ruolo="infrastruttura"] { background: var(--sv-text-3); }
.legenda__pastiglia[data-ruolo="riserva"]        { background: var(--sv-line-strong); }
.legenda__pastiglia[data-ruolo="libero"]         { background: transparent; }

.legenda__nome {
  font-family: var(--sv-font-mono);
  color: var(--sv-text-2);
  overflow-wrap: anywhere;
}

.legenda__valore {
  font-family: var(--sv-font-mono);
  font-variant-numeric: tabular-nums;
  color: var(--sv-text-3);
}
