/*
Theme Name: Wifidom
Theme URI: https://www.wifidom.com/
Author: Allnet Italia
Author URI: https://www.allnet-italia.it/
Description: Tema a blocchi del sito vetrina Wifidom. Si occupa solo di presentazione: il modello dei contenuti, i lead e le registrazioni ai corsi vivono nel plugin Wifidom Core.
Requires at least: 7.0
Tested up to: 7.1
Requires PHP: 8.3
Version: 0.1.0
License: Proprietary
Text Domain: wifidom
Tags: full-site-editing, block-patterns, translation-ready, accessibility-ready, wide-blocks
*/

/*
 * Questo file contiene solo cio' che theme.json non sa esprimere.
 * Regole: nessun valore letterale (si consumano le custom properties dei preset),
 * nessun !important, nessun selettore discendente oltre due livelli — il markup
 * dei blocchi core cambia fra versioni di WordPress e un selettore profondo si
 * rompe a un aggiornamento a caso.
 *
 * I token arrivano con il modulo design-system (T5-T9): finche' design.md non
 * e' compilato, qui non deve comparire nulla.
 */

/* ==========================================================================
   1. Padding orizzontale responsive
   theme.json non sa esprimere un breakpoint: dichiara i due valori come token
   e qui si scambia quello attivo. Il padding di root di WordPress consuma
   --wp--custom--padding--x, quindi ridefinirlo su :root basta.
   Breakpoint del progetto: 1024px (tablet) e 680px (mobile).

   `:root:root` E' DOPPIO APPOSTA, e non e' un refuso. Il core dichiara lo stesso
   token su `:root` — stessa specificita', 0,1,0 — e a parita' vince chi viene DOPO.
   Sul front end il tema viene dopo e vinceva; NELL'EDITOR l'ordine e' rovesciato,
   gli stili del tema entrano PRIMA di quelli globali, e questa regola restava
   inerte: a 660px di tela il padding misurava 40 invece di 20. Raddoppiare il
   selettore porta a 0,2,0 e chiude il pareggio in tutti e due i posti, senza
   `!important` e senza duplicare la regola per l'editor.
   ========================================================================== */

@media (max-width: 680px) {
	:root:root {
		--wp--custom--padding--x: var(--wp--custom--padding--x-mobile);
	}
}

/* ==========================================================================
   1-bis. Involucro e contenuto si toccano
   ========================================================================== */

/* Il core emette, dal `blockGap` di root di theme.json:

     :where(.wp-site-blocks) > * { margin-block-start: var(--wp--preset--spacing--50) }

   e i figli diretti di `.wp-site-blocks` sono header, main e footer. Risultato: DUE
   spazi da 24px, header->main e main->footer, che nessuna sezione ha chiesto.

   Non si corregge in theme.json: `styles.spacing.blockGap` e' il gap PREDEFINITO di
   ogni layout del tema — gruppi, colonne, griglie — e azzerarlo li' appiattirebbe
   tutti gli spazi del sito per sistemarne due.

   Si corregge qui, e basta una classe: la regola del core ha specificita' ZERO,
   perche' `:where()` non contribuisce e `*` nemmeno. `.wp-site-blocks > *` pesa
   0,1,0 e vince. E' la trappola 5 al contrario — di solito e' il core a battere il
   tema, qui e' il core ad aver scritto una regola che si lascia battere apposta.

   Ogni sezione porta il proprio padding verticale: fra un involucro e l'altro non ci
   va nulla. */
.wp-site-blocks > * {
	margin-block-start: 0;
}

/* ==========================================================================
   2. Fuoco visibile
   WCAG 2.2 SC 2.4.7 e 2.4.11. theme.json non esprime :focus-visible.
   L'outline usa il primario: 9.72:1 su base, 8.98:1 su surface — molto oltre
   il 3:1 richiesto per un indicatore di fuoco.
   ========================================================================== */

:where(a, button, input, select, textarea, summary, [tabindex]):focus-visible {
	outline: var(--wp--custom--focus--width) solid var(--wp--preset--color--primary);
	outline-offset: var(--wp--custom--focus--offset);
}

/* Sulle sezioni in negativo l'outline scuro sparisce: si inverte in bianco.

   `.wifidom-negativo` MANCAVA, dal modulo `pages`, e se n'e' accorto il modulo
   `vocabolario` il 2026-10-09: nei cover la classe del colore sta sullo <span>
   dell'overlay, non sulla sezione — la stessa ragione per cui esiste
   `.wifidom-negativo` — quindi il link «Inicio» delle briciole di OGNI pagina interna
   aveva l'anello `primary` su `contrast`, 1.66:1 contro i 3:1 di WCAG 1.4.11.
   `verifica-tema` controlla che l'anello ci sia, non che si veda. */
.has-contrast-background-color :focus-visible,
.has-primary-background-color :focus-visible,
.wifidom-negativo :focus-visible,
.is-style-scuro :focus-visible {
	outline-color: var(--wp--preset--color--base);
}

/* E torna `primary` nelle card chiare dentro una sezione scura: bianco su bianco
   non si vede. Modulo `vocabolario`, M2 — trovato scrivendo la FAQ, non misurando. */
.is-style-scuro .is-style-card :focus-visible {
	outline-color: var(--wp--preset--color--primary);
}

/* ==========================================================================
   3. Varianti di bottone
   theme.json copre solo il bottone predefinito. La variante "contorno" e' lo
   stile di blocco nativo del core, quindi non serve registrarne uno nuovo.
   ========================================================================== */

.wp-block-button.is-style-outline > .wp-block-button__link:not(.has-background) {
	background-color: transparent;
	border-color: var(--wp--preset--color--primary);
	color: var(--wp--preset--color--primary);
	/* Il core impone a questo stile un padding in em, diverso da quello che
	   theme.json da' al bottone pieno: affiancati risultavano alti 39px e 49px.
	   Trovato in browser misurando le due posizioni verticali. */
	padding: var(--wp--preset--spacing--40) var(--wp--preset--spacing--50);
}

.wp-block-button.is-style-outline > .wp-block-button__link:not(.has-background):hover {
	background-color: var(--wp--preset--color--surface-tint);
	border-color: var(--wp--preset--color--primary);
	color: var(--wp--preset--color--primary-hover);
}

/* I link dentro una sezione in negativo. `styles.elements.link` di theme.json da'
   loro il primario, che su `contrast` sta a **1.66:1**: illeggibile. Misurato in P3
   sulle briciole dell'hero.

   ATTENZIONE: questa regola NON raggiunge un `core/cover`. In un cover la classe
   del colore sta sullo <span> dell'overlay, non sulla sezione, quindi il contenuto
   non e' discendente di un elemento `.has-*-background-color`. I cover si vestono
   per classe propria — vedi `.wifidom-hero-interior` piu' sotto. */
.has-contrast-background-color a:not(.wp-element-button),
.has-primary-background-color a:not(.wp-element-button) {
	color: var(--wp--preset--color--on-dark);
}

.has-contrast-background-color a:not(.wp-element-button):hover,
.has-primary-background-color a:not(.wp-element-button):hover {
	color: var(--wp--preset--color--base);
}

/* Bottoni dentro una sezione in negativo: il primario passa al secondario,
   perche' il primario su fondo scuro non si distingue. */
.has-contrast-background-color .wp-element-button,
.has-primary-background-color .wp-element-button,
.wifidom-negativo .wp-element-button,
.is-style-scuro .wp-element-button {
	background-color: var(--wp--preset--color--secondary);
	border-color: var(--wp--preset--color--secondary);
}

.has-contrast-background-color .wp-element-button:hover,
.has-primary-background-color .wp-element-button:hover,
.wifidom-negativo .wp-element-button:hover,
.is-style-scuro .wp-element-button:hover {
	background-color: var(--wp--preset--color--secondary-strong);
	border-color: var(--wp--preset--color--secondary-strong);
}

/* Il bottone a contorno su fondo scuro. TRE livelli di discendenza, contro la
   regola dei due: il selettore del core per lo stile a contorno ne usa gia' due,
   e batterlo richiede il terzo. E' l'unico punto del tema dove succede.

   `design.md` §5 vuole il bordo a `rgba(255,255,255,.6)`; qui e' `base`, cioe'
   bianco pieno. Motivo: .6 sarebbe un valore letterale e servirebbe un token
   nuovo, e il bianco pieno da' piu' contrasto — WCAG 1.4.11 chiede >= 3:1 per il
   bordo di un controllo. Deviazione dichiarata. */
.wifidom-negativo .wp-block-button.is-style-outline > .wp-block-button__link:not(.has-background),
.is-style-scuro .wp-block-button.is-style-outline > .wp-block-button__link:not(.has-background) {
	background-color: transparent;
	border-color: var(--wp--preset--color--base);
	color: var(--wp--preset--color--base);
}

.wifidom-negativo .wp-block-button.is-style-outline > .wp-block-button__link:not(.has-background):hover,
.is-style-scuro .wp-block-button.is-style-outline > .wp-block-button__link:not(.has-background):hover {
	background-color: rgba(255, 255, 255, 0.12);
	border-color: var(--wp--preset--color--base);
	color: var(--wp--preset--color--base);
}

/* Un `core/cover` non porta la classe del colore su di se': sta sullo <span>
   dell'overlay. Quindi ne' i link ne' l'eyebrow ricadono nelle regole generali
   delle sezioni in negativo, e i cover si vestono per classe propria. Vale per
   ogni cover del tema, e da qui in avanti sono due. */
/* `.wifidom-negativo` E' L'AGGANCIO DEI COVER SCURI, e nasce dopo la terza volta.

   In un `core/cover` la classe del colore sta sullo `<span>` dell'overlay, non
   sulla sezione: nessuna delle regole `.has-contrast-background-color ...` lo
   raggiunge. Le prime due volte ho aggiunto il nome del pattern alla lista dei
   selettori — link dell'hero, poi eyebrow della card. Alla terza (il bottone
   dell'hero della home, che rendeva `primary` su fondo scuro) la lista sarebbe
   diventata la regola. Ora i cover scuri portano `wifidom-negativo`, e tutto ciò
   che vale per una sezione in negativo si aggancia anche a quello. */
.wifidom-negativo a:not(.wp-element-button),
.is-style-scuro a:not(.wp-element-button) {
	color: inherit;
}

.wifidom-negativo a:not(.wp-element-button):hover,
.is-style-scuro a:not(.wp-element-button):hover {
	color: var(--wp--preset--color--base);
}

.wifidom-negativo .is-style-eyebrow,
.is-style-scuro .is-style-eyebrow {
	color: var(--wp--preset--color--accent-light);
}

/* ==========================================================================
   4. Stili di blocco del tema
   Registrati in functions.php. L'eyebrow non puo' stare in theme.json:
   e' una combinazione di dimensione, peso, spaziatura e maiuscolo che
   nessun preset singolo esprime.
   ========================================================================== */

.is-style-eyebrow {
	color: var(--wp--preset--color--secondary-strong);
	font-size: var(--wp--preset--font-size--eyebrow);
	font-weight: 600;
	letter-spacing: 0.14em;
	line-height: 1;
	text-transform: uppercase;
}

/* Su fondo scuro il teal scurito non si legge: 1.55:1 su contrast. */
.has-contrast-background-color .is-style-eyebrow,
.has-primary-background-color .is-style-eyebrow {
	color: var(--wp--preset--color--accent-light);
}

/* L'etichetta maiuscola non dichiara un colore: lo prende dal blocco, cosi' la
   stessa forma tipografica funziona su fondo chiaro e su fondo scuro senza
   un'eccezione per ciascuno. */
.is-style-label {
	font-size: var(--wp--preset--font-size--small);
	font-weight: 600;
	letter-spacing: 0.08em;
	line-height: 1;
	text-transform: uppercase;
}

.is-style-dato {
	font-size: var(--wp--preset--font-size--dato);
	font-weight: 700;
	line-height: 1;
}

.is-style-card {
	background-color: var(--wp--preset--color--base);
	border: var(--wp--custom--border--width) solid var(--wp--preset--color--line);
	border-radius: var(--wp--custom--radius--card);
	padding: var(--wp--preset--spacing--50);
}

.is-style-card:hover {
	border-color: var(--wp--preset--color--secondary);
	box-shadow: var(--wp--preset--shadow--card);
}

/* La card di rimando — `grid-enlaces`, modulo `vocabolario`. Il link e' il titolo,
   e il suo `::after` steso rende cliccabile la card intera: qui funziona perche' la
   card e' un gruppo, posizionato, e `inset: 0` arriva ai suoi bordi. Nelle card
   fotografiche no — vedi il loro blocco, piu' sotto.

   Il fuoco si disegna sulla card e non sul titolo, per la stessa ragione delle card
   fotografiche: un anello attorno a due righe di testo dentro un riquadro cliccabile
   dice male dov'e' il bersaglio. */
.wifidom-card-enlace {
	position: relative;
}

.wifidom-card-enlace h3 a::after {
	content: "";
	inset: 0;
	position: absolute;
}

.wifidom-card-enlace:focus-within {
	outline: var(--wp--custom--focus--width) solid var(--wp--preset--color--primary);
	outline-offset: var(--wp--custom--focus--offset);
}

.wifidom-card-enlace h3 a:focus-visible {
	outline: none;
}

/* In una sezione scura l'anello sta FUORI dalla card, cioe' sul fondo scuro. */
.is-style-scuro .wifidom-card-enlace:focus-within {
	outline-color: var(--wp--preset--color--base);
}

/* La scheda del referente — `cta-referente`. La foto e' un ritratto quadrato e
   piccolo, non una foto di sezione: 120px bastano a riconoscere una persona, e a
   tutta larghezza la card sarebbe per due terzi una faccia. */
.wifidom-referente .wp-block-image.wifidom-media {
	border-radius: 50%;
	max-width: 120px;
}

/* Lo SFONDO di una sezione del vocabolario: nessuno stile = chiaro, `alternato`,
   `scuro`. Modulo `vocabolario`, D3.

   E' UNO STILE DI BLOCCO, non `backgroundColor`, perche' lo scuro non e' un fondo:
   e' un fondo PIU' i colori di tutto quello che ci sta sopra. Con l'attributo,
   scurire una sezione voleva dire cambiare anche il colore di ogni titolo e di ogni
   paragrafo attenuato — `franja-datos` e `hero-interior` lo fanno blocco per blocco.
   Un agente che cambia solo il fondo scrive testo scuro su fondo scuro. Qui lo
   scuro e' un punto solo, e due stili sullo stesso blocco si escludono: una sezione
   «alternata e scura» non si puo' scrivere.

   Link, bottoni ed eyebrow li veste gia' il blocco 3, insieme a `wifidom-negativo`.
   Qui restano i titoli e il testo, che nei cover hanno sempre avuto un `textColor`
   esplicito e quindi nessuna regola. */
.wp-block-group.is-style-alternato {
	background-color: var(--wp--preset--color--surface);
}

.wp-block-group.is-style-scuro {
	background-color: var(--wp--preset--color--contrast);
	color: var(--wp--preset--color--on-dark);
}

/* 0,1,1 contro lo 0,1,0 di `:root :where(h1, …)` che theme.json genera per
   `elements.heading`: vince per specificita', quindi anche nell'editor, dove
   l'ordine dei fogli e' rovesciato (vedi functions.php, add_editor_styles). */
.is-style-scuro :is(h1, h2, h3, h4, h5, h6) {
	color: var(--wp--preset--color--base);
}

/* Il core stampa le classi dei colori con `!important`: si batte solo con un altro
   `!important` piu' specifico. `muted` su `contrast` sarebbe 2.9:1. */
.is-style-scuro .has-muted-color {
	color: var(--wp--preset--color--on-dark-muted) !important;
}

/* LE CARD RESTANO CHIARE. Una card ha fondo `base` suo, quindi dentro una sezione
   scura e' un'isola chiara, e i colori vanno rimessi come fuori. Senza, il titolo di
   una card diventava bianco su bianco. */
.is-style-scuro .is-style-card {
	color: var(--wp--preset--color--contrast);
}

.is-style-scuro .is-style-card :is(h1, h2, h3, h4, h5, h6) {
	color: var(--wp--preset--color--contrast);
}

.is-style-scuro .is-style-card .has-muted-color {
	color: var(--wp--preset--color--muted) !important;
}

.is-style-scuro .is-style-card a:not(.wp-element-button) {
	color: var(--wp--preset--color--primary);
}

.is-style-scuro .is-style-card .is-style-eyebrow {
	color: var(--wp--preset--color--secondary-strong);
}

/* ==========================================================================
   5. Ancore sotto un header sticky
   WCAG 2.2 SC 2.4.11: dopo un errore il fuoco va su un campo che finirebbe
   coperto dall'header. Vale per i due wrapper dei form, che sono il bersaglio
   dell'ancora nel percorso senza JavaScript.
   ========================================================================== */

:target,
.wifidom-formulario,
.wifidom-inscripcion-cerrada {
	/* Il token e' l'altezza del contenuto dell'header; il bordo inferiore aggiunge
	   il suo pixel, e occlude come il resto. Misurato: 72 + 1 = 73px reali. */
	scroll-margin-top: calc( var(--wp--custom--header--height) + var(--wp--custom--border--width) );
}

/* ==========================================================================
   6. Form di wifidom-core
   Il plugin genera il markup e zero CSS: il 100% dell'aspetto e' qui.
   Inventario degli agganci e degli stati: docs/design/ANALISI-form.md.
   Le regole a tre livelli sotto .wifidom-* sono ammesse: quel markup e' nostro
   (sta nel plugin, che possiamo modificare), non markup di blocchi core che
   cambia fra versioni di WordPress.
   ========================================================================== */

/* --- 6.1 Il campo esca. BLOCCANTE.
   Nel plugin ha aria-hidden e tabindex="-1" ma nessuna regola CSS: senza
   questa, in pagina si vede un'etichetta "No rellenes este campo" con un
   campo sotto, e chi lo compila si vede l'invio respinto senza spiegazione. */

.wifidom-hp {
	border: 0;
	clip-path: inset(50%);
	height: 1px;
	overflow: hidden;
	position: absolute;
	white-space: nowrap;
	width: 1px;
}

/* --- 6.2 Il contenitore */

.wifidom-formulario {
	margin-inline: auto;
	max-width: var(--wp--style--global--content-size);
}

/* L'iscrizione ha una veste propria: e' un'azione, non un modulo di contatto.
   Il plugin le mette la classe aggiuntiva .wifidom-inscripcion apposta. */
.wifidom-inscripcion {
	background-color: var(--wp--preset--color--surface);
	border: var(--wp--custom--border--width) solid var(--wp--preset--color--line);
	border-radius: var(--wp--custom--radius--card);
	padding: var(--wp--preset--spacing--60);
}

/* --- 6.3 La griglia dei campi
   Due colonne su desktop, una sotto i 680px. Il markup e' una sequenza di <p>
   fratelli, quindi i conteggi dispari lasciano un buco: si accetta
   l'asimmetria, perche' riordinare romperebbe l'ordine di tabulazione. */

.wifidom-campos {
	display: grid;
	gap: var(--wp--preset--spacing--40) var(--wp--preset--spacing--50);
	grid-template-columns: repeat(2, minmax(0, 1fr));
}

.wifidom-campo {
	margin: 0;
}

.wifidom-campo--ancho {
	grid-column: 1 / -1;
}

@media (max-width: 680px) {
	.wifidom-campos {
		grid-template-columns: minmax(0, 1fr);
	}
}

/* --- 6.4 Etichette e controlli
   Etichetta sopra il controllo: e' la struttura naturale del markup ed e'
   quella che regge la dilatazione del portoghese (+20-30%).
   Il bordo dei campi usa line-strong (3.60:1), non line (1.27:1): WCAG 2.2
   SC 1.4.11 chiede >= 3:1 fra il bordo di un controllo e lo sfondo. E' una
   deviazione deliberata da design.md §5, registrata in audit-CP0. */

.wifidom-campo label {
	display: block;
	font-size: var(--wp--preset--font-size--small);
	font-weight: 600;
	margin-bottom: var(--wp--preset--spacing--20);
}

/* L'asterisco di obbligatorieta' e' <span aria-hidden="true">*</span> dentro la
   label e non ha una classe: serve un selettore ad attributo. */
.wifidom-campo label span[aria-hidden="true"] {
	color: var(--wp--custom--state--error);
}

.wifidom-campo :where(input, select, textarea) {
	background-color: var(--wp--preset--color--base);
	border: var(--wp--custom--border--width) solid var(--wp--preset--color--line-strong);
	border-radius: var(--wp--custom--radius--control);
	/* Senza questo il controllo sfonda la cella della griglia di 34px: WordPress
	   non dichiara box-sizing globalmente, quindi width:100% piu' padding piu'
	   bordo eccedono la colonna. Trovato in browser, non era visibile nel CSS. */
	box-sizing: border-box;
	color: var(--wp--preset--color--contrast);
	font-family: inherit;
	font-size: var(--wp--preset--font-size--body);
	padding: var(--wp--preset--spacing--30) var(--wp--preset--spacing--40);
	width: 100%;
}

.wifidom-campo :where(input, select, textarea):focus {
	border-color: var(--wp--preset--color--primary);
	box-shadow: var(--wp--custom--focus--halo);
	outline: none;
}

.wifidom-campo :where(input, select, textarea):focus-visible {
	box-shadow: var(--wp--custom--focus--halo);
	outline: var(--wp--custom--focus--width) solid var(--wp--preset--color--primary);
	outline-offset: 0;
}

.wifidom-campo textarea {
	line-height: 1.6;
	min-height: 8rem;
	resize: vertical;
}

/* --- 6.5 Errore sul campo
   [aria-invalid="true"] e' l'unico segnale che il plugin mette sul controllo.
   WCAG SC 1.4.1: il colore non basta. I segnali sono tre: bordo piu' spesso,
   sfondo, e il testo che il plugin scrive nello span.
   Il bordo usa width-strong, che vale 2px e non 1.5px: verificato in Chrome che
   un bordo di 1.5px viene reso 1px sia a 1x sia a 2x, quindi un campo in errore
   sarebbe risultato dello stesso spessore di uno sano. */

.wifidom-campo [aria-invalid="true"] {
	background-color: var(--wp--custom--state--error-surface);
	border-color: var(--wp--custom--state--error);
	border-width: var(--wp--custom--border--width-strong);
}

.wifidom-campo-error {
	color: var(--wp--custom--state--error);
	display: block;
	font-size: var(--wp--preset--font-size--small);
	font-weight: 500;
	margin-top: var(--wp--preset--spacing--20);
}

.wifidom-campo-error:empty {
	display: none;
}

/* --- 6.6 Consensi
   Sono due, separati, e nessuno pre-spuntato: e' conformita', non layout.
   La checkbox e' allineata alla prima riga del testo, non centrata sul blocco,
   perche' la frase va a capo (e in portoghese va a capo di piu').
   1.5rem = 24px e' il minimo di WCAG 2.2 SC 2.5.8: la nativa e' ~13px. */

.wifidom-consentimiento {
	align-items: flex-start;
	display: flex;
	font-size: var(--wp--preset--font-size--small);
	gap: var(--wp--preset--spacing--30);
	line-height: 1.5;
	margin-top: var(--wp--preset--spacing--40);
}

.wifidom-consentimiento input[type="checkbox"] {
	accent-color: var(--wp--preset--color--primary);
	flex: 0 0 auto;
	height: 1.5rem;
	margin: 0;
	width: 1.5rem;
}

/* --- 6.7 Riga del bottone
   Il submit e' .wp-element-button, quindi eredita da theme.json. Serve solo
   lo stato "spento", che il JS del plugin usa durante l'invio: e' l'unico
   segnale che qualcosa sta succedendo. */

.wifidom-acciones {
	margin-top: var(--wp--preset--spacing--50);
}

.wifidom-acciones button[disabled] {
	cursor: progress;
	opacity: 0.6;
}

/* --- 6.8 Messaggio d'esito. BLOCCANTE.
   Il <p> viene stampato a ogni rendering, vuoto finche' non c'e' un esito:
   se lo stile gli desse sfondo senza condizione, sotto ogni bottone Enviar
   comparirebbe un rettangolo colorato vuoto. Lo stile sta solo sulle classi
   di stato. */

.wifidom-form-estado {
	margin-top: var(--wp--preset--spacing--40);
}

.wifidom-form-estado:where(.is-ok, .is-error) {
	border-left: var(--wp--custom--border--width-strong) solid;
	border-radius: var(--wp--custom--radius--control);
	font-size: var(--wp--preset--font-size--small);
	padding: var(--wp--preset--spacing--40);
}

.wifidom-form-estado.is-ok {
	background-color: var(--wp--custom--state--success-surface);
	border-left-color: var(--wp--custom--state--success);
	color: var(--wp--custom--state--success);
}

.wifidom-form-estado.is-error {
	background-color: var(--wp--custom--state--error-surface);
	border-left-color: var(--wp--custom--state--error);
	color: var(--wp--custom--state--error);
}

/* --- 6.9 Iscrizione non possibile
   Il plugin manda tutti e tre gli avvisi con .is-error, e "Curso finalizado"
   in rosso comunica un guasto che non c'e'. Non si puo' distinguere lo stato
   dal CSS, ma il contenitore .wifidom-inscripcion-cerrada si', quindi lo
   vestiamo in tono neutro senza toccare il plugin. */

.wifidom-inscripcion-cerrada .wifidom-form-estado.is-error {
	background-color: var(--wp--custom--state--notice-surface);
	border-left-color: var(--wp--custom--state--notice);
	color: var(--wp--custom--state--notice);
}

/* L'hero della home: due colonne asimmetriche e il pannello notizie.

   Il rapporto `1.2fr .8fr` viene dalla bozza e il layout `grid` del core non lo
   esprime: `columnCount` fa solo colonne uguali. Sotto i 1024 il collasso e' quello
   di `wifidom-griglia-2`, cioe' una colonna. */
.wifidom-hero-home-griglia {
	grid-template-columns: 1.2fr 0.8fr;
}

/* Il pannello e' un riquadro sul fondo scuro: si stacca con un bordo a bassa
   opacita', lo stesso token del divisore del footer. */
.wifidom-hero-noticias {
	border: var(--wp--custom--border--width) solid var(--wp--custom--border--on-dark);
	border-radius: var(--wp--custom--radius--card);
	padding: var(--wp--preset--spacing--50);
}

/* Le voci del query loop: una riga per notizia, separate da un filo. */
.wifidom-hero-noticias-lista .wp-block-post-template {
	gap: 0;
}

.wifidom-hero-noticias-lista .wp-block-post-template > li + li {
	border-top: var(--wp--custom--border--width) solid var(--wp--custom--border--on-dark);
	margin-top: var(--wp--preset--spacing--40);
	padding-top: var(--wp--preset--spacing--40);
}

/* ==========================================================================
   6-bis. Gli altri blocchi di wifidom-core, vestiti

   La sezione 6 veste il form. Questi quattro blocchi — calendario, corsi in
   evidenza, fabbricanti, scheda corso — rendevano un markup che NESSUNO vestiva:
   ventuno classi senza una regola, trovate facendo l'inventario in P9. Fra queste
   due sono STILI DI BLOCCO che il plugin stampa e si aspetta dal tema,
   `is-style-wifidom-card` e `is-style-wifidom-tag`: la stessa forma di dipendenza
   dei preset `h-2` e `h-3`, e lo stesso silenzio se manca.

   Non si registrano con `register_block_style()`: il plugin le applica da se', e
   registrarle le offrirebbe anche nell'editor su blocchi qualunque.

   La griglia del plugin ha una convenzione SUA — `wifidom-grid--3` e `--4` —
   diversa dalla nostra `wifidom-griglia-N`. Non si tocca la logica del plugin,
   quindi si aggancia la stessa regola di collasso a entrambi i nomi: un solo
   comportamento, due nomi.
   ========================================================================== */

.wifidom-grid {
	display: grid;
	gap: var(--wp--preset--spacing--50);
	list-style: none;
	margin: 0;
	padding: 0;
}

.wifidom-grid--3 {
	grid-template-columns: repeat(3, minmax(0, 1fr));
}

.wifidom-grid--4 {
	grid-template-columns: repeat(4, minmax(0, 1fr));
}

/* Lo stile di card che il plugin pretende: le stesse scelte di `is-style-card`,
   perche' una card del plugin e una card del tema che si vedono nella stessa
   pagina devono essere la stessa cosa. */
.is-style-wifidom-card {
	background-color: var(--wp--preset--color--base);
	border: var(--wp--custom--border--width) solid var(--wp--preset--color--line);
	border-radius: var(--wp--custom--radius--card);
	padding: var(--wp--preset--spacing--50);
}

.is-style-wifidom-card:hover {
	border-color: var(--wp--preset--color--secondary);
	box-shadow: var(--wp--preset--shadow--card);
}

/* Il tag del tipo di formazione: un chip. Non dichiara un colore di testo per lo
   stesso motivo di `is-style-label` — cosi' funziona anche su fondo scuro. */
.is-style-wifidom-tag {
	background-color: var(--wp--preset--color--surface-tint);
	border-radius: var(--wp--custom--radius--chip);
	display: inline-block;
	font-size: var(--wp--preset--font-size--micro);
	font-weight: 600;
	letter-spacing: 0.1em;
	padding: var(--wp--preset--spacing--10) var(--wp--preset--spacing--30);
	text-transform: uppercase;
}

/* Un tag vuoto non si stampa: senza tipo di formazione il plugin rende il
   paragrafo comunque, e un chip vuoto e' un rettangolo che non dice niente. */
.is-style-wifidom-tag:empty {
	display: none;
}

/* ==========================================================================
   6-quinquies. Il campo di ricerca di `core/search`
   Compare in tre viste di `system-views`: il 404, la ricerca senza risultati e
   l'elenco vuoto. E' l'unico controllo di form che non viene da `wifidom-core`.
   ========================================================================== */

/* Il bordo sta sull'INVOLUCRO, non sull'input: con `button-inside` il core mette
   input e bottone dentro un contenitore, e un bordo per pezzo darebbe due cornici.
   `line-strong` (3.60:1) e non `line` (1.27:1), per SC 1.4.11 — la stessa deviazione
   deliberata dei campi del form. */
.wifidom-ricerca .wp-block-search__inside-wrapper {
	background-color: var(--wp--preset--color--base);
	border: var(--wp--custom--border--width) solid var(--wp--preset--color--line-strong);
	border-radius: var(--wp--custom--radius--control);
	padding: 0;
}

/* IL FUOCO VA SULL'INVOLUCRO, ED E' UNA CORREZIONE OBBLIGATA, non una preferenza.
   Il core dichiara

     :where(.wp-block-search__button-inside .wp-block-search__inside-wrapper)
       .wp-block-search__input:focus { outline: none }

   che pesa 0,2,0 — mentre la regola generale del tema, riga 48, e'
   `:where(a, button, input, …):focus-visible`, e `:where()` contribuisce ZERO alla
   specificita': pesa 0,1,0 e perde. Misurato nel foglio SERVITO il 2026-08-26: l'input
   della ricerca era l'unico elemento tabulabile del sito senza indicatore di fuoco,
   `outline: 3px none`. Il core toglie l'anello all'input perche' si aspetta che lo
   disegni l'involucro: qui glielo si disegna. Trappola 5, e trappola 11 — l'anello su
   un ANTENATO e' un indicatore valido per SC 2.4.7, e `percorsoTastiera()` risale. */
.wifidom-ricerca .wp-block-search__inside-wrapper:focus-within {
	border-color: var(--wp--preset--color--primary);
	box-shadow: var(--wp--custom--focus--halo);
	outline: var(--wp--custom--focus--width) solid var(--wp--preset--color--primary);
	outline-offset: var(--wp--custom--focus--offset);
}

.wifidom-ricerca .wp-block-search__input {
	background-color: transparent;
	border: 0;
	color: var(--wp--preset--color--contrast);
	font-family: inherit;
	font-size: var(--wp--preset--font-size--body);
	padding: var(--wp--preset--spacing--30) var(--wp--preset--spacing--40);
}

/* ==========================================================================
   6-bis. La scheda del fabbricante — `single-wifidom_fabricante`
   Tre regole, e tutte e tre esistono per la stessa ragione: un binding puo'
   riempire un attributo, non puo' TOGLIERE un blocco. Quando il dato manca il
   blocco esce comunque, e a farlo sparire e' il CSS.
   ========================================================================== */

/* Il logo non e' un'immagine di copertina: sta alla sua altezza naturale e non
   allarga niente. Stesso motivo della regola su `.wifidom-fabricante-logo`. */
.wifidom-ficha-fabricante-logo img {
	height: auto;
	max-height: var(--wp--preset--spacing--100);
	max-width: 100%;
	object-fit: contain;
	width: auto;
}

/* ==========================================================================
   6-quater. Il dettaglio del corso — `single-wifidom_curso`
   ========================================================================== */

/* Il collasso lo porta `wifidom-griglia-2` (2 -> 1 a 1024, tabella dell'audit §7):
   qui si dichiara solo il RAPPORTO, come fa `wifidom-hero-home-griglia`. `minmax(0, …)`
   e non `2fr 1fr` per la ragione misurata in C2: `fr` non scende sotto il min-content,
   e un'immagine nel contenuto terrebbe aperta la colonna. */
.wifidom-detalle-curso-griglia {
	grid-template-columns: minmax(0, 2fr) minmax(0, 1fr);
}

/* L'aside sticky. I blocchi core non espongono `position: sticky` se non per l'header
   di primo livello — audit §3 — quindi la regola sta qui.

   `align-self: start` NON E' OPZIONALE: senza, l'elemento della griglia si stira
   all'altezza della riga, non gli resta spazio per scorrere, e sticky non ha alcun
   effetto senza produrre nessun errore.

   Il `top` e' derivato, non i 96px della bozza: altezza dell'header piu' il suo bordo
   piu' una spaziatura del sistema. Se l'header cambia altezza, l'aside la segue. */
.wifidom-detalle-curso-aside {
	align-self: start;
	position: sticky;
	top: calc(
		var(--wp--custom--header--height) + var(--wp--custom--border--width) +
			var(--wp--preset--spacing--50)
	);
}

/* ==========================================================================
   6-ter. L'hero della scheda corso — `single-wifidom_curso`
   Stessa ragione delle regole qui sopra: un binding riempie un attributo, non
   toglie un blocco. Qui il blocco da togliere e' una COPPIA — etichetta piu'
   valore — e l'etichetta non e' mai vuota: senza questa regola un corso senza
   luogo mostrerebbe «Lugar» e nient'altro.
   ========================================================================== */

.wifidom-hero-curso-dato:has(.wifidom-hero-curso-valore:empty) {
	display: none;
}

/* E se nessuno dei tre dati ha un valore, il contenitore si chiude con loro. */
.wifidom-hero-curso-dati:not(:has(.wifidom-hero-curso-valore:not(:empty))) {
	display: none;
}

/* I badge dell'hero stanno su fondo scuro: il chip prende il suo fondo dal token
   chiaro, che li' sparirebbe. `wifidom-negativo` non arriva a `is-style-wifidom-tag`
   perche' quella regola dichiara gia' il proprio `background-color`. */
.wifidom-hero-curso .is-style-wifidom-tag {
	background-color: var(--wp--preset--color--primary);
	color: var(--wp--preset--color--on-dark);
}

/* Un bottone il cui URL viene da un meta ASSENTE esce con `href=""`, cioe' un link
   alla pagina corrente: misurato il 2026-08-26 su Marca Epsilon. Un link che non
   porta da nessuna parte e' anche una tappa di tabulazione che non fa niente, quindi
   si toglie dal flusso e dall'albero di accessibilita' insieme. */
.wifidom-ficha-fabricante-enlaces .wp-block-button__link[href=""],
.wifidom-ficha-fabricante-enlaces .wp-block-button__link:not([href]) {
	display: none;
}

/* E se nessuno dei due bottoni ha un URL, resta un contenitore flex vuoto che si
   porta dietro il proprio spazio. `:not(:has(…))` lo chiude. */
.wifidom-ficha-fabricante-enlaces:not(:has(.wp-block-button__link[href]:not([href=""]))) {
	display: none;
}

.wifidom-curso-meta {
	color: var(--wp--preset--color--muted);
	font-size: var(--wp--preset--font-size--small);
}

/* Il calendario: una riga per corso, data a sinistra. */
.wifidom-calendario-mes + .wifidom-calendario-mes {
	margin-top: var(--wp--preset--spacing--70);
}

.wifidom-calendario-lista {
	list-style: none;
	margin: var(--wp--preset--spacing--40) 0 0;
	padding: 0;
}

.wifidom-calendario-fila {
	align-items: baseline;
	border-top: var(--wp--custom--border--width) solid var(--wp--preset--color--line);
	display: flex;
	gap: var(--wp--preset--spacing--50);
	padding: var(--wp--preset--spacing--40) 0;
}

/* La data e' una colonna fissa: incolonnata, si legge come un calendario. */
.wifidom-calendario-fecha {
	color: var(--wp--preset--color--primary);
	flex: 0 0 auto;
	font-size: var(--wp--preset--font-size--small);
	font-weight: 600;
	min-width: var(--wp--preset--spacing--90);
	text-transform: uppercase;
}

.wifidom-calendario-titulo {
	display: block;
}

.wifidom-calendario-meta {
	color: var(--wp--preset--color--muted);
	display: block;
	font-size: var(--wp--preset--font-size--small);
	margin-top: var(--wp--preset--spacing--10);
}

/* I fabbricanti: `design.md` §8 vuole un contenitore di altezza fissa con il logo
   centrato e mai ritagliato. Finche' i loghi non ci sono il blocco rende il NOME,
   e il contenitore vale ugualmente: e' quello che tiene la fila allineata. */
.wifidom-fabricante {
	display: flex;
}

.wifidom-fabricante-enlace {
	align-items: center;
	background-color: var(--wp--preset--color--base);
	border: var(--wp--custom--border--width) solid var(--wp--preset--color--line);
	border-radius: var(--wp--custom--radius--control);
	display: flex;
	justify-content: center;
	min-height: var(--wp--preset--spacing--80);
	padding: var(--wp--preset--spacing--30);
	text-align: center;
	width: 100%;
}

.wifidom-fabricante-enlace:hover {
	border-color: var(--wp--preset--color--secondary);
}

/* Il logo e il nome si INCOLONNANO: con `display: flex` e nessuna direzione stavano
   affiancati, che non e' la card di nessuna bozza. Non si vedeva finche' nessun
   marchio aveva un'immagine in evidenza — cioe' fino alle fixture di C2. */
.wifidom-fabricante-enlace {
	flex-direction: column;
	gap: var(--wp--preset--spacing--20);
}

/* L'immagine non deve allargare la traccia della griglia. `1fr` e' `minmax(auto, 1fr)`
   e `auto` non scende sotto il min-content: senza `max-width`, un logo da 300px
   teneva aperte quattro colonne su un viewport da 1200 e la pagina sfondava di 412px.
   Misurato il 2026-08-26, e invisibile prima perche' il logo non esisteva. */
.wifidom-fabricante-logo {
	height: auto;
	max-height: var(--wp--preset--spacing--80);
	max-width: 100%;
	object-fit: contain;
	width: auto;
}

.wifidom-fabricante-nombre {
	font-size: var(--wp--preset--font-size--small);
	font-weight: 600;
}

/* La sezione «marchi associati» delle pagine di area E' il blocco del plugin, senza
   un gruppo che lo avvolga — ed e' voluto: se il titolo stesse in un `core/heading`
   del pattern sopravviverebbe al blocco, e su una pagina senza area resterebbe
   un'intestazione che introduce il vuoto. Il blocco esce prima di stampare il
   proprio titolo, quindi la sezione sparisce per intero.

   Conseguenza: l'allineamento lo deve fare questa regola, perche' non c'e' un
   layout `constrained` che lo faccia. Full-bleed con il padding di root, e i figli
   incolonnati a `contentSize`: e' quello che `has-global-padding` fa per gli altri. */
.wifidom-sezione-marcas {
	padding-block: var(--wp--preset--spacing--100);
	padding-inline: var(--wp--custom--padding--x);
}

.wifidom-sezione-marcas > * {
	margin-inline: auto;
	max-width: var(--wp--style--global--content-size);
}

/* La scheda dati di `wifidom/ficha-curso`, vestita in C10.
   P9 la lasciava scoperta di proposito: e' il dettaglio del corso, cioe'
   `single-wifidom_curso`, che appartiene a `cpt-views`.

   E' l'unico blocco del plugin che il tema veste da zero: gli altri tre portano gia'
   una classe sorella che li copre — `is-style-wifidom-card` sulla card di un corso,
   `wifidom-grid--3` e `--4` sulle due liste. Misurato in C10 sul foglio SERVITO, non
   dedotto dai nomi: sette classi su undici non hanno una regola propria e non devono
   averla. L'elenco di chi copre chi e' nella regola J di `check-i18n.php`. */
.wifidom-ficha {
	background-color: var(--wp--preset--color--surface);
	border: var(--wp--custom--border--width) solid var(--wp--preset--color--line);
	border-radius: var(--wp--custom--radius--card);
	padding: var(--wp--preset--spacing--50);
}

.wifidom-ficha-lista {
	margin: 0;
}

/* Etichetta a sinistra, valore a destra, e un divisore fra le righe ma non sopra la
   prima. Il `<dd>` porta un margine sinistro di 40px dal foglio del browser: senza
   azzerarlo il valore non arriva mai al bordo destro. */
.wifidom-ficha-fila {
	align-items: baseline;
	border-top: var(--wp--custom--border--width) solid var(--wp--preset--color--line);
	display: flex;
	gap: var(--wp--preset--spacing--30);
	justify-content: space-between;
	padding-block: var(--wp--preset--spacing--30);
}

.wifidom-ficha-fila:first-child {
	border-top: 0;
	padding-top: 0;
}

.wifidom-ficha-fila dt {
	color: var(--wp--preset--color--muted);
	font-size: var(--wp--preset--font-size--small);
}

.wifidom-ficha-fila dd {
	font-weight: 600;
	margin: 0;
	text-align: right;
}

.wifidom-ficha-nota {
	color: var(--wp--preset--color--muted);
	font-size: var(--wp--preset--font-size--small);
	margin-block: var(--wp--preset--spacing--30) 0;
}

/* ==========================================================================
   6-sexies. La tira di loghi che scorre
   Sostituisce la griglia statica il 2026-08-27. Zero JavaScript: `transform` piu'
   `@keyframes`, animato sul compositore.
   ========================================================================== */

/* Il taglio, e la ragione per cui la tira esce dal contenitore: una fila che scorre
   dentro 1200px sembra una casella, non un flusso — i loghi devono entrare e uscire
   dai bordi della finestra.

   L'uscita la fa `align: full` sul blocco, non un margine negativo scritto qui: con
   `useRootPaddingAwareAlignments` il core sa gia' quanto togliere, e un margine mio
   si sarebbe sommato al suo. Provato: con il margine negativo il taglio restava a
   1200, perche' il layout `constrained` del genitore rimette `margin-inline: auto`.

   `overflow: hidden` e' anche cio' che impedisce alla pista — larga 2216px — di
   allargare la pagina. */
.wifidom-marquee {
	overflow: hidden;
}

/* La pista NON dichiara `display`. Il layout flex glielo da' il core dagli attributi
   del blocco, e una regola del tema su una classe sola perderebbe comunque contro
   `body .is-layout-flex`, che pesa 0,1,1 — la trappola 5, pagata in S3.
   Qui si aggiunge solo cio' che il core non tocca: la larghezza e l'animazione. */
.wifidom-marquee-pista {
	width: max-content;
}

.wifidom-marquee-logo img {
	height: var(--wp--preset--spacing--70);
	max-width: none;
	width: auto;
}

/* Il 50% e' esatto perche' la pista contiene la sequenza DUE volte: a meta' corsa il
   fotogramma coincide con quello di partenza, e la giuntura non esiste. */
@keyframes wifidom-scorri {
	to {
		transform: translateX(-50%);
	}
}

/* ==========================================================================
   7. Movimento
   design.md §9: nessuna animazione legata allo scroll. Le transizioni su
   hover e focus rispettano prefers-reduced-motion.
   ========================================================================== */

@media (prefers-reduced-motion: no-preference) {

	/* Lo scorrimento della tira loghi sta QUI, non fuori: cosi' chi ha chiesto meno
	   movimento non lo riceve affatto, invece di riceverlo e vederselo fermare.
	   La durata e' proporzionata a dodici loghi: lenta abbastanza da leggerli. */
	.wifidom-marquee-pista {
		animation: wifidom-scorri 40s linear infinite;
	}

	/* 🔴 IL FERMO IN HOVER NON SODDISFA WCAG 2.2.2, ed e' una deviazione DICHIARATA,
	   non una dimenticanza. Il criterio (Livello A) chiede un MECCANISMO per fermare
	   cio' che si muove da solo oltre i 5 secondi: l'hover copre il mouse, non la
	   tastiera ne' il tocco. Decisione del committente il 2026-08-27, presa sapendolo.

	   `:focus-within` e' l'aggiunta che non costa nulla: chi tabula dentro i loghi lo
	   ferma. Non e' un meccanismo ai sensi del criterio — non c'e' un comando da
	   trovare — ma e' meglio del solo hover, e per un utente da tastiera cambia. */
	.wifidom-marquee:hover .wifidom-marquee-pista,
	.wifidom-marquee:focus-within .wifidom-marquee-pista {
		animation-play-state: paused;
	}

	.wp-element-button,
	.is-style-card,
	.is-style-wifidom-card,
	.wifidom-fabricante-enlace,
	.wifidom-persona,
	.wifidom-campo :where(input, select, textarea) {
		transition:
			background-color var(--wp--custom--transition--fast),
			border-color var(--wp--custom--transition--fast),
			box-shadow var(--wp--custom--transition--fast),
			color var(--wp--custom--transition--fast);
	}

	/* La comparsa della CTA: 300ms, `design.md` §9. */
	.wifidom-card-foto-cta {
		transition: opacity var(--wp--custom--transition--medium);
	}

	/*
	 * Lo zoom dell'immagine: 550ms, `design.md` §9, che e' esattamente
	 * `transition--slow`. Il bersaglio e' l'immagine di fondo del cover, che
	 * ESISTE SOLO QUANDO C'E' UNA FOTO: oggi le bozze non ne hanno nessuna,
	 * quindi questa regola non e' verificabile — ed e' dichiarata come tale nel
	 * task P7, non lasciata a sembrare verificata.
	 */
	.wifidom-card-foto .wp-block-cover__image-background {
		transition: transform var(--wp--custom--transition--slow);
	}

	.wifidom-card-foto:hover .wp-block-cover__image-background {
		transform: scale( 1.04 );
	}
}

@media (prefers-reduced-motion: reduce) {

	/* Senza movimento la pista e' una fila ferma: si manda a capo e si centra, o meta'
	   dei loghi resterebbe fuori dal taglio. E la COPIA sparisce, o si leggerebbero
	   sei marchi due volte. */
	.wifidom-marquee-pista {
		flex-wrap: wrap;
		justify-content: center;
		width: auto;
	}

	.wifidom-marquee-gruppo.is-copia {
		display: none;
	}
}

/* ==========================================================================
   8. Footer
   Il layout grid del core da' 4 colonne uguali; il design vuole la prima piu'
   larga, e un collasso 4 → 2 → 1 che il core non esprime. Tre regole.
   ========================================================================== */

.wifidom-footer-colonne {
	border-bottom: var(--wp--custom--border--width) solid var(--wp--custom--border--on-dark);
	grid-template-columns: 1.5fr 1fr 1fr 1fr;
}

@media (max-width: 1024px) {
	.wifidom-footer-colonne {
		grid-template-columns: 1fr 1fr;
	}
}

@media (max-width: 680px) {
	.wifidom-footer-colonne {
		grid-template-columns: 1fr;
	}
}

/* Gli elenchi del footer sono navigazione, non prosa: via i punti e il rientro. */
.wifidom-footer-elenco {
	list-style: none;
	padding-left: 0;
}

/* I link del footer non hanno una regola propria: la copre quella generale delle
   sezioni in negativo (sezione 3), perche' il footer e' `has-contrast-background-color`.
   Le due regole che stavano qui erano identiche a quelle, ed e' stato P3 a
   generalizzarle - una regola per pattern sarebbe diventata diciannove regole. */

/* ==========================================================================
   9. Header
   Sticky e solido sempre — design.md §6: non trasparente sopra l'hero, che e'
   la richiesta che trasformerebbe un template part in due.
   L'altezza e' imposta dal token, non lasciata al contenuto: e' lo stesso valore
   che serve allo scroll-margin-top delle ancore, e se le due cose divergono il
   campo che riceve il fuoco dopo un errore finisce sotto l'header.
   ========================================================================== */

/* Il logo del sito sta DENTRO l'altezza dell'header, qualunque file venga caricato.
   L'altezza dell'header e' un token e non il contenuto — la sticky, lo `scroll-margin-top`
   e il `top` dell'aside della scheda corso la usano — quindi un logo alto la spingerebbe
   fuori misura e tre cose si muoverebbero insieme.

   Sostituisce `core/site-title` dal 2026-08-27, per decisione del committente: il
   marchio e' un'immagine, non il nome del sito scritto. */
.wifidom-header .wp-block-site-logo img {
	/* ALTEZZA DEFINITA, non `auto` con un tetto. Il logo del sito e' un SVG, e un SVG
	   senza `width`/`height` intrinseci — WordPress non sa leggerli da un SVG, quindi
	   i metadati dell'allegato sono vuoti — con `height: auto` e `width: auto`
	   collassa a ZERO. Misurato il 2026-08-27: 0x0, e nell'HTML sembrava tutto a
	   posto. Con un'altezza definita e la larghezza automatica, il `viewBox` fa il
	   resto e qualunque proporzione entra. */
	height: calc(var(--wp--custom--header--height) - var(--wp--preset--spacing--30));
	max-width: 100%;
	width: auto;
}

.wifidom-header {
	border-bottom: var(--wp--custom--border--width) solid var(--wp--preset--color--line);
}

/* LO STICKY VA SULL'INVOLUCRO DEL TEMPLATE PART, NON SU `.wifidom-header`.
   Un elemento `sticky` si muove dentro il proprio GENITORE, e il genitore di
   `.wifidom-header` e' il `<header class="wp-block-template-part">`, alto esattamente
   quanto l'header: 73px. Nessuno spazio per scorrere, quindi l'header se ne andava
   con la pagina — e non c'era nessun errore, solo un header che non si fermava.

   Misurato il 2026-08-27: a `scrollY` 600 l'header stava a `top: -600`. Valeva anche
   PRIMA di togliere il tag annidato: verificato ripristinando il codice di allora.
   `design.md` §6 chiede «sticky e solido sempre» dal principio, e non lo e' MAI STATO.
   Nessuna verifica lo guardava — si misurava che l'header esistesse, non che restasse.

   L'involucro invece e' figlio diretto di `.wp-site-blocks`, quindi il suo genitore e'
   la pagina intera: li' lo spazio per scorrere c'e'. Si usa il tag e non una classe
   perche' e' WordPress a generare quell'elemento, e non gli si puo' dare una classe
   dal template. */
.wp-site-blocks > header {
	position: sticky;
	top: 0;
	z-index: 50;
}

.wifidom-header > .wp-block-group {
	align-items: center;
	min-height: var(--wp--custom--header--height);
}

/* La voce di menu della pagina corrente. Il bordo inferiore non e' decorativo:
   e' il secondo segnale che WCAG 1.4.1 chiede, perche' il colore da solo non basta. */
.wifidom-nav .wp-block-navigation-item.current-menu-item > a,
.wifidom-nav .wp-block-navigation-item.current-menu-ancestor > a {
	border-bottom: var(--wp--custom--border--width-strong) solid var(--wp--preset--color--primary);
	color: var(--wp--preset--color--primary);
	font-weight: 600;
}

/* Il selettore di lingua e' un <ul>, e la classe sta SULL'ul: il blocco di
   Polylang non lo avvolge in un contenitore. Senza azzerarne i margini, l'elenco
   conserva il `margin: 1em 0` di default del browser e l'header cresce di 7px
   oltre il token — trovato misurando, non leggendo. */
ul.wifidom-lingue {
	display: flex;
	gap: var(--wp--preset--spacing--30);
	list-style: none;
	margin: 0;
	padding: 0;
}

.wifidom-lingue a {
	font-size: var(--wp--preset--font-size--small);
	font-weight: 600;
}

/* La lingua non corrente e' attenuata: senza, entrambe ereditano il primario da
   styles.elements.link e non si distingue quale sia attiva. */
.wifidom-lingue a {
	color: var(--wp--preset--color--muted);
}

.wifidom-lingue .current-lang a {
	color: var(--wp--preset--color--primary);
}

.wifidom-lingue a:hover {
	color: var(--wp--preset--color--secondary-strong);
}

/* Sotto i 680px la CTA sparisce: design.md, ed e' la sola voce che si puo'
   togliere senza perdere una funzione — il contatto resta nel menu overlay.

   IL SELETTORE E' DOPPIO PER FORZA, non per abitudine. WordPress emette negli
   stili globali `body .is-layout-flex { display: flex }`, che ha specificita'
   0,1,1: batte `.wifidom-header-cta` (0,1,0), e la regola scritta in S3 non ha
   mai avuto effetto. Il difetto e' rimasto invisibile perche' `index.html` non
   includeva i due template part, quindi la verifica dello sfondamento a 390px
   girava su una pagina senza header. Misurato il 2026-08-25: a 390px l'header
   sfondava di 33px, e il colpevole era questa CTA.

   Con `.wifidom-header-azioni .wifidom-header-cta` si sta a 0,2,0 e si vince
   senza `!important` e senza toccare classi interne del core. */
@media (max-width: 680px) {
	.wifidom-header-azioni .wifidom-header-cta {
		display: none;
	}
}

/* I segnaposto delle IMMAGINI. Le bozze non contengono un solo `<img>`: la foto
   e' contenuto sostituibile (`data-content` la elenca), e finche' non arriva il
   segnaposto tiene la proporzione, che e' cio' che regge il layout.

   La proporzione la decide il TEMA e non l'editore: `dimensions.aspectRatio` e'
   `false` in theme.json, deliberatamente. `design.md` §8 dichiara 4:3 per l'hero
   media & text e 16:9 per le card settore; il **4:5 dei ritratti** e'
   l'integrazione decisa in `pages`, perche' §8 non parlava di persone — ed e' la
   proporzione che tutte e otto le occorrenze delle bozze usano.

   Il fondo e' `surface`, che in normalizzazione ha assorbito il `#eef2f4` dei
   segnaposto (11 occorrenze). */
.wifidom-media {
	background-color: var(--wp--preset--color--surface);
	border-radius: var(--wp--custom--radius--card);
	/* Serve al cover fotografico: il velo e' un figlio in posizione assoluta, e
	   senza questo esce dagli angoli arrotondati. */
	overflow: hidden;
}

.wifidom-media--4-3 {
	aspect-ratio: 4 / 3;
}

/* La foto come `core/image` — i pattern del vocabolario, `blocco_segnaposto()` in
   functions.php. La proporzione la porta l'immagine stessa (`aspectRatio` del blocco,
   con `object-fit: cover`), quindi qui servono solo la larghezza piena — una foto
   piu' piccola della colonna non deve restare a meta' — e il margine a zero, che il
   core da' alle `figure`. Gli angoli e il fondo vengono da `.wifidom-media`. */
.wp-block-image.wifidom-media {
	margin: 0;
}

.wp-block-image.wifidom-media img {
	width: 100%;
}

.wifidom-media--4-5 {
	aspect-ratio: 4 / 5;
}

.wifidom-media--16-9 {
	aspect-ratio: 16 / 9;
}

/* La card persona: come `is-style-card`, ma SENZA padding, perche' la foto sta a
   filo del bordo e `overflow: hidden` la ritaglia sul raggio. Con `is-style-card`
   la foto sarebbe rientrata di 24px.
   L'hover porta l'ombra e non il `translateY(-4px)` della bozza: `design.md` §5
   dichiara «hover -> box-shadow o bordo secondary», e uno spostamento non e' fra
   le due. Deviazione dichiarata. */
.wifidom-persona {
	border: var(--wp--custom--border--width) solid var(--wp--preset--color--line);
	border-radius: var(--wp--custom--radius--card);
	overflow: hidden;
}

.wifidom-persona:hover {
	box-shadow: var(--wp--preset--shadow--card);
}

/* Il LinkedIn della persona, sotto il ruolo.

   ESISTE PERCHE' IL CORE DIPINGE IL MARCHIO. `is-style-logos-only` toglie la
   pastiglia colorata, ma non il colore dell'icona: resta
   `:where(.wp-block-social-links.is-style-logos-only) .wp-social-link-linkedin
   { color: #0d66c2 }`, e nella scheda entrava il blu di LinkedIn — un colore che
   il design system non ha. Misurato in pagina, non dedotto dal foglio.

   Vince senza `!important`: quella regola pesa 0,1,0, perche' `:where()` non
   contribuisce, e questa pesa 0,2,0.

   Il colore e' `primary` perche' l'icona E' un link, e l'hover e' quello che
   `theme.json` da' a tutti i link. Non e' il `secondary-strong` dell'etichetta
   che stava qui prima: quella era testo, questo e' un'azione. */
.wifidom-social-persona .wp-social-link {
	color: var(--wp--preset--color--primary);
}

.wifidom-social-persona .wp-social-link:hover {
	color: var(--wp--preset--color--secondary-strong);
}

/* ==========================================================================
   La card fotografica di `grid-tecnologias` e `grid-sectores`.

   Nelle bozze la card INTERA e' un `<a href>` e la CTA e' uno `<span>`
   decorativo. Con i blocchi core un `<a>` non puo' avvolgere un `core/cover`, e
   il link e' quello del TITOLO: una sola tappa di tabulazione, e il nome
   accessibile e' il titolo — non «Ver tecnología →», che su dieci card sarebbe
   dieci volte lo stesso nome.

   LA CARD INTERA NON E' CLICCABILE, ed e' una deviazione dichiarata. La tecnica
   dello `::after` steso non funziona qui: `inset: 0` si risolve contro il
   CONTENITORE INTERNO del cover, che e' `position: relative` e alto solo quanto
   il testo — misurato, 558x171 su una card di 588x441. Farlo arrivare ai bordi
   costa o un numero magico ritagliato da `overflow: hidden`, o togliere il
   posizionamento al contenitore interno, che manderebbe il testo DIETRO il velo.
   Il bersaglio resta il titolo, 356x31: molto oltre i 24x24 di WCAG 2.5.8.
   ========================================================================== */

.wifidom-card-foto {
	/*
	 * `min-height: 0` NON e' una precauzione: e' la correzione di un difetto
	 * misurato. Il core mette su `.wp-block-cover` un `min-height: 430px`, e
	 * combinato con una `aspect-ratio` il browser calcola la LARGHEZZA
	 * dall'altezza: 430 x 4/3 = 573px. A viewport 390 le card erano larghe 573 e il
	 * documento 784, cioe' il doppio dello schermo.
	 */
	min-height: 0;
	position: relative;
}

/* Il fuoco si vede sulla CARD, non sulle due righe del titolo.

   L'anello e' `primary` e NON `base`: viene disegnato FUORI dalla card, cioe' sul
   fondo chiaro della sezione, dove il bianco sarebbe invisibile. Primo tentativo
   sbagliato, trovato misurando: `outlineColor` era bianco su una sezione bianca.

   E l'anello del link interno si spegne, perche' due anelli concentrici su un
   bersaglio solo sono rumore: quello della card e' garantito da questa regola. */
.wifidom-card-foto:focus-within {
	outline: var(--wp--custom--focus--width) solid var(--wp--preset--color--primary);
	outline-offset: var(--wp--custom--focus--offset);
}

.wifidom-card-foto a:focus-visible {
	outline: none;
}

/* La CTA decorativa compare in hover — `design.md` §9 — e ANCHE nel fuoco da
   tastiera: senza la seconda riga chi tabula non vedrebbe l'affordance che vede
   chi usa il mouse. L'opacita' e' uno STATO e sta fuori dalla media query del
   movimento: con `prefers-reduced-motion` la CTA compare, solo senza dissolvenza. */
.wifidom-card-foto-cta {
	opacity: 0;
}

.wifidom-card-foto:hover .wifidom-card-foto-cta,
.wifidom-card-foto:focus-within .wifidom-card-foto-cta {
	opacity: 1;
}

/* Il segnaposto dell'icona nelle card servizio. Le bozze non contengono un solo
   <img>, quindi l'icona e' un quadrato a fondo tenue che tiene il posto: e'
   contenuto sostituibile, e `data-content` la elenca.
   Misura 56px (`spacing|80`) contro i 52 del disegno — dentro la banda dichiarata
   in normalizzazione-token.md — e usa il raggio `card`, che in normalizzazione ha
   assorbito i 12px del disegno (80 occorrenze). */
.wifidom-icona {
	aspect-ratio: 1;
	border-radius: var(--wp--custom--radius--card);
	width: var(--wp--preset--spacing--80);
}

/* L'icona dentro il riquadro, dal 2026-08-31.

   MISURA DEFINITA E NON `auto`, ed e' la ragione per cui questa regola esiste:
   WordPress non sa leggere `width`/`height` da un SVG — `wp_getimagesize()` non lo
   apre — quindi i metadati dell'allegato restano vuoti, l'`<img>` non riceve
   nessun attributo di dimensione, e con `width: auto` l'immagine collassa a ZERO
   restando invisibile mentre nell'HTML sembra tutto a posto. E' la stessa trappola
   gia' pagata sul logo del sito il 2026-08-27, annotata nel blocco 9.

   Il `figure` di `core/image` porta un margine proprio: azzerarlo qui evita che
   scentri l'icona nel riquadro, che e' un contenitore flex di 56px esatti. */
.wifidom-icona figure {
	margin: 0;
}

.wifidom-icona img {
	height: var(--wp--preset--spacing--50);
	width: var(--wp--preset--spacing--50);
}

/* ==========================================================================
   9-bis. Il collasso delle griglie — la tabella misurata dell'audit §7

   Due cose che non si possono esprimere altrove: `theme.json` non conosce i
   breakpoint, e il layout `grid` del core non conosce il collasso. Le colonne di
   PARTENZA le dichiara il blocco (`columnCount`); qui si dichiara soltanto dove
   cambiano.

   Le classi sono l'aggancio, come i `data-grid-*` delle bozze. Una classe singola
   basta: verificato dal footer, che con `.wifidom-footer-colonne` (0,1,0) vince
   sulla regola generata dal blocco — `style.css` viene dopo nell'ordine.

   ATTENZIONE alla fonte: `design.md` §1 dice «3 col → 1 col (≤680)», ed e'
   SBAGLIATO. Tutte le bozze collassano le tre colonne a **1024**, e l'audit §7 lo
   misura e raccomanda 1024 — tre card affiancate sotto quella soglia sono troppo
   strette per testo tecnico. D4 accetta §7 come fonte.

   Test di regressione: `tools/browser/verifica-layout.mjs`, che asserisce questa
   stessa tabella misurando `grid-template-columns` calcolato.
   ========================================================================== */

@media (max-width: 1024px) {

	/* 2 e 3 colonne vanno direttamente a una. */
	.wifidom-griglia-2,
	.wifidom-griglia-3,
	.wifidom-grid--3 {
		grid-template-columns: minmax(0, 1fr);
	}

	/* 4 passa per 2. `wifidom-grid--4` e' il nome che usa il plugin. */
	.wifidom-griglia-4,
	.wifidom-grid--4 {
		grid-template-columns: repeat(2, minmax(0, 1fr));
	}

	/* A una colonna l'aside sta SOTTO il contenuto — tabella dell'audit §7 — e uno
	   sticky in una colonna sola incollerebbe un riquadro sopra ciò che si legge. */
	.wifidom-detalle-curso-aside {
		position: static;
	}

	/* La tira loghi ha una scala sua: 6 → 3 → 2. Usata dal modulo `pages`, P9. */
	.wifidom-loghi {
		grid-template-columns: repeat(3, 1fr);
	}
}

/* LA FAQ — `bloque-faq`, modulo `vocabolario`. `<details>` del browser, quindi
   tastiera e stato annunciato vengono gratis; qui solo la forma. Il marcatore nativo
   si toglie e lo sostituisce un + / − a destra, con `content: … / ""` perche' lo
   screen reader non legga «piu'» prima di ogni domanda: lo stato aperto/chiuso lo
   annuncia gia' il `<details>`. */
.wifidom-faq > .wp-block-details {
	border-bottom: var(--wp--custom--border--width) solid var(--wp--preset--color--line);
	margin: 0;
	padding-block: var(--wp--preset--spacing--40);
}

.wifidom-faq > .wp-block-details:first-child {
	border-top: var(--wp--custom--border--width) solid var(--wp--preset--color--line);
}

.wifidom-faq summary {
	cursor: pointer;
	display: flex;
	font-size: var(--wp--preset--font-size--h-3);
	font-weight: 600;
	gap: var(--wp--preset--spacing--40);
	justify-content: space-between;
	list-style: none;
}

.wifidom-faq summary::-webkit-details-marker {
	display: none;
}

.wifidom-faq summary::after {
	color: var(--wp--preset--color--secondary-strong);
	content: "+" / "";
	flex-shrink: 0;
}

.wifidom-faq details[open] > summary::after {
	content: "\2212" / "";
}

.is-style-scuro .wifidom-faq summary::after {
	color: var(--wp--preset--color--accent-light);
}

.wifidom-faq > .wp-block-details > p {
	margin-block-start: var(--wp--preset--spacing--30);
}

/* L'INVERSIONE, modulo `vocabolario` D3: l'immagine passa a sinistra. Solo sopra
   i 1024, cioe' finche' la griglia ha due colonne. Sotto, l'ordine torna quello
   del DOM — testo sopra, immagine sotto — per TUTTE le sezioni testo+immagine,
   invertite o no: chi scorre su un telefono non deve vedere l'ordine alternarsi
   senza una ragione. E l'ordine del DOM e' quello in cui legge uno screen reader,
   quindi resta lo stesso in ogni caso: cambia solo dove sta l'immagine. */
@media (min-width: 1025px) {

	.wp-block-group.is-style-invertito > :first-child {
		order: 2;
	}
}

@media (max-width: 680px) {

	.wifidom-griglia-4,
	.wifidom-grid--4 {
		grid-template-columns: minmax(0, 1fr);
	}

	.wifidom-loghi {
		grid-template-columns: repeat(2, 1fr);
	}
}

/* ==========================================================================
   10. Il breakpoint del menu — ECCEZIONE DICHIARATA
       (1200px dal 2026-09-01, era 1024: vedi la nota sulla @media qui sotto)
   Vedi docs/decisions/0002-breakpoint-del-menu.md.

   core/navigation commuta l'overlay a `@media (min-width: 600px)`. design.md §6
   chiede 1024px, e non e' un capriccio: a 768px l'header ha sei voci piu' il
   selettore di lingua piu' la CTA, e in portoghese quelle etichette occupano il
   20-30% in piu'.

   Qui si RIAPPLICA nella banda 600-1024px il comportamento che il core da' sotto
   i 600px, invertendo le sue due regole. Sono le uniche righe del tema che
   dipendono dall'implementazione interna di un blocco core: se un aggiornamento
   di WordPress cambia l'overlay, si rompono queste e nient'altro.

   Test di regressione: tools/browser/verifica-menu.mjs, a ogni aggiornamento
   maggiore di WordPress.
   ========================================================================== */

/* 1200px DAL 2026-09-01, ed era 1024. Il numero non e' scelto: e' misurato.

   La nav ha 704px dentro un header il cui contenuto e' vincolato a 1200, e le cinque
   voci con la spaziatura a 24px ne chiedono 572. Sotto i 1280 pero' il contenuto si
   stringe con la finestra, e lo spazio per la nav con lui: la soglia in cui tutto sta
   su UNA riga cade a **1150px**.

   A 1024 la fascia 1025-1149 mostrava la navigazione orizzontale con «Contacto»
   andato a capo e l'header alto 74px invece di 72. Non era una regressione del
   2026-09-01: con le sei voci di prima la soglia stava a 1216, quindi la fascia rotta
   era anche piu' larga e nessuno l'aveva misurata — `verifica-menu.mjs` controllava
   se la nav fosse VISIBILE, non se stesse su una riga.

   1200 e non 1150: cinquanta pixel di margine perche' `design.md` §6 e ADR 0002
   chiedono entrambi di non progettare navigazioni che stanno in larghezza per un
   pelo, e il portoghese e' piu' lungo dello spagnolo. Ed e' un numero che in questo
   tema significa gia' qualcosa — `contentSize`. */
@media (max-width: 1200px) {

	/* Il contenitore orizzontale torna nascosto, come sotto i 600px. */
	.wifidom-nav .wp-block-navigation__responsive-container:not(.is-menu-open) {
		display: none;
	}

	/* E il bottone che lo apre torna visibile. */
	.wifidom-nav .wp-block-navigation__responsive-container-open {
		display: flex;
	}
}

/* ==========================================================================
   11. La tela dell'editor rende come il front end — SOLO PAGINE

   Il problema, misurato: su una tela da 1640px le sezioni di una pagina stanno a
   [220..1420], cioe' 1200px centrati, mentre sul front end stanno a [0..1640] e
   sono solo i loro CONTENUTI a misurare 1200. La fascia di fondo non arriva ai
   bordi, ed e' la stessa differenza che `verifica-layout.mjs` sorveglia davanti.

   PERCHE' SUCCEDE, e perche' non lo si corregge nel markup. WordPress decide il
   layout della radice della tela guardando il template, ma la funzione che lo fa —
   `checkForPostContentAtRootLevel`, wp-includes/js/dist/editor.js — scorre SOLO il
   livello superiore, senza ricorsione. `core/post-content` qui sta dentro il gruppo
   `<main>` di `page.html`, quindi WordPress conclude che al primo livello non c'e',
   e ricade su `constrained` di `settings.layout.contentSize`. Il `<main>` del tema
   e' invece `flow`: e' quella la differenza, e sta in una riga del core.

   TRE STRADE PROVATE E SCARTATE, per non rifarle:

   1. `align: full` sulle sezioni. NON HA EFFETTO, misurato: nessuna classe
      `alignfull`, nessun `data-align`. Il layout `default` di un block theme non
      offre affatto `wide` e `full` (`getAlignments` in block-editor.js li aggiunge
      solo `if ( ! isBlockBasedTheme )`), quindi l'editor scarta l'attributo. La via
      d'uscita che il CSS del core prevede — `:where(:not(.alignfull))` — non e'
      raggiungibile. Aggiungere `add_theme_support( 'align-wide' )` non la apre.

   2. `core/post-content` al primo livello del template. Funzionerebbe, ma costa il
      `<main>`: il bersaglio dello skip link e la regola E del guardrail.

   3. `default-mode => template-locked` sul tipo `page`. Mostrerebbe l'intera pagina,
      header e footer compresi, ma mette la radice in `disabled` e `post-content` in
      `contentOnly` (editor.js, `DisableNonPageContentBlocks`): e' esattamente lo
      stato che l'ADR 0005 ha tolto su richiesta del committente.

   COME ARRIVANO QUESTE REGOLE NELL'EDITOR. Le porta `add_editor_style()`, e il
   trasformatore che premette `.editor-styles-wrapper` a ogni selettore LASCIA STARE
   quelli che quella classe la contengono gia' (`ignoredSelectors`, block-editor.js).
   Quindi valgono solo nella tela, e sul front end sono inerti perche' li' quella
   classe non esiste.

   SOLO PAGINE, e la limitazione e' la parte importante. Nei CPT `core/post-content`
   e' un campo di testo DENTRO una sezione, e li' la radice constrained e' giusta:
   senza `.post-type-page` il corpo di una scheda fabbricante finiva a [0..1920].
   Misurato. `.wp-block-post-content` esclude poi il caso «Mostra il template», dove
   la radice e' il template e non il contenuto.

   Nessun `!important`. Le regole del core pesano 0,1,0 e 0,2,0; queste 0,4,0 e piu'.
   Il `margin-left: auto !important` della regola del core resta ma e' innocuo: con
   `max-width: none` un margine automatico si risolve a zero.
   ========================================================================== */

/* La radice della tela non porta il padding: sul front end sta sulle sezioni. */
.editor-styles-wrapper.post-type-page .is-root-container.wp-block-post-content {
	padding-left: 0;
	padding-right: 0;
}

/* E non taglia i figli a `contentSize`: il `<main>` del template e' `flow`. */
.editor-styles-wrapper.post-type-page .is-root-container.wp-block-post-content > * {
	max-width: none;
}

/* Il padding torna dove il front end lo mette.

   Il secondo selettore e' il `core/cover` degli hero: li' il contenitore con
   `has-global-padding` non e' la sezione ma il suo figlio, perche' il cover non
   porta quella classe. Serve perche' la radice della tela `has-global-padding` ce
   l'ha comunque — e' del blocco, non del layout — e la regola del core che azzera i
   discendenti continua a mordere un livello di troppo. Senza questa riga il testo
   dell'hero toccava i bordi a 1160 di tela, e a 1640 non si vedeva perche' il
   taglio a 1200 mordeva prima: e' il motivo per cui si misura a piu' larghezze. */
.editor-styles-wrapper.post-type-page .is-root-container.wp-block-post-content > .has-global-padding,
.editor-styles-wrapper.post-type-page .is-root-container.wp-block-post-content > :not(.has-global-padding) > .has-global-padding {
	padding-left: var(--wp--style--root--padding-left);
	padding-right: var(--wp--style--root--padding-right);
}

/* ==========================================================================
   12. I mega menu — i pannelli di Tecnologías e Servicios

   Approvati il 2026-09-01. Le bozze stanno in docs/design/mega-menu/, il markup lo
   produce inc/mega-menu.php, e cosa viene dal core e cosa no e' scritto in testa
   a quel file.

   Tutto quello che segue vale per ENTRAMBI — gronda, misura, allineamento al logo,
   apertura, comportamento sotto i 1024px. L'unica cosa che cambia e' la griglia, e
   la porta un modificatore su `.wifidom-mega-dentro`: `--colonne` o `--schede`.

   LA STESSA CLASSE RIPETUTA, e non e' un vezzo: e' l'unico modo di pareggiare il
   peso del core senza dipendere dalla sua struttura. I due numeri sono MISURATI sul
   sorgente di wp-includes/blocks/navigation/style.css, non stimati — la prima
   versione di questa sezione ne aveva contato uno di meno, e il pannello rendeva
   largo 200px appeso sotto la voce: aperto e sbagliato, senza nessun errore.

     (0,2,0)  .wp-block-navigation .wp-block-navigation-item        -> position: relative
     (0,5,0)  .wp-block-navigation .has-child
                .wp-block-navigation-submenu__toggle[aria-expanded=true]
                ~ .wp-block-navigation__submenu-container           -> width, min-width

   Da qui `.wifidom-mega` tre volte e `.wifidom-mega-pannello` sei: sopra a entrambe,
   e senza un solo selettore discendente, che e' il vincolo del progetto. E' anche
   l'idioma del core, che poche righe sotto scrive `…__submenu-container` quattro
   volte di fila per la stessa ragione.

   Le uniche regole piu' pesanti — (0,6,0) su `left` — valgono per
   `.items-justified-*`, e questa navigazione non ha quella classe: verificato nel
   documento reso.

   A parita' di peso vincerebbe comunque l'ordine: `style.css` e' alla riga 113 del
   documento, il CSS del blocco alla 47.
   ========================================================================== */

/* Il pannello e' `position: absolute` per mano del core. Perche' si stenda a tutta
   la finestra il suo `<li>` non deve fargli da riferimento: statico, il riferimento
   diventa l'involucro sticky dell'header, che e' largo quanto la pagina. */
/* PERCHE' `fixed` E NON `absolute`, ed e' costato una misura per scoprirlo.

   Fra il pannello e `.wifidom-header` — l'unico antenato largo quanto la pagina —
   il core mette QUATTRO elementi `position: relative`, tutti larghi quanto la sola
   navigazione: `ul.wp-block-navigation__container`, `…__responsive-dialog`,
   `…__responsive-container` e il `<nav>`. Con `absolute` il pannello si ferma al
   primo di quelli e resta largo 635px invece di 1440.

   Azzerarli sarebbe QUATTRO nomi di classe del core in piu' nel debito che ADR 0002
   tiene contato. `fixed` non ne aggiunge nessuno: il riferimento diventa la finestra,
   e nessun antenato ha `transform` o `filter` che lo riporterebbero indietro —
   verificato risalendo la catena nel documento reso.

   Il prezzo e' che l'altezza dell'header va scritta invece che dedotta da
   `top: 100%`. E' un token, non un numero, quindi resta una sola verita'. */
.wifidom-mega.wifidom-mega.wifidom-mega {
	position: static;
}

.wifidom-mega-pannello.wifidom-mega-pannello.wifidom-mega-pannello.wifidom-mega-pannello.wifidom-mega-pannello.wifidom-mega-pannello {
	background-color: var(--wp--preset--color--base);
	/* Il contenitore e' un `<ul>` e l'involucro un `<li>` — vedi inc/mega-menu.php:
	   e' cio' che tiene in piedi il giro delle direttive del core. Qui si toglie
	   soltanto l'aspetto da elenco, che nessuno dei due deve avere. */
	list-style: none;
	margin: 0;
	border-top: var(--wp--custom--border--width) solid var(--wp--preset--color--line);
	box-shadow: var(--wp--preset--shadow--card);
	left: 0;
	/* Su una finestra bassa il pannello scorre dentro se stesso, invece di uscire
	   dallo schermo portandosi via il bottone «Ser partner distribuidor». */
	max-height: calc(100vh - var(--wp--custom--header--height) - var(--wp-admin--admin-bar--height, 0px));
	min-width: 0;
	overflow-y: auto;
	padding: 0 var(--wp--style--root--padding-right) 0 var(--wp--style--root--padding-left);
	position: fixed;
	right: 0;
	/* La barra di amministrazione sposta l'header in giu': senza il suo scarto il
	   pannello ci finirebbe sotto di 32px, e lo vedrebbe solo chi e' collegato. */
	top: calc(var(--wp--custom--header--height) + var(--wp-admin--admin-bar--height, 0px));
	width: auto;
}

/* Il contenuto del pannello si allinea al contenuto del sito, non ai suoi bordi:
   e' la stessa misura dell'header sopra, o le colonne non ci starebbero sotto. */
.wifidom-mega-dentro {
	list-style: none;
	/* Senza, il padding si somma a `max-width` e la griglia esce di 80px rispetto
	   al contenuto dell'header, che e' proprio la misura con cui deve allinearsi. */
	box-sizing: border-box;
	display: grid;
	margin: 0 auto;
	max-width: var(--wp--style--global--content-size);
	padding: var(--wp--preset--spacing--60) 0 var(--wp--preset--spacing--70);
	/* La griglia la porta il modificatore: `--colonne` per Tecnologías,
	   `--schede` per Servicios. Il resto — gronda, misura, allineamento al logo —
	   e' identico, ed e' cio' che fa sembrare i due pannelli parenti. */
	/* `width: 100%` NON e' ridondante con `max-width`, ed e' costato una misura.
	   Il core rende il contenitore `display: flex`, e su un elemento flex i margini
	   automatici sul lato trasversale ANNULLANO lo stiramento: senza questa riga la
	   griglia si dimensiona sul contenuto — 977px invece di 1200 — e le tre colonne
	   restano centrate ma strette. */
	width: 100%;
}

.wifidom-mega-dentro--colonne {
	gap: 0;
	grid-template-columns: 300px 1fr 360px;
}

.wifidom-mega-dentro--schede {
	gap: var(--wp--preset--spacing--50);
	grid-template-columns: repeat(3, 1fr);
}

.wifidom-mega-colonna {
	display: flex;
	flex-direction: column;
	gap: var(--wp--preset--spacing--40);
	padding: 0 var(--wp--preset--spacing--70);
}

.wifidom-mega-colonna:first-child {
	padding-left: 0;
}

.wifidom-mega-colonna:last-child {
	padding-right: 0;
}

/* Il divisore sta fra le colonne, non attorno: un bordo a sinistra su tutte tranne
   la prima da' due fili e non quattro. */
.wifidom-mega-colonna + .wifidom-mega-colonna {
	border-left: var(--wp--custom--border--width) solid var(--wp--preset--color--line);
}

/* Le tre colonne chiudono alla stessa quota. Due link e un bottone a altezze
   diverse leggono come un incidente, non come una scelta. */
.wifidom-mega-colonna > :last-child {
	margin-top: auto;
}

.wifidom-mega-etichetta {
	color: var(--wp--preset--color--primary);
	font-size: var(--wp--preset--font-size--eyebrow);
	font-weight: 600;
	letter-spacing: 0.14em;
	margin: 0;
	text-transform: uppercase;
}

.wifidom-mega-schede,
.wifidom-mega-elenco {
	display: flex;
	flex-direction: column;
	list-style: none;
	margin: 0;
	padding: 0;
}

.wifidom-mega-schede {
	gap: var(--wp--preset--spacing--30);
}

/* Le schede: le quattro aree tecnologiche. Il riquadro tinto e' cio' che le
   distingue dai settori — sono l'offerta, non una destinazione fra le altre. */
.wifidom-mega-scheda {
	align-items: center;
	border: var(--wp--custom--border--width) solid var(--wp--preset--color--line);
	border-radius: var(--wp--custom--radius--control);
	color: var(--wp--preset--color--contrast);
	display: flex;
	gap: var(--wp--preset--spacing--40);
	padding: var(--wp--preset--spacing--30) var(--wp--preset--spacing--40);
	text-decoration: none;
	transition: border-color var(--wp--custom--transition--fast), box-shadow var(--wp--custom--transition--fast);
}

.wifidom-mega-scheda:hover {
	border-color: var(--wp--preset--color--secondary);
	box-shadow: var(--wp--preset--shadow--card);
}

.wifidom-mega-riquadro {
	align-items: center;
	aspect-ratio: 1;
	background-color: var(--wp--preset--color--surface-tint);
	border-radius: var(--wp--custom--radius--chip);
	display: flex;
	flex-shrink: 0;
	justify-content: center;
	width: var(--wp--preset--spacing--70);
}

.wifidom-mega-nome {
	display: block;
	font-weight: 600;
	line-height: 1.35;
}

.wifidom-mega-sotto {
	color: var(--wp--preset--color--muted);
	display: block;
	font-size: var(--wp--preset--font-size--small);
	line-height: 1.4;
}

/* L'elenco: i sette settori. Icona in linea, senza riquadro. */
.wifidom-mega-riga {
	align-items: center;
	border-radius: var(--wp--custom--radius--control);
	color: var(--wp--preset--color--contrast);
	display: flex;
	gap: var(--wp--preset--spacing--30);
	margin: 0 calc(-1 * var(--wp--preset--spacing--20));
	padding: var(--wp--preset--spacing--20);
	text-decoration: none;
	transition: background-color var(--wp--custom--transition--fast), color var(--wp--custom--transition--fast);
}

.wifidom-mega-riga:hover {
	background-color: var(--wp--preset--color--surface);
	color: var(--wp--preset--color--primary);
}

.wifidom-mega-tutti {
	color: var(--wp--preset--color--primary);
	font-size: var(--wp--preset--font-size--small);
	font-weight: 600;
	text-decoration: none;
}

.wifidom-mega-tutti:hover {
	color: var(--wp--preset--color--secondary-strong);
	text-decoration: underline;
}

/* La colonna dei fabbricanti viene da un pattern sincronizzato, quindi qui si
   incontrano blocchi del core: il gruppo dell'intestazione, la griglia dei loghi e
   il bottone. */
.wifidom-mega-testa {
	align-items: baseline;
}

.wifidom-mega-testa p {
	margin: 0;
}

.wifidom-mega-loghi {
	display: grid;
	gap: var(--wp--preset--spacing--30);
	grid-template-columns: 1fr 1fr;
}

/* Contenitore ad altezza fissa e logo contenuto, mai ritagliato: e' la regola di
   design.md §8, la stessa della tira di loghi. */
.wifidom-mega-logo {
	align-items: center;
	border: var(--wp--custom--border--width) solid var(--wp--preset--color--line);
	border-radius: var(--wp--custom--radius--chip);
	display: flex;
	height: var(--wp--preset--spacing--80);
	justify-content: center;
	margin: 0;
	padding: var(--wp--preset--spacing--10) var(--wp--preset--spacing--30);
}

.wifidom-mega-logo img {
	max-height: 100%;
	object-fit: contain;
	width: auto;
}

/* Il bottone e' `secondary-strong` e non il primario, ed e' una decisione: il
   primario pieno sarebbe identico a `Contáctanos` nell'header, a trenta centimetri.
   Quando due chiamate hanno lo stesso peso nessuna delle due e' la principale.
   6.0:1 con testo bianco — misurato, contro il 4.59:1 del secondario pieno, che
   passerebbe il 4.5 di WCAG 1.4.3 restando sul limite. */
.wifidom-mega-partner .wp-block-button__link {
	background-color: var(--wp--preset--color--secondary-strong);
	display: block;
	text-align: center;
}

.wifidom-mega-partner .wp-block-button__link:hover {
	background-color: var(--wp--preset--color--secondary);
}

.wifidom-mega-partner {
	display: block;
}

/* --------------------------------------------------------------------------
   Le schede di servizio — la seconda forma del pannello.

   Una scheda per servizio, con la fotografia della pagina di destinazione a filo
   in alto. Il bordo e l'ombra sono gli stessi delle schede di area dentro il
   pannello di Tecnologías: i due pannelli devono reagire allo stesso modo.
   -------------------------------------------------------------------------- */

.wifidom-mega-servizio {
	border: var(--wp--custom--border--width) solid var(--wp--preset--color--line);
	border-radius: var(--wp--custom--radius--card);
	color: var(--wp--preset--color--contrast);
	display: flex;
	flex-direction: column;
	gap: var(--wp--preset--spacing--30);
	/* Senza, gli angoli tondi non tagliano la fotografia che esce dalla gronda. */
	overflow: hidden;
	padding: var(--wp--preset--spacing--50);
	text-decoration: none;
	transition: border-color var(--wp--custom--transition--fast), box-shadow var(--wp--custom--transition--fast);
}

.wifidom-mega-servizio:hover {
	border-color: var(--wp--preset--color--secondary);
	box-shadow: var(--wp--preset--shadow--card);
}

.wifidom-mega-servizio:hover .wifidom-mega-titolo {
	color: var(--wp--preset--color--primary);
}

/* La fotografia esce dalla gronda della scheda con margini negativi, invece di
   togliere il padding al contenitore: cosi' una scheda SENZA fotografia — una
   pagina a cui manca l'immagine in evidenza — resta impaginata bene da sola. */
.wifidom-mega-foto {
	aspect-ratio: 16 / 9;
	display: block;
	/* `height: auto` NON e' ridondante con `aspect-ratio`, ed e' costato una misura.
	   `wp_get_attachment_image()` stampa `width` e `height` sull'`<img>` — servono a
	   riservare lo spazio ed evitare lo scatto del layout — ma l'attributo `height`
	   vale come dichiarazione CSS, e vince sull'`aspect-ratio`. Senza questa riga la
	   copertina rendeva alta 512px invece di 216, e il pannello 794 invece di 517.
	   E' la trappola opposta a quella delle icone SVG, dove e' `auto` a rompere. */
	height: auto;
	margin: calc(-1 * var(--wp--preset--spacing--50)) calc(-1 * var(--wp--preset--spacing--50)) var(--wp--preset--spacing--10);
	max-width: none;
	object-fit: cover;
	width: calc(100% + 2 * var(--wp--preset--spacing--50));
}

.wifidom-mega-titolo {
	font-size: var(--wp--preset--font-size--body-l);
	font-weight: 600;
	line-height: 1.3;
}

.wifidom-mega-sotto {
	color: var(--wp--preset--color--muted);
	font-size: var(--wp--preset--font-size--small);
	line-height: 1.5;
}

/* Sta in fondo anche quando la descrizione di una scheda e' piu' corta: tre inviti
   a altezze diverse leggono come un incidente. */
.wifidom-mega-vedi {
	color: var(--wp--preset--color--primary);
	font-size: var(--wp--preset--font-size--small);
	font-weight: 600;
	margin-top: auto;
	padding-top: var(--wp--preset--spacing--10);
}

/* --------------------------------------------------------------------------
   Sotto i 1024px il pannello vive dentro l'overlay di ADR 0002.

   Non si costruisce un secondo menu: il core rimette il contenitore in `position:
   static` dentro l'overlay, e qui si disfa solo la griglia. Spariscono i loghi e i
   sottotitoli — su 390px farebbero scorrere il menu di tre schermate — ma NESSUNA
   destinazione sparisce: undici voci piu' due raccolte piu' il bottone restano
   tutte raggiungibili.
   -------------------------------------------------------------------------- */

@media (max-width: 1024px) {

	.wifidom-mega-pannello.wifidom-mega-pannello.wifidom-mega-pannello.wifidom-mega-pannello.wifidom-mega-pannello.wifidom-mega-pannello {
		border-top: 0;
		box-shadow: none;
		max-height: none;
		overflow-y: visible;
		padding: 0;
		/* Dentro l'overlay il pannello e' una fisarmonica nel flusso, non un
		   sovrapposto: `fixed` lo staccherebbe dalla voce che lo apre. */
		position: static;
	}

	.wifidom-mega-dentro {
		display: flex;
		flex-direction: column;
		gap: var(--wp--preset--spacing--50);
		padding: var(--wp--preset--spacing--40) 0 var(--wp--preset--spacing--60);
	}

	.wifidom-mega-colonna {
		padding: 0;
	}

	.wifidom-mega-colonna + .wifidom-mega-colonna {
		border-left: 0;
	}

	.wifidom-mega-colonna > :last-child {
		margin-top: 0;
	}

	.wifidom-mega-scheda {
		border: 0;
		padding: var(--wp--preset--spacing--20) 0;
	}

	.wifidom-mega-scheda:hover {
		box-shadow: none;
	}

	.wifidom-mega-sotto,
	.wifidom-mega-loghi {
		display: none;
	}

	/* Le schede di servizio diventano righe: icona e nome, come le aree. La
	   fotografia sparisce — su 390px tre copertine 16:9 sono tre schermate. */
	.wifidom-mega-dentro--schede {
		gap: 0;
		grid-template-columns: 1fr;
	}

	.wifidom-mega-servizio {
		align-items: center;
		border: 0;
		flex-direction: row;
		gap: var(--wp--preset--spacing--40);
		padding: var(--wp--preset--spacing--20) 0;
	}

	.wifidom-mega-servizio:hover {
		box-shadow: none;
	}

	.wifidom-mega-foto,
	.wifidom-mega-vedi {
		display: none;
	}

	.wifidom-mega-titolo {
		font-size: var(--wp--preset--font-size--body);
	}
}
