/* ==========================================================================
   gio.css — foglio di marca di Giò Soluzioni Casa · gruppo edilgetica
   --------------------------------------------------------------------------
   Che cos'è. Il tema Antra è comprato e generico: parla inglese, ha l'accento
   blu del portale e una scala tipografica che non è la nostra. Questo foglio
   non riscrive il tema: lo corregge dove sbaglia e gli dà la voce di Giò —
   «la persona di fiducia che ti accompagna in casa: caldo, umano, concreto»
   (docs/satellite-personalities.md §gio).

   Ordine di caricamento (tools/gio-shell.mjs):
     bootstrap … nice-select … main.css → variables.css → base.css → gio.css
   Quindi qui si può sovrascrivere sia il tema sia base.css usando la cascata:
   a parità di specificità vince chi viene dopo. `!important` è usato SOLO
   dove il valore da battere è uno stile inline scritto da JavaScript, e ogni
   occorrenza è commentata: sono SETTE in tutto il file e stanno tutte nel §14
   — tre per rimettere in vista i blocchi che il tema anima e quattro dentro
   `prefers-reduced-motion`, dove la regola d'accessibilità deve battere
   qualunque cosa. Cercare "important" per contarle.

   Regole di casa rispettate qui dentro:
   - «edilgetica» sempre minuscolo · separatore «·» · niente emoji;
   - motivo chevron ABOLITO: mai come bullet, divider, decorazione o
     pseudo-elemento. Dove serve un punto elenco c'è un filetto orizzontale;
   - il blu di gruppo (--color-group) solo per la firma endorsed, il footer di
     gruppo e i link al portale: mai in CTA, tag, barre o hover locali;
   - nessun colore scritto a mano: solo i token di variables.css.

   Accento terracotta — dove sì, dove no (§gio + docs/contrast-report.md):
     sì  barra sopra il kicker, badge/tag delle fasi, CTA primaria piena,
         hover dei link di sezione, numeri dei percorsi;
     no  mai come campitura di sezione, mai su testi lunghi, mai nel footer.
   AA: --color-primary #c05b3c vale 4,37:1 su bianco → SOLO elementi grandi e
   componenti di interfaccia (≥3:1). Per il testo si usa sempre
   --color-primary-strong #bc593b (4,54:1 su bianco). Su sand nemmeno strong
   basta (4,17:1): lì il testo d'accento diventa --ink-800 (10,94:1) e resta
   accento solo il filetto. La commutazione è automatica, vedi §1.3.

   Componenti, non pagine. Le pagine interne sono state scritte da un altro
   agente mentre questo foglio nasceva: qui si aggancia SOLO il vocabolario del
   tema (.section-title, .tl-primary-btn, …) e le classi eg-*. Nessun selettore
   dipende dall'ordine dei figli o dalla struttura di una singola pagina —
   l'unica eccezione è il :nth-child del §11.1, che serve a BATTERE un
   :nth-child del tema e non a descrivere una pagina.
   Gli attributi data-gio-* sono il contratto del JavaScript
   (docs/gio-modulo-ricerca.md §7.1) e NON compaiono mai come selettori:
   l'unica eccezione ammessa dal contratto è [hidden], che è HTML standard.

   INDICE
     1  il ponte con le variabili del tema        9  la card immobile
     2  lingua (Title Case, «edilgetica»)        10  il motore di ricerca
     3  tipografia e superfici                   11  i blocchi della home
     4  ritmo delle sezioni                      12  footer
     5  bottoni                                  13  note di bozza
     6  testata                                  14  accessibilità
     7  hero                                     15  le otto pagine interne
     8  la barra di ricerca                      16  modo revisione e residui
                                                 17  la regola scritta: scala,
                                                     occhiello, ritmo,
                                                     superfici (mappa §17.8,
                                                     pannelli in colonna §17.10)
                                                 18  modo revisione e residui

   DOVE SI GUARDA PRIMA. Il §17 è l'unico capitolo che vale su tutte e nove le
   pagine insieme: ci sono scritte la scala dei titoli, la regola del colore
   dell'occhiello e il ritmo delle sezioni con la mappa delle superfici. Chi
   aggiunge una pagina legge quello, non misura gli screenshot. Chi aggiunge un
   BLOCCO dentro una delle due pagine lunghe legge il §17.10, che è la stessa
   regola applicata dentro una colonna.

   PESO: 170,3 KB non compresso (174.399 byte in UTF-8), 49,1 KB gzip, 3.988
   righe — di cui il 56% sono commenti. Il foglio serve nove pagine, un tema
   comprato da correggere e un motore di ricerca.
   ========================================================================== */


/* ==========================================================================
   1. IL PONTE CON IL TEMA
   Il tema centralizza colore e caratteri in variabili --tl-*. Ridefinirle è
   il modo più economico e meno invasivo di cambiargli voce: una regola qui
   sistema centinaia di regole in main.css, e i punti in cui il tema cambia
   idea (fondo scuro, footer) si governano ri-dichiarando la stessa variabile
   più in basso nell'albero, senza inseguire selettori.
   ========================================================================== */

:root{
  /* --- l'accento del tema diventa il terracotta di ramo ---------------------
     Vale --color-primary-strong e non --color-primary perché main.css usa
     questa variabile anche per testo piccolo (hover dei link, numeri, voci di
     menu): strong regge 4,54:1 su bianco, primary si fermerebbe a 4,37:1. */
  --tl-color-theme-primary: var(--color-primary-strong);

  /* --- i caratteri di gruppo al posto del Cal Sans del tema ---------------
     base.css ha già portato Montserrat/Source Sans su h1-h4 e sul corpo; qui
     si completa il lavoro per tutto ciò che il tema imposta con var(--tl-ff-*)
     (bottoni, occhielli, menu, footer, filigrane). Senza questo il sito
     resterebbe bilingue: titoli nostri, bottoni del tema. */
  --tl-ff-heading: var(--font-display);
  --tl-ff-body: var(--font-body);
  --tl-ff-p: var(--font-body);

  /* --- i neutri del tema allineati ai token -------------------------------
     Antra usa #191919 per i titoli e #4D4D52 per il corpo: due grigi che non
     stanno nella nostra scala. Passano a ink-900 e text-body, così l'inchiostro
     è uno solo su tutto il sito. */
  --tl-color-heading-primary: var(--ink-900);
  --tl-color-text-body: var(--text-body);
  --tl-color-grey-1: var(--text-muted);
  --tl-color-grey-2: var(--ink-400);
  --tl-color-border-1: var(--line);
  --tl-color-bg-1: var(--surface-dark);

  /* --- variabili di questo foglio -----------------------------------------
     --gio-accento  colore ammesso per il TESTO d'accento sulla superficie
                    corrente (cambia da solo entrando in sand o nel buio);
     --gio-filetto  colore delle barrette decorative (non è testo: soglia 3:1);
     --gio-bordo-campo  bordo dei campi di modulo: --line (1,31:1) non basta
                    per un componente di interfaccia, che vuole 3:1
                    (WCAG 1.4.11 — docs/gio-modulo-ricerca.md §8.2);
     --gio-riga     filetto di separazione fra blocchi. */
  --gio-accento: var(--color-primary-strong);
  --gio-accento-titolo: var(--color-primary-strong);
  --gio-filetto: var(--color-primary);
  --gio-bordo-campo: var(--ink-400);
  --gio-riga: var(--line);
  --gio-campo-h: 46px;
}

/* main.css dichiara `img{max-width:100%}` e si ferma lì. È mezza regola: con
   gli attributi `width`/`height` in pagina (che servono, e servono giusti, per
   non far ballare il layout mentre le foto arrivano) l'altezza resta una
   misura assoluta mentre la larghezza viene compressa dal max-width. Risultato
   misurato su /home-staging: una foto 1200×686 impaginata a 446×800, cioè
   schiacciata del 68%. `height:auto` è l'altra metà della regola: l'altezza
   la ricava il browser dal rapporto vero. Sta qui e non su una classe perché
   il difetto è del foglio di base, non di un blocco. */
img{ height: auto; }

/* Il tema dipinge il fondo pagina di #f6f6f6: un grigio freddo che non è nella
   nostra scala. La pagina è bianca, e il calore lo porta il sand. */
body{
  background-color: var(--surface-page);
  font-family: var(--font-body);
  font-size: var(--text-md);
  line-height: var(--leading-body);
  color: var(--text-body);
}


/* ==========================================================================
   2. LINGUA — via il Title Case, via l'uppercase sul nome del gruppo
   Il tema applica text-transform:capitalize a titoli, menu e bottoni: è una
   convenzione inglese. In italiano «Richiedi La Valutazione» è un errore di
   ortografia, non una scelta grafica.
   ========================================================================== */

h1, h2, h3, h4, h5, h6,
.section-heading .section-title,
.header .primary-header-inner .header-menu-wrap ul li a,
.service-details-left-content .service-details-cta .cta-btn a,
.mean-bar .mean-nav.mean-nav > ul li ul li a,
.tab-navigation button,
.video-content .video-title,
.shop-content .title,
.post-meta li,
.tl-primary-btn,
.accordion-button,
.service-item-4 .title,
.project-item-2 .title,
.blog-item .title,
.eg-immobile-card__titolo{
  text-transform: none;
}

/* L'occhiello resta in maiuscolo: è grafica, e in maiuscolo pieno non esistono
   iniziali sbagliate. UNA eccezione, e vale come regola di marca: nella hero
   l'occhiello è la firma endorsed «Giò Soluzioni Casa · gruppo edilgetica», e
   «edilgetica» va SEMPRE minuscolo. Lì l'uppercase è un bug di marca, non una
   scelta tipografica: si spegne su tutta la testata, non su un singolo nodo,
   così vale anche per le pagine interne che avranno un'altra hero. */
.sub-heading{ text-transform: uppercase; }
.hero-section .section-heading .sub-heading,
.hero-content .section-heading .sub-heading{
  text-transform: none;
  letter-spacing: .01em;                /* firma, non etichetta: niente maiuscoletto spaziato */
  font-size: var(--text-sm);
}

/* La filigrana giganta del tema stampa il nome del sito: minuscolo, come il
   marchio. Vale per .service-text e .footer-text. */
.service-text span,
.footer-text span,
.about-text span{ text-transform: lowercase; }

/* Il preloader del tema scriveva «ANTRA» in maiuscolo a 80px. Qui c'è il
   wordmark di Giò: nome proprio, quindi nessuna trasformazione. */
.preloader .site-name span,
.eg-wordmark{
  text-transform: none;
  font-family: var(--font-display);
  font-weight: var(--weight-bold);
  font-size: clamp(1.5rem, 5vw, 2.75rem);
  letter-spacing: -.01em;
}


/* ==========================================================================
   3. TIPOGRAFIA DI MARCA
   Il più morbido dei cinque satelliti: display 700 (mai 800, troppo duro),
   kicker in maiuscoletto terracotta, corpo a interlinea piena.
   ========================================================================== */

/* 3.1 Titoli ------------------------------------------------------------- */
/* .section-title del tema è 80px/400 in Cal Sans: la scala la danno i token.
   La classe batte il selettore di elemento di base.css, quindi va nominata. */
.section-title{
  display: block;
  font-family: var(--font-display);
  font-weight: var(--weight-bold);      /* 700: mai 800 su gio */
  line-height: var(--leading-tight);
  letter-spacing: -.01em;
  color: var(--ink-900);
  overflow: visible;                    /* il tema tagliava i discendenti */
  margin-bottom: 0;
}

/* 3.1-bis Come vanno a capo i titoli --------------------------------------
   Difetto misurato: «Non siamo soli in questa casa» a 1600px cadeva su due
   righe con «casa» sola in fondo, e l'accento terracotta («in questa casa»)
   spezzato a metà fra le due righe. Succedeva perché il titolo era libero di
   prendere tutta la colonna: 1104px, cioè ~34 battute a 60px, e l'ultima
   parola avanzava.
   Due leve, in quest'ordine:
   1. una MISURA MASSIMA in unità di testo. Un titolo display non è un
      paragrafo: oltre le ~20 battute per riga l'occhio non lo legge più a
      colpo. Il limite in `ch` scala col corpo del carattere, quindi tiene a
      tutte e cinque le larghezze senza media query.
   2. `text-wrap: balance`, che distribuisce le righe per larghezza uguale
      invece di riempire la prima e lasciare l'avanzo sull'ultima: è
      esattamente il rimedio all'ultima riga con una parola sola. Dove non è
      supportato (Safari < 17.5) il titolo torna al comportamento normale e
      la misura massima del punto 1 continua a valere: nessuna regressione.
   `pretty` non basta qui: lavora solo sull'ultima riga, e su un titolo di
   due righe la riga da sistemare è anche la prima. */
/* `balance` su TUTTI i titoli, non solo su quelli grandi: la parola sola in
   fondo capita anche a un h3 di card, e a 390px capita di più. Non porta
   max-width con sé, quindi è innocua sui titoli che vivono in colonna
   stretta. Il bottone dell'accordion è il blocco di testo del suo h3. */
h1, h2, h3, h4, h5, h6,
.accordion-button{ text-wrap: balance; }
/* La misura massima invece vale solo per i titoli di scala display, che sono
   quelli che hanno spazio per allungarsi troppo. */
.section-title,
.details-title,
.eg-page-header .title{ max-width: 24ch; }

/* Nella hero il titolo vive già in metà griglia: lì il limite in ch
   arriverebbe prima della colonna e stringerebbe la hero. */
.hero-wrap .hero-content .section-heading .section-title,
.slider-content-wrap .section-heading .section-title{ max-width: 18ch; }
/* NIENTE `display:inline-block` sull'accento e niente `white-space:nowrap`:
   misurati tutti e due, e tutti e due peggiorano. L'inline-block diventa un
   blocco atomico che `balance` non sa più distribuire («Quello che possiamo
   dimostrare» passava da 2 righe a 4, una parola per riga); il nowrap su un
   accento di quattro parole sfonda il viewport a 390px, e uno sforamento è
   peggio di un a capo brutto.
   Dove cade l'accento si decide dove si scrive: nei generatori lo <span>
   racchiude un'unità di senso intera, mai mezza locuzione. */
h1, h1.section-title{
  font-size: var(--text-display);
  font-weight: var(--weight-bold);      /* base.css qui metteva 800 */
}
/* COLLISIONE DI CASCATA, risolta qui.
   `h2.section-title` (0,1,1) non ha mai vinto contro il tema:
   main.css (una riga, minificata) dichiara `.section-heading .section-title`
   (0,2,0) a 80/60/42/36px e `.section-heading .section-title.title-2`
   (0,3,0) a 60/50/42/36px. Risultato misurato: i titoli di sezione stavano a
   60px invece dei 52px del token — il 15% più grandi di quanto la scala
   prevede, ed è una delle ragioni per cui andavano a capo male.
   Come già si fa in questo foglio per l'occhiello e per la hero, il rimedio è
   ricalcare la profondità del tema, non un !important. */
h2, h2.section-title{ font-size: var(--text-3xl); }
.section-heading .section-title,
.section-heading .section-title.title-2{ font-size: var(--text-3xl); }

/* Il corpo di un titolo display deve guardare la COLONNA in cui vive, non la
   larghezza della finestra. La scala display è tarata su una colonna larga;
   nelle colonne strette — il box «Dicci cosa cerchi» di /immobili e
   /comprare-casa misura 446px anche a 1600 — la stessa misura spezzava il
   titolo in sei righe da due parole. Una media query non lo vede, perché la
   finestra è larga: lo vede solo una container query.
   Sta QUI e non più in alto perché deve venire dopo la riga di sopra: stessa
   specificità, e in caso di pari vince l'ultima. Dove le container query non
   ci sono (Safari < 16) il titolo resta grande e si comporta come prima:
   nessuna regressione, solo nessun miglioramento. */
.section-heading:not(.hero-content .section-heading),
.eg-prove{ container-type: inline-size; }
/* Il @media intorno al @container NON è ridondante: sotto i 992px la colonna
   stretta è tutto lo schermo, e senza questa guardia un titolo di sezione a
   390px scendeva a 24px, cioè al corpo di un h3. La container query deve
   agire solo dove una colonna stretta è davvero una scelta d'impaginazione,
   non la conseguenza di uno schermo piccolo. Misurato: «Vendi o compri?» a
   390px passava da 36px a 24px. */
@media (min-width: 62rem){
  @container (max-width: 34rem){
    .section-heading .section-title,
    .section-heading .section-title.title-2{ font-size: var(--text-2xl); }
    .details-title{ font-size: var(--text-2xl); }
  }
}
/* Il tema porta il titolo della hero a 120px con un selettore a tre classi
   (.hero-content .section-heading .section-title): per riportarlo nella scala
   dei token serve la stessa profondità, non un !important. 120px in Montserrat
   700 su una frase di quattro parole italiane è una riga che non sta in
   nessuno schermo, e a 1440x900 spingeva la barra di ricerca sotto la piega. */
.hero-wrap .hero-content .section-heading .section-title,
.slider-content-wrap .section-heading .section-title{
  /* Non --text-display: quel token è tarato su una hero a colonna piena,
     mentre qui il titolo vive in metà griglia (col-lg-6 = 552px a 1440).
     A 72px «Vendiamo case che abbiamo guardato bene» prendeva CINQUE righe e
     382px di altezza, e spingeva la barra di ricerca sotto la piega. A 3,5rem
     la stessa frase sta in tre righe e la hero respira. */
  font-size: clamp(2.25rem, 4vw, 3.5rem);
  font-weight: var(--weight-bold);
  line-height: 1.08;
}
h3{ font-size: var(--text-xl); font-weight: var(--weight-bold); }

/* La parola in accento dentro il titolo. Qui l'accento resta terracotta anche
   su sand, e non è una deroga: un titolo è testo grande (≥24px, ≥18,66px
   bold), soglia 3:1, e strong su sand vale 4,17:1. La commutazione a inchiostro
   riguarda solo il testo piccolo — occhielli, link, note — che di soglia ne
   chiede 4,5. Due variabili diverse perché sono due regole diverse. */
.section-title span,
.section-heading .section-title span{ color: var(--gio-accento-titolo); }

/* 3.2 Corpo -------------------------------------------------------------- */
p{
  font-family: var(--font-body);
  font-size: var(--text-md);
  line-height: var(--leading-body);     /* interlinea piena: si legge, non si scorre */
  color: var(--text-body);
}
/* La misura della riga: oltre le ~70 battute l'occhio perde il ritorno a capo.
   Vale per i paragrafi lunghi delle sezioni, non per le card (che sono strette
   di loro) né per il footer. */
.section-heading p,
.eg-exp-testo-intro p,
.eg-gruppo-wrap p,
.eg-voci p,
.eg-immobili-coda,
.accordion-body p{ max-width: 68ch; }

/* Link di testo: colore + sottolineatura. Il colore da solo non basta
   (WCAG 1.4.1), e nel corpo di un paragrafo la sottolineatura è anche il modo
   più veloce di far capire che si può cliccare. */
/* Solo i link dentro un testo corrente. NON `li a`: nella griglia dei
   risultati il titolo della card è un <a> senza classe dentro un <li>, e
   `li a:not([class])` — più specifico di .eg-immobile-card__titolo a — lo
   stampava terracotta e sottolineato, cioè come un link di paragrafo. */
p a:not([class]),
address a:not([class]),
.eg-lista a:not([class]){
  color: var(--gio-accento);
  text-decoration: underline;
  text-underline-offset: .18em;
}
p a:not([class]):hover,
.eg-lista a:not([class]):hover{ text-decoration-thickness: 2px; }

/* 3.3 Kicker (occhiello) --------------------------------------------------
   Il tema lo disegna come una pastiglia con un pallino colorato dentro. Su gio
   l'occhiello è tipografico: una barra d'accento sopra e il maiuscoletto. La
   barra è l'unico punto in cui l'accento pieno compare in testata. */
/* Il selettore ricalca quello del tema (.section-heading .sub-heading): la
   pastiglia sta lì, e senza la stessa profondità l'occhiello resterebbe un
   bottone finto con dentro un pallino colorato. */
.sub-heading,
.section-heading .sub-heading,
.slider-content .sub-heading{
  display: block;
  padding: 0;
  border: 0;
  border-radius: 0;
  overflow: visible;
  font-family: var(--font-display);
  font-size: var(--text-xs);
  font-weight: var(--weight-medium);
  letter-spacing: var(--tracking-caps);
  line-height: 1.3;
  color: var(--gio-accento);
  margin: 0 0 var(--space-5);
}
.sub-heading::before,
.section-heading .sub-heading::before,
.slider-content .sub-heading::before{
  /* la barra: 2,5rem × 3px. Statica, non assoluta come il pallino del tema. */
  content: "";
  display: block;
  width: 2.5rem;
  height: 3px;
  border-radius: var(--radius-pill);
  background-color: var(--gio-filetto);
  margin-bottom: var(--space-3);
  transform: none;
  position: static;
}

/* Sul buio il tema disegna l'occhiello dentro una pastiglia bordata di bianco
   e lo colora di bianco (selettore .section-heading.white-content .sub-heading):
   stessa profondità, stesso trattamento di sopra. Il colore lo decide comunque
   --gio-accento, che sulle superfici scure vale primary-on-dark (4,54:1). */
.section-heading.white-content .sub-heading,
.white-content .sub-heading{
  border: 0;
  padding: 0;
  color: var(--gio-accento);
}

/* 3.4 Le tre superfici, e la commutazione automatica dell'accento ---------
   Ogni superficie ridichiara --gio-accento e --gio-bordo-campo nello STESSO
   blocco in cui dichiara il fondo: così colore del testo e sfondo non possono
   più divergere quando qualcuno cambia una sezione di superficie. */

/* sand — il tema la chiamava #f6f6f6, noi usiamo il sand di gruppo. Su sand il
   terracotta non regge il testo normale (4,17:1): l'accento testuale passa a
   ink-800 (10,94:1) e resta accento solo il filetto (4,02:1, sopra il 3:1). */
.tl-bg-color,
.bg-grey{
  background-color: var(--surface-alt);
  --gio-accento: var(--ink-800);
  --gio-bordo-campo: var(--text-muted);
}

/* Due sezioni tornano bianche per non avere quattro fasce sand di fila: il
   ritmo di gio è morbido, non monotono. Sono classi di componente del tema,
   quindi la regola vale su qualunque pagina le usi. */
.service-section-4.tl-bg-color,
.faq-section.tl-bg-color{
  background-color: var(--surface-page);
  --gio-accento: var(--color-primary-strong);
  --gio-bordo-campo: var(--ink-400);
}

/* buio — sull'inchiostro l'unico accento ammesso è primary-on-dark (4,54:1). */
.exp-section,
.cta-section-3,
.footer-section{
  --gio-accento: var(--color-primary-on-dark);
  --gio-accento-titolo: var(--color-primary-on-dark);
  --gio-filetto: var(--color-primary-on-dark);
  --gio-bordo-campo: rgba(255,255,255,.55);
  --tl-color-theme-primary: var(--color-primary-on-dark);
}
.exp-section{ background-color: var(--surface-dark); }
.exp-section h2, .exp-section h3, .exp-section .section-title,
.cta-section-3 h2, .cta-section-3 .section-title,
.white-content .section-title,
.white-content .title{ color: var(--text-inverse); }
.exp-section p, .cta-section-3 p, .white-content p{ color: rgba(255,255,255,.86); }

/* Il footer è l'unico posto dove il terracotta non entra mai: lì restano i
   neutri e il blu di gruppo. La variabile del tema viene spenta sul bianco,
   così tutti gli hover che main.css colora d'accento diventano neutri. */
.footer-section{
  --tl-color-theme-primary: var(--text-inverse);
  --gio-accento: var(--text-inverse);
  --gio-accento-titolo: var(--text-inverse);
  --gio-filetto: rgba(255,255,255,.32);
}

/* La sezione "voci" e le sezioni senza classe di fondo stanno sul bianco. */
.testimonial-section-4{ background-color: var(--surface-page); }


/* ==========================================================================
   4. RITMO DELLE SEZIONI
   «Padding pieno, molta aria attorno alle persone, mai sezioni sotto
   --space-8» (§gio). Il tema scende a 60px sotto i 768px: troppo poco.
   ========================================================================== */

.pt-130{ padding-top: clamp(var(--space-8), 9vw, 8.125rem); }
.pb-130{ padding-bottom: clamp(var(--space-8), 9vw, 8.125rem); }
.pt-150{ padding-top: clamp(var(--space-8), 10vw, 9.375rem); }
.pb-150{ padding-bottom: clamp(var(--space-8), 10vw, 9.375rem); }

/* Il container resta quello di gruppo (72rem = 1152px): è la misura su cui
   sono tarate tutte le griglie del design system, e il tema porterebbe le
   sezioni a 1425px, cioè a una riga di testo troppo lunga per il corpo 17px.
   .container-2 vale quanto .container e sta in main.css: senza questa riga la
   larghezza dipenderebbe dall'ordine dei fogli. */
.container, .container-2{
  max-width: var(--container);
  padding-inline: var(--space-5);
}

/* La testata di sezione del tema porta un'immagine decorativa (un filetto
   d'angolo). Il nostro segno di testata è la barra del kicker: due segni per
   la stessa cosa sono uno di troppo. Il markup non la produce più: la regola
   resta per il guscio del tema, dove qualche `.shape` sopravvive. */
.section-heading-wrap .shape{ display: none; }
/* LA TESTATA DI SEZIONE È UNA COLONNA SOLA.
   Il tema la impagina su due colonne (`col-lg-4` con l'occhiello, `col-lg-8`
   col titolo): regge se l'occhiello è una frase. I nostri sono di due parole
   — «DA CHE PARTE STAI» misura 130px — quindi la colonna di sinistra restava
   vuota per ~400px su 1600 e il titolo partiva a x=648 con la voragine di
   fianco. Ora l'occhiello sta sopra il titolo, nella stessa colonna, e la
   testata comincia dove comincia il resto della sezione.
   Il markup lo produce intestazioneSezione() in tools/gio-shell.mjs: un solo
   componente per tutte e nove le pagine. */
.section-heading-wrap{
  max-width: none;
  padding-top: 0;
  margin-bottom: var(--space-7);
}
.section-heading-wrap .section-heading-2 p{
  margin-top: var(--space-4);
  max-width: 68ch;
}

/* Le filigrane «giò» del tema sono 420px e 480px: a 1024px sfondavano dalla
   colonna. Restano, perché sono l'unico ornamento di marca del tema, ma
   diventano una misura relativa e non escono mai dal loro contenitore. */
.service-section-4, .project-section-4{ overflow: clip; }
.service-text{
  font-size: clamp(5rem, 16vw, 14rem);
  line-height: .8;
  left: var(--space-5);
  bottom: -.1em;
  opacity: .06;                         /* filigrana, non fondale */
  pointer-events: none;
}
.footer-text span{ font-size: clamp(5rem, 22vw, 18rem); opacity: .12; }


/* ==========================================================================
   5. BOTTONI
   Una sola CTA primaria per blocco, piena di terracotta. Il tema disegna un
   bottone a filo con un cerchietto colorato: il cerchietto resta (è il suo
   carattere), il resto diventa nostro.
   ========================================================================== */

.tl-primary-btn{
  display: inline-flex;
  align-items: center;
  justify-content: center;
  gap: var(--space-2);
  min-height: 48px;                     /* tap target ≥44px, con margine */
  padding: .6rem .75rem .6rem 1.6rem;
  border-radius: var(--radius-pill);
  border: 1px solid transparent;
  background-color: var(--button-primary-bg);
  color: var(--button-primary-text);    /* bianco su #bc593b = 4,54:1 */
  font-family: var(--font-display);
  font-size: var(--text-sm);
  font-weight: var(--weight-bold);
  line-height: 1.2;
  text-decoration: none;
  transition: transform var(--dur-fast) var(--ease-brand),
              box-shadow var(--dur-fast) var(--ease-brand),
              background-color var(--dur-fast) var(--ease-brand),
              color var(--dur-fast) var(--ease-brand);
}
/* senza icona il bottone non ha bisogno dell'asimmetria destra */
.tl-primary-btn:not(:has(.icon)){ padding-inline: 1.6rem; }
.tl-primary-btn:hover,
.tl-primary-btn:focus-visible{
  background-color: var(--button-primary-bg);
  color: var(--button-primary-text);
  border-color: transparent;
  box-shadow: var(--shadow-lift);
  transform: translateY(-2px);
}
.tl-primary-btn:active{ transform: translateY(0); }
.tl-primary-btn .icon{
  height: 34px; width: 34px;
  margin-left: var(--space-1);
  background-color: var(--surface-card);
  color: var(--color-primary-strong);   /* freccia terracotta su bianco: 4,54:1 */
  flex: none;
}
.tl-primary-btn:hover .icon{ background-color: var(--surface-card); }

/* Secondaria: contorno, per la seconda scelta di una coppia di CTA. */
.eg-btn-secondario,
.tl-primary-btn.eg-btn-secondario{
  background-color: transparent;
  color: var(--ink-900);
  border-color: var(--ink-400);         /* 3,29:1 sul bianco: è un bordo di controllo */
}
.eg-btn-secondario:hover,
.tl-primary-btn.eg-btn-secondario:hover{
  background-color: transparent;
  color: var(--ink-900);
  border-color: var(--ink-900);
  box-shadow: none;
}
.eg-btn-secondario .icon{
  background-color: var(--color-primary-strong);
  color: var(--text-inverse);
}

/* Sul buio e sulla fotografia: bianca piena, inchiostro dentro. Un bottone a
   filo bianco su una foto non garantisce il 3:1 in tutti i punti dello scatto. */
.tl-primary-btn.white-btn{
  background-color: var(--surface-card);
  color: var(--ink-900);
  border-color: var(--surface-card);
}
.tl-primary-btn.white-btn:hover{
  background-color: var(--surface-card);
  color: var(--ink-900);
  border-color: var(--surface-card);
}
.tl-primary-btn.white-btn .icon{
  background-color: var(--color-primary-strong);
  color: var(--text-inverse);
}
/* La secondaria sul buio resta a filo, ma con il bianco pieno del bordo. */
.exp-section .eg-btn-secondario,
.cta-section-3 .eg-btn-secondario{
  color: var(--text-inverse);
  border-color: rgba(255,255,255,.7);
}
.exp-section .eg-btn-secondario:hover,
.cta-section-3 .eg-btn-secondario:hover{
  color: var(--text-inverse);
  border-color: var(--text-inverse);
}

/* I gruppi di CTA. La nota di bozza che il generatore infila accanto ai
   bottoni è un blocco: senza flex-basis diventerebbe una colonna stretta
   schiacciata fra due pastiglie. */
.hero-btn,
.cta-btn-wrap,
.eg-cta-btn-wrap{
  display: flex;
  flex-wrap: wrap;
  align-items: center;
  gap: var(--space-4);
}
/* max-width:none serve davvero: la nota ha una misura di riga di 62ch e in un
   contenitore flex quella diventa la larghezza usata, così la nota restava in
   riga accanto ai bottoni invece di andare a capo. */
.hero-btn .eg-draft-note,
.eg-cta-btn-wrap .eg-draft-note{ flex: 1 0 100%; max-width: none; margin-top: 0; margin-bottom: 0; }
.eg-section-cta{ margin-top: var(--space-7); }
.section-heading .eg-section-cta{ margin-top: var(--space-5); }


/* ==========================================================================
   6. TESTATA
   Lockup tipografico (Giò non ha un logo), sette voci, telefono e CTA.
   ========================================================================== */

/* PERCHÉ LA TESTATA RESTA SOVRAPPOSTA (position:absolute del tema, non
   toccata). Misurato: main.js avvia ScrollSmoother di GSAP, che porta
   #antra-smooth-wrapper a `position:fixed` ancorato in cima al viewport. La
   testata sta FUORI da quel contenitore: metterla nel flusso non sposta di un
   pixel il contenuto, che parte comunque da y=0, e testata e hero finiscono
   una sopra l'altra. L'unica soluzione onesta è quella del tema — testata
   sovrapposta e hero che si tiene lo spazio — con una differenza: lo spazio
   non è un numero magico ma --gio-header-h, dichiarata qui accanto alle
   misure che la determinano e ridichiarata a ogni soglia in cui la testata
   cambia forma. Chi tocca l'una tocca l'altra. */
:root{ --gio-header-h: 7.5rem; }        /* due piani: marchio+contatti, menu */
/* La testata ha SEMPRE un fondo pieno. Sulla home poggia sul bianco della hero
   e non si vede, ma sulle otto pagine interne la fascia della testata è una
   fotografia: senza fondo, marchio e menu (inchiostro) ci finivano sopra e
   scendevano sotto il 3:1. Un fondo pieno è anche la scelta più prevedibile
   per chi scriverà le prossime pagine. */
.primary-header{ background-color: var(--surface-page); }
.primary-header.fixed{
  background-color: var(--surface-page);
  box-shadow: 0 1px 0 var(--line), var(--shadow-card);
}
.primary-header-inner{ padding-block: var(--space-2); gap: var(--space-2) var(--space-5); }

/* Due piani, e non per vezzo: marchio + contatto + CTA non stanno su una riga
   sola insieme a sette voci dentro 72rem, e lasciare che il menu vada a capo
   per conto suo produceva la riga «Contatti» orfana sotto il marchio.
   `display:contents` scioglie il contenitore intermedio del tema e fa dei suoi
   figli tre celle della stessa riga flex: marchio e contatti sul primo piano,
   menu a tutta larghezza sul secondo. Il div sciolto non porta semantica,
   quindi l'albero di accessibilità non cambia. */
.header .primary-header-inner .header-left-wrap{ display: contents; }
.primary-header-inner .header-logo{ order: 1; }
.primary-header-inner .header-right-wrap{
  order: 2;
  margin-left: auto;
  display: flex;
  align-items: center;
  gap: var(--space-5);
}
.primary-header-inner .header-menu-wrap{
  order: 3;
  flex: 1 0 100%;
  border-top: 1px solid var(--gio-riga);
}
.primary-header-inner .header-menu-wrap ul{
  display: flex;
  flex-wrap: wrap;
  column-gap: var(--space-6);
}

/* 6.1 Lockup --------------------------------------------------------------
   Nome in display 700, firma endorsed in blu di gruppo. Sono due link
   autonomi (uno alla home, uno al portale): entrambi devono arrivare a 44px
   di altezza toccabile, e nel tema ne misuravano 24. */
.eg-lockup{
  display: inline-flex;
  align-items: baseline;
  flex-wrap: wrap;
  gap: var(--space-1) var(--space-2);
}
.eg-lockup__nome{
  font-family: var(--font-display);
  font-size: var(--text-lg);
  font-weight: var(--weight-bold);
  line-height: 1.1;
  letter-spacing: -.01em;
  color: var(--ink-900);
  text-decoration: none;
  padding-block: 12px;                  /* 22px di testo + 24 = 46 */
}
.eg-lockup__nome:hover{ color: var(--color-primary-strong); }
.eg-lockup__firma{
  font-family: var(--font-display);
  font-size: var(--text-xs);
  font-weight: var(--weight-medium);
  line-height: 1.1;
  color: var(--header-signature-color); /* #0f70b7 su bianco: 5,22:1 */
  text-decoration: none;
  padding-block: 16px;                  /* 14px di testo + 32 = 46 */
  align-self: center;
}
.eg-lockup__firma:hover{ text-decoration: underline; }
/* Sul fondo scuro (pannello mobile, footer) il blu di gruppo pieno scende a
   2,95:1: la firma passa al blu chiaro del token, 5,68:1 su ink-900. */
.footer-section .eg-lockup__nome,
.mobile-side-menu .eg-lockup__nome{ color: var(--text-inverse); }
.footer-section .eg-lockup__firma,
.mobile-side-menu .eg-lockup__firma{ color: var(--blue-400); }

/* 6.2 Menu ---------------------------------------------------------------- */
.header .primary-header-inner .header-menu-wrap ul li a{
  font-family: var(--font-display);
  font-size: var(--text-sm);
  font-weight: var(--weight-medium);
  color: var(--ink-800);
  padding: var(--space-3) 0;            /* 15px di testo + 24 = 44px toccabili */
  min-height: 44px;
  display: flex;
  align-items: center;
  letter-spacing: 0;
}
.header .primary-header-inner .header-menu-wrap ul li a:hover,
.header .primary-header-inner .header-menu-wrap ul li a[aria-current="page"]{
  color: var(--color-primary-strong);
}
/* La pagina corrente non si segnala con il solo colore (WCAG 1.4.1): sotto la
   voce attiva c'è anche un filetto d'accento. */
.header .primary-header-inner .header-menu-wrap ul li a[aria-current="page"]{
  box-shadow: inset 0 -3px 0 var(--color-primary);
}

/* 6.3 Telefono e CTA ------------------------------------------------------ */
.header-contact{ text-decoration: none; padding-block: var(--space-1); column-gap: var(--space-3); }
.header-4 .primary-header-inner .header-right-wrap .header-contact .icon{
  color: var(--color-primary-strong);
  font-size: 22px;
}
.header-contact .content .call-text{
  font-family: var(--font-body);
  font-size: var(--text-xs);
  line-height: 1.2;
  color: var(--text-muted);
}
.header-contact .content .call-number{
  font-family: var(--font-display);
  font-size: var(--text-md);
  font-weight: var(--weight-bold);
  line-height: 1.3;
  color: var(--ink-900);
}
.header-4 .primary-header-inner .header-right-wrap .header-btn-wrap .header-btn{
  border-color: transparent;
  background-color: var(--button-primary-bg);
  color: var(--button-primary-text);
  padding: .7rem 1.5rem;
}
.header-4 .primary-header-inner .header-right-wrap .header-btn-wrap .header-btn:hover{
  border-color: transparent;
  color: var(--button-primary-text);
}

/* 6.4 Testata sotto i 992px ----------------------------------------------
   IL DIFETTO È STATO CORRETTO ALLA FONTE. header-4 non ha mai avuto il
   bottone .mobile-side-menu-toggle: meanmenu clonava le sette voci dentro
   .side-menu-wrap, cioè dentro un pannello che nessuno poteva aprire, e
   sotto i 992px il sito restava senza navigazione. Il bottone ora lo scrive
   il guscio (tools/gio-shell.mjs, passo «il tasto che apre il menu»); qui
   resta solo il CSS, che si divide in due casi perché il pannello ha due
   dipendenze diverse dal JavaScript:
     · lo RIEMPIE meanmenu (clona le voci in .side-menu-wrap)
     · lo APRE main.js (.is-open su .mobile-side-menu)
   Con JavaScript: si vede il tasto, l'elenco in testata resta nascosto (lo
   nasconde già il tema a 992) e la navigazione vive nel pannello.
   Senza JavaScript: il pannello è vuoto e non apribile, quindi il tasto NON
   deve comparire — un bottone che non apre niente è peggio della sua
   assenza — e le sette voci tornano in testata come riga scorrevole.
   La classe `js` sull'<html> la mette uno script in linea nel <head>: se
   aspettasse gio-menu.js, in fondo al corpo, si vedrebbe il menu comparire
   e sparire a pagina già disegnata. */
/* BREAKPOINT: 992px INCLUSO, non 991.98. Il tema nasconde il menu di testata
   e accende il pannello con `max-width: 992px`, e meanmenu si attiva con
   `currentWidth <= 992`. Con 991.98 restava una fessura larga un pixel — a
   viewport esattamente 992 — in cui la testata era in versione desktop, il
   menu vero era già nascosto dal tema e il pannello era nel DOM ma senza
   tasto: nessuna navigazione, e sette link fuori tela nell'ordine di
   tabulazione. Qui e nel resto del capitolo il confine è lo stesso del tema. */
@media (max-width: 992px){
  /* Due piani — marchio + tasto del menu · telefono + CTA — e l'altezza è la
     stessa a 390 e a 768, così --gio-header-h resta una promessa mantenuta.
     `display:contents` scioglie il contenitore di destra del tema,
     altrimenti telefono e CTA si porterebbero via una riga ciascuno.
     .header-menu-wrap resta nel flusso a fare da interruzione di riga (il
     tema le mette `display:flex !important`, e da vuota è alta zero): è il
     filetto che separa i due piani. */
  :root{ --gio-header-h: 9.75rem; }     /* misurata 154px a 768 con JS */
  .header .primary-header-inner{ flex-wrap: wrap; row-gap: var(--space-2); column-gap: var(--space-3); }
  .header-4 .primary-header-inner .header-right-wrap{ display: contents; }
  /* il lockup può restringersi e mandare a capo la firma endorsed: a
     larghezza intrinseca (294px a 390) spingeva il tasto del menu su una
     riga tutta sua, e la testata saliva a 208px */
  .primary-header-inner .header-logo{ flex: 1 1 0; min-width: 0; }
  html.js .eg-menu-toggle{ display: inline-flex; order: 2; margin-left: auto; flex: none; }
  /* min-width:0 e non per scaramanzia: un elemento flex ha `min-width:auto`,
     cioè non scende sotto il suo min-content, e senza JavaScript il min-content
     di questa cella sono le sette voci in fila — 868px. La riga usciva larga
     868 su un viewport di 390, e `overflow-x:auto` sull'<ul> non scorreva
     nulla perché l'<ul> era largo quanto il suo contenuto: le ultime quattro
     voci erano semplicemente tagliate via da `overflow-x:hidden` di html.
     Misurato: body.scrollWidth 892 a 390. */
  .primary-header-inner .header-menu-wrap{ order: 3; min-width: 0; }
  .primary-header-inner .header-menu-wrap .mobile-menu-items{ min-width: 0; max-width: 100%; }
  .header-4 .primary-header-inner .header-right-wrap .header-contact{ order: 4; margin-left: 0; }
  .header-4 .primary-header-inner .header-right-wrap .header-btn-wrap{ order: 5; margin-left: auto; }
  /* telefono e CTA restano visibili: su telefono sono le due azioni vere.
     Cade l'occhiello «Parla con noi»: due righe di testo per un numero di
     telefono costano 24px di testata su ogni pagina, e il numero si spiega
     da solo accanto alla cornetta. */
  .header-4 .primary-header-inner .header-right-wrap .header-contact{
    display: flex;
    padding-block: var(--space-2);      /* senza l'occhiello misurava 43px */
  }
  .header-4 .primary-header-inner .header-right-wrap .header-contact .content .call-text{ display: none; }
  .header-4 .primary-header-inner .header-right-wrap .header-btn-wrap .header-btn{ display: inline-flex; }

  /* --- il pannello fuori tela --- */
  /* Chiuso è fuori dall'ordine di tabulazione: `transform:translateX(100%)`
     da solo lo sposta ma lascia i suoi link raggiungibili col tabulatore,
     cioè sette destinazioni invisibili prima del contenuto. */
  .mobile-side-menu:not(.is-open){ visibility: hidden; }
  .mobile-side-menu.is-open{ visibility: visible; }
  /* Il tema nasconde la QUARTA voce del menu clonato — `li:nth-child(4)` —
     perché la sua demo aveva sei voci e la quarta era un doppione. Con le
     nostre sette sparirebbe «Comprare casa»: la regola si annulla qui, con
     la stessa profondità di selettore. */
  .mean-bar .mean-nav.mean-nav > ul li:nth-child(4){ display: block; }
  /* meanmenu tiene l'elenco clonato chiuso finché non si clicca la sua
     «reveal» (che il tema nasconde): il tema lo riapre con !important, e
     qui basta che resti dov'è. Nessuna regola che nasconda .mean-bar: era
     quella a lasciare il pannello vuoto, perché .mean-nav sta DENTRO. */
  .side-menu-wrap .mean-bar{ display: block; }

  /* --- senza JavaScript: le sette voci tornano in testata --- */
  /* Una riga sola che scorre in orizzontale, non quattro righe impilate:
     quattro righe porterebbero la testata a ~300px, cioè un terzo dello
     schermo prima ancora del titolo. Il tasto resta nascosto dalla regola
     base: senza meanmenu e senza main.js non aprirebbe niente. */
  html:not(.js){ --gio-header-h: 13rem; }      /* misurata 206-208px senza JS a ogni larghezza sotto i 992 */
  html:not(.js) .header .primary-header-inner .header-menu-wrap .mobile-menu-items{
    display: block;
    width: 100%;
  }
  html:not(.js) .header .primary-header-inner .header-menu-wrap ul{
    /* il tema nasconde l'elenco vero sotto i 992px (display:none con
       selettore a tre classi) perché lì subentra il pannello fuori tela;
       senza JavaScript quel pannello non esiste, e l'elenco torna. */
    display: flex;
    flex-wrap: nowrap;
    overflow-x: auto;
    overscroll-behavior-x: contain;
    scrollbar-width: none;
    column-gap: var(--space-5);
    padding-top: var(--space-1);
    padding-right: var(--space-5);
  }
  html:not(.js) .header .primary-header-inner .header-menu-wrap ul::-webkit-scrollbar{ display: none; }
  html:not(.js) .header .primary-header-inner .header-menu-wrap ul li{ flex: none; }
  html:not(.js) .header .primary-header-inner .header-menu-wrap ul li a{
    white-space: nowrap;
    padding: var(--space-3) 0;
    min-height: 44px;
    display: flex;
    align-items: center;
  }
}
/* Sotto i 576px il numero per esteso non ci sta accanto alla CTA: resta
   l'icona, che su un telefono è il gesto («chiama»), e il numero continua a
   esistere per chi ascolta la pagina — nascosto alla vista, non al lettore di
   schermo. Per esteso è comunque in fondo a ogni pagina e su /contatti. */
@media (max-width: 575.98px){
  /* qui il lockup non sta su una riga accanto al tasto del menu e va a capo:
     nome sopra, firma endorsed sotto. Due righe da 46px (i due link devono
     restare toccabili) più la riga di telefono e CTA. */
  :root{ --gio-header-h: 13rem; }       /* misurata 205px a 360 e a 390 con JS */
  .header-4 .primary-header-inner .header-right-wrap .header-contact{
    min-width: 44px;
    min-height: 44px;
    justify-content: center;
    border: 1px solid var(--ink-400);
    border-radius: var(--radius-pill);
    padding-inline: var(--space-3);
  }
  .header-4 .primary-header-inner .header-right-wrap .header-contact .content{
    position: absolute;
    width: 1px; height: 1px;
    overflow: hidden;
    clip-path: inset(50%);
    white-space: nowrap;
  }
  .header-4 .primary-header-inner .header-right-wrap .header-btn-wrap{ flex: 1 1 auto; }
  .header-4 .primary-header-inner .header-right-wrap .header-btn-wrap .header-btn{
    width: 100%;
    justify-content: center;
  }
  /* col corpo ridotto il nome scendeva a 43px di altezza toccabile */
  .eg-lockup__nome{ font-size: var(--text-md); padding-block: 13px; }
}

/* 6.5 Il tasto del menu ---------------------------------------------------
   Nasce nascosto e compare solo sotto i 992px e solo con JavaScript (§6.4):
   sopra c'è il menu vero, sotto senza JavaScript c'è la riga scorrevole.
   Le tre barre sono disegnate qui e non prese da FontAwesome: se il font
   delle icone non arriva, il tasto che apre la navigazione deve esserci
   comunque. L'etichetta «Menu» è testo vero, non un aria-label: su un tasto
   così si legge, e costa 34px di larghezza. */
.eg-menu-toggle{
  display: none;
  align-items: center;
  gap: var(--space-2);
  min-height: 44px;
  padding: var(--space-2) var(--space-3);
  background: none;
  border: 1px solid var(--ink-400);
  border-radius: var(--radius-pill);
  color: var(--ink-900);
  font-family: var(--font-display);
  font-size: var(--text-sm);
  font-weight: var(--weight-medium);
  line-height: 1;
  cursor: pointer;
}
.eg-menu-toggle:hover{ border-color: var(--color-primary); color: var(--color-primary-strong); }
.eg-menu-toggle__barre{
  position: relative;
  display: block;
  width: 18px;
  height: 2px;
  background-color: currentColor;
  border-radius: 2px;
}
.eg-menu-toggle__barre::before,
.eg-menu-toggle__barre::after{
  content: "";
  position: absolute;
  left: 0;
  width: 18px;
  height: 2px;
  background-color: currentColor;
  border-radius: 2px;
}
.eg-menu-toggle__barre::before{ top: -6px; }
.eg-menu-toggle__barre::after{ top: 6px; }
/* quando il pannello è aperto il tasto resta sotto l'ombra: niente animazione
   in croce, che qui sarebbe movimento senza informazione */

/* Il pannello fuori tela deve essere leggibile: qui il minimo perché non sia
   una pagina straniera dentro il sito. Il tema lo dipinge bianco e ci mette
   dentro il contenuto: senza questa riga restava una cornice bianca di 20px
   attorno a un riquadro scuro. */
.mobile-side-menu,
.mobile-side-menu .side-menu-content{ background-color: var(--surface-dark); }
.mobile-side-menu .eg-side-title{
  font-family: var(--font-display);
  font-size: var(--text-xs);
  font-weight: var(--weight-medium);
  letter-spacing: var(--tracking-caps);
  text-transform: uppercase;
  color: rgba(255,255,255,.66);
}
.mobile-side-menu .side-menu-list a,
.mobile-side-menu .side-menu-wrap a{
  color: var(--text-inverse);
  min-height: 44px;
  display: inline-flex;
  align-items: center;
}
/* Le voci clonate da meanmenu. Il tema le scrive con
   `color: var(--tl-color-heading-primary)` — inchiostro scuro — perché il suo
   pannello è bianco: sul nostro sarebbe testo nero su fondo nero. La regola
   sopra non basta, il selettore del tema è più specifico; qui si aggiunge il
   contenitore e si riprende il controllo senza !important. */
.mobile-side-menu .mean-bar .mean-nav.mean-nav > ul li a{
  color: var(--text-inverse);
  font-family: var(--font-display);
  font-size: var(--text-md);
  font-weight: var(--weight-medium);
  padding-block: var(--space-2);
  min-height: 44px;
  display: flex;
  align-items: center;
}
.mobile-side-menu .mean-bar .mean-nav.mean-nav > ul li:not(:last-of-type){
  border-bottom-color: rgba(255,255,255,.16);
}
/* La pagina corrente: non basta il colore (WCAG 1.4.1), c'è anche il filetto.
   Il terracotta pieno su fondo scuro sta a 3,1:1 — qui va la variante
   --color-primary-on-dark, che è il token nato per questo. */
.mobile-side-menu .mean-bar .mean-nav.mean-nav > ul li a[aria-current="page"],
.mobile-side-menu .mean-bar .mean-nav.mean-nav > ul li.active > a{
  color: var(--color-primary-on-dark);
  box-shadow: inset 3px 0 0 var(--color-primary-on-dark);
  padding-left: var(--space-3);
}
/* Il resto del pannello — recapiti e tasto di chiusura — il tema lo scrive
   con `--tl-color-heading-primary`, cioè #191919: sul nostro fondo scuro erano
   inchiostro su inchiostro, cioè invisibili. Non si vedeva perché fino a ieri
   il pannello non si apriva: il bug era latente, non assente. */
.mobile-side-menu .side-menu-contact p,
.mobile-side-menu .side-menu-list li,
.mobile-side-menu .side-menu-list li span,
.mobile-side-menu .side-menu-list li a,
.mobile-side-menu .side-menu-head .mobile-side-menu-close{ color: var(--text-inverse); }
/* nel tema la voce dell'indirizzo è <i> + <p>: il <p> è di blocco e finiva
   sopra la sua icona, con 50px di margine sotto */
.mobile-side-menu .side-menu-list li{
  display: flex;
  align-items: center;
  gap: var(--space-3);
  margin-bottom: var(--space-3);
}
.mobile-side-menu .side-menu-contact p{ margin-bottom: 0; }
.mobile-side-menu .side-menu-head .mobile-side-menu-close{
  min-height: 44px;
  min-width: 44px;
  border-color: rgba(255,255,255,.4);
}
.mobile-side-menu .side-menu-head .mobile-side-menu-close:hover{
  background-color: var(--color-primary-on-dark);
  border-color: var(--color-primary-on-dark);
  color: var(--surface-dark);
}


/* ==========================================================================
   7. HERO
   Foto di interno abitato (mai una facciata, mai un cartello «vendesi»),
   titolo in display 700, due CTA, e sotto la barra di ricerca agganciata al
   bordo inferiore.
   ========================================================================== */

/* Il tema appoggia dietro il titolo un disegno tecnico a fil di ferro: è la
   voce di uno studio di architettura, non di un'agenzia che parla di persone,
   e passa sotto l'H1 abbassandone il contrasto. Al suo posto una luce calda
   disegnata in CSS: zero byte scaricati, nessun testo sopra un tratto. */
.hero-section .bg-shape{ display: none; }
/* La hero è l'unica sezione chiara che resta bianca: la testata ora è nel
   flusso e sopra la hero, e una fascia bianca sopra una fascia sand farebbe
   un gradino a metà schermo. Il calore lo danno due luci disegnate in CSS —
   zero byte scaricati — e il sand riprende dalla sezione successiva, sotto la
   scheda di ricerca. */
.hero-section.tl-bg-color{
  background-color: var(--surface-page);
  background-image:
    radial-gradient(64% 58% at 82% 6%, var(--color-primary-soft) 0%, rgba(255,255,255,0) 66%),
    radial-gradient(48% 44% at 2% 92%, var(--sand-050) 0%, rgba(255,255,255,0) 70%);
  background-repeat: no-repeat;
  --gio-accento: var(--color-primary-strong);
  --gio-bordo-campo: var(--ink-400);
}
.hero-wrap{
  /* lo spazio che la testata sovrapposta si prende, più il respiro */
  padding-top: calc(var(--gio-header-h) + var(--space-4));
  padding-bottom: var(--space-6);
  align-items: center;
}
.hero-wrap .hero-content{ margin-bottom: 0; }
/* :not(.sub-heading) perché l'occhiello è anch'esso un <p> dentro la testata:
   senza l'esclusione questa regola, più specifica, gli mangerebbe corpo e
   colore e il maiuscoletto tornerebbe un paragrafo grigio. */
.hero-wrap .hero-content.hero-content-4 .section-heading p:not(.sub-heading),
.hero-wrap .hero-content .section-heading p:not(.sub-heading){
  font-family: var(--font-body);
  font-size: var(--text-lg);
  font-weight: var(--weight-body);
  line-height: 1.45;
  color: var(--text-muted);
  margin-top: var(--space-4);
  margin-bottom: 0;
  max-width: 46ch;
}
/* La nota di bozza sotto le CTA della hero è materiale di lavorazione: deve
   restare leggibile (AA) ma non può prendersi tre righe sopra la piega. */
.hero-btn .eg-draft-note{ font-size: var(--text-xs); margin-top: var(--space-2); }
.hero-wrap .hero-content .hero-btn{ margin-top: var(--space-6); }

/* La foto: 3/4 verticale (interno abitato), mai più alta della piega. Il tema
   la fissava a 820px, che a 1440×900 mangiava la barra di ricerca. */
.hero-wrap .hero-img{
  height: auto;
  max-width: 100%;
  /* 4/3 e non il 3/4 verticale dello scatto: il riquadro sta in metà griglia e
     un verticale alto 720px porterebbe la barra di ricerca sotto la piega. Il
     taglio lo fa object-fit, la foto definitiva resta quella dichiarata nel
     markup (interno abitato, verticale).
     A 1440x900 devono stare sopra la piega testata, occhiello, H1, payoff, CTA
     e la barra intera: la foto è l'elemento che si comprime. */
  aspect-ratio: 4 / 3;
  max-height: min(52vh, 460px);
  margin-left: auto;
  border-radius: var(--radius-lg);
  overflow: hidden;
  box-shadow: var(--shadow-card);
}
.hero-wrap .hero-img img{
  width: 100%; height: 100%;
  object-fit: cover;
  border-radius: 0;
}
@media (max-width: 991.98px){
  .hero-wrap .hero-img{ aspect-ratio: 16 / 10; max-height: 42vh; margin-inline: auto; }
}


/* ==========================================================================
   8. LA BARRA DI RICERCA — .eg-search-band
   È il pezzo che nessun altro satellite ha, ed è il punto in cui il sito
   rischia di sembrare un aggregatore. Tre scelte per evitarlo:
   1. non è una fascia colorata a piena larghezza, è una SCHEDA appoggiata sul
      bordo inferiore della hero: si legge come l'ultima riga della hero, non
      come la prima riga di un portale;
   2. tre campi e un bottone, mai di più (docs/gio-modulo-ricerca.md §3.1);
   3. sotto la barra una riga sola, e parla a chi vende — il pubblico che i
      tre portali dimenticano.
   Tetti di misura (gio-sito-ia.md §2.1.1): ≤128px desktop, ≤96px mobile con
   il solo campo «Dove», ≤15% del viewport. I conti stanno nei commenti.
   ========================================================================== */

.eg-search-band{
  position: relative;
  z-index: 5;
  margin-top: calc(-1 * var(--space-6));  /* aggancio al bordo inferiore della hero */
  background-color: transparent;          /* mai una campitura d'accento */
}

.eg-search-bar{
  /* 14 + 66 + 14 = 94px di scheda; con la riga sotto (22 + 8) la fascia
     misura ~124px: sotto il tetto di 128. */
  display: grid;
  grid-template-columns: minmax(0, 1.5fr) minmax(0, 1fr) minmax(0, 1fr) auto;
  align-items: end;
  gap: var(--space-3);
  padding: var(--space-3) var(--space-4);
  background-color: var(--surface-card);
  border: 1px solid var(--line);
  border-radius: var(--radius-lg);
  box-shadow: var(--shadow-card);
}
.eg-search-field{ display: flex; flex-direction: column; min-width: 0; }
.eg-search-field label{
  font-family: var(--font-display);
  font-size: var(--text-xs);
  font-weight: var(--weight-medium);
  letter-spacing: .04em;
  color: var(--text-muted);               /* 7,35:1 su bianco */
  margin-bottom: var(--space-1);
}
/* I campi. Il bordo è --ink-400 (3,29:1) e non --line (1,31:1): il contorno di
   un controllo è un componente di interfaccia e WCAG 1.4.11 chiede 3:1.
   font-size 16px o iOS zooma da solo al focus e la pagina si sposta. */
.eg-search-field input,
.eg-search-field select{
  min-height: var(--gio-campo-h);
  padding: 0 var(--space-3);
  font-family: var(--font-body);
  font-size: 1rem;
  line-height: 1.2;
  color: var(--ink-900);
  background-color: var(--surface-card);
  border: 1px solid var(--gio-bordo-campo);
  border-radius: var(--radius-md);
  width: 100%;
}
.eg-search-field input::placeholder{ color: var(--text-muted); opacity: 1; }
.eg-search-field input:hover,
.eg-search-field select:hover{ border-color: var(--ink-600); }
.eg-search-field input:focus-visible,
.eg-search-field select:focus-visible{ border-color: var(--color-primary); }
/* I due <select> restano NATIVI (portano data-eg-native, quindi main.js non li
   sostituisce con nice-select): la freccia è quella del sistema operativo, non
   un segno disegnato da noi. Non serve, e non si aggiunge, nessun
   pseudo-elemento decorativo. */
.eg-search-field select{ padding-right: var(--space-2); }

.eg-search-submit,
.tl-primary-btn.eg-search-submit{
  min-height: var(--gio-campo-h);
  padding-inline: var(--space-6);
  align-self: end;
}

/* La riga sotto la barra: è l'unica, e va a chi vende. */
.eg-search-aside{
  margin: var(--space-2) 0 0;
  font-size: var(--text-sm);
  line-height: 1.4;
  color: var(--text-muted);
}
/* Il link è dentro una frase, quindi resta una riga di testo: portarlo a 44px
   di scatola gonfierebbe la fascia oltre il tetto dichiarato. L'area toccabile
   arriva comunque a 44px con uno pseudo-elemento che non occupa spazio nel
   layout — WCAG 2.5.8 misura il bersaglio, non la scatola del testo, e il
   testo attorno non è cliccabile, quindi la sovrapposizione non toglie niente
   a nessuno. NOTA per chi legge i report: tools/shoot.mjs misura il
   getBoundingClientRect dell'<a> e continuerà a contarlo come ~20px. */
.eg-search-aside a{
  position: relative;
  color: var(--ink-900);                  /* la fascia poggia sulla hero: inchiostro, non accento */
  text-decoration: underline;
  text-underline-offset: .18em;
  text-decoration-color: var(--color-primary);
  text-decoration-thickness: 2px;
}
.eg-search-aside a::before{
  content: "";
  position: absolute;
  inset: -12px -4px;
}

/* Tablet: la riga regge fino a 768px (dove 247 · tipologia 176 · fino a 176 ·
   cerca 96, gronde comprese). */
@media (max-width: 1023.98px){
  .eg-search-bar{ gap: var(--space-2); padding: var(--space-3); }
  .eg-search-submit,
  .tl-primary-btn.eg-search-submit{ padding-inline: var(--space-4); }
}

/* Sotto i 768px resta il solo campo «Dove» accanto a «Cerca» (§3.3).
   I due <select> restano nel DOM e continuano a serializzare il loro valore
   vuoto: il degrado senza JavaScript non cambia di una virgola.
   Conto dell'altezza: 10 + 48 + 10 = 68 di scheda, + 6 + 20 della riga sotto
   = 94px, sotto il tetto mobile di 96. L'etichetta va in linea con il campo
   perché resti visibile senza costare una riga (§3.6: mai solo placeholder). */
@media (max-width: 767.98px){
  .eg-search-band{ margin-top: calc(-1 * var(--space-5)); }
  .eg-search-bar{
    grid-template-columns: auto minmax(0, 1fr) auto;
    align-items: center;
    padding: var(--space-2) var(--space-3);
    gap: var(--space-2);
  }
  .eg-search-field--dove{
    display: contents;                    /* etichetta e campo diventano celle */
  }
  .eg-search-field--dove label{
    margin: 0 var(--space-1) 0 0;
    align-self: center;
    color: var(--ink-800);
  }
  .eg-search-field--tipologia,
  .eg-search-field--prezzo{ display: none; }
  .eg-search-field input{ min-height: 48px; }
  .eg-search-submit,
  .tl-primary-btn.eg-search-submit{
    min-height: 48px;
    padding-inline: var(--space-4);
  }
  .eg-search-aside{ margin-top: var(--space-2); font-size: var(--text-xs); }
}

/* Se una pagina interna monta un <select> senza data-eg-native, main.js lo
   sostituisce con nice-select: il campo vero sparisce e resta un <div>. Qui
   quel div prende le stesse misure e lo stesso bordo dei campi nativi, così
   la riga filtri non si spezza a seconda di come è scritto il markup. */
.nice-select{
  min-height: var(--gio-campo-h);
  line-height: calc(var(--gio-campo-h) - 2px);
  border: 1px solid var(--gio-bordo-campo);
  border-radius: var(--radius-md);
  font-family: var(--font-body);
  font-size: 1rem;
  color: var(--ink-900);
  background-color: var(--surface-card);
  padding-left: var(--space-3);
  padding-right: var(--space-7);
}
.nice-select:after{ border-color: var(--ink-600); }   /* la freccetta del plugin */
.nice-select .list{
  border-radius: var(--radius-md);
  box-shadow: var(--shadow-card);
  border: 1px solid var(--line);
}
.nice-select .option{ min-height: 44px; line-height: 44px; }
.nice-select .option.selected{ font-weight: var(--weight-medium); }
.nice-select .option:hover,
.nice-select .option.focus,
.nice-select .option.selected.focus{ background-color: var(--color-primary-soft); }


/* ==========================================================================
   9. LA CARD IMMOBILE — .eg-immobile-card
   È il componente che decide se sembriamo un'agenzia o un aggregatore.
   Regola non negoziabile: TUTTE LE CARD SONO IDENTICHE. Nessuna evidenziazione
   a pagamento, nessun badge di urgenza o novità, nessuna card più grande di
   un'altra: il dark pattern vero dei portali italiani è il pay-to-rank
   travestito da merito (docs/gio-modulo-ricerca.md §1.5).
   Otto dati, al massimo due badge, UN SOLO link per card.
   ========================================================================== */

/* DUE NOMI PER DUE COSE DIVERSE, e non era così.
   .eg-immobili-riga   = la .row di bootstrap del blocco 8 della home, con le
                         col-lg-4 dentro;
   .eg-immobili-griglia = l'<ol> di /immobili e di /immobili/<slug>, con <li>
                         senza classi, impaginato a grid dal CSS (§10.3).
   Prima erano la stessa classe su due strutture opposte, e la regola della
   griglia doveva agganciarsi a `ol.` per non fare a pezzi la home: un
   selettore di elemento usato come discriminante è un nome mancante. */
.eg-immobili-riga,
.eg-immobili-griglia{ margin-top: var(--space-6); }

.eg-immobile-card{
  position: relative;                     /* regge il link esteso a tutta la card */
  display: flex;
  flex-direction: column;
  height: 100%;                           /* stessa altezza a parità di riga */
  padding: 0 var(--space-5) var(--space-5);
  background-color: var(--surface-card);
  border: 1px solid var(--border-card);
  border-radius: var(--radius-lg);
  box-shadow: var(--shadow-card);
  overflow: hidden;
  transition: transform var(--dur-fast) var(--ease-brand),
              box-shadow var(--dur-fast) var(--ease-brand);
}
.eg-immobile-card:hover{
  transform: translateY(-4px);
  box-shadow: var(--shadow-lift);
}
/* quando il link dentro la card prende il fuoco, la cornice si vede su tutta
   la card e non solo sul titolo */
.eg-immobile-card:focus-within{
  outline: 3px solid var(--color-primary-strong);
  outline-offset: 2px;
}

/* 9.1 Media e badge -------------------------------------------------------
   La foto esce dalla gronda della card (margini negativi) e ha un rapporto
   fisso 4/3: senza aspect-ratio le tre card della home si allineavano male e
   il layout ballava al caricamento delle immagini (CLS).
   I badge sono due <p> fratelli senza contenitore: il media diventa un flex
   che li impila in basso a sinistra, così zero, uno o due badge stanno
   sempre bene senza toccare il markup. */
.eg-immobile-card__media{
  position: relative;
  display: flex;
  flex-wrap: wrap;
  align-content: flex-end;
  gap: var(--space-2);
  aspect-ratio: 4 / 3;
  padding: var(--space-3);
  margin: 0 calc(-1 * var(--space-5)) var(--space-4);
  background-color: var(--sand-100);      /* fondo caldo mentre la foto carica */
  overflow: hidden;
}
.eg-immobile-card__media img{
  position: absolute;
  inset: 0;
  width: 100%;
  height: 100%;
  object-fit: cover;
}
.eg-immobile-card__badge{
  position: relative;
  z-index: 1;
  margin: 0;
  padding: var(--space-1) var(--space-3);
  border-radius: var(--radius-pill);
  background-color: var(--tag-bg);        /* --color-primary-soft */
  color: var(--ink-800);                  /* ink su soft: 10,24:1 */
  font-family: var(--font-display);
  font-size: var(--text-xs);
  font-weight: var(--weight-medium);
  letter-spacing: .04em;
  line-height: 1.4;
}
/* «Venduta» e «Trattativa in corso» hanno trattamento SPENTO: un immobile che
   non è più disponibile non deve gridare più forte di uno che lo è.
   Il selettore è la classe, non il data-gio-badge (contratto §7.1): il tipo di
   badge si dichiara aggiungendo questa classe nel markup/template. */
.eg-immobile-card__badge--spento{
  background-color: var(--sand-100);
  color: var(--ink-800);                  /* 10,02:1 */
}

/* 9.2 Testo --------------------------------------------------------------- */
.eg-immobile-card__titolo{
  font-family: var(--font-display);
  font-size: var(--text-lg);
  font-weight: var(--weight-bold);
  line-height: var(--leading-snug);
  margin: 0 0 var(--space-2);
}
.eg-immobile-card__titolo a{
  color: var(--ink-900);
  text-decoration: none;
}
.eg-immobile-card__titolo a:hover{ color: var(--color-primary-strong); }
/* Un solo link per card in tutto l'ordine di tabulazione: il titolo si estende
   all'intera card con uno pseudo-elemento (§5.1). Niente «Vedi la scheda» come
   secondo link che dice la stessa cosa. */
.eg-immobile-card__titolo a::after{
  content: "";
  position: absolute;
  inset: 0;
  z-index: 2;
}
.eg-immobile-card__luogo,
.eg-immobile-card__dati{
  margin: 0 0 var(--space-2);
  font-size: var(--text-sm);
  color: var(--text-muted);               /* 7,35:1 */
}
/* IL PUNTO IN CUI HOME E GRIGLIA SI DIFFERENZIANO, ed è l'unico.
   La card è un solo componente con un solo ordine di campi (§7.5 del
   contratto: titolo, luogo, prezzo, dati, classe, riferimento). Quello che
   cambia fra i due contesti è il PESO del prezzo, e cambia qui, non nel DOM:
   in home la card fa da assaggio e il prezzo non è l'elemento dominante
   (IA §2.1 blocco 8); nella griglia dei risultati la card è sola col suo
   mestiere e il prezzo può pesare di più.
   Inchiostro pieno, mai accento: a 4,37:1 il dato più letto della pagina non
   ci può stare. */
.eg-immobile-card__prezzo{
  margin: auto 0 var(--space-3);          /* spinge in basso: card allineate */
  padding-top: var(--space-3);
  border-top: 1px solid var(--gio-riga);
  font-family: var(--font-display);
  font-size: var(--text-md);
  font-weight: var(--weight-medium);
  color: var(--ink-900);
}
/* Il gancio è l'<li> della lista dei risultati previsto dal contratto (§7.3):
   in home le card stanno dentro le col-* di una .row, qui dentro un <li>.
   Non un attributo data-gio-*, che il §7.1 vieta al CSS. */
li .eg-immobile-card__prezzo{
  font-size: var(--text-xl);
  font-weight: var(--weight-bold);
}
.eg-immobile-card__energia,
.eg-immobile-card__rif{
  margin: 0;
  font-size: var(--text-xs);
  color: var(--text-muted);
}
.eg-immobile-card__energia{ margin-bottom: var(--space-1); }

/* La coda della griglia: chi non ha trovato niente non finisce in un vicolo
   cieco nemmeno qui. */
.eg-immobili-coda{
  margin-top: var(--space-6);
  padding-top: var(--space-5);
  border-top: 1px solid var(--gio-riga);
  font-size: var(--text-md);
  color: var(--text-body);
}
.eg-immobili-coda a{
  display: inline-flex;
  align-items: center;
  min-height: 44px;
  color: var(--gio-accento);
  text-decoration: underline;
  text-underline-offset: .18em;
}


/* ==========================================================================
   10. IL MOTORE DI RICERCA — /immobili
   Le classi qui sotto sono quelle che il markup di immobili.html usa davvero
   (verificate a fine lavorazione sul file generato). Gli attributi data-gio-*
   NON compaiono: sono il contratto del JavaScript (gio-modulo-ricerca.md
   §7.1), e il CSS non li tocca — l'unica eccezione ammessa dal contratto è
   [hidden], che è HTML standard e lo gestisce già bootstrap.
   Tutto deve reggere SENZA JavaScript: la griglia di partenza è renderizzata
   a build time, «Applica i filtri» sparisce solo quando il motore è vivo, e
   nessuno stato è un vicolo cieco.
   ========================================================================== */

/* 10.1 La riga filtri — sand, non sticky ---------------------------------
   Una barra che insegue lo scroll è il tratto più riconoscibile
   dell'aggregatore, e su telefono si mangia un quinto del viewport. Qui è un
   blocco fermo, largo quanto il contenuto, che si legge una volta e si usa. */
.eg-filtri{
  padding: var(--space-5);
  background-color: var(--surface-alt);
  border: 1px solid var(--line);
  border-radius: var(--radius-lg);
  /* su sand --ink-400 scende a 3,02:1: i bordi dei campi passano a text-muted
     (6,75:1). La variabile lo fa da sola per tutto ciò che sta qui dentro. */
  --gio-bordo-campo: var(--text-muted);
  --gio-accento: var(--ink-800);
}
.eg-filtri-riga{
  display: flex;
  flex-wrap: wrap;
  align-items: end;
  gap: var(--space-4) var(--space-5);
}
.eg-filtro,
.eg-filtro-gruppo{
  display: flex;
  flex-direction: column;
  min-width: 0;
  border: 0;
  margin: 0;
  padding: 0;
}
.eg-filtro-gruppo{ gap: var(--space-2); }
.eg-filtro > label,
.eg-filtro-gruppo > legend,
.eg-ordina > label{
  font-family: var(--font-display);
  font-size: var(--text-xs);
  font-weight: var(--weight-medium);
  letter-spacing: .04em;
  color: var(--ink-800);
  margin-bottom: var(--space-1);
  padding: 0;
  float: none;                          /* <legend> di bootstrap: 100% di larghezza */
  width: auto;
}
.eg-filtro-gruppo{ flex-direction: row; flex-wrap: wrap; align-items: center; }
/* <legend> non è un elemento flex (il browser lo rende a parte): il testo di
   aiuto, che invece lo è, va mandato a capo a mano o si incastra fra le
   pastiglie. */
.eg-filtro-gruppo > legend{ flex: 1 0 100%; }
.eg-filtro-gruppo > p{ flex: 1 0 100%; margin-bottom: var(--space-2); }
.eg-filtro input[type="text"],
.eg-filtro select,
.eg-ordina select{
  min-height: var(--gio-campo-h);
  padding: 0 var(--space-3);
  font-family: var(--font-body);
  font-size: 1rem;                      /* sotto i 16px iOS zooma al focus */
  color: var(--ink-900);
  background-color: var(--surface-card);
  border: 1px solid var(--gio-bordo-campo);
  border-radius: var(--radius-md);
  max-width: 100%;
}
.eg-filtro--dove input{ min-width: 14rem; }

/* Le scelte multiple (contratto, dotazioni, bandiere) come pastiglie.
   Il controllo nativo resta visibile dentro la pastiglia: è lui a dire se è
   spuntato, così lo stato non è comunicato dal solo colore (WCAG 1.4.1) e chi
   naviga da tastiera vede il fuoco dove se lo aspetta. */
.eg-filtro-scelta{
  display: inline-flex;
  align-items: center;
  gap: var(--space-2);
  /* 44 è il pavimento del bersaglio, +2 è il bordo. Il bersaglio vero qui è
     la <label>, e la label si stende sulla SCATOLA DEL CONTENUTO della
     pastiglia, che con `box-sizing: border-box` è alta 44−2 = 42. Due pixel
     di pastiglia in più sono l'unico modo di portare la label a 44 esatti
     senza toccare la larghezza di niente: costano 4 px di pannello a 1600,
     6 a 1024, 12 a 768 e 24 a 390 — misurati. Vedi la label qui sotto. */
  min-height: calc(44px + 2px);
  padding: 0 var(--space-4) 0 var(--space-3);
  border: 1px solid var(--gio-bordo-campo);
  border-radius: var(--radius-pill);
  background-color: var(--surface-card);
  font-size: var(--text-sm);
  line-height: 1.25;
}
.eg-filtro-scelta:hover{ border-color: var(--ink-900); }
.eg-filtro-scelta:has(input:checked){
  background-color: var(--color-primary-soft);
  border-color: var(--color-primary);
  font-weight: var(--weight-medium);
}
.eg-filtro-scelta{ position: relative; }
.eg-filtro-scelta input{ accent-color: var(--color-primary-strong); flex: none; }
/* L'ETICHETTA È IL BERSAGLIO, E DEVE MISURARLO.
   Il quadratino nativo è alto 13px: da solo è troppo piccolo, e infatti il
   bersaglio vero è la <label>, che comanda lo stesso controllo. Solo che la
   label si dava l'altezza con `padding-block: var(--space-2)`, cioè 8+8 sopra
   una riga di 18,75px: 34,8px misurati, diciotto volte, su tutte e cinque le
   larghezze. Sotto i 44 richiesti.
   Il rimedio NON è crescere in verticale: la pastiglia che la contiene è già
   un bersaglio buono, quindi basta che la label ci si stenda dentro invece di
   misurarsi da sé. `align-self: stretch` le dà l'altezza della scatola del
   contenuto della pastiglia, il flex interno le tiene il testo in mezzo, e il
   padding se ne va — era proprio lui a dare i 34,8.
   INGOMBRO DEL PANNELLO, prima → dopo, misurato:
     1600  774 → 778      768   1.205 → 1.217
     1280  774 → 778      390   1.830 → 1.854
     1024  826 →  832
   cioè i 2 px di pastiglia del blocco qui sopra, moltiplicati per il numero
   di righe di pastiglie che ogni larghezza produce. Non c'è nessuna riga in
   più: la pastiglia resta larga uguale e va a capo negli stessi punti.

   LA LARGHEZZA DELLE QUATTRO ETICHETTE-CIFRA, e perché resta com'è. In
   «Locali, almeno» le label «1», «2», «3», «4» misurano 7,5 px di larghezza:
   il bersaglio però è tutta la pastiglia (58,5 × 44, perché il ::before qui
   sotto la copre per intero), quindi il minimo è rispettato dove conta.
   Portare anche la scatola della label a ≥44 con una misura minima si può, ma
   allarga quelle sei pastiglie e la riga va a capo una volta in più: pannello
   826 → 919 a 1024 e 1.830 → 1.908 a 390, misurati. Novantatré pixel di
   modulo in più prima della prima casa, per una misura che il bersaglio ha
   già: non si fa. */
.eg-filtro-scelta label{
  display: flex;
  align-items: center;
  align-self: stretch;
  cursor: pointer;
}
/* Il fondo della pastiglia è il bersaglio: la label lo copre tutto, padding
   compreso, così ci si può cliccare anche di fianco al quadratino. Il
   quadratino resta visibile, perché lo stato non si dice col solo colore.
   (I report automatici continueranno a misurare il solo <input>.) */
.eg-filtro-scelta label::before{
  content: "";
  position: absolute;
  inset: 0;
  border-radius: var(--radius-pill);
}
.eg-filtro--bandiera{ gap: var(--space-2); }
.eg-filtro__aiuto{
  margin: 0;
  font-size: var(--text-sm);
  color: var(--text-muted);
  max-width: 46ch;
}

.eg-filtri-azioni{
  display: flex;
  flex-wrap: wrap;
  align-items: center;
  gap: var(--space-3) var(--space-4);
  margin-top: var(--space-5);
}
.eg-altri-filtri-btn,
.eg-azzera{
  display: inline-flex;
  align-items: center;
  min-height: 44px;
  padding: 0 var(--space-4);
  background: none;
  border: 1px solid transparent;
  border-radius: var(--radius-pill);
  font-family: var(--font-display);
  font-size: var(--text-sm);
  font-weight: var(--weight-medium);
  color: var(--ink-900);
  cursor: pointer;
}
.eg-altri-filtri-btn{ border-color: var(--gio-bordo-campo); }
.eg-altri-filtri-btn:hover{ border-color: var(--ink-900); }
.eg-azzera{ text-decoration: underline; text-underline-offset: .18em; padding-inline: var(--space-2); }
/* «Applica i filtri» esiste per chi non ha JavaScript e sparisce solo quando
   il motore è vivo: la classe .js-attivo la mette ricerca.js sull'<html>, e la
   toglie da sola se il JSON non arriva (§4.8). Senza questa riga il bottone
   resterebbe visibile anche a filtro istantaneo attivo. */
.js-attivo .eg-applica-filtri{ display: none; }
.eg-altri-filtri{
  display: flex;
  flex-wrap: wrap;
  gap: var(--space-4) var(--space-6);
  margin-top: var(--space-5);
  padding-top: var(--space-5);
  border-top: 1px solid var(--line);
}

/* 10.2 Riga di servizio: conteggio, ordinamento, criterio dichiarato ------ */
.eg-riga-servizio{
  display: flex;
  flex-wrap: wrap;
  align-items: end;
  justify-content: space-between;
  gap: var(--space-3) var(--space-5);
  margin-top: var(--space-6);
  padding-top: var(--space-5);
  border-top: 1px solid var(--line);
}
.eg-conteggio{
  margin: 0;
  font-family: var(--font-display);
  font-size: var(--text-md);
  font-weight: var(--weight-medium);
  color: var(--ink-900);
}
.eg-ordina{ display: flex; flex-direction: column; }
/* La riga che dichiara il criterio non è una nota a piè di pagina: è la cosa
   più credibile che possiamo scrivere e non si nasconde mai (§4.4). */
.eg-criterio{
  margin: var(--space-3) 0 0;
  font-size: var(--text-sm);
  color: var(--text-muted);
}
.eg-noscript{
  margin: var(--space-5) 0 0;
  padding: var(--space-4) var(--space-5);
  border-left: 4px solid var(--color-primary);
  background-color: var(--color-primary-soft);
  color: var(--ink-800);                /* 10,24:1 sul soft */
}

/* 10.3 Intestazione dei risultati e griglia ------------------------------
   Sulla pagina risultati la griglia è un <ol> con <li> senza classi (il
   contratto §7.3 vieta al JavaScript di lavorare per classe): le colonne le
   mette il CSS, non bootstrap. La classe è .eg-immobili-griglia e vale SOLO
   qui — la riga di card della home si chiama .eg-immobili-riga (§9), così la
   regola non ha più bisogno di `ol.` per distinguere due strutture diverse
   che portavano lo stesso nome. */
.eg-risultati-intro p{ font-size: var(--text-lg); color: var(--text-body); }
.eg-risultati-titolo{
  font-size: var(--text-xl);
  margin: var(--space-7) 0 var(--space-5);
}
.eg-immobili-griglia{
  list-style: none;
  margin: 0;
  padding: 0;
  display: grid;
  gap: var(--space-5);
  grid-template-columns: 1fr;
}
@media (min-width: 48rem){ .eg-immobili-griglia{ grid-template-columns: repeat(2, minmax(0,1fr)); } }
@media (min-width: 64rem){ .eg-immobili-griglia{ grid-template-columns: repeat(3, minmax(0,1fr)); } }
.eg-immobili-griglia > li{ display: flex; }

/* 10.4 Stati: caricamento, errore, nessun risultato ----------------------
   «Nessun immobile con questi criteri» ha lo stesso peso tipografico di un
   contenuto vero: dice il fatto, spiega, propone il filtro da togliere e
   lascia due vie d'uscita. Niente rosso, niente punti esclamativi, niente
   faccine: non è un errore dell'utente. */
.eg-caricamento{ color: var(--text-muted); font-size: var(--text-sm); }
.eg-errore{
  padding: var(--space-5);
  border: 1px solid var(--ink-400);
  border-left: 4px solid var(--error);
  border-radius: var(--radius-md);
  background-color: var(--surface-card);
}
.eg-errore p:last-child{ margin-bottom: 0; }
.eg-vuoto{
  margin: var(--space-6) 0;
  padding: var(--space-7);
  background-color: var(--surface-alt);
  border: 1px solid var(--line);
  border-radius: var(--radius-lg);
}
.eg-vuoto h2{
  font-size: var(--text-2xl);
  line-height: var(--leading-snug);
  margin-bottom: var(--space-4);
}
.eg-vuoto p{ max-width: 62ch; }
.eg-suggerimento{
  font-size: var(--text-lg);
  color: var(--ink-900);
}
/* il filtro citato nel suggerimento si evidenzia con una sottolineatura piena
   di soft: l'accento non finisce mai sotto al testo lungo */
.eg-suggerimento em,
.eg-suggerimento strong{
  font-style: normal;
  font-weight: var(--weight-medium);
  box-shadow: inset 0 -.35em 0 var(--color-primary-soft);
}
.eg-vuoto-azioni{
  display: flex;
  flex-wrap: wrap;
  gap: var(--space-4);
  margin: var(--space-5) 0;
}

/* 10.5 Paginazione numerica ---------------------------------------------- */
.eg-paginazione{ margin-top: var(--space-7); }
.eg-paginazione ol{
  list-style: none;
  display: flex;
  flex-wrap: wrap;
  gap: var(--space-2);
  margin: 0;
  padding: 0;
}
.eg-paginazione a,
.eg-paginazione [aria-current="page"]{
  display: inline-flex;
  align-items: center;
  justify-content: center;
  min-width: 44px;
  min-height: 44px;
  padding: 0 var(--space-4);
  border: 1px solid var(--line);
  border-radius: var(--radius-md);
  font-family: var(--font-display);
  font-size: var(--text-sm);
  color: var(--ink-900);
  text-decoration: none;
}
.eg-paginazione a:hover{ border-color: var(--ink-900); }
/* la pagina corrente non è un link e non si distingue col solo colore */
.eg-paginazione [aria-current="page"]{
  background-color: var(--ink-900);
  color: var(--text-inverse);
  border-color: var(--ink-900);
  font-weight: var(--weight-bold);
}

/* 10.6 Ricerca inversa e code editoriali --------------------------------- */
.eg-ricerca-inversa,
.eg-rimando-portafoglio{ margin-top: var(--space-7); }
.eg-selezione-punti{ display: grid; gap: var(--space-5); margin-top: var(--space-5); }
@media (min-width: 48rem){ .eg-selezione-punti{ grid-template-columns: repeat(3, minmax(0,1fr)); } }

/* ==========================================================================
   11. I BLOCCHI EDITORIALI DELLA HOME (e delle pagine interne che li riusano)
   ========================================================================== */

/* 11.1 «Tre cose che quasi nessuno fa» — .eg-differenziante ---------------
   Il tema fissa .about-item-4 a 480px perché lì dentro ci va solo una foto.
   Qui c'è foto + titolo + testo: l'altezza la fa il contenuto, e la foto tiene
   il suo rapporto 3/2. */
.about-item-4.eg-differenziante{
  height: auto;
  display: flex;
  flex-direction: column;
}
.eg-differenziante-img{
  aspect-ratio: 3 / 2;
  border-radius: var(--radius-lg);
  overflow: hidden;
  margin-bottom: var(--space-5);
  background-color: var(--sand-100);
}
.eg-differenziante-img img{
  width: 100%;
  height: 100%;
  object-fit: cover;
  border-radius: 0;
}
.eg-differenziante .title{
  font-size: var(--text-xl);
  font-weight: var(--weight-bold);
  line-height: var(--leading-snug);
  margin-bottom: var(--space-3);
}
.eg-differenziante p{ margin-bottom: 0; color: var(--text-body); }
/* Il tema sfalsa le tre colonne (50px e 100px di margine sul secondo e sul
   terzo figlio) per fare «dinamismo». Su gio le tre prove hanno lo stesso peso
   e devono leggersi come tre: partono dalla stessa riga. È l'unico punto in cui
   serve ricalcare un :nth-child, perché è il selettore da battere. */
.about-item-wrap > div:nth-child(2),
.about-item-wrap > div:nth-child(3){ margin-top: 0; }

/* 11.2 I due percorsi — .service-item-4 -----------------------------------
   Vendi o compri: due righe larghe, numerate, con il titolo che diventa
   terracotta al passaggio. Il numero è l'unico posto in cui l'accento pieno
   compare in questa sezione. */
.service-item-4{ border-color: var(--gio-riga); padding-block: var(--space-6); }
.service-item-4:first-child{ border-top-color: var(--gio-riga); padding-top: var(--space-6); }
.service-item-4:not(:last-of-type){ margin-bottom: 0; }
.service-item-4 .service-item-inner .left-content > span{
  font-family: var(--font-display);
  font-size: var(--text-xl);
  font-weight: var(--weight-bold);
  color: var(--color-primary);            /* numero grande: 4,37:1, sopra il 3:1 */
  min-width: 2.5rem;
}
.service-item-4 .service-item-inner .left-content .left-content-inner .title{
  font-size: var(--text-2xl);
  font-weight: var(--weight-bold);
  line-height: var(--leading-snug);
  margin-bottom: var(--space-3);
}
.service-item-4 .title a{ color: var(--ink-900); text-decoration: none; }
.service-item-4:hover .title a,
.service-item-4 .title a:hover{ color: var(--color-primary-strong); }
/* IL TESTO NON SI NASCONDE DIETRO UN HOVER. Il tema mette la descrizione di
   ogni percorso in `position:absolute; visibility:hidden; opacity:0` e la
   scopre solo al passaggio del mouse: su un touch screen quel testo non esiste,
   e qui non è un dettaglio decorativo ma la spiegazione di che cosa succede a
   chi vende e a chi compra. Torna nel flusso, sempre visibile. */
.service-item-4 .service-item-inner .left-content .left-content-inner{
  width: auto;
  max-width: 68ch;
  padding-bottom: 0;
}
.service-item-4:hover .service-item-inner .left-content .left-content-inner{ padding-bottom: 0; }
.service-item-4 .service-item-inner .left-content .left-content-inner p{
  position: static;
  visibility: visible;
  opacity: 1;
  color: var(--text-body);
  max-width: 68ch;
  margin-bottom: 0;
}
.service-item-4 .service-arrow a{
  display: inline-flex;
  align-items: center;
  justify-content: center;
  min-width: 44px;
  min-height: 44px;                       /* nel tema erano 42×42 */
  border-radius: 50%;
  border: 1px solid var(--ink-400);
  color: var(--ink-900);
}
.service-item-4 .service-arrow a:hover{
  background-color: var(--color-primary-strong);
  border-color: var(--color-primary-strong);
  color: var(--text-inverse);
}

/* 11.3 «Come nasce il prezzo» — la fascia scura --------------------------
   L'unica superficie scura della pagina, e serve da climax.
   In home il blocco è una SINTESI di tre frasi che rimanda a /valutazione;
   su /valutazione lo stesso vestito serve l'argomentazione lunga, con le tre
   colonne «cosa non usiamo» (testo, non card). */
.eg-exp-testo-intro p{
  font-size: var(--text-lg);
  color: rgba(255,255,255,.86);           /* 10,79:1 su ink-900 */
}
/* la riga che chiude la sintesi della home e manda a leggere il resto */
.eg-exp-rimando{ margin-top: var(--space-5); margin-bottom: 0; }
.eg-exp-sottotitolo{
  font-family: var(--font-display);
  font-size: var(--text-xs);
  font-weight: var(--weight-medium);
  letter-spacing: var(--tracking-caps);
  text-transform: uppercase;
  color: var(--color-primary-on-dark);    /* 4,54:1 */
  margin: var(--space-8) 0 var(--space-5);
}
.exp-item.eg-exp-testo .exp-content .title{
  font-family: var(--font-display);
  font-size: var(--text-lg);
  font-weight: var(--weight-bold);
  color: var(--text-inverse);
}
.exp-item .exp-content .line{
  background-color: var(--color-primary-on-dark);
  opacity: .5;
  width: 2.5rem;
  margin: var(--space-4) 0;
}
.exp-item.eg-exp-testo p{ color: rgba(255,255,255,.82); margin-bottom: 0; }

/* 11.4 Home staging — le due fasce ---------------------------------------
   QUI C'ERA L'EFFETTO DEL TEMA, E NON DEVE TORNARE.
   Il markup era `.project-item-wrap-2 > .project-item-2`, cioè esattamente il
   selettore con cui main.js (tema, condiviso) monta sopra i 992px uno
   ScrollTrigger GSAP con `pin: true`, `pinSpacing: false` e `scrub: 2`: la
   «pila di schede di portfolio». Su questo blocco produceva foto sovrapposte,
   titolo tagliato a metà, i numeri 01/02 fuori posto e una home alta
   14.609px con l'ultimo terzo vuoto, perché il pin si prenota l'altezza di
   scorrimento. Lo si è sganciato cambiando le classi nel generatore: qui
   sotto non c'è nessuna classe del tema, quindi il selettore di main.js non
   trova più niente e non è servita una riga di JavaScript per disfarlo.

   L'impaginazione è ferma: due fasce, foto grande a sinistra e testo accanto,
   che si alternano. Niente testo sopra la foto — era anche quello a rendere
   illeggibile il titolo — e una didascalia che dichiara il cartone, che su
   questo blocco è il contenuto, non una nota. */
.eg-bande{
  display: grid;
  gap: var(--space-9);
}
.eg-banda{
  display: grid;
  gap: var(--space-6);
  align-items: center;
}
@media (min-width: 62rem){
  .eg-banda{
    grid-template-columns: minmax(0, 7fr) minmax(0, 5fr);
    gap: var(--space-8);
  }
  /* La seconda fascia specchiata: il ritmo è la sola decorazione.
     Le colonne si invertono INSIEME all'ordine, o la foto finisce nella
     colonna stretta e la fascia pari esce più piccola dell'altra (misurato:
     607px contro 433px). */
  .eg-banda:nth-child(even){ grid-template-columns: minmax(0, 5fr) minmax(0, 7fr); }
  .eg-banda:nth-child(even) .eg-banda__figura{ order: 2; }
}
.eg-banda__figura{
  margin: 0;
  min-width: 0;
}
.eg-banda__figura img{
  display: block;
  width: 100%;
  height: auto;
  aspect-ratio: 4 / 3;
  object-fit: cover;
  object-position: center;
  border-radius: var(--radius-lg);
}
@media (min-width: 62rem){
  .eg-banda__figura img{ aspect-ratio: 3 / 2; }
}
.eg-banda__didascalia{
  font-size: var(--text-sm);
  line-height: 1.45;
  color: var(--text-muted);
  margin-top: var(--space-3);
  max-width: 46ch;
}
.eg-banda__testo{ min-width: 0; }
.eg-banda__numero{
  font-family: var(--font-display);
  font-size: var(--text-sm);
  font-weight: var(--weight-bold);
  letter-spacing: var(--tracking-caps);
  color: var(--gio-accento);
  margin-bottom: var(--space-2);
}
.eg-banda__titolo{
  font-family: var(--font-display);
  font-size: var(--text-2xl);
  font-weight: var(--weight-bold);
  line-height: var(--leading-tight);
  color: var(--ink-900);
  text-wrap: balance;
  max-width: 20ch;
  margin-bottom: var(--space-3);
}
.eg-banda__testo p:not(.eg-banda__numero){ max-width: 56ch; margin-bottom: 0; }

/* La griglia del cartone su /home-staging: tre figure affiancate, stessa
   didascalia dichiarativa. Anche qui niente classi del tema. */
.eg-cartone-banda{ margin: 0; min-width: 0; }
.eg-cartone-banda img{
  display: block;
  width: 100%;
  height: auto;
  aspect-ratio: 3 / 4;
  object-fit: cover;
  object-position: center;
  border-radius: var(--radius-lg);
}

/* 11.5 «Patti chiari» — l'accordion --------------------------------------- */
.accordion-item{ border: 0; background-color: transparent; }
.accordion-button,
.faq-content .faq-accordion .accordion-item .accordion-button,
.faq-content-2 .faq-accordion .accordion-item .accordion-button{
  font-family: var(--font-display);
  font-size: var(--text-lg);
  font-weight: var(--weight-bold);
  color: var(--ink-900);
  border-top-color: var(--gio-riga);
  padding-block: var(--space-5);
  gap: var(--space-4);
  min-height: 44px;
}
.accordion-button span,
.faq-content .faq-accordion .accordion-item .accordion-button span,
.faq-content-2 .faq-accordion .accordion-item .accordion-button span{
  font-size: var(--text-sm);
  font-weight: var(--weight-medium);
  color: var(--color-primary-strong);     /* la numerazione: 4,54:1 */
}
.accordion-button:not(.collapsed),
.faq-content .faq-accordion .accordion-item .accordion-button:not(.collapsed),
.faq-content-2 .faq-accordion .accordion-item .accordion-button:not(.collapsed){
  color: var(--color-primary-strong);
  background-color: transparent;
  border-color: var(--gio-riga);
}
.accordion-button:after{ color: var(--ink-900); }
.accordion-body{ padding: 0 0 var(--space-6); }
.accordion-body p{ color: var(--text-body); }

/* Elenco di marca: UN SOLO marcatore, il filetto orizzontale (mai un chevron:
   motivo abolito). Il markup portava anche una spunta cerchiata del tema
   incollata al testo — due segni per riga, il secondo pure semanticamente
   falso su un elenco di cose da temere: è stata tolta dal generatore.
   Il rientro è sporgente: il filetto esce dal flusso (position:absolute) e il
   testo — prima riga e righe di continuazione — si allinea tutto al bordo
   del padding. Prima l'<i> in mezzo spostava solo la prima riga, e le altre
   rientravano sotto il bollino. */
/* .eg-ruoli è un elenco come gli altri: sull'agenzia arrivava con i pallini
   di serie del browser (list-style:disc con padding-left 0, quindi i pallini
   fuori dal riquadro). Un secondo linguaggio di marcatore per la stessa cosa:
   qui prende quello di casa. */
.eg-lista,
.eg-ruoli{ list-style: none; padding: 0; margin: 0 0 var(--space-4); }
.eg-ruoli li{
  position: relative;
  padding-left: var(--space-6);
  margin-bottom: var(--space-3);
  line-height: var(--leading-body);
  color: var(--text-body);
}
.eg-ruoli li::before{
  content: "";
  position: absolute;
  left: 0;
  top: .72em;
  width: .85rem;
  height: 2px;
  background-color: var(--gio-filetto);
}
.eg-lista li{
  position: relative;
  padding-left: var(--space-6);
  /* fra una voce e l'altra deve esserci più aria che fra due righe della
     stessa voce, o le voci si leggono come un paragrafo unico: interlinea
     1,6 (0,96rem di spazio fra le righe) contro 1rem fra le voci non
     bastava. */
  margin-bottom: var(--space-5);
  line-height: var(--leading-body);
  color: var(--text-body);
  max-width: 72ch;
}
.eg-lista li:last-child{ margin-bottom: 0; }
.eg-lista li::before{
  content: "";
  position: absolute;
  left: 0;
  top: .72em;
  width: .85rem;
  height: 2px;
  background-color: var(--gio-filetto);
}

/* La colonna di lato dell'accordion: una scheda sand, non una foto. */
/* IL PADDING È PIÙ STRETTO DI FIANCO CHE SOPRA, e non è un capriccio: la
   scheda vive in una col-lg-3 che a 1024 misura 226px, e 32px per lato ne
   lasciavano 160 al bottone, che di suo ne chiede 171. Il bottone non andava
   a capo (l'etichetta è una parola sola) — usciva: misurato a 1024, il tondo
   bianco della freccia sporgeva per metà FUORI dalla pastiglia terracotta, ed
   è il residuo di cui restava traccia nella misura h59 di quando l'etichetta
   era ancora lunga. 24px di fianco lasciano 176: il bottone ci sta con sei
   pixel di margine, e la scheda non perde niente in verticale. */
.faq-img-wrap.eg-faq-aside{
  padding: var(--space-6) var(--space-5);
  background-color: var(--surface-alt);
  border: 1px solid var(--line);
  border-radius: var(--radius-lg);
  --gio-accento: var(--ink-800);
}
.faq-img-wrap.eg-faq-aside .title{
  font-family: var(--font-display);
  font-size: var(--text-lg);
  font-weight: var(--weight-bold);
  line-height: var(--leading-snug);
  color: var(--ink-900);
  margin-bottom: var(--space-3);
}
.faq-img-wrap.eg-faq-aside p{ color: var(--text-muted); }
/* La colonna è stretta (col-lg-3 = 258px a 1440): la pastiglia prende tutta la
   larghezza e l'etichetta sta a sinistra, la freccia a destra.
   NIENTE `line-height` né `font-size` locali. Erano gli ultimi due valori con
   cui questa pastiglia divergeva da tutte le altre: il corpo era già quello di
   sistema (--text-sm, quindi la riga era una ripetizione), e l'interlinea a
   1,25 contro l'1,2 di §5 non si vedeva finché l'etichetta stava su una riga —
   ma su DUE faceva 2×18,75 + 19,2 + 2 = 58,7, cioè l'h59 che il registro
   riporta. Oggi l'etichetta è una parola sola e la pastiglia misura 55,19 px,
   uguale al riferimento di sezione allo 0,00: togliendo l'interlinea locale
   quella misura smette di dipendere dalla lunghezza dell'etichetta e torna a
   dipendere dal componente. */
.eg-faq-aside .tl-primary-btn{
  margin-top: var(--space-4);
  width: 100%;
  justify-content: space-between;
  text-align: left;
}
/* `space-between` fa già tutto lo spazio che serve fra etichetta e freccia:
   il margine di §5 serve alle pastiglie centrate, qui è larghezza sprecata in
   una colonna che non ne ha. */
.eg-faq-aside .tl-primary-btn .icon{ margin-left: 0; }

/* 11.6 «Quello che possiamo dimostrare» — lo spazio dichiarato vuoto ------
   Finché non ci sono due testimonianze vere e autorizzate, qui non si mette
   niente: nessuna voce inventata, nessuna stellina, nessun punteggio. Lo
   spazio vuoto è dichiarato, e si vede che è un posto riservato. */
.eg-voci-vuoto{
  padding: var(--space-6);
  border: 1px dashed var(--ink-400);
  border-radius: var(--radius-lg);
  background-color: var(--surface-alt);
}
.eg-voci-titolo{
  font-family: var(--font-display);
  font-size: var(--text-lg);
  font-weight: var(--weight-bold);
  line-height: var(--leading-snug);
  color: var(--ink-900);
  margin-bottom: var(--space-3);
}

/* 11.7 La chiamata finale sopra la fotografia ----------------------------
   Il velo del tema è al 48%: su una foto chiara il testo bianco non arriva a
   4,5:1. Qui il velo diventa un gradiente più profondo — il contrasto lo
   garantisce il layout, non lo scatto. */
.cta-section-3{ padding-block: clamp(var(--space-8), 10vw, 9.375rem); }
.cta-section-3 .cta-bg:before{
  opacity: 1;
  background-color: transparent;
  background-image:
    linear-gradient(180deg, rgba(21,18,16,.74) 0%, rgba(21,18,16,.68) 55%, rgba(21,18,16,.8) 100%);
}
.cta-wrap-3 .section-heading p{ color: rgba(255,255,255,.92); }
.cta-wrap-3 .eg-cta-btn-wrap{ justify-content: center; }
.cta-wrap-3 .eg-draft-note{ text-align: center; }

/* 11.8 «Il gruppo» — il rimando al portale -------------------------------
   Qui non si racconta né la storia né il metodo del gruppo: vivono sul
   portale. Il blu di gruppo compare solo su questo link e sul filetto. */
.eg-gruppo-section{ --gio-accento: var(--ink-800); }
.eg-gruppo-wrap{
  border-top: 4px solid var(--color-group);
  padding-top: var(--space-6);
}
.eg-gruppo-wrap .sub-heading{ color: var(--color-group-strong); }  /* 7,70:1 */
.eg-gruppo-wrap .sub-heading::before{ background-color: var(--color-group); }
.eg-gruppo-link{ margin-bottom: 0; }
.eg-gruppo-link a{
  display: inline-flex;
  align-items: center;
  min-height: 44px;
  font-family: var(--font-display);
  font-weight: var(--weight-medium);
  color: var(--color-group);              /* 4,80:1 su sand: si legge E si vede che è blu */
  text-decoration: underline;
  text-underline-offset: .2em;
}


/* ==========================================================================
   12. FOOTER
   Neutri e blu di gruppo. Il terracotta qui non entra: il footer appartiene
   alla rete, non al singolo satellite.
   ========================================================================== */

.footer-section{
  padding-bottom: clamp(var(--space-9), 14vw, 12.5rem);
  background-color: var(--footer-group-bg);
  color: rgba(255,255,255,.82);           /* 10,79:1 su ink-900 */
}
/* Il fondo del tema era un segnaposto «1920X950»: il div resta perché dipinge
   la superficie, ma il colore lo dà il token e il velo nero non serve più. */
.footer-section .footer-bg{ background-color: var(--footer-group-bg); }
.footer-section .footer-bg:before{ opacity: 0; }
/* Il pannello traslucido del tema chiudeva a 550px con un gradino orizzontale
   in mezzo al footer: la superficie resta piatta. */
.footer-section .footer-shade{ display: none; }
.footer-section p,
.footer-section address,
.footer-section .footer-list li{ color: rgba(255,255,255,.82); }

.eg-footer-title{
  font-family: var(--font-display);
  font-size: var(--text-xs);
  font-weight: var(--weight-medium);
  letter-spacing: var(--tracking-caps);
  text-transform: uppercase;
  color: rgba(255,255,255,.66);           /* ~7,4:1 */
  margin-bottom: var(--space-4);
}
.footer-widget .footer-list li:not(:last-of-type){ margin-bottom: 0; }
.footer-widget .footer-list li a,
.footer-widget .footer-list li > span{
  display: inline-flex;
  align-items: center;
  min-height: 44px;                       /* nel tema misuravano 23px */
  font-family: var(--font-body);
  font-size: var(--text-md);
  font-weight: var(--weight-body);
  line-height: 1.3;
  color: var(--text-inverse);
  text-decoration: none;
}
.footer-widget .footer-list li a:hover{
  color: var(--text-inverse);
  text-decoration: underline;
  text-underline-offset: .2em;
}
/* Il tema disegna un SECONDO segnale di passaggio: un filetto assoluto in
   `::before` largo 0 che a hover diventa 100% del link. Sulle voci a una riga
   raddoppia la sottolineatura; sulle voci a due righe cade sotto la riga di
   descrizione, cioè in un terzo posto ancora. Un segnale solo. */
.footer-widget .footer-list li a:before,
.footer-widget .footer-list li a:hover:before{ display: none; }
/* La colonna delle cinque realtà: nome + qualifica su due righe. La qualifica
   è il servizio, non un claim. */
/* La profondità ricalca quella del tema (.footer-widget .footer-list li a):
   con un selettore più corto vinceva il suo align-items:center e le sei righe
   della rete finivano incolonnate al centro, ognuna con un rientro diverso. */
.footer-widget .footer-list.eg-footer-gruppo li a,
.footer-widget .footer-list.eg-footer-gruppo li > span{
  flex-direction: column;
  align-items: flex-start;
  justify-content: center;
  padding-block: var(--space-2);
  line-height: 1.3;
}
/* Ogni voce del gruppo è un blocco di due righe: il nome e il mestiere.
   Difetto misurato: con `text-decoration: underline` sull'<a> la decorazione
   si applica a tutte e due le righe — che sono larghe diverso — e insieme al
   filetto del tema si vedevano TRE segni sovrapposti su un solo passaggio del
   puntatore (misurato su «Studio R»: sottolineatura sul nome, sottolineatura
   sulla descrizione, filetto bianco largo 216px sotto).
   Il segnale resta la sottolineatura, che è il linguaggio di hover di tutto
   il sito (link di testo, voci di footer, indice di pagina): cambia solo
   dove cade, cioè sul nome. Il nome ha un suo <span> apposta; la
   sottolineatura non può essere «tolta» da un figlio, quindi si spegne
   sull'<a> e si accende sul nome. */
.footer-widget .footer-list.eg-footer-gruppo li a,
.footer-widget .footer-list.eg-footer-gruppo li a:hover{ text-decoration: none; }
.eg-realta{
  display: block;
  text-decoration: inherit;
  text-underline-offset: .2em;
}
.footer-widget .footer-list.eg-footer-gruppo li a:hover .eg-realta,
.footer-widget .footer-list.eg-footer-gruppo li a:focus-visible .eg-realta{
  text-decoration: underline;
}
.eg-endorse{
  display: block;
  font-size: var(--text-xs);
  color: rgba(255,255,255,.62);           /* ~6,7:1 */
  line-height: 1.3;
}
/* la realtà corrente non è un link: si spegne, e lo dice anche a chi ascolta */
.eg-footer-gruppo li > span{ color: rgba(255,255,255,.6); }
/* il link al portale è l'unico posto del footer in cui compare il blu, ed è
   il blu chiaro del token: sull'inchiostro il blu pieno vale 2,95:1 */
.eg-footer-gruppo li:first-child a{ color: var(--blue-400); }

.footer-widget .footer-address .number,
.footer-widget .footer-address .mail{
  display: inline-flex;
  align-items: center;
  min-height: 44px;
  font-family: var(--font-display);
  font-size: var(--text-lg);
  font-weight: var(--weight-medium);
  color: var(--text-inverse);
}
.footer-widget .footer-address .number:hover,
.footer-widget .footer-address .mail:hover{
  color: var(--text-inverse);
  text-decoration: underline;
  text-underline-offset: .2em;
}
.footer-widget .footer-address .number:before,
.footer-widget .footer-address .mail:before{ background-color: transparent; }

.copyright-area{
  border-top-color: rgba(255,255,255,.16);
  padding-block: var(--space-5);
}
.copyright-content p{
  margin-bottom: 0;
  font-size: var(--text-sm);
  color: rgba(255,255,255,.72);           /* 8,63:1 */
}


/* ==========================================================================
   13. NOTE DI BOZZA — .eg-draft-note
   Finché i dati non sono reali chi guarda deve poterlo capire. Non è
   decorazione: statistiche e recapiti inventati vengono letti come impegni
   presi. Restano leggibili (AA) ma non competono col contenuto.
   ========================================================================== */

.eg-draft-note{
  display: block;
  margin-top: var(--space-3);
  font-family: var(--font-body);
  font-size: var(--text-sm);
  line-height: 1.5;
  color: var(--text-muted);               /* 7,35:1 su bianco, 6,75:1 su sand */
  max-width: 62ch;
}
.eg-draft-note::before{
  content: "bozza — ";
  font-weight: var(--weight-medium);
  color: var(--gio-accento);
}
/* Nelle note di lavorazione compaiono percorsi e nomi di file: il monospazio
   del browser li stampava in magenta, che non è un colore di questo sito. */
code{
  font-family: ui-monospace, SFMono-Regular, Menlo, Consolas, monospace;
  font-size: .92em;
  color: var(--ink-800);
  background-color: var(--sand-050);
  border: 1px solid var(--line);
  border-radius: var(--radius-sm);
  padding: 0 .3em;
}
.exp-section .eg-draft-note,
.cta-section-3 .eg-draft-note,
.white-content .eg-draft-note,
.footer-section .eg-draft-note{ color: rgba(255,255,255,.72); }


/* ==========================================================================
   14. ACCESSIBILITÀ
   Non è un capitolo a parte: è la ragione di metà delle misure di sopra.
   Qui restano le regole trasversali.
   ========================================================================== */

/* 14.1 Fuoco visibile ---------------------------------------------------
   base.css lo definisce con l'accento; qui si aggiunge solo ciò che il tema
   non copre (campi e summary) e la variante sul buio, dove un contorno
   terracotta su inchiostro scenderebbe a 3,4:1. */
a:focus-visible,
button:focus-visible,
input:focus-visible,
select:focus-visible,
textarea:focus-visible,
summary:focus-visible,
[tabindex]:focus-visible{
  outline: 3px solid var(--color-primary-strong);
  outline-offset: 2px;
  border-radius: var(--radius-sm);
}
.exp-section a:focus-visible,
.exp-section button:focus-visible,
.cta-section-3 a:focus-visible,
.cta-section-3 button:focus-visible,
.footer-section a:focus-visible,
.footer-section button:focus-visible,
.mobile-side-menu a:focus-visible,
.mobile-side-menu button:focus-visible{ outline-color: var(--text-inverse); }

/* 14.2 Aree di tocco ------------------------------------------------------
   Rete di sicurezza per i link che nascono dentro un testo ma sono controlli
   autonomi (chiusure di colonna, «vedi tutto», voci di elenco del footer).
   I casi puntuali sono già risolti nei rispettivi blocchi. */
.eg-side-title + ul a,
.side-menu-list a{ min-height: 44px; display: inline-flex; align-items: center; }

/* 14.3 Movimento ---------------------------------------------------------
   Il tema anima l'ingresso di quasi tutti i blocchi con GSAP, che scrive
   opacity e transform INLINE: con la preferenza «meno movimento» attiva quegli
   stili resterebbero al valore iniziale (opacità 0) e mezza pagina sarebbe
   invisibile. Da qui i tre !important: sono l'unico modo di battere uno stile
   inline scritto da JavaScript, e servono a mostrare contenuto, non a
   nasconderlo. */
@media (prefers-reduced-motion: reduce){
  .fade-top, .fade-wrapper > *, .slide-anim,
  .hero-content, .hero-img, .section-heading, .eg-immobile-card{
    opacity: 1 !important;
    transform: none !important;
    visibility: visible !important;
  }
  *, *::before, *::after{
    animation-duration: .001ms !important;
    animation-iteration-count: 1 !important;
    transition-duration: .001ms !important;
    scroll-behavior: auto !important;
  }
}

/* 14.4 Il preloader senza JavaScript -------------------------------------
   Il preloader del tema è un pannello fisso a tutta pagina con z-index 999,
   che main.js fa sparire. Senza JavaScript resterebbe lì: invisibile (non ha
   fondo) ma sopra a tutto, e intercetterebbe ogni click sulla hero e sulla
   barra di ricerca. Due cinture: non prende mai il puntatore, e dove il
   browser sa dire che gli script sono spenti sparisce del tutto. */
.preloader{ pointer-events: none; }
.preloader .site-name{ color: var(--ink-900); }
@media (scripting: none){
  .preloader{ display: none; }
}

/* 14.5 Il cursore finto del tema — spento ovunque -------------------------
   main.js appende a <body> due dischi che seguono il puntatore (.mt-cursor,
   .mt-cursor-view). Erano già spenti dove il puntatore non esiste; adesso
   sono spenti e basta, per tre motivi misurati:
   1. .mt-cursor è un disco di 10px colorato con --tl-color-theme-primary,
      che alla radice vale terracotta. Sopra il footer di gruppo diventa un
      puntino terracotta che galleggia sulle voci — e nel footer l'accento
      terracotta non entra: lì vivono i neutri e il blu di gruppo. Non è un
      dettaglio, è una violazione della regola di marca;
   2. su .cursor-effect il disco si ingrandiva di 7 volte in `difference`:
      un'invenzione grafica che su un sito di agenzia immobiliare non
      racconta niente e non aiuta a leggere;
   3. su touch non esiste, quindi non è nemmeno un elemento del linguaggio:
      è un ornamento per metà del pubblico.
   Le classi `.cursor-effect` sono state tolte dal markup dei generatori, così
   il tema non ha nemmeno più a cosa agganciarsi. Questa regola resta per il
   guscio, che i due div li appende comunque. */
.mt-cursor, .mt-cursor-view{ display: none; }

/* 14.6 Il segnalino di scorrimento --------------------------------------- */
#scroll-percentage-value{
  color: var(--color-primary-strong);
  font-family: var(--font-display);
}

/* 14.6 Moduli delle pagine interne ---------------------------------------
   Le pagine /valutazione e /contatti montano i moduli del tema (.form-control).
   Stessa griglia di misure e stesso bordo dei campi di ricerca: un modulo che
   si comporta come il resto del sito è un modulo che si compila. */
.form-control,
.form-item input,
.form-item textarea,
.form-item select{
  min-height: var(--gio-campo-h);
  padding: var(--space-3);
  font-family: var(--font-body);
  font-size: 1rem;
  color: var(--ink-900);
  background-color: var(--surface-card);
  border: 1px solid var(--gio-bordo-campo);
  border-radius: var(--radius-md);
  width: 100%;
}
.form-item textarea{ min-height: 8rem; }
.form-control::placeholder{ color: var(--text-muted); opacity: 1; }
.form-title{
  font-family: var(--font-display);
  font-size: var(--text-xl);
  font-weight: var(--weight-bold);
  color: var(--ink-900);
}

/* 14.7 Stampa -------------------------------------------------------------
   Chi porta in banca o dal notaio la scheda di un immobile la stampa. */
@media print{
  .preloader, .mobile-side-menu, .mobile-side-menu-overlay,
  #scroll-percentage, .service-text, .footer-text, .eg-search-band,
  .eg-cta-sticky{ display: none; }
  .eg-immobile-card{ break-inside: avoid; box-shadow: none; }
  body{ background: var(--surface-page); color: var(--ink-900); }
}


/* ==========================================================================
   15. LE OTTO PAGINE INTERNE
   Riusano il vocabolario del tema (.page-header, .service-details,
   .portfolio-details, .contact-section) più le classi eg-* del loro markup.
   Tutto ciò che è tipografia, superfici, bottoni e campi arriva dai capitoli
   precedenti: qui c'è solo quello che quei blocchi hanno in più.
   ========================================================================== */

/* 15.1 Testata di pagina — fascia fotografica ----------------------------
   La testata del sito è sovrapposta (§6): senza questo padding il marchio e il
   menu finirebbero sopra le briciole. Stesso conto della hero, stessa
   variabile, così vale anche quando la testata cambia forma sotto i 992px. */
.page-header .page-header-content{
  padding-top: calc(var(--gio-header-h) + var(--space-6));
  padding-bottom: var(--space-8);
}
/* Sopra una fotografia l'accento non può essere il terracotta pieno (3,4:1
   sull'inchiostro): qui valgono le variabili delle superfici scure. */
.page-header{
  --gio-accento: var(--color-primary-on-dark);
  --gio-accento-titolo: var(--color-primary-on-dark);
  --gio-filetto: var(--color-primary-on-dark);
  background-color: var(--surface-dark);
}
/* Il velo del tema è al 64% di #100801: su una facciata in mattoni al sole il
   bianco resta sotto il 4,5:1 nella metà bassa. Diventa un gradiente, così il
   contrasto lo garantisce il layout e non lo scatto. */
.page-header .overlay{
  opacity: 1;
  background-color: transparent;
  background-image:
    linear-gradient(180deg, rgba(16,12,10,.7) 0%, rgba(16,12,10,.66) 45%, rgba(16,12,10,.8) 100%);
}
.page-header .page-header-content .title{
  font-size: var(--text-3xl);
  font-weight: var(--weight-bold);
  line-height: var(--leading-tight);
  color: var(--text-inverse);
  margin-bottom: var(--space-4);
}
.page-header .page-header-content .sub-heading{
  color: var(--gio-accento);
  margin-bottom: var(--space-4);
}
/* la barra dell'occhiello è centrata come il resto della testata */
.page-header .page-header-content .sub-heading::before{ margin-inline: auto; }
.eg-page-header__sommario{
  max-width: 62ch;
  margin-inline: auto;
  font-size: var(--text-lg);
  color: rgba(255,255,255,.9);          /* ~12:1 sul velo */
}
/* Briciole: separatore «·», mai un chevron. Il separatore è decorativo e non
   entra nel testo letto dal lettore di schermo. */
.eg-briciole ol{
  list-style: none;
  display: flex;
  flex-wrap: wrap;
  justify-content: center;
  align-items: center;
  gap: var(--space-2) var(--space-3);
  margin: 0 0 var(--space-4);
  padding: 0;
  font-family: var(--font-display);
  font-size: var(--text-xs);
  letter-spacing: .04em;
}
.eg-briciole li + li::before{
  content: "\00b7";
  margin-right: var(--space-3);
  color: rgba(255,255,255,.6);
}
.eg-briciole a{
  color: var(--text-inverse);
  text-decoration: underline;
  text-underline-offset: .2em;
  display: inline-flex;
  align-items: center;
  min-height: 44px;
}
.eg-briciole [aria-current="page"]{ color: rgba(255,255,255,.72); }
/* Scheda immobile: prezzo e etichette in testata */
.eg-prezzo-testata{
  font-family: var(--font-display);
  font-size: var(--text-2xl);
  font-weight: var(--weight-bold);
  color: var(--text-inverse);
  margin: var(--space-5) 0 var(--space-4);
}
.eg-etichette{
  list-style: none;
  display: flex;
  flex-wrap: wrap;
  justify-content: center;
  gap: var(--space-2);
  margin: 0;
  padding: 0;
}
.eg-etichette li{
  padding: var(--space-1) var(--space-3);
  border-radius: var(--radius-pill);
  background-color: rgba(255,255,255,.16);
  border: 1px solid rgba(255,255,255,.34);
  color: var(--text-inverse);
  font-family: var(--font-display);
  font-size: var(--text-xs);
  letter-spacing: .04em;
}

/* 15.2 Colonna di sinistra: indice e scatola contatto -------------------- */
.service-details-left-content .service-category-list.eg-indice{
  background-color: var(--surface-alt);
  border: 1px solid var(--line);
  border-radius: var(--radius-lg);
  padding: var(--space-5);
}
.service-details-left-content .service-category-list.eg-indice .list-title{
  font-family: var(--font-display);
  font-size: var(--text-xs);
  font-weight: var(--weight-medium);
  letter-spacing: var(--tracking-caps);
  text-transform: uppercase;
  color: var(--ink-800);
  margin-bottom: var(--space-3);
}
.service-details-left-content .service-category-list.eg-indice ul li{
  font-family: var(--font-body);
  font-size: var(--text-md);
  border-color: var(--line);
}
.service-details-left-content .service-category-list.eg-indice ul li a{
  padding: var(--space-3) 0 var(--space-3) var(--space-4);
  min-height: 44px;
  display: flex;
  align-items: center;
  line-height: 1.3;
  color: var(--ink-900);
}
.service-details-left-content .service-category-list.eg-indice ul li a:hover{ color: var(--color-primary-strong); }
/* il pallino del tema diventa il filetto di marca */
.service-details-left-content .service-category-list.eg-indice ul li a:before{
  height: 2px;
  width: .6rem;
  border-radius: 0;
  top: 50%;
  left: 0;
  transform: translateY(-50%);
  background-color: var(--color-primary);
}

/* La scatola contatto del tema è pensata su una fotografia con velo scuro e
   testo bianco. Qui la fotografia non c'è (il markup non porta .cta-bg): senza
   questo blocco sarebbe testo bianco su bianco. Diventa una scheda sand. */
.service-details-cta.eg-box-contatto{
  padding: var(--space-6);
  margin-top: var(--space-5);
  background-color: var(--surface-alt);
  border: 1px solid var(--line);
  border-radius: var(--radius-lg);
  text-align: left;
}
.eg-box-contatto__titolo{
  font-family: var(--font-display);
  font-size: var(--text-lg);
  font-weight: var(--weight-bold);
  color: var(--ink-900);
  margin-bottom: var(--space-3);
}
.service-details-cta.eg-box-contatto p{ color: var(--text-body); }
.service-details-left-content .service-details-cta.eg-box-contatto .number,
.service-details-left-content .service-details-cta.eg-box-contatto .mail{
  display: inline-flex;
  align-items: center;
  min-height: 44px;
  font-size: var(--text-lg);
  color: var(--ink-900);
  margin-bottom: var(--space-3);
}
.service-details-left-content .service-details-cta.eg-box-contatto .number:hover,
.service-details-left-content .service-details-cta.eg-box-contatto .mail:hover{
  color: var(--color-primary-strong);
}
.service-details-cta.eg-box-contatto .cta-btn a{ width: 100%; justify-content: space-between; }
/* La stessa scatola compare anche fuori dalla colonna del tema (scheda
   immobile, /valutazione): lì il selettore profondo non arriva. */
.eg-box-contatto .number,
.eg-box-contatto .mail,
.request-item > a,
.eg-link-whatsapp{
  display: inline-flex;
  align-items: center;
  min-height: 44px;
  font-family: var(--font-display);
  font-size: var(--text-lg);
  color: var(--ink-900);
  text-decoration: none;
}
.eg-box-contatto .number:hover,
.eg-box-contatto .mail:hover,
.request-item > a:hover,
.eg-link-whatsapp:hover{ color: var(--color-primary-strong); text-decoration: underline; }

/* 15.3 Passi numerati (percorsi, iter, «otto cose») ---------------------- */
/* SFORAMENTO ORIZZONTALE VERO, e nascosto: il tema dà a
   .service-details-items `grid-template-columns: repeat(2, 1fr)` senza nessun
   punto di rottura. `1fr` è `minmax(auto, 1fr)`, quindi la colonna non scende
   sotto il min-content del passo: a 390px le due colonne misuravano 295px
   l'una e la seconda finiva a x=648 su un viewport di 390. Non si vedeva
   perché main.css mette `overflow-x:hidden` su html e body — il sintomo era
   coperto, il contenuto no: metà di ogni passo restava fuori pagina.
   Qui le colonne diventano elastiche e si riducono a una sola quando non ci
   stanno, senza media query: è il contenitore a decidere, e questo blocco
   vive dentro colonne di larghezze diverse su tre pagine. */
.service-details-content .service-details-items.eg-passi{
  grid-template-columns: repeat(auto-fit, minmax(min(100%, 18rem), 1fr));
}
.service-details-item.eg-passo{
  display: grid;
  grid-template-columns: auto minmax(0,1fr);
  gap: var(--space-4) var(--space-5);
  align-items: start;
  padding: var(--space-6) 0;
  border-top: 1px solid var(--line);
}
.eg-passi > .eg-passo:last-child{ border-bottom: 1px solid var(--line); }
.eg-passo__numero{
  margin: 0;
  font-family: var(--font-display);
  font-size: var(--text-xl);
  font-weight: var(--weight-bold);
  line-height: 1.1;
  color: var(--color-primary);          /* cifra grande: 4,37:1, oltre il 3:1 richiesto */
  min-width: 2.5rem;
}
.eg-passo .content .title{
  font-size: var(--text-lg);
  font-weight: var(--weight-bold);
  margin-bottom: var(--space-2);
}
.eg-passo .content p{ margin-bottom: 0; max-width: 68ch; }
.tl-bg-color .eg-passo__numero{ color: var(--ink-800); }  /* su sand: 10,94:1 */

/* 15.4 Elenchi, titoli di colonna, chiusure ------------------------------ */
/* .eg-lista dentro il contenitore del tema: stessa profondità di selettore,
   altrimenti vincono il flex e l'icona previsti per le liste di Antra. */
.service-details-list-wrap ul.eg-lista li,
.eg-lista li{
  display: block;
  font-family: var(--font-body);
  font-size: var(--text-md);
  color: var(--text-body);
  column-gap: 0;
}
.eg-lista-wrap{ max-width: none; align-items: flex-start; }
.eg-colonna-titolo{
  font-family: var(--font-display);
  font-size: var(--text-lg);
  font-weight: var(--weight-bold);
  margin-bottom: var(--space-3);
}
/* la riga che chiude un blocco: stesso corpo del testo, un filo più scura */
.eg-chiusura{
  font-size: var(--text-lg);
  color: var(--ink-900);
  max-width: 62ch;
}

/* 15.5 Scheda immobile ---------------------------------------------------- */
.eg-galleria{
  display: grid;
  gap: var(--space-4);
  grid-template-columns: 1fr;
  margin-bottom: var(--space-7);
}
@media (min-width: 48rem){
  .eg-galleria{ grid-template-columns: repeat(2, minmax(0,1fr)); }
  /* il primo scatto occupa la riga intera: è quello che si guarda davvero */
  .eg-galleria > .eg-galleria__scatto:first-child{ grid-column: 1 / -1; }
}
.eg-galleria__scatto{ margin: 0; }
.eg-galleria__scatto a{
  display: block;
  border-radius: var(--radius-lg);
  overflow: hidden;
  background-color: var(--sand-100);
}
.eg-galleria__scatto img{
  width: 100%;
  height: 100%;
  aspect-ratio: 3 / 2;
  object-fit: cover;
}
.eg-galleria > .eg-galleria__scatto:first-child img{ aspect-ratio: 16 / 9; }
.eg-galleria__scatto figcaption{
  margin-top: var(--space-2);
  font-size: var(--text-sm);
  color: var(--text-muted);
}
.eg-galleria__nota{
  font-size: var(--text-sm);
  color: var(--text-muted);
  max-width: 68ch;
}

/* I dati obbligatori stanno sopra la piega e nella stessa dimensione degli
   altri: classe energetica e IPE non finiscono in corpo 11 in fondo, che è la
   prassi dei portali. */
.eg-dati{
  display: grid;
  gap: var(--space-4) var(--space-6);
  grid-template-columns: repeat(auto-fit, minmax(12rem, 1fr));
  margin: 0 0 var(--space-5);
  padding: var(--space-5) 0;
  border-top: 1px solid var(--line);
  border-bottom: 1px solid var(--line);
}
.eg-dati__voce dt{
  font-size: var(--text-sm);
  color: var(--text-muted);
  font-weight: var(--weight-body);
  margin-bottom: var(--space-1);
}
.eg-dati__voce dd{
  margin: 0;
  font-family: var(--font-display);
  font-size: var(--text-md);
  font-weight: var(--weight-medium);
  color: var(--ink-900);
}
.eg-dati__voce--energia dd{ color: var(--ink-900); }
.eg-dati__nota{ font-size: var(--text-sm); color: var(--text-muted); max-width: 68ch; }

/* Il blocco della verifica tecnica: è l'unica parte non duplicabile della
   scheda, e si vede che è un documento nostro. */
.eg-sopralluogo{
  padding: var(--space-6);
  background-color: var(--surface-alt);
  border-radius: var(--radius-lg);
  border-left: 4px solid var(--color-primary);
  margin-bottom: var(--space-7);
  --gio-accento: var(--ink-800);
}
.eg-sopralluogo__data{ font-size: var(--text-sm); color: var(--text-muted); }
.eg-sopralluogo__voce{
  font-family: var(--font-display);
  font-size: var(--text-lg);
  font-weight: var(--weight-bold);
  margin: var(--space-5) 0 var(--space-3);
}
.eg-sopralluogo__chiusura{ margin-bottom: 0; }
.eg-zona .eg-mappa-segnaposto,
.eg-mappa-segnaposto{
  aspect-ratio: 16 / 9;
  border-radius: var(--radius-lg);
  border: 1px solid var(--border-card);
  background-color: var(--sand-050);
  background-image:
    linear-gradient(135deg, var(--color-primary-soft) 0%, var(--sand-100) 60%, var(--sand-050) 100%),
    repeating-linear-gradient(90deg, rgba(35,37,37,.05) 0 1px, transparent 1px 48px),
    repeating-linear-gradient(0deg, rgba(35,37,37,.05) 0 1px, transparent 1px 48px);
  display: flex;
  align-items: center;
  justify-content: center;
  text-align: center;
  padding: var(--space-5);
  color: var(--text-muted);
}
.eg-scheda-lato{ position: relative; }
@media (min-width: 64rem){
  .eg-scheda-lato{ position: sticky; top: var(--space-6); }
}
.eg-simili{ margin-top: var(--space-8); }
.eg-simili-vuoto{ color: var(--text-muted); }

/* La barra fissa in fondo su telefono. Il padding di compensazione sta sul
   contenitore della scheda: senza, l'ultima riga della pagina resta sotto la
   barra e non si legge mai (§6, blocco 10). */
.eg-cta-sticky{
  position: fixed;
  inset: auto 0 0 0;
  z-index: 40;
  display: flex;
  align-items: center;
  justify-content: space-between;
  gap: var(--space-4);
  padding: var(--space-3) var(--space-5);
  background-color: var(--surface-card);
  border-top: 1px solid var(--line);
  box-shadow: 0 -2px 16px rgba(35,37,37,.1);
}
.eg-cta-sticky__prezzo{
  margin: 0;
  font-family: var(--font-display);
  font-size: var(--text-lg);
  font-weight: var(--weight-bold);
  color: var(--ink-900);
  line-height: 1.2;
}
.eg-cta-sticky__prezzo span{
  display: block;
  font-size: var(--text-xs);
  font-weight: var(--weight-body);
  color: var(--text-muted);
}
.eg-scheda{ padding-bottom: calc(var(--space-9) + 4.5rem); }
@media (min-width: 64rem){
  /* su schermo largo la colonna di destra è sempre visibile: la barra fissa
     non serve, e una barra fissa in fondo a un desktop è solo ingombro */
  .eg-cta-sticky{ display: none; }
  .eg-scheda{ padding-bottom: clamp(var(--space-8), 9vw, 8.125rem); }
}

/* 15.6 Moduli (valutazione, contatti) ------------------------------------
   ATTENZIONE, qui il tema fa danni veri: .request-form-wrap e .request-item
   sono disegnati per stare su una FASCIA SCURA (campi trasparenti senza bordo,
   testo bianco, etichette #9f9fa4). Sulla nostra pagina bianca i campi
   diventavano invisibili e le etichette scendevano a 2,5:1. E
   .request-item-wrap dispone i quattro recapiti in RIGA con 65px di gronda:
   dentro una colonna da 5/12 sfondavano sopra il modulo, testo su testo.
   Le regole qui sotto ricalcano la profondità del tema per riportare i campi
   sul bianco e i recapiti in colonna. */
.request-form-wrap .form-item .form-control,
.contact-page-area .request-form-wrap .form-item .form-control{
  background: var(--surface-card);
  border: 1px solid var(--gio-bordo-campo);
  border-radius: var(--radius-md);
  color: var(--ink-900);
  padding: var(--space-3);
  min-height: var(--gio-campo-h);
  margin-bottom: var(--space-4);
  backdrop-filter: none;
}
.request-form-wrap .form-item textarea.form-control{ min-height: 9rem; }
.request-form-wrap .form-item .form-control::placeholder{ color: var(--text-muted); opacity: 1; }
.request-form-wrap .form-item .form-title,
.contact-page-area .request-form-wrap .form-item .form-title{
  font-family: var(--font-display);
  font-size: var(--text-sm);
  font-weight: var(--weight-medium);
  color: var(--ink-900);
  margin-bottom: var(--space-2);
}
.request-content .request-item-wrap{
  flex-direction: column;
  align-items: stretch;
  row-gap: var(--space-5);
  column-gap: 0;
  margin-bottom: var(--space-6);
}
/* :not(.eg-draft-note) resta come RETE. La nota di bozza della CTA WhatsApp
   ora è un <p> nel markup (tools/gio-shell.mjs, ctaWhatsApp), quindi non entra
   più da questa porta; ma NAP.indirizzo ne porta ancora una dentro <address>,
   e il selettore del tema è un discendente, non un figlio. */
.request-content .request-item-wrap .request-item > span:not(.eg-draft-note){
  font-family: var(--font-display);
  font-size: var(--text-xs);
  font-weight: var(--weight-medium);
  letter-spacing: var(--tracking-caps);
  text-transform: uppercase;
  color: var(--text-muted);             /* era #9f9fa4: 2,5:1 sul bianco */
  margin-bottom: var(--space-2);
}
.request-content .request-item-wrap .request-item p,
.request-content .request-item-wrap .request-item a,
.contact-page-area .request-content .request-item-wrap .request-item p,
.contact-page-area .request-content .request-item-wrap .request-item a{
  color: var(--ink-900);
  font-family: var(--font-body);
  font-size: var(--text-md);
  font-weight: var(--weight-body);
}
/* la nota di bozza è un <p> e finirebbe nella regola qui sopra, cioè
   travestita da recapito vero: qui si riprende il suo trattamento */
.request-content .request-item-wrap .request-item p.eg-draft-note,
.contact-page-area .request-content .request-item-wrap .request-item p.eg-draft-note{
  color: var(--text-muted);
  font-size: var(--text-sm);
}
/* e la stessa cosa per la nota dentro <address>, che il tema stampa come
   etichetta di campo (§7 del guscio: il <span> lì dentro non è un figlio
   diretto, quindi la rete sopra non lo prende) */
.request-content .request-item-wrap .request-item address .eg-draft-note{
  color: var(--text-muted);
  font-size: var(--text-sm);
  letter-spacing: normal;
  text-transform: none;
}

.eg-form-hint,
.eg-form-note{
  font-size: var(--text-sm);
  color: var(--text-muted);
  max-width: 62ch;
}
.eg-modulo-spalla{
  font-size: var(--text-lg);
  color: var(--text-body);
  max-width: 46ch;
}
.eg-select{
  min-height: var(--gio-campo-h);
  padding: 0 var(--space-3);
  font-family: var(--font-body);
  font-size: 1rem;
  color: var(--ink-900);
  background-color: var(--surface-card);
  border: 1px solid var(--gio-bordo-campo);
  border-radius: var(--radius-md);
  width: 100%;
}
/* il modulo sta su sand: lì --ink-400 come bordo scende a 3,02:1 */
.tl-bg-color .form-control,
.tl-bg-color .eg-select{ border-color: var(--text-muted); }

/* 15.7 Blocchi editoriali delle pagine lunghe ---------------------------- */
.eg-prove,
.eg-ruoli,
.eg-persone,
.eg-cartone-bande,
.eg-selezione-punti{ display: grid; gap: var(--space-5); }
/* .eg-prove NON entra fra le griglie a più colonne: è un blocco di prosa
   (un titolo e quattro paragrafi) dentro una col-lg-6. Con l'auto-fit
   diventava una griglia di due colonne da 258px, e il suo <h2> a 52px si
   spezzava a metà parola («possiam / o dimostra / re»). Misurato su
   /agenzia a 1600px. Resta grid a una colonna: serve solo per il gap. */
@media (min-width: 48rem){
  .eg-ruoli,
  .eg-persone,
  .eg-selezione-punti,
  .eg-cartone-bande{ grid-template-columns: repeat(auto-fit, minmax(16rem, 1fr)); }
}
.eg-prima-dopo-vuoto,
.eg-simili-vuoto,
.eg-staging-img,
.eg-chi-siamo-img{
  border-radius: var(--radius-lg);
}
.eg-prima-dopo-vuoto{
  padding: var(--space-6);
  border: 1px dashed var(--ink-400);
  background-color: var(--surface-alt);
}

/* Le due foto di colonna delle pagine lunghe. Il riquadro è verticale (3/4):
   se la foto che ci finisce dentro non lo è, si RITAGLIA, non si stira.
   Senza queste due righe fase-sopralluogo.jpg (1200×686) veniva impaginata a
   446×800, cioè 68% di deformazione. */
.eg-staging-img img,
.eg-chi-siamo-img img{
  display: block;
  width: 100%;
  height: auto;
  aspect-ratio: 3 / 4;
  object-fit: cover;
  object-position: center;
  border-radius: var(--radius-lg);
}

/* SEGNAPOSTO FOTOGRAFICO DICHIARATO.
   Sta al posto di una foto che racconterebbe un'altra storia. Non è una
   mancanza da nascondere: dice cosa va scattato, e chi legge la bozza lo sa.
   Stessa veste del segnaposto della galleria prima/dopo: un linguaggio solo. */
.eg-foto-attesa{
  display: flex;
  flex-direction: column;
  justify-content: flex-end;
  gap: var(--space-2);
  aspect-ratio: 3 / 4;
  padding: var(--space-6);
  border: 1px dashed var(--ink-400);
  border-radius: var(--radius-lg);
  background-color: var(--surface-alt);
}
.eg-foto-attesa__titolo{
  font-family: var(--font-display);
  font-size: var(--text-lg);
  font-weight: var(--weight-bold);
  color: var(--ink-900);
  margin-bottom: 0;
}
.eg-foto-attesa__brief{
  font-size: var(--text-sm);
  line-height: 1.45;
  color: var(--text-muted);
  margin-bottom: 0;
}




/* ==========================================================================
   17. LA REGOLA SCRITTA — scala dei titoli, occhiello, ritmo delle sezioni
   --------------------------------------------------------------------------
   PERCHÉ ESISTE QUESTO CAPITOLO. I capitoli 3 e 4 avevano già le regole
   giuste, ma le applicavano a una parte dei selettori che il tema porta con
   sé. Misurato a 1600 prima di questo capitolo: lo stesso h2 era composto a
   24, 36, 40 e 52 px a seconda della classe del tema che si trovava addosso;
   l'occhiello usava quattro colori; otto sezioni su dieci della home avevano
   lo stesso identico respiro (130/130). Qui si chiude il conto e si SCRIVE la
   regola, in modo che chi aggiunge una pagina domani sappia a cosa attenersi
   senza dover misurare gli screenshot.

   Nessun `!important`: dove il tema impone la sua misura con un selettore più
   profondo si ricalca la sua profondità, che è il metodo già adottato ai §3.1
   e §6. Nessun colore e nessuna misura scritti a mano: solo token.

   ── 17.A LA SCALA DEI TITOLI ─────────────────────────────────────────────
   Quattro gradi. Ogni grado ha UNA misura, presa dai token, uguale su tutte e
   nove le pagine.

     grado  ruolo                                     token           1600  390
     T1     apertura di pagina (h1)                   --text-display   72    44
     T2     titolo di sezione (h2)                    --text-3xl       52    36
     T3     titolo di blocco (h3)                     --text-xl        24    24
     T4     titolo di componente (card, scatole,      --text-lg        20    20
            segnaposto: vive in colonna stretta)

   UNA SOLA DEROGA, e non guarda la pagina ma la COLONNA: un titolo che vive
   in una colonna più stretta di 34rem viene composto a `calc(grado * .8)`.
   Serve perché il sito impagina titoli di sezione dentro scatole da 446px —
   «Dicci cosa cerchi» su /immobili e /comprare-casa, «Siamo a Faenza» su
   /contatti — dove la misura piena si spezzava a metà parola. Il fattore è
   uno solo e vale per tutti i gradi, quindi l'ordine fra i gradi non si
   rovescia mai: un h2 non può diventare più grande di un h1.
   La deroga si applica in due modi, per la stessa ragione:
     - via container query dove la colonna è variabile: il container è
       .section-heading, dichiarato al §3.1, cioè il componente con cui i
       generatori scrivono le testate di sezione;
     - a mano sull'hero della home, che vive in metà griglia per costruzione:
       lì il container non serve perché la colonna è nota (540px a 1600). A T1
       pieno (72px) il titolo dell'hero prendeva CINQUE righe e spingeva la
       barra di ricerca sotto la piega a 1600x950 — misurato.
   Risultato a 1600: h1 72 sulle otto testate interne e 57,6 sull'hero della
   home; h2 52 ovunque, 41,6 nelle tre scatole da 446px; h3 24; card 20.
   Il @media (min-width:62rem) attorno al @container non è ridondante: sotto i
   992px una colonna stretta non è una scelta d'impaginazione, è lo schermo.

   MISURA DI RIGA. Un blocco di testo continuo non supera le ~68 battute:
   `p{max-width:68ch}` con `ch` del carattere di corpo. È innocuo dove la
   colonna è già stretta (una card da 302px non arriva a 68ch) e morde solo
   dove serve: le pagine di servizio erano a 86 battute, /valutazione a 97, il
   copyright del footer a 147.

   ── 17.B L'OCCHIELLO ─────────────────────────────────────────────────────
   UN COLORE, e a deciderlo è solo la FAMIGLIA DI FONDO — chiaro o scuro.

     fondo chiaro (bianco E sand)  --gio-occhiello   5,24:1 su bianco
                                                     4,82:1 su sand
     fondo scuro                   --color-primary-on-dark   4,54:1
     barra sopra l'occhiello       --gio-filetto (§1): 4,37:1 su bianco,
                                   4,02:1 su sand, 3,4:1+ sul buio — è un
                                   elemento grafico, soglia 3:1.

   Prima erano quattro colori: terracotta sul bianco, inchiostro sul sand,
   terracotta chiaro sul buio, blu sul gruppo. Il criterio c'era (è quello di
   components/shared/base.css) ma si vedeva come rumore: su /home-staging
   «PRIMO TEMPO» era quasi nero e «SECONDO TEMPO» terracotta, perché i tre
   capitoli cadevano su superfici diverse. Tre fratelli, due colori.

   Perché il sand aveva l'inchiostro: --color-primary-strong su sand vale
   4,17:1, sotto i 4,5 che un testo di 13px richiede. Non è un capriccio, è
   AA. Ma la conseguenza — due colori su due fondi chiari — è peggiore del
   problema. --gio-occhiello è lo STESSO terracotta portato sopra la soglia
   mescolandolo con l'inchiostro dei token (color-mix 88/12): a occhio è il
   terracotta di marca, alla misura è 4,82:1 anche sul sand. NON entra nella
   tavolozza: vive solo dentro questo componente, e i tre toni di marca
   (#c05b3c, #bc593b, #cb7459) restano quelli e solo quelli.
   Dove color-mix non c'è, il valore di riserva è --color-primary-strong: il
   comportamento di prima, nessuna regressione.

   UNA SOLA ECCEZIONE, dichiarata: l'occhiello di «Il gruppo» resta blu. Quel
   blocco non è una sezione del sito, è la voce del portale dentro la pagina,
   e il blu di gruppo è il suo segnale — lo stesso della firma in testata e
   del footer. Non è un accento locale, e infatti non compare da nessun'altra
   parte.

   ── 17.C IL RITMO ────────────────────────────────────────────────────────
   TRE RESPIRI, non uno. Presi dalla scala degli spazi e assegnati per PESO
   del blocco, non per posizione:

     --gio-sez-denso    48 → 96 px    code e rimandi: FAQ, «Il gruppo», le
                                      sezioni brevi di chiusura
     --gio-sez-normale  64 → 128 px   le sezioni di contenuto (predefinito)
     --gio-sez-quiete   96 → 192 px   i momenti da guardare: la fascia scura,
                                      la banda fotografica, i blocchi staging

   ALTERNANZA. Giò è «il più morbido dei cinque: sand generoso una sezione su
   due». Prima il sand era 3 sezioni su 10 sulla home, e due sezioni bianche
   consecutive con lo stesso impianto (la FAQ della provvigione e «Quello che
   possiamo dimostrare») facevano 1.862 px di bianco continuo in cui la pagina
   si spegneva. Qui sotto c'è LA MAPPA DELLE SUPERFICI: dove il markup non
   alterna, alterna questo foglio, per nome di blocco.

   La regola per chi aggiunge una sezione: **la superficie di una sezione è
   l'opposto di quella della sezione che la precede.** Il buio e la banda
   fotografica non contano nell'alternanza — sono cesure, e dopo una cesura si
   riparte come si vuole. Se il blocco nuovo non porta già la superficie
   giusta dal markup, si aggiunge una riga alla mappa.

   Sequenze risultanti (B = bianco, S = sand, ■ = buio, ▣ = fotografia). Le
   due pagine lunghe impaginano tutto il corpo dentro UNA sezione: il gruppo
   fra parentesi è l'alternanza dei blocchi dentro quella colonna, e la
   geometria che la rende visibile sta al §17.10.
     index          B S B ■ S B S B ▣ S
     immobili       B S B
     immobile       B (con il riquadro sopralluogo su sand dentro la scheda)
     vendere-casa   (B S B S B S) B ▣ S
     comprare-casa  (B S B S B B) S B ▣ S
     valutazione    S ■ B S B S
     home-staging   B S B S B S ▣ S
     agenzia        B S B ▣ S
     contatti       B ▣

   TESTATE DI PAGINA. Otto testate avevano cinque altezze diverse (478, 510,
   568, 617): il componente non aveva un'altezza minima e cresceva col numero
   di righe del titolo. Ora ne ha una sola e il contenuto ci sta dentro
   centrato, così passando da /contatti a /immobile il sito non salta.
   Misurato dopo: 676px a 768, 704px a 900, 1024, 1280 e 1600 — otto testate
   su otto, una altezza. A 390 restano diverse, e va bene: lì l'altezza la
   decide il testo, non il ritmo.
   ========================================================================== */

:root{
  /* i quattro gradi */
  --gio-t1: var(--text-display);
  --gio-t2: var(--text-3xl);
  --gio-t3: var(--text-xl);
  --gio-t4: var(--text-lg);
  /* il fattore di colonna: unico, e vale per tutti i gradi */
  --gio-colonna: .8;

  /* l'occhiello. Riserva = il terracotta di marca (§17.B) */
  --gio-occhiello: var(--color-primary-strong);

  /* i tre respiri */
  --gio-sez-denso:   clamp(var(--space-7), 7vw,  var(--space-9));
  --gio-sez-normale: clamp(var(--space-8), 9vw,  var(--space-10));
  --gio-sez-quiete:  clamp(var(--space-9), 13vw, calc(var(--space-10) + var(--space-8)));
}
@supports (color: color-mix(in srgb, #000 50%, #fff)){
  :root{ --gio-occhiello: color-mix(in srgb, var(--color-primary-strong) 88%, var(--ink-900)); }
}


/* 17.1 T1 — l'apertura di pagina ----------------------------------------- */
h1,
h1.section-title,
.page-header .page-header-content .title{
  font-size: var(--gio-t1);
  font-weight: var(--weight-bold);      /* 700: mai 800 su gio */
  line-height: var(--leading-tight);
}
/* La testata è centrata: senza margin-inline il blocco limitato in ch si
   incollerebbe a sinistra mentre il testo dentro resta centrato. */
.page-header .page-header-content .title{
  max-width: 22ch;
  margin-inline: auto;
}
/* L'hero vive in metà griglia (540px a 1600): fattore di colonna, applicato a
   mano perché qui la colonna è nota per costruzione e non serve un container.
   Sostituisce la clamp scritta a mano del §3.1: stessa misura, ma ora è la
   scala a deciderla. */
/* La profondità (0,4,0) serve due volte: per battere i 120px del tema, e per
   battere la regola T2 del §17.2, che vale a 0,3,0 e che altrimenti farebbe
   scendere il titolo dell'hero — che è un h1 con la classe .section-title —
   al corpo di un titolo di sezione sotto i 992px. */
.hero-wrap .hero-content .section-heading .section-title,
.slider-content-wrap .section-heading .section-title{
  font-size: var(--gio-t1);
  line-height: 1.06;
}
/* Il @media è la stessa guardia del @container di sopra e per la stessa
   ragione: sotto i 992px la hero non è più in metà griglia, è a tutta
   larghezza, quindi il fattore non ha più niente da compensare. Senza la
   guardia il titolo dell'hero della home restava a 35px mentre le otto
   testate interne stavano a 44: la home sarebbe stata l'unica pagina con
   l'apertura più piccola di tutte le altre. */
@media (min-width: 62rem){
  .hero-wrap .hero-content .section-heading .section-title,
  .slider-content-wrap .section-heading .section-title{
    font-size: calc(var(--gio-t1) * var(--gio-colonna));
  }
}

/* 17.2 T2 — il titolo di sezione ------------------------------------------
   L'elenco è lungo perché lungo è il vocabolario del tema: .section-title,
   .details-title e .details-title-2 sono TRE nomi per lo stesso ruolo, e il
   tema li compone a 80/60/50/44/40/30px a seconda del contenitore. Ricalcare
   la sua profondità (.service-details-content .details-title è 0,2,0) costa
   una riga in più e non un !important. */
h2,
h2.section-title,
.section-title,
.details-title,
.details-title-2,
.eg-risultati-titolo,
.section-heading .section-title,
.section-heading .section-title.title-2,
.service-details-content .details-title,
.team-details-content .details-title,
.blog-details-content .details-title,
.blog-details-content .details-title-2,
.project-details-wrap .details-title,
.project-details-wrap .details-title-2{
  font-size: var(--gio-t2);
  font-weight: var(--weight-bold);
  line-height: var(--leading-tight);
}
/* Il tema dà al titolo di sezione `display:inline-block` e `overflow:hidden`
   con un selettore a due classi: il §3.1 li correggeva a una sola classe e
   perdeva. Conseguenze misurate: il titolo si restringeva sul contenuto
   (782px invece dei 1104 della colonna), quindi `text-wrap:balance` e la
   misura massima in ch lavoravano su una larghezza che non era quella della
   colonna, e i discendenti venivano tagliati. */
.section-heading .section-title,
.section-heading .section-title.title-2{
  display: block;
  overflow: visible;
}
.details-title-2,
.eg-risultati-titolo{ max-width: 24ch; }
/* Il titolo dei risultati era l'unico h2 del sito a 24px: più piccolo del
   prezzo delle card che introduce. */
.eg-risultati-titolo{ margin: var(--space-7) 0 var(--space-5); }

/* La deroga di colonna vale dove la colonna è DICHIARATA come tale, cioè dove
   c'è un container. .eg-prove ne era uno, e il risultato si vedeva su
   /agenzia: «Chi trovi quando chiami» e «Quello che possiamo dimostrare»
   stanno affiancate in due col-lg-6 larghe uguali (540px), ma solo la seconda
   era dentro un container, quindi era composta a 41,6 e la prima a 52. Due
   sorelle, due misure, e la differenza non era la colonna ma la classe.
   540px reggono la misura piena: il container si toglie e la deroga resta
   dov'è vera, cioè nelle scatole da 446px. */
.eg-prove{ container-type: normal; }

/* La deroga di colonna, T2. Sostituisce il salto a --text-2xl del §3.1: stessa
   idea, ma ora è un fattore della scala e non un gradino scelto a parte. */
@media (min-width: 62rem){
  @container (max-width: 34rem){
    .section-heading .section-title,
    .section-heading .section-title.title-2,
    .details-title,
    .details-title-2,
    .eg-risultati-titolo{ font-size: calc(var(--gio-t2) * var(--gio-colonna)); }
  }
}

/* 17.3 T3 — il titolo di blocco -------------------------------------------
   Prima gli h3 stavano a 20, 24, 26 e 36px: 26 era il valore del tema per i
   passi numerati (0,5,0 di profondità, per questo il §15.3 non lo batteva),
   36 quello dei due percorsi della home. Ora è uno solo. */
h3,
.eg-differenziante .title,
.eg-banda__titolo,
.eg-colonna-titolo,
.eg-sopralluogo__voce,
.eg-passo .content .title,
.accordion-button,
.faq-content .faq-accordion .accordion-item .accordion-button,
.faq-content-2 .faq-accordion .accordion-item .accordion-button,
.exp-item.eg-exp-testo .exp-content .title,
.service-details-content .service-details-items .service-details-item .content .title,
.service-item-4 .service-item-inner .left-content .left-content-inner .title{
  font-size: var(--gio-t3);
  font-weight: var(--weight-bold);
  line-height: var(--leading-snug);
}
/* Un h3 non è un paragrafo: oltre le ~28 battute per riga smette di leggersi
   a colpo d'occhio. Non tocca le card, che sono già più strette. */
.eg-banda__titolo,
.eg-colonna-titolo,
.eg-passo .content .title,
.service-item-4 .service-item-inner .left-content .left-content-inner .title{ max-width: 28ch; }

/* 17.4 T4 — il titolo di componente ---------------------------------------
   Vive in una colonna stretta per costruzione: la card immobile (302px a
   1600), la scatola di lato della FAQ, il segnaposto fotografico. È l'unico
   punto in cui un h3 non è T3, e la ragione è la colonna, non la pagina. */
.eg-immobile-card__titolo,
.faq-img-wrap.eg-faq-aside .title,
.eg-foto-attesa__titolo{
  font-size: var(--gio-t4);
  line-height: var(--leading-snug);
}

/* 17.5 La misura di riga --------------------------------------------------
   68 battute. Vedi §17.A: morde solo dove la colonna è più larga della
   misura, quindi le card e il footer a colonne non se ne accorgono. */
p{ max-width: 68ch; }
/* Dove il testo è centrato il blocco va ricentrato, altrimenti la misura
   massima lo spinge a sinistra sotto un titolo centrato. */
.page-header-content p,
.cta-wrap-3 p,
.copyright-content p,
.text-center p{ margin-inline: auto; }


/* 17.6 L'OCCHIELLO — un colore, e lo decide il fondo ---------------------- */
.sub-heading,
.section-heading .sub-heading,
.slider-content .sub-heading,
.section-heading.white-content .sub-heading,
.white-content .sub-heading,
.page-header .page-header-content .sub-heading{ color: var(--gio-occhiello); }

/* Le superfici scure: lì il terracotta pieno non regge (3,4:1) e vale la
   variante on-dark, che è già il terzo tono di marca. */
.exp-section,
.cta-section-3,
.page-header{ --gio-occhiello: var(--color-primary-on-dark); }
/* Il footer resta l'unico posto senza accento: neutri e blu di gruppo. */
.footer-section{ --gio-occhiello: var(--text-inverse); }
/* L'eccezione dichiarata: «Il gruppo» parla con la voce del portale. */
.eg-gruppo-wrap .sub-heading{ color: var(--color-group-strong); }  /* 7,70:1 */


/* 17.7 IL RITMO — tre respiri --------------------------------------------- */
.pt-130{ padding-top: var(--gio-sez-normale); }
.pb-130{ padding-bottom: var(--gio-sez-normale); }
.pt-150{ padding-top: var(--gio-sez-quiete); }
.pb-150{ padding-bottom: var(--gio-sez-quiete); }

/* quiete — i tre momenti da guardare. Una classe in più della sola .pt-130,
   quindi vince senza !important. */
.exp-section.pt-130,
.project-section-4.pt-130{ padding-top: var(--gio-sez-quiete); }
.exp-section.pb-130,
.project-section-4.pb-130{ padding-bottom: var(--gio-sez-quiete); }
.cta-section-3{ padding-block: var(--gio-sez-quiete); }

/* denso — code, rimandi ed elenchi: sono già alti di loro, e l'aria attorno
   li allontanava dal contenuto che commentano. */
.faq-section.pt-130,
.eg-gruppo-section.pt-130,
.testimonial-section-4.pt-130{ padding-top: var(--gio-sez-denso); }
.faq-section.pb-130,
.eg-gruppo-section.pb-130,
.testimonial-section-4.pb-130{ padding-bottom: var(--gio-sez-denso); }


/* 17.8 LA MAPPA DELLE SUPERFICI ------------------------------------------
   Ogni riga dice: questo blocco sta su questo fondo, e il perché è la
   sequenza scritta al §17.C. Le variabili di superficie si ridichiarano nello
   stesso blocco del fondo — la disciplina del §3.4 — così colore del testo e
   sfondo non possono divergere.

   Dalla seconda passata la mappa copre anche i blocchi INTERNI delle due
   pagine lunghe: là la superficie non è una fascia a tutta pagina ma un
   pannello dentro la colonna del testo, e la geometria di quel pannello sta
   al §17.10. La regola che li assegna è però la stessa e sola: la superficie
   è l'opposto di quella che precede.

   I blocchi interni si agganciano per `.eg-blocco--<nome>`: è il nome che i
   generatori danno alla SEZIONE. Prima si scriveva `.eg-blocco.eg-passi`, in
   due righe, perché `.eg-passi` e `.eg-lista` sono GIÀ due componenti di
   questo foglio (la griglia dei passi numerati, §15.3, e l'elenco col
   filetto, §15.4) e il markup riusava lo stesso nome per la sezione che li
   contiene: senza `.eg-blocco` davanti, il fondo sand — e con lui la
   sporgenza laterale — finiva anche sulla griglia annidata. La collisione è
   stata sciolta nei generatori, non qui: sezione `.eg-blocco--passi`,
   componente `.eg-passi`, e il selettore torna a essere uno solo. */

/* → sand */
.faq-section.tl-bg-color,          /* torna al fondo che chiede il markup: il
                                      §3.4 lo forzava a bianco per non avere
                                      quattro sand di fila, e oggi non serve
                                      più perché alterna la mappa */
.project-section-4.eg-staging,     /* index — la fascia home staging */
.eg-valutazione,                   /* valutazione — «come funziona» */
.eg-non-facciamo,                  /* valutazione — «non gonfiamo» */
.eg-allestimento,                  /* home-staging — «l'allestimento» */
/* i pannelli in colonna: sand ai posti pari della sequenza, §17.10 */
.eg-blocco--passi,                 /* vendere-casa — i sette passi */
.eg-blocco--preparare,             /* vendere-casa — gli scatoloni */
.eg-blocco--documenti,             /* vendere-casa — le carte del notaio */
.eg-blocco--lista,                 /* comprare-casa — le sorprese tipiche */
.eg-blocco--carte{                 /* comprare-casa — conformità, catasto, APE */
  background-color: var(--surface-alt);
  --gio-accento: var(--ink-800);
  --gio-bordo-campo: var(--text-muted);
}
/* Le quattro FAQ che restano sand perché sand chiede la regola: su index,
   valutazione, home-staging e comprare-casa la sezione che le precede è
   bianca. Sono già coperte dalla riga `.faq-section.tl-bg-color` qui sopra e
   stanno scritte per esteso solo perché la mappa si legga per intero: chi
   cerca «dove sta la FAQ di /valutazione» la trova qui e non per deduzione.
   Stessa profondità della riga che le assegna il fondo (0,2,0). */
.faq-section.eg-domande--trasparenza,
.faq-section.eg-domande--valutazione,
.faq-section.eg-domande--staging,
.faq-section.eg-domande--comprare{
  background-color: var(--surface-alt);
  --gio-accento: var(--ink-800);
  --gio-bordo-campo: var(--text-muted);
}

/* → bianco */
.blog-section,                     /* index — «le case che stiamo seguendo» */
.eg-prima-dopo,                    /* home-staging — «prima e dopo» */
.eg-otto-cose,                     /* valutazione — «cosa guardiamo» */
.eg-modulo-valutazione,            /* valutazione — il modulo */
/* «Dicci cosa cerchi» è una sezione sola per due pagine, ma le due pagine la
   mettono dopo due superfici diverse: su /immobili segue la fascia sand «come
   leggere una scheda», su /comprare-casa segue le domande. Da questa passata
   ciascuna porta il nome della propria pagina — come le cinque FAQ — così la
   riga qui sotto si può spezzare in due il giorno in cui una delle due deve
   cambiare fondo, senza toccare l'altra. Oggi il fondo è lo stesso e la
   sequenza del §17.C lo conferma su entrambe. */
.eg-ricerca-inversa--immobili,     /* immobili — dopo una fascia sand */
.eg-ricerca-inversa--comprare{     /* comprare-casa — dopo le domande, sand */
  background-color: var(--surface-page);
  --gio-accento: var(--color-primary-strong);
  --gio-bordo-campo: var(--ink-400);
}
/* I quattro pannelli in colonna che NON prendono il sand. Il fondo lo
   avrebbero comunque dalla sezione che li contiene: sono scritti lo stesso
   perché una mappa in cui compaiono solo le righe sand non si legge come una
   sequenza, e perché se un giorno la sezione ospite passasse al sand questi
   devono restare bianchi. */
.eg-blocco--apertura,              /* le due pagine lunghe — la risposta diretta */
.eg-blocco--costa,                 /* comprare-casa — quanto costa sistemarla */
.eg-blocco--investire,             /* comprare-casa — se compri per investire */
.eg-blocco--visita{                /* comprare-casa — dalla visita alle chiavi */
  background-color: var(--surface-page);
  --gio-accento: var(--color-primary-strong);
  --gio-bordo-campo: var(--ink-400);
}
/* L'UNICA FAQ CHE CAMBIA FONDO. Su /vendere-casa la sezione che la precede
   finisce con un pannello sand (.eg-blocco--documenti), quindi la FAQ deve essere
   bianca: è la regola del §17.C applicata alla lettera, ed è esattamente il
   motivo per cui i generatori hanno dato un nome a ciascuna delle cinque FAQ.
   Serve la profondità del §17.8 più la classe di pagina, o vincerebbe la riga
   `.faq-section.tl-bg-color` che le manda tutte sul sand. */
.faq-section.eg-domande--vendere.tl-bg-color{
  background-color: var(--surface-page);
  --gio-accento: var(--color-primary-strong);
  --gio-bordo-campo: var(--ink-400);
}
/* Chi passa dal sand al bianco si porta dietro la classe .tl-bg-color, e con
   lei due regole che credono di stare ancora sul sand: il bordo dei campi e
   il numero dei passi. Si rimettono in riga qui, alla stessa profondità. */
.eg-modulo-valutazione .form-control,
.eg-modulo-valutazione .eg-select,
.eg-ricerca-inversa .form-control,
.eg-ricerca-inversa .eg-select{ border-color: var(--gio-bordo-campo); }
.eg-otto-cose .eg-passo__numero{ color: var(--color-primary); }  /* 4,37:1 sul bianco */


/* 17.9 LA TESTATA DI PAGINA — una sola altezza --------------------------- */
.page-header.eg-page-header{
  display: grid;
  align-content: center;
  /* 44rem = 704px: è l'altezza naturale della testata più alta a 1600
     (/comprare-casa, titolo su tre righe). Sotto quel valore le otto testate
     tornerebbero a cinque altezze diverse; sopra, si guadagnerebbe solo vuoto.
     Il termine centrale (68vw) non è decorativo: sotto i 1280 il titolo va a
     capo una volta in più e la testata più alta cresce in proporzione alla
     colonna, non alla finestra: a 768 la testata più alta arriva a 669px.
     88vw sta sopra quella curva a tutte le larghezze da 768 in su, e il
     massimo di 44rem impedisce che sui monitor larghi diventi una voragine.
     Misurato dopo: 676 a 768, 704 a 1024, 1280 e 1600 — otto testate, una
     altezza sola. Il minimo di 22rem è il pavimento del telefono, dove la
     fascia non è più una scelta di ritmo ma il minimo che serve al titolo:
     lì le altezze restano diverse perché è il testo a deciderle. */
  min-height: clamp(22rem, 88vw, 44rem);
}


/* 17.10 LE SUPERFICI DENTRO LA COLONNA — le due pagine lunghe -------------
   IL DIFETTO. /vendere-casa e /comprare-casa impaginano tutto il corpo dentro
   UNA sola sezione (`.service-details`, colonna indice a sinistra e testo a
   destra). Misurato a 1600 prima di questo blocco: quella sezione è alta
   5.410 px su vendere e 3.559 px su comprare, tutta bianca, senza un solo
   cambio di superficie. Il §17.C chiede l'opposto della precedente ogni volta
   che cambia sezione; qui di sezioni ce n'era una, e la pagina si spegneva a
   metà. È il difetto che il committente vede per primo su una pagina di
   servizio, e la scheda §gio lo rende doppiamente grave: Giò è «il più
   morbido dei cinque, sand generoso una sezione su due», e queste due pagine
   erano le più asciutte del sito.

   L'AGGANCIO. I generatori hanno dato un nome a ciascun blocco del corpo
   (`.eg-blocco` più `.eg-blocco--<nome>`), uno a ciascuna delle cinque FAQ e
   uno a ciascuna delle due «Dicci cosa cerchi». Il CSS non aggiunge né sposta
   niente: decide solo quali blocchi portano il sand, e la regola che lo
   decide è quella già scritta.
   `--<nome>` e non il nome nudo perché due dei blocchi si chiamavano come due
   componenti di questo foglio: vedi la nota in testa al §17.8.

   PERCHÉ UN PANNELLO E NON UNA FASCIA. Questi blocchi vivono dentro la
   col-lg-8: una fascia a tutta pagina si farebbe con `margin-inline:
   calc(50% - 50vw)`, che (a) porterebbe il sand sotto la colonna indice, che
   nella prima metà della pagina è ancora lì, e (b) conta la barra di
   scorrimento dentro il 100vw, cioè fa nascere lo sforamento orizzontale che
   `overflow-x:hidden` del tema nasconde invece di risolvere. Quindi:
   pannello, largo esattamente quanto la colonna del testo.

   IL PADDING VIENE DA FUORI, NON DA DENTRO. Un pannello che si ricava il
   padding stringendo il testo costerebbe 48 px di colonna, e la colonna non
   ne ha: la griglia dei sette passi sta a 728 px esatti sul suo punto di
   rottura. Misurato togliendo larghezza al testo dentro il pannello: a −48 px
   «La valutazione, fatta con l'esperto» e «La preparazione: svuotare e
   allestire» passano da due righe a TRE, con la parola sola in fondo che il
   §3.1-bis combatte da tre passate; a −16 px ci va ancora «La preparazione».
   L'unica misura che non rompe niente è zero. Quindi il pannello sporge in
   fuori di --gio-pannello-lato e si rimette dentro lo stesso valore di
   padding: il testo — di tutti i blocchi, sand e bianchi, compresi i due
   paragrafi d'apertura che non hanno nome — resta largo quanto prima e su una
   sola verticale.

   LA MISURA È --space-5, E FA GUADAGNARE DUE COSE. A destra il pannello
   arriva al bordo della SCATOLA del container (il container ha esattamente
   --space-5 di padding, §4): sopra i 1152 px il sand è dentro il margine di
   pagina, sotto diventa una fascia a tutta larghezza, che a 768 e a 390 —
   dove la colonna indice non c'è più e la colonna del testo è la pagina — è
   esattamente il taglio giusto. Un valore più grande sfonderebbe il viewport.
   Misurato dopo: body.scrollWidth uguale a innerWidth a 1600, 1280, 1024,
   768 e 390.
   A sinistra invece, sopra i 992 px, il pannello arriverebbe a toccare la
   scheda sand «Cominciamo dal sopralluogo» della colonna indice — misurato:
   zero px fra le due, due superfici dello stesso colore che diventano una
   macchia sola con una tacca in mezzo. Il canale se lo prende la colonna
   indice, che ha larghezza da vendere (352 px per un elenco di sei voci):
   vedi la riga sotto.
   Nessun raggio: questa è una superficie, non una card — una card qui sarebbe
   un sesto linguaggio di riquadro.

   IL RESPIRO. Vale la scala del §17.C, con il FATTORE DI COLONNA del §17.A:
   i tre respiri sono tarati su una fascia larga quanto la finestra, e dentro
   una colonna di 728 px la stessa misura pesa quasi il doppio. Il fattore è
   quello dei titoli (--gio-colonna), perché è la stessa ragione: la colonna,
   non la pagina. A 1600 diventano 77 / 102 / 154 px.
   Assegnati per peso, non per posizione:
     quiete   il climax della pagina — su vendere «il nostro lavoro è
              prendere il massimo per te», su comprare «puoi sapere quanto
              costa sistemarla prima di comprarla». Sono i due argomenti che
              nessun concorrente scrive, e sono gli unici due blocchi bianchi
              che si prendono tutta l'aria.
     normale  i blocchi di contenuto: i sette passi, gli scatoloni, le
              sorprese tipiche, le carte, dalla visita alle chiavi.
     denso    code, rimandi ed elenchi, che sono già alti di loro: la
              trasparenza (due elenchi di quindici voci), i documenti, il caso
              a parte di chi compra per investire.

   LA SEQUENZA CHE NE ESCE (B bianco, S sand, ▣ fotografia; il corpo della
   pagina lunga è il gruppo fra parentesi):

     vendere-casa    ■ (B S B S B S) B ▣ S      prima: ■ B S ▣ S
     comprare-casa   ■ (B S B S B B) S B ▣ S    prima: ■ B S B ▣ S

   Le due pagine leggono uguale perché il corpo comincia con un blocco bianco
   — i due paragrafi di risposta diretta, che stanno sul fondo della sezione —
   e da lì alterna. Da questa passata quel blocco è un elemento e ha un nome,
   .eg-blocco--apertura: prima era un h2 e due <p> sciolti, e il respiro
   glielo doveva prestare un margine su tutti gli altri (vedi sotto).

   PERCHÉ SU COMPRARE L'ULTIMO PANNELLO NON È SAND. La catena è bloccata alle
   DUE estremità: davanti dal blocco bianco d'apertura, dietro da «Dicci cosa
   cerchi», che è bianco perché su /immobili — dove la stessa sezione segue
   una fascia sand — bianco deve restare. Fra i due vincoli restano sei posti
   e due sole coppie possibili: o il sand va su «le sorprese tipiche» e «le
   carte», o va sui due blocchi brevi in mezzo. Vince la prima, perché mette
   la superficie sui blocchi che contano (706 e 394 px contro 522 e 238) e
   perché lascia bianco il percorso di chiusura, che è il punto in cui la
   pagina consegna. Il prezzo è che «dalla visita alle chiavi» resta bianco
   mentre il suo gemello su vendere («i sette passi») è sand.
   Il vincolo di dietro non è più strutturale: da questa passata «Dicci cosa
   cerchi» porta il nome della propria pagina (.eg-ricerca-inversa--comprare e
   --immobili, §17.8), quindi la coda di /comprare-casa si può sbloccare
   quando si decide di farlo — sono tre superfici da rovesciare in fila
   (visita, domande, ricerca inversa) e vanno decise insieme, non qui.
   Oggi la mappa resta quella scritta sopra, misurata e invariata.
   Non si inventa qui un selettore che dipenda dall'ordine dei fratelli: il
   §17 dice che in questo foglio non ce ne sono. */

:root{
  /* di quanto il pannello sand sporge dalla colonna, e quanto padding si
     rimette dentro: vedi sopra, le due misure sono la stessa. */
  --gio-pannello-lato: var(--space-5);
  /* il respiro predefinito di un blocco in colonna */
  --gio-blocco-respiro: var(--gio-sez-normale);
}

/* Il canale fra la colonna indice e i pannelli. Sotto i 992 px la colonna
   indice sta sopra il testo e non c'è niente da separare, quindi la riga vale
   solo da lg in su — che è anche l'unica larghezza in cui le due colonne sono
   affiancate. Le due schede perdono 24 px su 352 e non se ne accorgono. */
@media (min-width: 62rem){
  .eg-percorso .service-details-left-content,
  .eg-comprare .service-details-left-content{ padding-right: var(--gio-pannello-lato); }
}

/* Il respiro di tutti i blocchi del corpo, sand o bianchi che siano. Un
   selettore solo: da questa passata OGNI blocco del corpo porta .eg-blocco,
   compresi i due che ne erano rimasti fuori (.eg-doppio-mandato e
   .eg-trasparenza) e l'apertura, che prima non era nemmeno un elemento.
   Il ritmo di una pagina non deve dipendere da chi ha ricevuto un aggancio.

   IL MARGINE NON C'È PIÙ. Serviva in un punto solo: i due paragrafi di
   risposta diretta che aprono il corpo non erano un blocco, non avevano
   respiro, e il primo pannello sand partiva 19 px sotto l'ultima riga
   (misurato a 1600). Ora l'apertura è .eg-blocco--apertura e il canale se lo
   fanno i padding, come fra due sezioni: misurato a 1600 dopo la modifica,
   apertura → primo pannello 205 px su entrambe le pagine lunghe, che è
   esattamente pb+pt dei due blocchi. Fra fratelli il margine collassava e non
   aggiungeva ritmo; in testa e in coda alla colonna si sommava invece al
   padding della sezione. Via.
   Con l'aggancio nuovo cade anche la seconda ragione che lo teneva in vita:
   il `margin: 0 0 var(--space-4)` che .eg-lista (§15.4) lasciava addosso alla
   sezione omonima di /comprare-casa non esiste più, perché quella sezione
   oggi si chiama .eg-blocco--lista e l'elenco è solo il suo contenuto. */
.eg-blocco{
  padding-block: calc(var(--gio-blocco-respiro) * var(--gio-colonna));
}
/* L'ultimo figlio di un blocco porta il proprio margine dentro il padding e
   lo raddoppia in basso: sul pannello sand si vedeva come un pannello
   sbilanciato. */
.eg-blocco > :last-child{ margin-bottom: 0; }

/* quiete — un blocco per pagina, ed è il climax */
.eg-doppio-mandato,                        /* vendere-casa */
.eg-blocco--costa{                         /* comprare-casa */
  --gio-blocco-respiro: var(--gio-sez-quiete);
}
/* denso — code, rimandi ed elenchi */
.eg-trasparenza,                           /* vendere-casa — i due elenchi */
.eg-blocco--documenti,                     /* vendere-casa — le carte */
.eg-blocco--investire{                     /* comprare-casa — il caso a parte */
  --gio-blocco-respiro: var(--gio-sez-denso);
}

/* La geometria del pannello sand: si riprende il rientro della colonna e lo
   rimette dentro, così il fondo arriva al bordo della colonna e il testo non
   si muove. Il fondo e le variabili di superficie li dà la mappa del §17.8.
   Stessi cinque nomi della mappa, e nessuno di questi selettori può più
   toccare la griglia o l'elenco annidati: `--passi` e `--lista` sono agganci
   di sezione, `.eg-passi` e `.eg-lista` restano i componenti. */
.eg-blocco--passi,
.eg-blocco--preparare,
.eg-blocco--documenti,
.eg-blocco--lista,
.eg-blocco--carte{
  margin-inline: calc(-1 * var(--gio-pannello-lato));
  padding-inline: var(--gio-pannello-lato);
}
/* Il numero del passo su sand. §15.3 lo porta a --ink-800 quando la SEZIONE è
   .tl-bg-color; qui il sand non è la sezione ma il pannello, quindi la stessa
   commutazione va rifatta all'aggancio nuovo. Cifra di 24px in display: la
   soglia sarebbe 3:1 e il terracotta la passerebbe anche sul sand, ma due
   trattamenti diversi per lo stesso numero sulla stessa superficie sarebbero
   la solita incoerenza di prima. 10,94:1 sul sand. */
.eg-blocco--passi .eg-passo__numero{ color: var(--ink-800); }

/* ==========================================================================
   18. MODO REVISIONE E RESIDUI DEL TEMA
   Sezione aggiunta dall'intervento «seconda ondata» (generatori in tools/).
   Sta in coda apposta: non riscrive nessuna regola dei capitoli precedenti,
   li commuta soltanto. Tre blocchi, in tutto una ventina di dichiarazioni.
   ========================================================================== */

/* 18.1 Le note di bozza escono dall'impaginato -----------------------------
   §13 le compone; qui si decide QUANDO si vedono. Erano 69 in nove pagine, e
   sulla home una cadeva fra i bottoni della hero e la barra di ricerca, in
   terracotta, cioè nel colore delle CTA: chi guardava non leggeva un sito in
   lavorazione, leggeva un sito rotto.
   Restano TUTTE nel DOM — sono il registro di ciò che è segnaposto, e servono
   a chi rivede — ma di default non si vedono. Si accendono con `?bozza=1`
   (lo scrive lo script in linea di tools/gio-shell.mjs, che mette
   `data-bozza` su <html> e lo ricorda in sessionStorage), si spengono con
   `?bozza=0`. In fondo a ogni pagina resta UNA riga di registro, §16.2, che
   dice quante sono e come si rivedono.
   Senza JavaScript `data-bozza` non compare mai: il comportamento
   predefinito, cioè la pagina pulita, è anche quello di riserva. */
.eg-draft-note{ display: none; }
/* Due note sfuggivano (misurate su /contatti: la nota del WhatsApp e quella
   dentro <address>). Non e' un caso limite, e' specificita': main.css del tema
   porta `.request-content .request-item-wrap .request-item p` e `... span` con
   `display:block`, cioe' (0,3,1) contro lo (0,1,0) della riga qui sopra. Chi
   aggiunge una nota dentro un blocco del tema che imposta `display` deve
   aggiungere qui il selettore corrispondente — e il modo di accorgersene e'
   contare quante .eg-draft-note hanno display != none in pagina, che deve
   essere ZERO su tutte e nove. */
.request-content .request-item-wrap .request-item p.eg-draft-note,
.request-content .request-item-wrap .request-item span.eg-draft-note,
.request-content .request-item-wrap .request-item address .eg-draft-note{ display: none; }
html[data-bozza] .request-content .request-item-wrap .request-item p.eg-draft-note,
html[data-bozza] .request-content .request-item-wrap .request-item span.eg-draft-note,
html[data-bozza] .request-content .request-item-wrap .request-item address .eg-draft-note{ display: block; }

html[data-bozza] .eg-draft-note{
  display: block;
  border-left: 2px dashed var(--ink-400);
  padding-left: var(--space-3);
}
/* Anche in revisione la parola «bozza» non è terracotta: l'accento del marchio
   non si spende per dire «questo pezzo non è finito». */
html[data-bozza] .eg-draft-note::before{ color: var(--ink-600); }
html[data-bozza] .exp-section .eg-draft-note,
html[data-bozza] .cta-section-3 .eg-draft-note,
html[data-bozza] .white-content .eg-draft-note,
html[data-bozza] .footer-section .eg-draft-note{ border-left-color: rgba(255,255,255,.32); }
html[data-bozza] .exp-section .eg-draft-note::before,
html[data-bozza] .cta-section-3 .eg-draft-note::before,
html[data-bozza] .white-content .eg-draft-note::before,
html[data-bozza] .footer-section .eg-draft-note::before{ color: rgba(255,255,255,.72); }

/* 18.2 La riga di registro in fondo al footer ------------------------------
   Una riga, nei neutri del footer (§12: lì dentro l'accento non entra). Il
   numero lo scrive la build contando le .eg-draft-note della pagina finita.
   I due comandi sono due link veri: uno solo si vede per volta, e senza
   JavaScript resta visibile «Mostra», che è lo stato di partenza. */
.eg-bozza-registro{
  margin-top: var(--space-3);
  padding-top: var(--space-3);
  border-top: 1px solid rgba(255,255,255,.16);
  font-size: var(--text-xs);
  line-height: 1.6;
  color: rgba(255,255,255,.72);           /* 8,63:1 sul fondo del footer */
}
.eg-bozza-registro a{
  display: inline-flex;
  align-items: center;
  min-height: 44px;                        /* è un controllo autonomo, non un link di testo */
  padding-inline: var(--space-2);
  /* Nel footer entrano solo i neutri e il blu di gruppo: senza questa riga il
     link ereditava il terracotta di ramo, cioè l'accento del marchio speso su
     un comando di lavorazione. Bianco all'86% = 10,4:1 sul fondo scuro. */
  color: rgba(255,255,255,.86);
  text-decoration: underline;
  text-underline-offset: 3px;
}
.eg-bozza-registro a:hover{ color: var(--text-inverse); }
/* Specificità pari a quella della riga qui sopra: con il solo `.eg-bozza-off`
   (0,1,0) contro `.eg-bozza-registro a` (0,2,1) si vedevano tutti e due i
   comandi, misurato. */
.eg-bozza-registro a.eg-bozza-off{ display: none; }
html[data-bozza] .eg-bozza-registro a.eg-bozza-on{ display: none; }
html[data-bozza] .eg-bozza-registro a.eg-bozza-off{ display: inline-flex; }

/* 18.3 La CTA della scatola contatto ---------------------------------------
   Sostituisce `.service-details-cta.eg-box-contatto .cta-btn a` (§15): il
   markup non porta più `.cta-btn`, perché su quella classe main.css del tema
   monta un disco di 120x120 con border-radius:50% e sfondo rgba(152,152,152,.36)
   — il cerchio che nel tema si espande all'hover, e che qui restava fermo allo
   stato iniziale come ellisse grigia con l'etichetta fuori. L'effetto non si
   ripara: si toglie l'aggancio. Vedi il commento in tools/build-gio-pages.mjs. */
.eg-box-contatto__azione{ width: 100%; }
.eg-box-contatto__azione > a{ width: 100%; justify-content: space-between; }

/* SECONDO residuo, che il disco teneva nascosto. Il tema veste OGNI <span>
   dentro la scatola contatto come una didascalia:
   `.service-details-left-content .service-details-cta span` -> display:block,
   margin 20px 0 15px, font-size 20px, color bianco — specificità (0,3,1), che
   batte il `.tl-primary-btn .icon` di §5 (0,2,0). Quel selettore prende anche
   il tondo della freccia del bottone. Finché il bottone era un disco di 120px
   non si notava; appena è tornato una pill, la pill cresceva a 90px (contro i
   55 di sistema) e la freccia restava bianca su fondo bianco, cioè invisibile.
   Misurato a 1600 su /vendere-casa e /comprare-casa. */
.service-details-left-content .service-details-cta.eg-box-contatto .tl-primary-btn .icon,
.eg-box-contatto .eg-box-contatto__azione .tl-primary-btn .icon{
  display: flex;
  margin: 0 0 0 var(--space-1);
  font-size: 1rem;
  color: var(--color-primary-strong);
}

/* 18.4 IL MODULO SPENTO ----------------------------------------------------
   Non e' una nota di bozza ed e' apposta che non lo sia: le note si spengono
   (§18.1), questo avviso no. Finche' non c'e' l'endpoint, un modulo che si
   compila e non manda niente e' una trappola, e su questo sito e' la peggiore
   possibile. Il markup lo scrive tools/gio-shell.mjs (moduloContatto, opzione
   `attivo`), che mette anche i campi dentro un <fieldset disabled>.
   Superficie sand e filetto in inchiostro: e' un avviso, non una CTA, e
   l'accento terracotta non si spende per dire «questo pezzo non funziona». */
.eg-modulo-spento{
  margin-bottom: var(--space-5);
  padding: var(--space-5);
  border-left: 3px solid var(--ink-800);
  border-radius: var(--radius-md);
  background-color: var(--surface-alt);
}
.eg-modulo-spento__titolo{
  font-family: var(--font-display);
  font-size: var(--text-lg);
  font-weight: var(--weight-bold);
  color: var(--ink-900);
  margin-bottom: var(--space-2);
}
/* niente `color` qui: p{} lo dà già, e con .eg-modulo-spento p (0,1,1) il
   titolo — che è un <p> con la sua classe (0,1,0) — perdeva contro la mia stessa
   regola e usciva in --text-body invece che in --ink-900. Misurato. */
.eg-modulo-spento p{ margin-bottom: 0; }
/* I due recapiti sono l'unica via che funziona davvero, quindi non stanno
   dentro il paragrafo: stanno su una riga propria, come due controlli. Dentro
   il testo servivano comunque 44px di altezza, e quei 44px gonfiavano le righe
   del paragrafo intorno (misurato: interlinea a 44px invece di 27). */
.eg-modulo-spento__vie{
  display: flex;
  flex-wrap: wrap;
  align-items: center;
  gap: var(--space-2) var(--space-5);
  margin-top: var(--space-3);
}
/* Il colore NON si dichiara qui: lo dà il sistema, con
   `p a:not([class])` -> var(--gio-accento) del §3.4, che a (0,1,2) batteva
   comunque questo selettore (0,1,1) — misurato, la dichiarazione era morta.
   Ed è giusto così: sono link, e questo è il colore dei link del sito.
   Contrasto verificato: #bc593b su sand-050 #f7f5f1 = 4,17:1, e a 20px bold
   siamo in «testo grande» (soglia AA 3:1). */
.eg-modulo-spento__vie a{
  display: inline-flex;
  align-items: center;
  min-height: 44px;
  font-family: var(--font-display);
  font-size: var(--text-lg);
  font-weight: var(--weight-bold);
  text-decoration: underline;
  text-underline-offset: 4px;
}

/* Il fieldset non deve introdurre geometria propria: e' un involucro
   semantico attorno alla griglia dei campi, non un riquadro. */
.eg-modulo-campi{
  border: 0;
  margin: 0;
  padding: 0;
  min-width: 0;      /* senza, un fieldset non si restringe sotto la min-content dei figli */
}
/* Che i campi siano spenti si deve VEDERE, non solo scoprire al click. Il
   tema dipinge .form-control con fondo e bordo espliciti, quindi il grigio
   predefinito del browser non arriva mai.
   La profondità è ricalcata, non forzata: main.css porta la regola
   .contact-page-area .request-form-wrap .form-item .form-control a (0,4,0),
   e con un selettore più corto il fondo restava bianco — misurato, i campi
   di /contatti erano #ffffff con il fieldset gia' disabilitato. Stesso metodo
   dei §3.1, §6 e §17.2: si pareggia la profondità e si vince sull'ordine.
   Le ETICHETTE restano a contrasto pieno: spegnere i controlli serve a non
   far scrivere, non a rendere illeggibile il modulo — che in questa fase è
   anche il testo che il cliente deve rileggere. */
.request-form-wrap .eg-modulo-campi[disabled] .form-item .form-control,
.request-form-wrap .eg-modulo-campi[disabled] .form-item .eg-select{
  color: var(--text-muted);
  background-color: var(--sand-050);
  border-color: var(--line);
  cursor: not-allowed;
}
.eg-modulo-campi[disabled] .tl-primary-btn{
  background-color: var(--ink-400);
  border-color: var(--ink-400);
  cursor: not-allowed;
}
.eg-modulo-campi[disabled] .tl-primary-btn::before{ display: none; }   /* niente hover su un bottone spento */
.eg-modulo-campi[disabled] .tl-primary-btn .icon{
  background-color: var(--surface-card);
  color: var(--ink-600);
}
