/* components.css — componenti workshop_supplier. Core + CSS owned, niente dipendenze.
   Fornitore di attrezzature per officina e industria: header fisso indaco con wp:navigation, hero a
   TAGLIO DIAGONALE (pannello di marca che invade la foto), hub categorie fotografico, striscia servizi
   a icone, BLOCCHI-DATI sulle schede (il device che regge il catalogo tecnico), muro dei marchi e bande
   chiare per i blocchi densi.
   Contrasti WCAG AA verificati (ink/paper 17.3 · on_dark/brand 10.9 · ink_on_light/sage_tint 16.2 ·
   accent_dark/brand 5.6 · accent_ink/sage_tint 5.1). VINCOLI: mai bianco su --accent (3.08), mai
   --accent su --brand (3.52), mai --accent su fondo chiaro (3.00). Vedi tokens.css. */

/* ---------- Eyebrow / label (Inter uppercase molto tracciato, registro tecnico) ---------- */
.eyebrow {
  font-family: var(--font-body); font-size: var(--text-xs); font-weight: 600;
  letter-spacing: var(--tracking-label); text-transform: uppercase;
  color: var(--accent-dark); display: inline-flex; gap: var(--space-3); align-items: center;
}
.eyebrow::before { content: ""; width: 1.8em; height: 2px; background: currentColor; }
/* Sul chiaro l'arancione non regge come testo (3.00): si usa la variante scurita. */
.eyebrow--on-light { color: var(--accent-ink); }

/* ---------- Buttons (pill, radius misurato sul template) ---------- */
.btn {
  display: inline-flex; align-items: center; gap: var(--space-2);
  padding: .78em 1.5em; border-radius: var(--radius-pill);
  font-weight: 600; font-size: var(--text-sm); text-decoration: none; border: 2px solid transparent;
  transition: transform var(--dur) var(--ease), background var(--dur) var(--ease), border-color var(--dur) var(--ease);
}
.btn:hover { transform: translateY(-1px); }
/* Il bottone arancione porta testo SCURO: bianco su arancione fa 3.08 e non passa. */
.btn--accent { background: var(--accent); color: var(--paper); }
.btn--accent:hover { background: var(--accent-deep); color: var(--paper); }
.btn--ghost { background: transparent; color: var(--ink); border-color: rgba(255,255,255,.34); }
.btn--ghost:hover { border-color: var(--ink); background: rgba(255,255,255,.07); }
.btn--ghost.on-light { color: var(--accent-ink); border-color: var(--line-light); }
.btn--ghost.on-light:hover { border-color: var(--accent-ink); background: rgba(0,0,0,.04); }

/* Ponte core/button -> look ForgePress (editabile, round-trip valido; formalizzato in theme.json). */
.wp-block-button__link { border-radius: var(--radius-pill); padding: .78em 1.5em;
  font-weight: 600; font-size: var(--text-sm); border: 2px solid transparent; }
.wp-block-button.is-accent .wp-block-button__link { background: var(--accent); color: var(--paper); }
.wp-block-button.is-ghost .wp-block-button__link { background: transparent; color: var(--ink); border-color: rgba(255,255,255,.34); }
.wp-block-button.is-ghost.on-light .wp-block-button__link { color: var(--accent-ink); border-color: var(--line-light); background: transparent; }

/* ---------- Header (fisso, indaco pieno, wordmark lockup, wp:navigation) ---------- */
/* display:contents dissolve il wrapper del template-part WP, altrimenti lo sticky si stacca subito. */
.wp-block-template-part { display: contents; }
.site-header {
  position: sticky; top: 0; z-index: 50; background: var(--brand);
  border-bottom: 3px solid var(--accent);
  transition: box-shadow var(--dur-slow) var(--ease), background-color var(--dur-slow) var(--ease);
}
/* Contrazione allo scroll (classe commutata da reveal.js su [data-shrink]): la barra si assottiglia e
   stacca dalla pagina con un'ombra. È un segnale di reattività, non una decorazione — e recupera
   verticale sulle pagine lunghe di catalogo. */
.site-header.is-scrolled { background: var(--brand-dark); box-shadow: 0 12px 34px rgba(0,0,0,.42); }
.site-header__row { transition: padding-top var(--dur-slow) var(--ease), padding-bottom var(--dur-slow) var(--ease); }
.site-header.is-scrolled .site-header__row { padding-block: var(--space-2); }
.wordmark__mark { transition: height var(--dur-slow) var(--ease); }
.site-header.is-scrolled .wordmark__mark { height: 34px; }
/* Header centrato verticalmente: spazio sopra = sotto, nav sulla stessa linea del wordmark.
   ⚠ La riga dell'header NON è vincolata alla misura del contenuto (1220px): a quella larghezza le quattro
   zone (marchio · menu · telefono · CTA) saturavano la riga e `margin-left:auto` sulla nav non aveva più
   spazio da consumare, per cui il menu finiva incollato al nome del sito a 24px — contro i 48 fra menu e
   telefono. Misurato nel DOM. Con la riga larga il marchio resta solo a sinistra e le tre zone d'azione
   formano un gruppo a destra, con un vuoto vero in mezzo.
   Lo stacco MINIMO è il `gap` della riga, non `margin-left:auto`: l'auto dà spazio solo se ne avanza, il
   gap lo garantisce sempre. */
.site-header__row { display: flex; align-items: center; gap: clamp(1.5rem, 2.6vw, 3rem);
  max-width: 1560px; padding-block: var(--space-5); }
.site-header__row > * { align-self: center; margin-block: 0; }

/* Lockup: emblema (punta da trapano + "dal 1950", ritagliato dal marchio del cliente) + nome in tipografia.
   Il file logo originale è 9.5:1 e porta DUE marchi: a quel rapporto il nome sarebbe illeggibile. */
.wordmark { display: inline-flex; align-items: center; gap: .6rem; text-decoration: none;
  font-family: var(--font-display); font-weight: 600; font-size: var(--text-lg);
  letter-spacing: -0.02em; color: var(--on-dark); }
.wordmark__mark { height: 46px; width: auto; flex: 0 0 auto; display: block; align-self: center; }
.wordmark__txt { display: inline-flex; flex-direction: column; line-height: 1.02; align-self: center; }
.wordmark__name { font-family: var(--font-display); font-weight: 600; font-size: 1.32rem;
  letter-spacing: .01em; color: var(--on-dark); white-space: nowrap; text-transform: uppercase; }
.wordmark__kicker { font-family: var(--font-body); font-weight: 600; font-size: var(--text-xs);
  letter-spacing: .16em; text-transform: uppercase; color: var(--accent-dark); white-space: nowrap; }
@media (max-width: 420px) { .wordmark__kicker { display: none; } }

/* wp:navigation reso: <nav class="site-nav"> con lista di navigation-item */
.site-header .site-nav { margin-left: auto; }
.site-nav.wp-block-navigation, .site-nav .wp-block-navigation__container { align-items: center; }
/* Sopra i 900px la nav non va MAI a capo: con flex-wrap l'ultima voce resta orfana su una seconda riga
   e l'header cresce in silenzio. */
@media (min-width: 901px) { .site-nav .wp-block-navigation__container { flex-wrap: nowrap; gap: var(--space-5); } }
/* WP inietta `.wp-block-navigation .wp-block-navigation-item__content` (0,2,0) DOPO il tema: a parità
   vince lui. Serve un livello in più, e il colore va messo anche sullo __label. */
/* Le voci non vanno MAI a capo: una voce di due parole ("Chi siamo") si spezzava su due righe e da sola
   raddoppiava l'altezza dell'header (49px contro 24 delle altre, misurato). */
.site-header .site-nav .wp-block-navigation-item__content { text-decoration: none; font-size: var(--text-sm);
  font-weight: 500; color: var(--on-dark-muted); white-space: nowrap; }
.site-header .site-nav .wp-block-navigation-item__label { color: inherit; }
.site-header .site-nav .wp-block-navigation-item__content:hover,
.site-header .site-nav .current-menu-item .wp-block-navigation-item__content { color: var(--accent-dark); }

.site-header__phone { display: inline-flex; align-items: center; gap: var(--space-2); text-decoration: none;
  font-weight: 600; font-size: var(--text-sm); color: var(--on-dark); white-space: nowrap; margin-left: var(--space-5); }
.site-header__phone:hover { color: var(--accent-dark); }
@media (max-width: 1080px) { .site-header .site-header__phone { display: none; } }
.site-header__cta { flex: 0 0 auto; margin-left: var(--space-4); align-self: center;
  padding: .55em 1.1em; font-size: var(--text-sm); }
/* Su mobile la CTA in header sparisce: la barra fissa in basso porta già "Preventivo". */
@media (max-width: 860px) { .site-header .site-header__cta { display: none; } }

/* Hamburger: WP lo lascia a currentColor e sull'header indaco erediterebbe un colore scuro.
   ⚠ Le regole vanno vincolate al breakpoint VERO di WP (599.98px): senza media query il display:flex
   batte il display:none di WP e il bottone resta visibile a desktop, mandando la nav a capo. */
@media (max-width: 599.98px) {
  .site-header .wp-block-navigation__responsive-container-open,
  .site-header .wp-block-navigation__responsive-container-close {
    color: var(--on-dark); display: flex; align-items: center; justify-content: center;
    width: 44px; height: 44px;
  }
  .site-header .wp-block-navigation__responsive-container-close { color: var(--accent-dark); }
}
/* Overlay mobile: WP impone il fondo BIANCO con
   `.wp-block-navigation:not(.has-background) .…is-menu-open:not(.disable-default-overlay)` = (0,4,0),
   iniettato dopo il tema. Una regola a 3 classi perde in silenzio: si vince solo RICOPIANDO il suo schema. */
.wp-block-navigation:not(.has-background) .wp-block-navigation__responsive-container.is-menu-open:not(.disable-default-overlay),
.wp-block-navigation__responsive-container.is-menu-open {
  background: var(--brand-dark); color: var(--on-dark);
  height: 100vh; max-height: 100vh; overflow-y: auto; -webkit-overflow-scrolling: touch;
}
.wp-block-navigation__responsive-container.is-menu-open .wp-block-navigation__responsive-container-content {
  padding: 76px var(--space-6) 96px; width: 100%; }
/* Le voci si allineano risalendo la catena dei genitori: l'<a> è shrink, allinearlo non basta. */
.wp-block-navigation__responsive-container.is-menu-open .wp-block-navigation__responsive-container-content,
.wp-block-navigation__responsive-container.is-menu-open .wp-block-navigation__container {
  align-items: stretch !important; justify-content: flex-start !important; }
.wp-block-navigation__responsive-container.is-menu-open .wp-block-navigation__container {
  gap: 0 !important; width: 100%; }
.wp-block-navigation__responsive-container.is-menu-open .wp-block-navigation__container > li {
  width: 100%; border-bottom: 1px solid rgba(255,255,255,.14); }
.wp-block-navigation__responsive-container.is-menu-open .wp-block-navigation-item__content {
  width: 100% !important; padding: var(--space-4) 0 !important; font-size: var(--text-md) !important;
  font-weight: 600 !important; color: var(--on-dark) !important; justify-content: flex-start !important;
  margin-left: 0 !important; text-align: left !important; }
.wp-block-navigation__responsive-container.is-menu-open .wp-block-navigation__submenu-container {
  position: static !important; border: none !important; box-shadow: none !important; background: transparent !important;
  border-radius: 0 !important; padding: var(--space-2) 0 var(--space-3) var(--space-5) !important;
  min-width: 0 !important; width: 100%; opacity: 1; visibility: visible; transform: none; }

/* ---------- HERO: il TAGLIO DIAGONALE (dispositivo firma della categoria) ----------
   Il pannello indaco esce a tutta larghezza dal bordo sinistro del viewport e taglia in obliquo dentro
   la foto. Risolve anche un vincolo reale: le testate del cliente sono banner 1920x700, che da soli non
   reggerebbero una banda a piena larghezza. */
.hero { position: relative; isolation: isolate; overflow: hidden; background: var(--paper);
  border-bottom: 3px solid var(--accent); min-height: clamp(30rem, 24rem + 14vw, 42rem); display: grid; }
.hero__media { position: absolute; inset: 0; z-index: -2; }
.hero__media img { width: 100%; height: 100%; object-fit: cover; object-position: center 42%; }
/* Slideshow: N .hero-slide in crossfade + Ken Burns.
   ⚠⚠ La durata del giro DEVE seguire il numero di slide. Con tre slide e un ciclo tarato su quattro
   (ritardi 0/8/16s su 32s) l'ultima si spegneva al 25,9° secondo e restavano SEI SECONDI di banda vuota
   — il fondo pagina nero al posto della fotografia — a ogni giro. Il conteggio si legge con :has(), e la
   finestra "accesa" di ogni fotogramma cambia con esso: a un quarto di giro corrispondono percentuali
   diverse rispetto a un terzo, quindi servono due serie di keyframe, non una riscalata. */
.hero__media { --step: 8s; }
.hero-slide { position: absolute; inset: 0; opacity: 0;
  animation: fp-hero-fade3 24s linear infinite; animation-delay: var(--d, 0s); }
.hero-slide img { width: 100%; height: 100%; object-fit: cover; object-position: center 42%;
  animation: fp-hero-zoom 24s linear infinite; animation-delay: var(--d, 0s); }
.hero-slide:nth-child(1) { --d: 0s; }
.hero-slide:nth-child(2) { --d: var(--step); }
.hero-slide:nth-child(3) { --d: calc(2 * var(--step)); }
.hero-slide:nth-child(4) { --d: calc(3 * var(--step)); }
/* Quattro fotogrammi: giro più lungo e finestra di un quarto. */
.hero__media:has(.hero-slide:nth-child(4)) .hero-slide,
.hero__media:has(.hero-slide:nth-child(4)) .hero-slide img { animation-duration: 32s; }
.hero__media:has(.hero-slide:nth-child(4)) .hero-slide { animation-name: fp-hero-fade4; }
@keyframes fp-hero-fade3 { 0% { opacity: 0 } 5%, 33% { opacity: 1 } 38%, 100% { opacity: 0 } }
@keyframes fp-hero-fade4 { 0% { opacity: 0 } 4%, 25% { opacity: 1 } 29%, 100% { opacity: 0 } }
/* Ken Burns: la fotografia non è mai del tutto ferma. Ampiezza minima — deve leggersi come respiro. */
@keyframes fp-hero-zoom { 0% { transform: scale(1.005) } 45%, 100% { transform: scale(1.075) } }
@media (prefers-reduced-motion: reduce) {
  .hero-slide, .hero-slide img { animation: none; }
  .hero-slide { opacity: 0; }
  .hero-slide:nth-child(1) { opacity: 1; }
}
/* Velo sulla parte scoperta della foto: il testo NON ci sta sopra (sta nel pannello), ma il velo tiene
   coerente il fotogramma quando le vetture sono chiare. */
.hero::after { content: ""; position: absolute; inset: 0; z-index: -1;
  background: linear-gradient(90deg, rgba(18,18,18,.15) 0%, rgba(18,18,18,.05) 55%, rgba(18,18,18,.35) 100%); }
.hero__inner { display: grid; grid-template-columns: minmax(0, 1.02fr) minmax(0, .98fr); }
/* ⚠ Il taglio diagonale toglie `--slant-w` al pannello IN BASSO: senza un padding destro almeno pari
   alla pendenza, le righe finali del testo escono dal pannello e finiscono sopra la foto. Misurato dal
   pixel: il lead stava a 1.00 di contrasto contro un fotogramma chiaro. */
.hero__text { position: relative; z-index: 1; align-self: center; max-width: 34rem;
  padding-block: clamp(3rem, 1.8rem + 5vw, 6.5rem);
  padding-right: calc(var(--slant-w) + var(--space-5)); }
.hero__text::before {
  content: ""; position: absolute; top: 0; bottom: 0; right: 0; left: calc(50% - 50vw);
  background: var(--brand); z-index: -1;
  clip-path: polygon(0 0, 100% 0, calc(100% - var(--slant-w)) 100%, 0 100%);
}
.hero__text h1 { color: var(--on-dark); margin-top: var(--space-4);
  font-size: clamp(2.35rem, 1.45rem + 4.3vw, 4.5rem); line-height: 1.02; letter-spacing: -0.03em; }
/* La "parola accento" del titolo dentro il pannello è AMBRA: l'arancione su indaco fa 3.52 e non passa. */
.hero__text h1 .accent { color: var(--accent-dark); }
.hero__lead { font-size: var(--text-md); color: var(--on-dark-muted); margin-top: var(--space-5); max-width: 31rem; }
.hero__cta { display: flex; flex-wrap: wrap; gap: var(--space-3); margin-top: var(--space-6); }
@media (max-width: 900px) {
  .hero__inner { grid-template-columns: 1fr; }
  .hero__text { max-width: none; padding-right: 0; padding-block: clamp(2.5rem, 2rem + 4vw, 4rem); }
  /* Su mobile il pannello copre tutta la banda: niente diagonale, la foto resta sotto come atmosfera. */
  .hero__text::before { left: calc(50% - 50vw); right: calc(50% - 50vw); clip-path: none;
    background: linear-gradient(180deg, var(--brand) 0%, var(--brand) 82%, rgba(46,46,122,.94) 100%); }
}

/* ---------- Sezioni: intestazione comune ---------- */
.section-intro { max-width: 60ch; }
.section-intro h2 { margin-top: var(--space-4); }
/* Il riferimento accenta UNA PAROLA del titolo, ma la copy che arriva dall'IR è escapata (giustamente:
   niente markup dal contenuto). Il carattere si recupera con un filetto ambra sotto il titolo — stesso
   segno, nessuna forzatura dello schema. */
.section-intro h2::after, .hero__text h1::after {
  content: ""; display: block; width: 3.2rem; height: 4px; margin-top: var(--space-4);
  background: var(--accent-dark); border-radius: 2px;
}
.section--light .section-intro h2::after { background: var(--accent); }
.section-intro h2 .accent { color: var(--accent-dark); }
.section--light .section-intro h2 .accent { color: var(--accent-ink); }
.section-intro p { margin-top: var(--space-4); color: var(--ink-muted); }
.section--light .section-intro p { color: var(--sage); }
.section-head { display: flex; align-items: flex-end; justify-content: space-between; gap: var(--space-6);
  flex-wrap: wrap; }

/* ---------- HUB categorie: tessere fotografiche con etichetta piena ---------- */
/* Due colonne, non quattro: i nomi di categoria di questo mestiere sono lunghi ("Utensili, macchine
   utensili, elettroutensili") e in una tessera da 273px andavano a 4 righe, mangiandola. Misurato. */
.hub { display: grid; grid-template-columns: repeat(auto-fit, minmax(280px, 1fr));
  gap: var(--tile-gap); margin-top: var(--space-7); }
@media (min-width: 760px) { .hub { grid-template-columns: repeat(2, 1fr); } }
.hub__card { position: relative; display: block; text-decoration: none; overflow: hidden;
  border-radius: var(--radius); background: var(--surface); aspect-ratio: 4 / 3;
  transition: transform var(--dur) var(--ease); }
.hub__card:hover { transform: translateY(-3px); }
.hub__card img { width: 100%; height: 100%; object-fit: cover;
  transition: transform 420ms var(--ease); }
.hub__card:hover img { transform: scale(1.045); }
.hub__card::after { content: ""; position: absolute; inset: 0;
  background: linear-gradient(180deg, rgba(18,18,18,0) 38%, rgba(18,18,18,.86) 100%); }
.hub__label { position: absolute; left: 0; right: 0; bottom: 0; z-index: 1;
  padding: var(--space-5); display: flex; align-items: flex-end; justify-content: space-between; gap: var(--space-3); }
.hub__label h3 { color: #F6F6F6; font-size: var(--text-lg); }
.hub__go { flex: 0 0 auto; width: 34px; height: 34px; border-radius: var(--radius-pill);
  background: var(--accent); color: var(--paper); display: inline-flex; align-items: center;
  justify-content: center; font-weight: 700; }
/* Il filetto di marca sul bordo alto della tessera. */
.hub__card::before { content: ""; position: absolute; left: 0; right: 0; top: 0; height: 4px;
  background: var(--accent); z-index: 1; transform: scaleX(0); transform-origin: left;
  transition: transform 320ms var(--ease); }
.hub__card:hover::before { transform: scaleX(1); }

/* ---------- BLOCCHI-DATI: il device che regge il catalogo tecnico ----------
   Un'attrezzatura si sceglie sui numeri (portata, anno, modello): etichetta piccola tracciata sopra,
   valore grande in display sotto. */
.specs { display: grid; grid-template-columns: repeat(auto-fit, minmax(112px, 1fr));
  gap: var(--space-4) var(--space-5); margin-top: var(--space-5); }
.specs__k { font-family: var(--font-body); font-size: var(--text-xs); font-weight: 600;
  letter-spacing: var(--tracking-label); text-transform: uppercase; color: var(--accent-dark); }
.specs__v { font-family: var(--font-display); font-weight: 600; font-size: var(--text-data);
  line-height: 1.1; color: var(--ink); letter-spacing: -0.02em; }
.section--light .specs__k { color: var(--accent-ink); }
.section--light .specs__v { color: var(--ink-on-light); }
/* In linea i blocchi-dati si dispongono a FLUSSO, non su colonne fisse: con tre voci in due colonne la
   terza restava sola con mezza riga vuota accanto (misurato su 8 schede dell'usato). A flusso ogni voce
   è larga quanto il suo contenuto e l'ultima riga non lascia buchi. */
.specs--inline { display: flex; flex-wrap: wrap; gap: var(--space-3) var(--space-6); }
.specs--inline > * { flex: 0 1 auto; min-width: 5.5rem; }
.specs--inline .specs__v { font-size: var(--text-lg); }

/* ---------- Card prodotto / usato ---------- */
.cards { display: grid; grid-template-columns: repeat(auto-fit, minmax(280px, 1fr));
  gap: var(--space-5); margin-top: var(--space-7); }
/* "two" vuol dire DUE: a minmax(360px) sulla misura piena ne entravano tre, e la quarta scheda restava
   sola in fondo con due terzi di riga vuota. A 26rem la griglia si ferma davvero a due colonne. */
.cards--two { grid-template-columns: repeat(auto-fit, minmax(min(100%, 26rem), 1fr)); }
.card { display: flex; flex-direction: column; background: var(--surface); border-radius: var(--radius);
  overflow: hidden; text-decoration: none; transition: transform var(--dur) var(--ease); }
.card:hover { transform: translateY(-3px); }
.card__media { aspect-ratio: 4 / 3; overflow: hidden; background: var(--brand-dark); }
.card__media img { width: 100%; height: 100%; object-fit: cover; transition: transform 420ms var(--ease); }
.card:hover .card__media img { transform: scale(1.04); }
/* Sui prodotti scontornati `cover` taglia il soggetto: si passa a contain su fondo di marca. */
.card__media--contain img { object-fit: contain; padding: var(--space-4); }
.card__body { padding: var(--space-5); display: flex; flex-direction: column; gap: var(--space-3); flex: 1; }
.card__body h3 { color: var(--ink); }
.card__body p { color: var(--ink-muted); font-size: var(--text-sm); }
.card__foot { margin-top: auto; padding-top: var(--space-3); }
.card__more { font-weight: 600; font-size: var(--text-sm); color: var(--accent-dark); }
/* Sulle bande chiare la card cambia superficie e ruoli di testo. */
.section--light .card { background: #FFFFFF; border: 1px solid var(--line-light); }
.section--light .card__body h3 { color: var(--ink-on-light); }
.section--light .card__body p { color: var(--sage); }
.section--light .card__more { color: var(--accent-ink); }
/* Etichetta di stato ("pronta consegna", "usato"): superficie arancione, testo scuro. */
.tag { display: inline-flex; align-items: center; align-self: flex-start; gap: var(--space-2);
  padding: .3em .8em; border-radius: var(--radius-pill); background: var(--accent); color: var(--paper);
  font-size: var(--text-xs); font-weight: 700; letter-spacing: .06em; text-transform: uppercase; }
.tag--muted { background: var(--brand-mid); color: var(--on-dark); }

/* ---------- Striscia SERVIZI a icone ---------- */
.svcs { display: grid; grid-template-columns: repeat(auto-fit, minmax(240px, 1fr));
  gap: var(--space-5); margin-top: var(--space-8); counter-reset: svc; }
.svc { position: relative; overflow: hidden; display: flex; flex-direction: column; gap: var(--space-4);
  text-decoration: none; padding: var(--space-6) var(--space-5); background: var(--surface);
  border-radius: var(--radius); border-top: 3px solid transparent;
  transition: border-color var(--dur) var(--ease), transform var(--dur) var(--ease); }
.svc:hover { border-top-color: var(--accent); }
/* Il NUMERO d'ordine in filigrana: dà peso editoriale a una scheda altrimenti muta, e non costa markup —
   lo genera un contatore CSS. Resta molto sotto la soglia del testo perché è decorazione, non contenuto. */
.svc::before { counter-increment: svc; content: counter(svc, decimal-leading-zero);
  position: absolute; top: var(--space-3); right: var(--space-4); pointer-events: none;
  font-family: var(--font-display); font-weight: 600; font-size: 3.6rem; line-height: 1;
  letter-spacing: -0.05em; color: rgba(246,246,246,.055);
  transition: color var(--dur-slow) var(--ease); }
.svc:hover::before { color: rgba(245,160,63,.17); }
.svc__icon { width: 60px; height: 60px; display: block; }
.svc__icon img { width: 100%; height: 100%; object-fit: contain; }
.svc h3 { color: var(--ink); font-size: var(--text-lg); position: relative; }
.svc p { color: var(--ink-muted); font-size: var(--text-sm); position: relative; }

/* ---------- Banda del CARATTERE: "dal 1950" + le vetture ----------
   La storia dell'azienda e le foto delle auto da rally sono lo stesso contenuto: stanno insieme. */
.story { position: relative; background: var(--brand-dark); color: var(--on-dark); overflow: hidden; }
.story__inner { display: grid; grid-template-columns: minmax(0, .92fr) minmax(0, 1.08fr);
  gap: clamp(1.5rem, 1rem + 3vw, 3.5rem); align-items: center; }
@media (max-width: 900px) { .story__inner { grid-template-columns: 1fr; } }
.story__text h2 { color: var(--on-dark); }
.story__text h2 .accent { color: var(--accent-dark); }
.story__text p { color: var(--on-dark-muted); margin-top: var(--space-4); }
.story__year { font-family: var(--font-display); font-weight: 600; font-size: clamp(3rem, 2rem + 6vw, 6rem);
  line-height: .9; color: var(--accent-dark); letter-spacing: -0.04em; }
.story__mosaic { display: grid; grid-template-columns: 1fr 1fr; gap: var(--tile-gap); }
.story__mosaic figure { margin: 0; overflow: hidden; border-radius: var(--radius); }
.story__mosaic img { width: 100%; height: 100%; object-fit: cover;
  transition: transform 520ms var(--ease); }
.story__mosaic figure:hover img { transform: scale(1.06); }
/* Il mosaico è sfalsato: la prima tessera scavalca in altezza, mai una griglia piatta. */
.story__mosaic figure:nth-child(1) { grid-row: span 2; }
.story__mosaic figure:nth-child(1) img { aspect-ratio: 3 / 4; }
.story__mosaic figure:nth-child(2) img,
.story__mosaic figure:nth-child(3) img { aspect-ratio: 4 / 3; }
/* Il mosaico ESCE dalla misura a destra e SCAVALCA la banda successiva. È il dispositivo che rompe la
   pila di fasce centrate: senza, la pagina è cinque volte la stessa forma. La fuga a destra si calcola
   dalla distanza fra il bordo del contenuto e il bordo del viewport. */
/* ⚠ Un margine negativo su un elemento CENTRATO nella griglia non lo fa scavalcare: sposta soltanto il
   centraggio. Misurato: il mosaico restava 156px DENTRO la banda. Per uscire davvero deve essere
   ancorato all'altezza della banda (`stretch`) e i margini devono superare il padding della sezione. */
/* ⚠ Nemmeno `align-self: stretch` basta: le immagini a `height: 100%` dentro righe automatiche non hanno
   un'altezza definita, la dipendenza si chiude a cerchio e il browser ricade sull'altezza del contenuto —
   misurato, restava di nuovo 152px dentro. Il posizionamento assoluto è l'unico deterministico: la
   colonna fotografica si aggancia ai bordi della banda e li supera di una misura dichiarata.
   La cella della griglia resta come distanziatore, così il testo non ci finisce sotto. */
@media (min-width: 901px) {
  .story { z-index: 1; overflow-y: visible; }   /* ⚠ `clip` sull'asse X consente `visible` sull'altro; `hidden` no */
  .story__inner { position: relative; }
  .story__mosaic {
    position: absolute; left: 52%;
    right: calc((100vw - min(100vw, var(--container))) / -2);
    top: calc(var(--space-5) - var(--section-y-lg));
    bottom: calc(-1 * var(--section-y-lg) - var(--space-6));
    grid-template-rows: 1fr 1fr;
  }
  /* Con l'altezza definita comanda la banda e il taglio segue: le proporzioni fisse non servono più. */
  .story__mosaic figure img { aspect-ratio: auto; height: 100%; }
}

/* ---------- Muro dei MARCHI (banda chiara) ----------
   ⚠ TESTUALE, non a loghi: un logo è largo e basso e non regge le soglie FOTOGRAFICHE (lato corto >=800),
   mentre come `type: logo` non entrerebbe in Media Library. Finché manca un canale per gli asset di design
   per-progetto, i marchi si dichiarano per NOME — che è comunque il dato del cliente. */
/* Tre COLONNE EDITORIALI, non tre scatolette bianche: su una banda quasi bianca un riquadro bianco
   bordato non stacca, e il risultato era la parte più spenta della pagina. Un filetto pieno in testa,
   il titolo grande e i nomi dei marchi in misura di lettura pesano molto di più, e il filetto che si
   colora al passaggio dà alla banda una reattività che prima non aveva. */
.brand-groups { display: grid; grid-template-columns: repeat(auto-fit, minmax(260px, 1fr));
  gap: var(--space-6) var(--space-7); margin-top: var(--space-8); }
.brand-group { background: transparent; border: 0; border-radius: 0; padding: var(--space-5) 0 0;
  border-top: 2px solid var(--ink-on-light); }
.brand-group h3 { color: var(--ink-on-light); font-size: var(--text-xl); letter-spacing: -0.02em; }
.brand-group p { color: var(--sage); margin-top: var(--space-4); font-size: var(--text-base);
  line-height: 1.65; }
.brands { display: grid; grid-template-columns: repeat(auto-fit, minmax(150px, 1fr));
  gap: var(--space-4); margin-top: var(--space-7); align-items: center; }
.brands__cell { display: flex; align-items: center; justify-content: center; background: #FFFFFF;
  border: 1px solid var(--line-light); border-radius: var(--radius); padding: var(--space-4);
  aspect-ratio: 5 / 3; }
.brands__name { font-family: var(--font-display); font-weight: 600; font-size: var(--text-base);
  color: var(--ink-on-light); text-align: center; line-height: 1.25; }
.brands__cell img { max-width: 100%; max-height: 100%; width: auto; height: auto; object-fit: contain;
  transition: transform var(--dur) var(--ease); }
/* I marchi restano a COLORI: per un fornitore sono l'argomento di vendita, e il grigio spegneva del tutto
   i sei loghi che il materiale porta a bassa risoluzione. Il cliente li mostra a colori anche oggi. */
.brands__cell:hover img { transform: scale(1.06); }

/* ---------- Gallery (banda chiara, tessere quadrate apribili) ---------- */
.gal { display: grid; grid-template-columns: repeat(auto-fit, minmax(220px, 1fr));
  gap: var(--tile-gap); margin-top: var(--space-7); }
.gal figure { margin: 0; overflow: hidden; border-radius: var(--radius); background: var(--brand-dark); }
.gal img { width: 100%; height: 100%; aspect-ratio: 1 / 1; object-fit: cover;
  transition: transform 420ms var(--ease); }
.gal a:hover img { transform: scale(1.045); }
.gal figcaption { padding: var(--space-3) var(--space-1); font-size: var(--text-sm); color: var(--sage); }

/* ---------- Banda contatti (arancione: superficie, testo scuro) ---------- */
.contact-band { background: var(--accent); color: var(--paper); }
.contact-band__inner { display: grid; grid-template-columns: repeat(auto-fit, minmax(230px, 1fr));
  gap: var(--space-6); padding-block: var(--space-7); }
.contact-band__item { display: flex; gap: var(--space-4); align-items: flex-start; }
.contact-band__item .k { font-size: var(--text-xs); font-weight: 700; text-transform: uppercase;
  letter-spacing: var(--tracking-label); opacity: .82; }
.contact-band__item .v { font-family: var(--font-display); font-weight: 600; font-size: var(--text-lg);
  line-height: 1.25; }
.contact-band a { text-decoration: none; }
.contact-band a:hover { text-decoration: underline; }

/* ---------- Page-head (testata delle pagine interne, compatta) ---------- */
.page-head { background: var(--brand); color: var(--on-dark); padding-block: var(--space-7);
  border-bottom: 3px solid var(--accent); position: relative; overflow: hidden; }
.page-head h1 { font-size: var(--text-2xl); color: var(--on-dark); }
.page-head p { color: var(--on-dark-muted); margin-top: var(--space-3); max-width: 62ch; }
/* Con una foto la testata ha bisogno di respiro: a 265px il ritaglio era 5.4:1 su una foto 4:3 e del
   soggetto non restava niente. Misurato sul sito vivo.
   ⚠⚠ Il velo era DIPINTO SOTTO LA FOTO: `::before` aveva z-index 0 e `.page-head__media` z-index auto —
   a parità di livello decide l'ordine nel DOM, e lo pseudo-elemento è il primo figlio. Il titolo misurava
   1.00:1 dal pixel contro le zone chiare dello scatto ed era di fatto illeggibile; axe tace, perché su
   testo-sopra-immagine restituisce `incomplete`.
   La leggibilità NON si compra affogando la foto in un velo più scuro (a quel punto la foto non si vede
   più): si risolve per STRUTTURA, ripetendo il dispositivo firma del verticale — il pannello indaco che
   taglia in obliquo dentro lo scatto, esattamente come nell'hero. Il testo sta SEMPRE sul pieno. */
/* `align-items: stretch`, non `center`: centrato, il pannello era alto quanto il testo e lasciava due
   fettucce di foto sopra e sotto — che si leggono come un errore di allineamento, non come una scelta. */
.page-head--photo { padding-block: 0; min-height: clamp(19rem, 15rem + 9vw, 26rem);
  display: grid; align-items: stretch; isolation: isolate; }
.page-head--photo .container { display: flex; flex-direction: column; justify-content: center; }
.page-head--photo .page-head__media { position: absolute; inset: 0; z-index: -3; }
.page-head--photo .page-head__media img { width: 100%; height: 100%; object-fit: cover; object-position: center 45%; }
/* Velo leggero: tiene coerente il fotogramma quando lo scatto è chiaro, senza spegnerlo. */
.page-head--photo::before { content: ""; position: absolute; inset: 0; z-index: -2;
  background: linear-gradient(90deg, rgba(18,18,18,.34) 0%, rgba(18,18,18,.08) 58%, rgba(18,18,18,.36) 100%); }
.page-head--photo .container { position: relative; z-index: 1;
  padding-block: clamp(2.5rem, 1.7rem + 3.4vw, 4.5rem); }
/* Il pannello esce dal bordo sinistro del viewport e si chiude in obliquo dentro la foto. */
.page-head--photo .container::before {
  content: ""; position: absolute; top: 0; bottom: 0; left: calc(50% - 50vw);
  right: calc(100% - 50rem); background: var(--brand); z-index: -1;
  clip-path: polygon(0 0, 100% 0, calc(100% - var(--slant-w)) 100%, 0 100%);
}
/* Il testo non deve mai sporgere oltre la pendenza: il pannello perde `--slant-w` in basso. */
.page-head--photo .container > * { position: relative; max-width: calc(50rem - var(--slant-w) - var(--space-8)); }
@media (max-width: 900px) {
  .page-head--photo .container::before { right: calc(50% - 50vw); clip-path: none;
    background: linear-gradient(180deg, var(--brand) 0%, var(--brand) 84%, rgba(46,46,122,.94) 100%); }
  .page-head--photo .container > * { max-width: none; }
}

/* ---------- Pagina interna: split testo | foto ---------- */
.split { display: grid; grid-template-columns: repeat(auto-fit, minmax(300px, 1fr));
  gap: clamp(1.5rem, 1rem + 3vw, 3.5rem); align-items: center; }
.split__media { overflow: hidden; border-radius: var(--radius); }
.split__media img { width: 100%; height: auto; }
/* Le foto scontornate non si tagliano: contain su fondo di marca. */
.split__media--contain { background: var(--brand-dark); display: flex; align-items: center; }
.split__media--contain img { object-fit: contain; }

/* ---------- Pagina Contatti a 2 colonne ---------- */
.contact-cols { display: grid; grid-template-columns: 1.1fr .9fr; gap: clamp(1.5rem, 1rem + 3vw, 3.5rem);
  align-items: start; }
@media (max-width: 860px) { .contact-cols { grid-template-columns: 1fr; } }
.contact-form .field { display: flex; flex-direction: column; gap: var(--space-2); margin-bottom: var(--space-4); }
.contact-form .row { display: grid; grid-template-columns: 1fr 1fr; gap: var(--space-4); }
@media (max-width: 520px) { .contact-form .row { grid-template-columns: 1fr; } }
.contact-form label { font-size: var(--text-xs); font-weight: 600; letter-spacing: var(--tracking-label);
  text-transform: uppercase; color: var(--ink-muted); }
.contact-form input, .contact-form textarea { font: inherit; color: var(--ink); background: var(--surface);
  border: 1px solid var(--line); border-radius: var(--radius); padding: .7em .9em; }
.contact-form input:focus-visible, .contact-form textarea:focus-visible { border-color: var(--accent); }
.contact-form textarea { min-height: 9rem; resize: vertical; }
.contact-form .consent { display: flex; gap: var(--space-3); align-items: flex-start; margin-block: var(--space-4); }
.contact-form .consent span { font-size: var(--text-sm); color: var(--ink-muted); }
.contact-info { background: var(--surface); border: 1px solid var(--line); border-radius: var(--radius);
  padding: var(--space-6); }
.contact-info dt { font-size: var(--text-xs); font-weight: 600; letter-spacing: var(--tracking-label);
  text-transform: uppercase; color: var(--accent-dark); margin-top: var(--space-4); }
.contact-info dt:first-child { margin-top: 0; }
.contact-info dd { margin: var(--space-1) 0 0; color: var(--ink); }
.contact-info a { text-decoration: none; }
.contact-info a:hover { text-decoration: underline; }

/* ---------- Footer ---------- */
.site-footer { background: var(--brand-dark); color: var(--on-dark); padding-block: var(--space-8) var(--space-5); }
.site-footer__grid { display: grid; grid-template-columns: 1.3fr 1fr 1fr 1.1fr; gap: var(--space-6); }
@media (max-width: 900px) { .site-footer__grid { grid-template-columns: 1fr 1fr; } }
@media (max-width: 560px) { .site-footer__grid { grid-template-columns: 1fr; } }
.site-footer h2 { font-size: var(--text-xs); font-weight: 700; letter-spacing: var(--tracking-label);
  text-transform: uppercase; color: var(--accent-dark); font-family: var(--font-body); }
.site-footer p, .site-footer li { color: var(--on-dark-muted); font-size: var(--text-sm); }
.site-footer ul { margin-top: var(--space-3); display: grid; gap: var(--space-2); }
.site-footer a { text-decoration: none; }
.site-footer a:hover { color: var(--on-dark); text-decoration: underline; }
.site-footer__marks { margin-top: var(--space-4); background: #FFFFFF; border-radius: var(--radius);
  padding: var(--space-3); }
.site-footer__legal { margin-top: var(--space-7); padding-top: var(--space-4);
  border-top: 1px solid rgba(255,255,255,.14); display: grid; grid-template-columns: 1fr auto 1fr;
  align-items: center; gap: var(--space-4); font-size: var(--text-xs); color: var(--on-dark-muted); }
@media (max-width: 720px) { .site-footer__legal { grid-template-columns: 1fr; text-align: center; } }
.site-footer__legal .right { justify-self: end; }
@media (max-width: 720px) { .site-footer__legal .right { justify-self: center; } }
.powered { display: inline-flex; align-items: center; gap: .4rem; text-decoration: none; justify-self: center; }
.powered img { width: 20px; height: 20px; }

/* ---------- CTA bar fissa (mobile) ---------- */
.cta-bar { position: fixed; left: 0; right: 0; bottom: 0; z-index: 60; display: none;
  background: var(--brand-dark); border-top: 1px solid rgba(255,255,255,.16); }
.cta-bar > * { margin-block: 0; }
.cta-bar__inner { display: grid; grid-template-columns: 1fr 1fr; }
.cta-bar a { display: flex; align-items: center; justify-content: center; gap: var(--space-2);
  padding: var(--space-4) var(--space-3); text-decoration: none; font-weight: 600; font-size: var(--text-sm); }
a.cta-bar__call { color: var(--on-dark); }
a.cta-bar__quote { background: var(--accent); color: var(--paper); }
@media (max-width: 860px) { .cta-bar { display: block; } body { padding-bottom: 56px; } }

/* ---------- Scroll reveal (micro-JS IntersectionObserver) ----------
   ⚠ SOLO MOVIMENTO, mai opacity: un testo vicino alla soglia AA scende sotto durante la dissolvenza, e
   un elemento a opacity:0 può impedire alle immagini che contiene di scaricarsi. Fail-visible senza JS. */
@media (prefers-reduced-motion: no-preference) {
  /* SOLO movimento, mai opacità: un testo in dissolvenza attraversa la soglia AA mentre sfuma, e un
     elemento trasparente può impedire il download delle immagini che contiene. Regola pagata due volte. */
  .js .reveal { transform: translateY(28px); transition: transform 760ms var(--ease-out);
    transition-delay: calc(var(--reveal-i, 0) * 80ms); }
  .js .reveal.is-visible { transform: none; }
  .js .reveal--left { transform: translateX(-32px); }
  .js .reveal--right { transform: translateX(32px); }
  /* La scala entra dal "quasi a fuoco": adatta alle tessere fotografiche, dove uno scivolamento
     laterale competerebbe con il taglio della griglia. */
  .js .reveal--scale { transform: scale(.94); }
  /* Salita lunga per i blocchi pieni, che devono arrivare con peso. */
  .js .reveal--rise { transform: translateY(56px); }
  .js .reveal--left.is-visible, .js .reveal--right.is-visible,
  .js .reveal--scale.is-visible, .js .reveal--rise.is-visible { transform: none; }
}
/* Un reveal orizzontale sborda: si taglia sull'asse X. Mai `hidden` (romperebbe lo sticky dell'header). */
.section, .story, .hero { overflow-x: clip; }

/* ---------- Lightbox (attivata da a.zoom, resa da reveal.js — no-op se non usata) ---------- */
/* ⚠ reveal.js CREA il contenitore .fp-lb al caricamento della pagina (nascosto) e lo apre commutando la
   classe `is-open`. Senza lo stato nascosto qui, l'overlay resta SEMPRE visibile: oscura la pagina,
   INTERCETTA OGNI CLICK e la X non chiude nulla perche' non c'era niente di aperto. */
.fp-lb { position: fixed; inset: 0; z-index: 100; background: rgba(10,10,12,.94);
  display: none; align-items: center; justify-content: center; padding: var(--space-6); }
.fp-lb.is-open { display: flex; }
.fp-lb img { max-width: min(94vw, 1400px); max-height: 88vh; width: auto; height: auto; object-fit: contain; }
.fp-lb__x { position: absolute; top: var(--space-5); right: var(--space-5); width: 48px; height: 48px;
  border-radius: var(--radius-pill); border: 2px solid rgba(255,255,255,.5); background: transparent;
  font-size: 0; transition: border-color var(--dur) var(--ease), transform var(--dur) var(--ease); }
.fp-lb__x::before, .fp-lb__x::after { content: ""; position: absolute; left: 50%; top: 50%;
  width: 20px; height: 2px; background: #F6F6F6; }
.fp-lb__x::before { transform: translate(-50%, -50%) rotate(45deg); }
.fp-lb__x::after { transform: translate(-50%, -50%) rotate(-45deg); }
.fp-lb__x:hover { border-color: var(--accent-dark); transform: rotate(90deg); }
.fp-lb__x:hover::before, .fp-lb__x:hover::after { background: var(--accent-dark); }

/* ---------- Icone dei servizi: data-URI nel CSS, non percorsi nel markup ----------
   ⚠ Un url("../assets/…") dentro il post_content NON risolve: rewriteOf riscrive solo i .php del tema.
   Qui il data-URI non deve risolvere nulla, e l'icona viaggia con l'item via [data-icon]. */
.svc__icon[data-icon="progettazione"] { background-image: url("data:image/svg+xml,%3Csvg%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20viewBox%3D%220%200%2064%2074%22%20role%3D%22img%22%20aria-label%3D%22Progettazione%20e%20realizzazione%20impianti%22%3E%20%3Cpath%20d%3D%22M0%200h64v56H38l-6%2010-6-10H0Z%22%20fill%3D%22%23e26a0d%22%2F%3E%20%3Cg%20fill%3D%22none%22%20stroke%3D%22%23FFFFFF%22%20stroke-width%3D%222.6%22%20stroke-linecap%3D%22round%22%20stroke-linejoin%3D%22round%22%3E%20%3Cpath%20d%3D%22M16%2030a16%2016%200%200%201%2032%200%22%2F%3E%20%3Cpath%20d%3D%22M13%2030h38%22%2F%3E%20%3Cpath%20d%3D%22M28%2015.5a14%2014%200%200%200-6%208%22%2F%3E%20%3Cpath%20d%3D%22M20%2038h24v8H20z%22%2F%3E%20%3Cpath%20d%3D%22M26%2038v8M34%2038v8%22%2F%3E%20%3C%2Fg%3E%20%3C%2Fsvg%3E"); }
.svc__icon[data-icon="assistenza"] { background-image: url("data:image/svg+xml,%3Csvg%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20viewBox%3D%220%200%2064%2074%22%20role%3D%22img%22%20aria-label%3D%22Assistenza%20post%20vendita%22%3E%20%3Cpath%20d%3D%22M0%200h64v56H38l-6%2010-6-10H0Z%22%20fill%3D%22%23e26a0d%22%2F%3E%20%3Cg%20fill%3D%22none%22%20stroke%3D%22%23FFFFFF%22%20stroke-width%3D%222.6%22%20stroke-linecap%3D%22round%22%20stroke-linejoin%3D%22round%22%3E%20%3Cpath%20d%3D%22M18%2032v-4a14%2014%200%200%201%2028%200v4%22%2F%3E%20%3Crect%20x%3D%2213%22%20y%3D%2230%22%20width%3D%228%22%20height%3D%2212%22%20rx%3D%223%22%2F%3E%20%3Crect%20x%3D%2243%22%20y%3D%2230%22%20width%3D%228%22%20height%3D%2212%22%20rx%3D%223%22%2F%3E%20%3Cpath%20d%3D%22M46%2042v2a5%205%200%200%201-5%205h-6%22%2F%3E%20%3Ccircle%20cx%3D%2232%22%20cy%3D%2249%22%20r%3D%222.4%22%2F%3E%20%3C%2Fg%3E%20%3C%2Fsvg%3E"); }
.svc__icon[data-icon="manutenzione"] { background-image: url("data:image/svg+xml,%3Csvg%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20viewBox%3D%220%200%2064%2074%22%20role%3D%22img%22%20aria-label%3D%22Manutenzione%20attrezzature%22%3E%20%3Cpath%20d%3D%22M0%200h64v56H38l-6%2010-6-10H0Z%22%20fill%3D%22%23e26a0d%22%2F%3E%20%3Cg%20fill%3D%22none%22%20stroke%3D%22%23FFFFFF%22%20stroke-width%3D%222.6%22%20stroke-linecap%3D%22round%22%20stroke-linejoin%3D%22round%22%3E%20%3Ccircle%20cx%3D%2226%22%20cy%3D%2224%22%20r%3D%227%22%2F%3E%20%3Cpath%20d%3D%22M26%2012v4M26%2032v4M38%2024h-4M18%2024h-4M34.5%2015.5l-2.8%202.8M20.3%2029.7l-2.8%202.8M34.5%2032.5l-2.8-2.8M20.3%2018.3l-2.8-2.8%22%2F%3E%20%3Cpath%20d%3D%22M50%2030a7%207%200%200%200-9%208.6L30%2049.6a3.4%203.4%200%200%200%204.8%204.8L45.7%2043.4A7%207%200%200%200%2054%2034l-4.2%201.8-2.6-2.6L50%2030Z%22%2F%3E%20%3C%2Fg%3E%20%3C%2Fsvg%3E"); }
.svc__icon[data-icon="riparazione"] { background-image: url("data:image/svg+xml,%3Csvg%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20viewBox%3D%220%200%2064%2074%22%20role%3D%22img%22%20aria-label%3D%22Riparazione%22%3E%20%3Cpath%20d%3D%22M0%200h64v56H38l-6%2010-6-10H0Z%22%20fill%3D%22%23e26a0d%22%2F%3E%20%3Cg%20fill%3D%22none%22%20stroke%3D%22%23FFFFFF%22%20stroke-width%3D%222.6%22%20stroke-linecap%3D%22round%22%20stroke-linejoin%3D%22round%22%3E%20%3Cpath%20d%3D%22M44%2014a7%207%200%200%200-8.4%209.2L18%2040.8a3.6%203.6%200%200%200%205.1%205.1l17.6-17.6A7%207%200%200%200%2049%2020l-4.2%201.8-2.6-2.6L44%2014Z%22%2F%3E%20%3Cpath%20d%3D%22M20%2014l8%208%22%2F%3E%20%3Cpath%20d%3D%22M17%2011a4.2%204.2%200%200%201%206%200l2%202-6%206-2-2a4.2%204.2%200%200%201%200-6Z%22%2F%3E%20%3Cpath%20d%3D%22M28%2022%2046%2040a3.6%203.6%200%200%201-5.1%205.1L23%2027%22%2F%3E%20%3C%2Fg%3E%20%3C%2Fsvg%3E"); }
.svc__icon { background-repeat: no-repeat; background-position: center top; background-size: contain; }

/* ---------- PARALLASSE (elementi [data-parallax], mossi da reveal.js) ----------
   La fotografia scorre più lenta della pagina: entra ed esce dalla propria banda invece di restare
   inchiodata. Serve margine sopra e sotto, altrimenti lo spostamento scopre il bordo del contenitore. */
[data-parallax] { will-change: transform; }
.page-head--photo .page-head__media { inset: -7% 0; height: 114%; }

/* Testata che RUOTA: stesse foto già presenti più sotto nella pagina, in dissolvenza invece che ferme.
   Riusa la meccanica dell'hero (keyframe e passo), così il ritmo del sito è uno solo. */
.ph-slide { position: absolute; inset: 0; opacity: 0;
  animation: fp-hero-fade3 24s linear infinite; animation-delay: var(--d, 0s); }
.ph-slide img { width: 100%; height: 100%; object-fit: cover; object-position: center 45%; }
.page-head__media { --step: 8s; }
.ph-slide:nth-child(1) { --d: 0s; }
.ph-slide:nth-child(2) { --d: var(--step); }
.ph-slide:nth-child(3) { --d: calc(2 * var(--step)); }
.ph-slide:nth-child(4) { --d: calc(3 * var(--step)); }
.page-head__media:has(.ph-slide:nth-child(4)) .ph-slide { animation-name: fp-hero-fade4; animation-duration: 32s; }
.page-head__media:has(.ph-slide:nth-child(2):last-child) .ph-slide { animation-name: fp-hero-fade2; animation-duration: 16s; }
@keyframes fp-hero-fade2 { 0% { opacity: 0 } 7%, 50% { opacity: 1 } 57%, 100% { opacity: 0 } }
@media (prefers-reduced-motion: reduce) {
  .ph-slide { animation: none; opacity: 0; }
  .ph-slide:nth-child(1) { opacity: 1; }
}
.band__media { position: absolute; inset: -8% 0; height: 116%; z-index: -2; }
.band__media img { width: 100%; height: 100%; object-fit: cover; }

/* ---------- NASTRO CONTINUO (pista [data-marquee], duplicata da reveal.js) ----------
   Il muro dei marchi è un elenco: in nastro diventa un movimento costante e leggibile, e non ha più
   un'ultima riga da riempire. La copia è aria-hidden; in pausa all'hover e ferma su reduced-motion. */
.marquee { display: flex; overflow: hidden; gap: var(--space-6); margin-top: var(--space-7);
  mask-image: linear-gradient(90deg, transparent, #000 5%, #000 95%, transparent); }
.marquee__track { display: flex; align-items: center; gap: var(--space-6); flex: 0 0 auto;
  animation: fp-marquee 52s linear infinite; }
.marquee:hover .marquee__track { animation-play-state: paused; }
/* Nel nastro la cella ha una larghezza propria: in griglia gliela dava la colonna. */
.marquee .brands__cell { flex: 0 0 auto; width: 178px; }
@keyframes fp-marquee { from { transform: translateX(0) } to { transform: translateX(calc(-100% - var(--space-6))) } }
@media (prefers-reduced-motion: reduce) {
  /* ⚠ MAI `overflow-x: auto` qui: creerebbe una regione scrollabile non raggiungibile da tastiera —
     una violazione a11y presa in un altro sito. Senza movimento il nastro torna una fila che va a capo. */
  .marquee { overflow: visible; mask-image: none; }
  .marquee__track { animation: none; flex-wrap: wrap; }
  .marquee .is-clone { display: none; }   /* senza movimento la copia è solo un doppione visibile */
}

/* ---------- Micro-interazioni: la superficie risponde ----------
   Il movimento all'hover è piccolo e sempre accompagnato da un secondo segnale (filetto, ombra, scala
   della foto): su fondo scuro il solo sollevamento non si legge. */
.card, .svc, .hub__card { transition: transform var(--dur) var(--ease), box-shadow var(--dur-slow) var(--ease),
  border-color var(--dur) var(--ease), background-color var(--dur) var(--ease); }
.card:hover, .svc:hover { transform: translateY(-6px); box-shadow: var(--shadow-md); }
.hub__card:hover { transform: translateY(-6px); box-shadow: var(--shadow-md); }
.card:hover .card__more { color: var(--accent); }
.card__more { transition: color var(--dur) var(--ease); }
/* La freccia della tessera categoria scatta in avanti: dice "si va di là". */
.hub__go { transition: transform var(--dur) var(--ease), background-color var(--dur) var(--ease); }
.hub__card:hover .hub__go { transform: translateX(4px); background: var(--accent-deep); }
/* Le foto delle schede respirano un po' di più all'hover (la scala era 1.04, impercettibile). */
.card:hover .card__media img, .hub__card:hover img { transform: scale(1.07); }
/* Il bottone si solleva e si allarga di un filo: due segnali, non uno. */
.btn:hover { transform: translateY(-2px); box-shadow: 0 8px 22px rgba(0,0,0,.32); }
.brands__cell { transition: transform var(--dur) var(--ease), filter var(--dur) var(--ease); }
.brands__cell:hover { transform: translateY(-3px); }

/* Micro-interazioni sulle superfici secondarie: anche il muro dei marchi e le voci del footer
   rispondono. Su un sito di catalogo la reattività è ciò che distingue una pagina viva da una stampata. */
.brand-group { transition: transform var(--dur) var(--ease), box-shadow var(--dur-slow) var(--ease); }
.brand-group:hover { transform: translateY(-4px); box-shadow: 0 14px 30px rgba(0,0,0,.10); }
.svc__icon { transition: transform var(--dur-slow) var(--ease); }
.svc:hover .svc__icon { transform: translateY(-3px) rotate(-4deg); }
.site-footer a { transition: color var(--dur) var(--ease); }
.site-footer a:hover { color: var(--accent-dark); }
.story__mosaic figure { transition: transform var(--dur) var(--ease); }

/* Il filetto della colonna editoriale si accende al passaggio: il sollevamento con ombra apparteneva
   alla scheda bianca, che qui non c'è più. */
.brand-group { transition: transform var(--dur) var(--ease), border-color var(--dur-slow) var(--ease); }
.brand-group:hover { transform: translateY(-4px); border-top-color: var(--accent); box-shadow: none; }
/* Le etichette delle tessere categoria reggono il peso della foto: erano in misura di sottotitolo. */
.hub__label h3 { font-size: var(--text-xl); letter-spacing: -0.02em; }
.hub__go { width: 38px; height: 38px; }

/* ---------- Segnale di scorrimento nell'hero ----------
   Un filetto che scende sul bordo basso della banda: dice "c'è dell'altro sotto" senza aggiungere
   markup (lo pseudo-elemento libero dell'hero) né rubare attenzione al titolo. */
.hero::before { content: ""; position: absolute; left: 50%; bottom: 20px; z-index: 2;
  width: 2px; height: 40px; border-radius: 2px; pointer-events: none;
  background: linear-gradient(180deg, rgba(245,160,63,0), var(--accent-dark));
  animation: fp-scroll-hint 2.6s var(--ease) infinite; }
@keyframes fp-scroll-hint {
  0% { transform: translateY(-12px) scaleY(.4); opacity: 0 }
  45% { opacity: .95 }
  100% { transform: translateY(12px) scaleY(1); opacity: 0 }
}
/* L'alone pulsante sta sulla SOLA CTA primaria dell'hero: sull'header sarebbe rumore permanente. */
.hero__cta .wp-block-button.is-accent .wp-block-button__link { position: relative; isolation: isolate; }
.hero__cta .wp-block-button.is-accent .wp-block-button__link::after {
  content: ""; position: absolute; inset: -3px; z-index: -1; border-radius: var(--radius-pill);
  border: 2px solid var(--accent); animation: fp-cta-halo 2.8s var(--ease) infinite; }
@keyframes fp-cta-halo {
  0% { transform: scale(1); opacity: .55 }
  70%, 100% { transform: scale(1.16); opacity: 0 }
}
@media (prefers-reduced-motion: reduce) {
  .hero::before, .hero__cta .wp-block-button.is-accent .wp-block-button__link::after { animation: none; }
  .hero::before { opacity: .8; transform: none; }
}
/* Le voci di navigazione e i recapiti rispondono al passaggio come tutto il resto. */
.site-header .site-nav .wp-block-navigation-item__content,
.site-header__phone, .contact-band a, .contact-info a, .brands__name {
  transition: color var(--dur) var(--ease), transform var(--dur) var(--ease); }
.contact-band a:hover, .contact-info a:hover { transform: translateX(2px); }

/* ---------- Le due sezioni della home che non sono "una sezione qualsiasi" ----------
   La vetrina fotografica e la striscia del metodo avevano la stessa forma di tutte le altre: cinque
   fasce identiche in fila. La differenza è strutturale, non solo di nome. */
/* Vetrina: respiro maggiore e un velo che la stacca dall'hero senza introdurre un'altra tinta. */
.section--showcase { padding-block: var(--section-y-lg);
  background: linear-gradient(180deg, rgba(46,46,122,.14) 0%, transparent 46%); }
/* Metodo: filetto di marca in testa e passo più stretto — è una striscia, non un episodio. */
.section--method { padding-block: var(--section-y); border-top: 1px solid var(--line); }
.section--method .section-intro h2::after { background: var(--accent); }
/* Il footer entra a colonne sfalsate come il resto della pagina. */
.site-footer__grid > * { --reveal-i: 0; }

/* ---------- Banda CTA di marca ----------
   Non è un episodio ma una CHIAMATA: passo normale, non il grado largo, e contenuto CENTRATO. Con il
   contenitore stretto e il testo a bandiera la banda risultava alta 330px con tre elementi piccoli
   appoggiati a sinistra — molto vuoto e nessun centro visivo. */
.section--brand { padding-block: var(--section-y); text-align: center; }
.section--brand .container--narrow { margin-inline: auto; }
.section--brand h2 { color: var(--on-dark); font-size: var(--text-2xl); }
.section--brand p { color: var(--on-dark-muted); }
.section--brand .btn { margin-top: var(--space-2); }

/* La colonna fotografica delle pagine interne esce dalla misura verso il bordo, come il mosaico della
   storia: è lo stesso dispositivo, e impedisce che ogni pagina di catalogo sia due rettangoli affiancati
   dentro la stessa cornice. ⚠ Qui l'elemento è nel FLUSSO, quindi il margine si misura dal content box e
   il gutter va sottratto — al contrario del mosaico, che è assoluto e parte dal padding box. */
@media (min-width: 901px) {
  .split__media--bleed { margin-right: calc((100vw - min(100vw, var(--container))) / -2 - var(--gutter)); }
  .split__media--bleed img { border-radius: var(--radius) 0 0 var(--radius); }
}

/* Su telefono l'header non ha né menu né recapiti in linea: la stessa altezza del desktop sarebbe
   verticale rubato alla prima schermata. */
@media (max-width: 599.98px) { .site-header__row { padding-block: var(--space-4); } }

/* La riga delle promozioni è SFALSATA in verticale: tre schede allineate al millimetro sono un listino,
   tre schede a quote diverse sono una composizione. Lo scarto è piccolo e regolare, così resta un ritmo
   e non sembra un errore di allineamento. Solo sopra la misura piena: impilate non avrebbe senso. */
@media (min-width: 901px) {
  .section.alt .cards > :nth-child(2) { margin-top: var(--space-6); }
  .section.alt .cards > :nth-child(3) { margin-top: var(--space-8); }
}

/* ---------- Il footer resta in fondo anche sulle pagine corte ----------
   Su una pagina con poco contenuto (Partner: testata + una fascia di marchi) il footer finiva a metà
   schermo con sotto una banda vuota del fondo pagina: sembra un errore di caricamento. La colonna
   flessibile alta almeno quanto la finestra spinge il footer sul bordo inferiore.
   ⚠ `display: contents` sui template-part fa sì che header, main e footer siano davvero i figli di
   .wp-site-blocks: senza quello il main non sarebbe l'elemento che cresce. */
.wp-site-blocks { display: flex; flex-direction: column; min-height: 100vh; }
.wp-site-blocks > main { flex: 1 0 auto; }

/* ---------- Interventi: la foto sta SOTTO la sua descrizione ----------
   Sul sito del cliente ogni voce dell'elenco è la DIDASCALIA di una fotografia precisa: le due cose
   stanno appaiate, ed è così che si capisce di che lavoro si parla. Affiancare il testo a una foto sola
   perdeva quel legame. Il rapporto di ogni scatto arriva dal generatore (--ar) perché il ritaglio segua
   il soggetto: fra questi ce n'è uno verticale, e forzarlo in 4/3 decapiterebbe il ponte sollevatore. */
.works { display: grid; grid-template-columns: repeat(auto-fit, minmax(min(100%, 19rem), 1fr));
  gap: var(--space-7) var(--space-5); margin-top: var(--space-8); align-items: start; }
.work { margin: 0; display: flex; flex-direction: column; gap: var(--space-4); }
.work a { display: block; overflow: hidden; border-radius: var(--radius); background: var(--brand-dark); }
.work img { width: 100%; aspect-ratio: 1 / 1; object-fit: cover;
  transition: transform 480ms var(--ease); }
.work a:hover img { transform: scale(1.06); }
.work figcaption { color: var(--ink-muted); font-size: var(--text-sm); line-height: 1.62;
  border-top: 2px solid var(--accent); padding-top: var(--space-3); }
/* Un solo scatto senza didascalia: fascia larga, non una tessera sperduta in una griglia. */
.work--wide { grid-column: 1 / -1; }
.work--wide img { aspect-ratio: 21 / 9; }
/* Il testo introduttivo di una pagina di servizio sta alla misura di LETTURA, non a piena banda. */
.lead-block { max-width: 62ch; }
.lead-block p + p { margin-top: var(--space-4); }
.lead-block p { font-size: var(--text-md); color: var(--ink); line-height: 1.66; }

/* ---------- Testata con fotografia PICCOLA ----------
   Per alcune pagine l'unica fotografia che il cliente associa è una 600x600 (è il massimo che il suo
   sito serva: lo dichiara il suo stesso srcset). Stesa su tutta la banda andrebbe ingrandita 2,4 volte
   e si sgranerebbe. Confinandola alla parte VISIBILE della testata — quella a destra del pannello — il
   fattore scende a ~1,3. Sotto i 901px il pannello copre tutta la banda e la foto torna piena. */
@media (min-width: 901px) {
  .page-head--right .page-head__media { left: 46%; }
}
