/*
 * Theme Name:   Sunya Child — dadesign
 * Theme URI:    https://dadesign.it
 * Description:  Child theme di Sunya — personalizzazioni per dadesign.it. Il brand e' dichiarato via filtro sunya_brand_colors in functions.php.
 * Author:       Davide Arduini
 * Author URI:   https://dadesign.it
 * Template:     sunya
 * Version:      2.9.0
 * License:      GPL-2.0-or-later
 * License URI:  https://www.gnu.org/licenses/gpl-2.0.html
 * Text Domain:  sunya-child
 * Tags:         custom, portfolio, developer
 * Requires at least: 6.0
 * Tested up to: 7.1
 * Requires PHP: 7.4
 *
 * Questo child theme eredita tutte le funzionalità del tema parent Sunya.
 * Tutte le personalizzazioni specifiche per dadesign.it vanno qui.
 */


/* ==========================================================================
   FONT LOCALI — Space Grotesk + DM Sans
   Self-hosted per GDPR compliance (nessuna chiamata a Google Fonts)
   ========================================================================== */

/* --- Space Grotesk (Heading) --- */

@font-face {
    font-family: 'Space Grotesk';
    src: url('fonts/SpaceGrotesk-Regular.woff2') format('woff2');
    font-weight: 400;
    font-style: normal;
    font-display: swap;
}

@font-face {
    font-family: 'Space Grotesk';
    src: url('fonts/SpaceGrotesk-Medium.woff2') format('woff2');
    font-weight: 500;
    font-style: normal;
    font-display: swap;
}

@font-face {
    font-family: 'Space Grotesk';
    src: url('fonts/SpaceGrotesk-SemiBold.woff2') format('woff2');
    font-weight: 600;
    font-style: normal;
    font-display: swap;
}

@font-face {
    font-family: 'Space Grotesk';
    src: url('fonts/SpaceGrotesk-Bold.woff2') format('woff2');
    font-weight: 700;
    font-style: normal;
    font-display: swap;
}

/* --- DM Sans (Body) --- */

@font-face {
    font-family: 'DM Sans';
    src: url('fonts/DMSans-Regular.woff2') format('woff2');
    font-weight: 400;
    font-style: normal;
    font-display: swap;
}

@font-face {
    font-family: 'DM Sans';
    src: url('fonts/DMSans-Italic.woff2') format('woff2');
    font-weight: 400;
    font-style: italic;
    font-display: swap;
}

@font-face {
    font-family: 'DM Sans';
    src: url('fonts/DMSans-Medium.woff2') format('woff2');
    font-weight: 500;
    font-style: normal;
    font-display: swap;
}

@font-face {
    font-family: 'DM Sans';
    src: url('fonts/DMSans-SemiBold.woff2') format('woff2');
    font-weight: 600;
    font-style: normal;
    font-display: swap;
}

@font-face {
    font-family: 'DM Sans';
    src: url('fonts/DMSans-Bold.woff2') format('woff2');
    font-weight: 700;
    font-style: normal;
    font-display: swap;
}


/* ==========================================================================
   CUSTOM PROPERTIES — Palette dadesign.it
   
   Colori brand (dal logo):
   - Cyan Primary: #00E5D0  (CTA, link, accenti)
   - Cyan Light:   #5CFFF0  (hover, highlight)
   - Cyan Muted:   #00BFB3  (bordi attivi, label)
   
   Sfondi scuri (hero, header, footer):
   - Dark BG:      #0D1117  (sfondo principale)
   - Dark Card:    #161B22  (card, box)
   - Dark Border:  #21262D  (bordi, separatori)
   - Dark Surface: #1C2128  (superfici elevate)
   
   Sfondi chiari (sezioni contenuto):
   - Light BG:     #FAFBFC  (sfondo sezioni chiare)
   - Light Card:   #FFFFFF  (card su sfondo chiaro)
   - Light Border: #E1E4E8  (bordi versione chiara)
   
   Testo:
   - On Dark:      #F0F6FC  (titoli/body su scuro — 15.4:1 su #0D1117)
   - Secondary:    #8B949E  (descrizioni su scuro — 5.1:1, WCAG AA)
   - Muted:        #6E7681  (meta/caption su scuro — 3.8:1, large text AA)
   - On Light:     #1B1F23  (titoli su chiaro — 17.1:1 su #FAFBFC)
   - Light Sec:    #586069  (paragrafi su chiaro — 7.1:1, WCAG AAA)
   
   Contrasto link verificato:
   - #00E5D0 su #0D1117 = 11.2:1 (AAA) ✓
   - #00BFB3 su #0D1117 = 8.7:1  (AAA) ✓
   - #00E5D0 su #FAFBFC = 1.8:1  (FAIL — usare #0D1117 come CTA su chiaro)
   ========================================================================== */

:root {
    /* Font */
    --sunya-font-body:    'DM Sans', sans-serif;
    --sunya-font-heading: 'Space Grotesk', sans-serif;

    /* Colori primari (dal logo) */
    --da-cyan:            #00E5D0;
    --da-cyan-light:      #5CFFF0;
    --da-cyan-muted:      #00BFB3;

    /* Teal — accento accessibile su sfondo chiaro (4.75:1 con bianco).
       Il cyan e' decorativo: su chiaro non raggiunge il rapporto AA. */
    --da-teal:            #00756C;
    --da-teal-hover:      #008C82;

    /* Sfondi scuri */
    --da-dark-bg:         #0D1117;
    --da-dark-card:       #161B22;
    --da-dark-border:     #21262D;
    --da-dark-surface:    #1C2128;

    /* Sfondi chiari */
    --da-light-bg:        #FAFBFC;
    --da-light-card:      #FFFFFF;
    --da-light-border:    #E1E4E8;
    --da-input-border:    #D9DDE2;

    /* Testo */
    --da-text-on-dark:    #F0F6FC;
    --da-text-secondary:  #8B949E;
    --da-text-muted:      #6E7681;
    --da-text-on-light:   #1B1F23;
    --da-text-light-sec:  #586069;

    /* Accento caldo (usato con moderazione per badge/alert) */
    --da-accent-warm:     #FF6B35;

    /* Stato */
    --da-success:         #2EA043;
    --da-warning:         #D29922;
    --da-error:           #F85149;

    /* Spaziature — Scala 8px */
    --da-space-xs:  8px;
    --da-space-sm:  16px;
    --da-space-md:  24px;
    --da-space-lg:  32px;
    --da-space-xl:  48px;
    --da-space-2xl: 64px;
    --da-space-3xl: 96px;

    /* ----------------------------------------------------------------
       Design system Sunya — mappatura preset Gutenberg

       Il parent registra i preset colore puntando a queste variabili
       (inc/theme-json-palette.php). Ridefinirle qui e' l'UNICO modo in
       cui questo sito imposta i colori delle sezioni Gutenberg: nessun
       colore va scritto nel theme.json del child.

       I valori --da-* restano la fonte di verita' del brand.
       ---------------------------------------------------------------- */
    --sunya-color-surface-dark:     var(--da-dark-bg);
    --sunya-color-surface-dark-alt: var(--da-dark-card);
    --sunya-color-surface-light:    var(--da-light-bg);
    --sunya-color-text-on-dark:     var(--da-text-on-dark);
    --sunya-color-text-on-light:    var(--da-text-on-light);
    --sunya-color-accent-bright:    var(--da-cyan);
    --sunya-color-accent-contrast:  var(--da-teal);

    /* ----------------------------------------------------------------
       Carta del pre-footer (v2.0.0)

       Il parent usa l'accent come fondo del pre-footer:
       `background: var(--sunya-prefooter-bg, var(--sunya-color-accent))`.
       Finche' l'accent di questo sito era il nero residuo in DB la
       sezione usciva scura per caso; col brand nel filtro l'accent e' il
       cyan vero e il pre-footer sarebbe diventato una fascia cyan piena.

       Su dadesign il pre-footer e' carta SCURA per scelta di design, non
       per effetto collaterale: lo dichiariamo col token che il parent
       espone apposta, invece di combattere la cascata ridichiarando
       sfondo e inchiostro dei singoli elementi.

       L'INCHIOSTRO VA DICHIARATO INSIEME ALLA CARTA (parent v1.9.5).
       Il default del parent e' `--sunya-color-on-accent`, derivato
       dall'ACCENT: giusto finche' la carta E' l'accent, sbagliato qui.
       Senza questa riga l'hover del pulsante riportava #0d1117 sulla
       carta #0d1117 — contrasto 1.00, etichetta invisibile dentro il
       proprio bordo.
       ---------------------------------------------------------------- */
    --sunya-prefooter-bg:  var(--da-dark-bg);
    --sunya-prefooter-ink: var(--da-text-on-dark);
}


/* ==========================================================================
   APPLICAZIONE FONT
   ========================================================================== */

body {
    font-family: var(--sunya-font-body);
}

h1, h2, h3, h4, h5, h6 {
    font-family: var(--sunya-font-heading);
}


/* --------------------------------------------------------------------------
   1. Body text — Sezioni chiare
   
   Il sito dadesign.it alterna sezioni scure e chiare.
   Il parent di default ha sfondo chiaro, quindi partiamo da lì.
   -------------------------------------------------------------------------- */

body,
.entry-content,
.sunya-entry-content,
.page-content {
    color: var(--da-text-on-light);
}

.sunya-meta,
.sunya-caption,
figcaption,
.wp-caption-text,
.comment-metadata {
    color: var(--da-text-light-sec);
}


/* --------------------------------------------------------------------------
   2. Link e accenti — RIMOSSA in v2.0.0

   Dichiarava i link di contenuto a --da-cyan-muted (#00BFB3, 4.3:1 su
   bianco) con hover --da-cyan (#00E5D0, 1.8:1): l'hover finiva SOTTO il
   riposo, cioe' il link diventava meno leggibile quando lo si puntava.

   Col brand nel filtro il parent emette --sunya-color-link e
   --sunya-color-link-hover derivandoli dall'accent-contrast e
   conservando il lato (inchiostro scuro -> hover schiarisce). La base
   `a` del parent li consuma gia': ridichiararli qui con una catena
   peggiore non serviva piu' a nulla se non a rompere l'hover.
   -------------------------------------------------------------------------- */


/* --------------------------------------------------------------------------
   3. Navigazione — RIMOSSA in v2.0.0

   Era la causa del menu quasi invisibile emerso col parent 1.9.4
   (contrasto 1.09 sulle pagine senza hero, 2.04 sulla home scrollata).

   Dichiarava:
       .sunya-nav__menu > li > a                            -> da-text-on-light
       .sunya-header--transparent .sunya-nav__menu > li > a -> da-text-on-dark

   Reliquia pre-1.7.x: nasceva quando il parent aveva #ffffff hardcoded
   e il child doveva correggerlo. Dal refactor 1.8.3/1.8.4 l'inchiostro
   dell'header e' un TOKEN (--sunya-header-color) che la SUPERFICIE
   dichiara, via guardie body-class mutuamente esclusive.

   Il difetto: `--transparent` e' una classe di ELEMENTO e resta anche
   dove le body class (no-hero, force-solid, scrolled) convertono
   l'header a solido. "Trasparente" non significa "visivamente
   trasparente". La regola child applicava percio' inchiostro chiaro su
   header bianco. Fino alla 1.4.3 il parent aveva regole a (0,4,2) che
   la scavalcavano: la 1.8.3 le ha rimosse — correttamente, ma con esse
   e' caduto lo scudo che teneva insieme questo child.

   Gli STATI dell'header li possiede il parent. Il child non li sa.
   -------------------------------------------------------------------------- */


/* --------------------------------------------------------------------------
   4. Pulsanti CTA — RIMOSSA in v2.0.0

   Dichiarava .sunya-btn--outline a --da-cyan-muted su qualunque carta
   (#00BFB3 = 2.3:1 su bianco: sotto AA per il testo e sotto il 3:1 di
   WCAG 1.4.11 per il bordo), battendo per ordine sorgente le regole
   superficie-aware del parent 1.7.8+, dove e' la sezione a decidere
   l'inchiostro dei propri pulsanti.

   I bottoni di brand veri e propri restano: sezione 9.3 (dd-btn),
   9.8 (pre-footer) e 12 (core buttons).
   -------------------------------------------------------------------------- */


/* --------------------------------------------------------------------------
   5. Footer — Colori su sfondo scuro
   
   Le regole body { color } cascadano ovunque.
   Ri-dichiariamo i colori footer per testo chiaro su sfondo scuro.
   -------------------------------------------------------------------------- */

.sunya-footer {
    color: var(--da-text-on-dark);
}

.sunya-footer a {
    color: var(--da-text-on-dark);
}

.sunya-footer a:hover,
.sunya-footer a:focus {
    color: var(--da-cyan);
}

/* Copyright bar: testo secondario su scuro */
.sunya-footer__bottom {
    color: var(--da-text-secondary);
}

.sunya-footer__bottom a {
    color: var(--da-text-secondary);
}

.sunya-footer__bottom a:hover,
.sunya-footer__bottom a:focus {
    color: var(--da-cyan);
}


/* 5.1 Area widget sul telefono — due colonne (2026-09-24, child 2.8.3)

   Il parent sotto i 768px mette ogni griglia widget a UNA colonna: con
   Servizi (8 link), Lavori (5) e Contatti l'area era alta 1032px a 396,
   misurata sul servito il 24/09. Qui, solo per la griglia a 3 colonne:
   Servizi e Lavori affiancati, Contatti sotto a tutta larghezza.
   Stessa specificita' del parent (0,1,0), vince per ordine: il child si
   carica dopo. Gap di riga e di colonna ridotti: il 2xl del parent
   (48px) fra due colonne da ~160px ruberebbe un terzo della larghezza. */
@media screen and (max-width: 768px) {
    .sunya-footer__widgets-grid--3col {
        grid-template-columns: repeat(2, minmax(0, 1fr));
        gap: var(--sunya-spacing-xl) var(--sunya-spacing-lg);
    }

    .sunya-footer__widgets-grid--3col > :nth-child(3) {
        grid-column: 1 / -1;
    }
}


/* 5.2 Titolo di colonna attaccato al suo elenco (2026-09-24, child 2.8.4)

   Nel footer ogni colonna e' fatta di DUE widget: uno col solo Titolo
   (H2) e uno con l'Elenco pagine o il testo. Fra i due si sommavano il
   margine sotto del titolo (lg, 24px, footer.css) e il margine sotto del
   widget (xl, 32px, sidebar.css): 56px, misurati sul servito il 24/09,
   e il titolo sembrava staccato dalla sua lista. Qui il widget che
   contiene SOLO un titolo perde il suo margine: resta quello del titolo,
   lo stesso che il parent prevede fra titolo e contenuto di un widget
   unico. Nessun effetto su widget con piu' blocchi o senza titolo. */
.sunya-footer__column > .sunya-widget:has(> .wp-block-heading:only-child) {
    margin-bottom: 0;
}

/* Poi, su richiesta di Davide (24/09, 2.8.5), il titolo stesso scende da
   lg a md: 16px fra titolo e widget, 22px fino al testo della prima voce
   (che ha 4px di padding sopra) — misurati iniettando la regola sul
   servito. 0,3,0 contro lo 0,2,0 di `.sunya-footer__column
   .wp-block-heading` del parent. */
.sunya-footer__column > .sunya-widget > .wp-block-heading {
    margin-bottom: var(--sunya-spacing-md);
}


/* --------------------------------------------------------------------------
   6. Pre-footer CTA
   -------------------------------------------------------------------------- */

.sunya-prefooter {
    color: var(--da-text-on-dark);
}

.sunya-prefooter a {
    color: var(--da-cyan);
}


/* --------------------------------------------------------------------------
   7. Componenti specifici dadesign.it
   -------------------------------------------------------------------------- */

/* Card servizi — hover con bordo cyan */
.service-card:hover,
.sunya-product-card:hover {
    border-color: var(--da-cyan-muted);
}

/* Badge / label (opzionale, per sezioni tecniche) */
.da-label {
    font-family: 'JetBrains Mono', 'DM Sans', monospace;
    font-size: 11px;
    font-weight: 500;
    letter-spacing: 2px;
    text-transform: uppercase;
    color: var(--da-cyan-muted);
}

/* Bordi e radius coerenti con style guide */
.service-card,
.sunya-product-card,
.sunya-btn,
img {
    border-radius: 8px;
}


/* --------------------------------------------------------------------------
   8. Sezioni scure Gutenberg — cascade colore testo
   
   I preset surface-dark / surface-dark-alt impostano solo il background.
   Queste regole garantiscono testo leggibile dentro ogni sezione scura
   senza dover impostare textColor blocco per blocco nell'editor.
   
   - Heading: serve il selettore esplicito perché il parent colora
     h1-h6 direttamente sull'elemento (l'ereditarietà non basta).
   - Link: cyan primario (#00E5D0 su #0D1117 = 11.2:1 AAA); esclusi i
     bottoni per non toccare gli stili button.
   - Le classi preset esplicite dell'editor (.has-*-color) usano
     !important nel core, quindi vincono sempre su queste regole.

   PERIODO DI SOVRAPPOSIZIONE (rinomina slug, vedi
   docs/MAPPA-2026-08-11-slug-palette.md): sono presenti SIA i selettori
   nuovi SIA quelli vecchi (dark-bg / dark-card). I vecchi vanno rimossi
   solo dopo la migrazione del post_content in DB e la verifica visiva.
   -------------------------------------------------------------------------- */

.has-surface-dark-background-color,
.has-surface-dark-alt-background-color,
.has-dark-bg-background-color,
.has-dark-card-background-color {
    color: var(--da-text-on-dark);
}

.has-surface-dark-background-color :is(h1, h2, h3, h4, h5, h6),
.has-surface-dark-alt-background-color :is(h1, h2, h3, h4, h5, h6),
.has-dark-bg-background-color :is(h1, h2, h3, h4, h5, h6),
.has-dark-card-background-color :is(h1, h2, h3, h4, h5, h6) {
    color: var(--da-text-on-dark);
}

.has-surface-dark-background-color a:not(.wp-block-button__link):not(.sunya-btn),
.has-surface-dark-alt-background-color a:not(.wp-block-button__link):not(.sunya-btn),
.has-dark-bg-background-color a:not(.wp-block-button__link):not(.sunya-btn),
.has-dark-card-background-color a:not(.wp-block-button__link):not(.sunya-btn) {
    color: var(--da-cyan);
}

.has-surface-dark-background-color a:not(.wp-block-button__link):not(.sunya-btn):hover,
.has-surface-dark-background-color a:not(.wp-block-button__link):not(.sunya-btn):focus,
.has-surface-dark-alt-background-color a:not(.wp-block-button__link):not(.sunya-btn):hover,
.has-surface-dark-alt-background-color a:not(.wp-block-button__link):not(.sunya-btn):focus,
.has-dark-bg-background-color a:not(.wp-block-button__link):not(.sunya-btn):hover,
.has-dark-bg-background-color a:not(.wp-block-button__link):not(.sunya-btn):focus,
.has-dark-card-background-color a:not(.wp-block-button__link):not(.sunya-btn):hover,
.has-dark-card-background-color a:not(.wp-block-button__link):not(.sunya-btn):focus {
    color: var(--da-cyan-light);
}


/* =========================================================================
   NASCONDE BARRA VERDE SU PAGINA PRIVACY E COOKIE POLICY
============================================================================ */

#iub-legalDoc {
	border-top: 0px !important;
}

/* ==========================================================================
   9. PAGINE DADESIGN — Homepage + styling pass Chi sono
   
   APPENDERE in fondo a style.css del child sunya-child-dadesign
   (dopo la sezione 8 "Sezioni scure Gutenberg", prima del blocco Iubenda
   o dopo, indifferente — mantenere la numerazione).
   
   Dopo il deploy: bump SUNYA_CHILD_VERSION + purge Varnish.
   
   Convenzioni: variabili --da-* esistenti; colori del design system via
   var(--sunya-color-{token}) con fallback esadecimale (NON via
   --wp--preset--color--*, che dipende dal nome dello slug).
   Ultima modifica: 2026-08-12
   ========================================================================== */

/* --------------------------------------------------------------------------
   9.0 Padding laterale mobile sezioni full-width — RITIRATA il 2026-08-27

   Conteneva, sotto i 781px, `padding: 0 20px` sulle .alignfull, perche' il
   parent scendeva a 1rem (16px) e su dadesign 16px era gia' stato scartato
   una volta (card ed etichette a filo schermo, vedi 9.7).

   Dal parent 1.10.3 quel giudizio e' diventato il default del tema: esiste
   --sunya-content-gutter, che vale 24px su desktop e **20px sotto i 768px**,
   e governa solo il contenuto — header, footer, pre-footer, Cover e barra
   breadcrumb restano a --sunya-container-padding.

   Quindi qui non serve piu' nulla: il valore e' lo stesso, ma ora e' del
   tema e vale su tutti i siti invece che su questo soltanto.
   -------------------------------------------------------------------------- */

/* --------------------------------------------------------------------------
   9.1 Utility condivise (eyebrow, lead, label gruppo)
   -------------------------------------------------------------------------- */

.dd-eyebrow {
    font-family: var(--sunya-font-heading);
    font-size: 13px;
    font-weight: 600;
    letter-spacing: 3px;
    text-transform: uppercase;
    color: var(--da-cyan);
    margin-bottom: var(--da-space-xs);
}

.dd-lead {
    font-size: 1.15rem;
    line-height: 1.7;
    max-width: 620px;
    margin-left: auto;
    margin-right: auto;
}

.has-surface-dark-background-color .dd-lead,
.has-surface-dark-alt-background-color .dd-lead,
.has-dark-bg-background-color .dd-lead,
.has-dark-card-background-color .dd-lead {
    color: var(--da-text-secondary);
}

/* Label gruppo su sfondo chiaro: teal AA (mai cyan come testo su chiaro) */
.dd-group-label {
    font-family: var(--sunya-font-heading);
    font-size: 13px;
    font-weight: 600;
    letter-spacing: 2px;
    text-transform: uppercase;
    color: var(--sunya-color-accent-contrast, #00756C);
    margin: var(--da-space-lg) 0 var(--da-space-sm);
}

/* --------------------------------------------------------------------------
   9.2 Hero homepage (sezione scura, testo centrato)
   -------------------------------------------------------------------------- */

/* ⚠️ SPECIFICITÀ: il parent ha `.sunya-entry-content > .alignfull {padding:0}`
   (0,2,0). Le sezioni full-width del child DEVONO essere qualificate con
   `.sunya-entry-content >` per pareggiare e vincere per ordine sorgente.
   Senza prefisso il padding viene azzerato dal parent. */
.sunya-entry-content > .dd-home-hero {
    /* Header trasparente sovrapposto: il padding-top compensa l'altezza
       header (variabile parent) + respiro, così l'eyebrow non finisce
       sotto il logo/nav */
    padding: calc(var(--sunya-header-height, 80px) + var(--da-space-2xl)) var(--da-space-md) var(--da-space-3xl);
    text-align: center;
}

.dd-home-hero h1 {
    font-size: clamp(2.1rem, 5vw, 3rem);
    line-height: 1.15;
    margin: 0 0 0.4em;
}

.dd-home-hero .dd-hero-actions {
    margin-top: var(--da-space-lg);
    gap: var(--da-space-sm);
}

/* --------------------------------------------------------------------------
   9.3 Bottoni Gutenberg dd-btn (hero + riuso futuro)
   
   Primario: cyan pieno + testo scuro (11.2:1, valido su scuro E su chiaro).
   Outline: bordo/testo cyan — SOLO su sfondi scuri.
   HOVER = INVERSIONE (pattern unico di sito, allineato a Contatti):
   il primario si svuota, l'outline si riempie. Mai cyan→cyan-light:
   la variazione è impercettibile. Focus visibile = hover + anello.
   -------------------------------------------------------------------------- */

.dd-btn--primary .wp-block-button__link {
    background: var(--da-cyan);
    color: var(--da-dark-bg);
    border: 1.5px solid var(--da-cyan);
    border-radius: 8px;
    font-weight: 600;
    padding: 13px 26px;
    transition: background 0.15s, color 0.15s, border-color 0.15s, box-shadow 0.15s;
}

.dd-btn--primary .wp-block-button__link:hover,
.dd-btn--primary .wp-block-button__link:focus-visible {
    background: transparent;
    border-color: var(--da-cyan);
    color: var(--da-cyan);
    box-shadow: 0 4px 20px rgba(0, 229, 208, 0.3);
}

.dd-btn--outline .wp-block-button__link {
    background: transparent;
    color: var(--da-cyan);
    border: 1.5px solid var(--da-cyan);
    border-radius: 8px;
    font-weight: 600;
    padding: 13px 26px;
    transition: background 0.15s, color 0.15s, border-color 0.15s, box-shadow 0.15s;
}

.dd-btn--outline .wp-block-button__link:hover,
.dd-btn--outline .wp-block-button__link:focus-visible {
    background: var(--da-cyan);
    border-color: var(--da-cyan);
    color: var(--da-dark-bg);
    box-shadow: 0 4px 20px rgba(0, 229, 208, 0.3);
}

.dd-btn--primary .wp-block-button__link:focus-visible,
.dd-btn--outline .wp-block-button__link:focus-visible {
    outline: 2px solid var(--da-cyan);
    outline-offset: 3px;
}

/* --------------------------------------------------------------------------
   9.4 Sezione servizi homepage + card
   
   Card da style guide: bordo, radius 8, hover lift + bordo cyan-muted +
   barra gradient superiore. Testo card in grigio scuro, link teal AA.
   -------------------------------------------------------------------------- */

.sunya-entry-content > .dd-home-services {
    padding: var(--da-space-2xl) var(--da-space-md);
}

.dd-home-services > h2 {
    margin-bottom: var(--da-space-md);
}

.dd-card {
    position: relative;
    background: var(--da-light-card);
    border: 1px solid var(--da-light-border);
    border-radius: 8px;
    padding: var(--da-space-md);
    height: 100%;
    overflow: hidden;
    transition: transform 0.25s ease, border-color 0.25s ease, box-shadow 0.25s ease;
}

.dd-card::before {
    content: "";
    position: absolute;
    top: 0;
    left: 0;
    right: 0;
    height: 3px;
    background: linear-gradient(90deg, var(--da-cyan), var(--da-cyan-light));
    opacity: 0;
    transition: opacity 0.25s ease;
}

.dd-card:hover,
.dd-card:focus-within {
    border-color: var(--da-cyan-muted);
    transform: translateY(-3px);
    box-shadow: 0 8px 30px rgba(13, 17, 23, 0.08);
}

.dd-card:hover::before,
.dd-card:focus-within::before {
    opacity: 1;
}

.dd-card h3 {
    font-size: 1.1rem;
    margin: 0 0 0.5em;
}

.dd-card p {
    font-size: 0.95rem;
    color: var(--da-text-light-sec);
    margin: 0 0 0.8em;
}

.dd-card .dd-card-link {
    margin: auto 0 0;
}

.dd-card .dd-card-link a {
    font-weight: 600;
    font-size: 0.95rem;
    color: var(--sunya-color-accent-contrast, #00756C);
    text-decoration: none;
}

.dd-card .dd-card-link a:hover {
    text-decoration: underline;
    text-underline-offset: 2px;
}

.dd-card .dd-card-link a:focus-visible {
    outline: 2px solid var(--sunya-color-accent-contrast, #00756C);
    outline-offset: 2px;
}

/* Colonna a piena altezza: card allineate anche con testi di lunghezza diversa */
.dd-home-services .wp-block-column {
    display: flex;
    flex-direction: column;
}

.dd-home-services .wp-block-column > .dd-card {
    display: flex;
    flex-direction: column;
    flex: 1;
}

/* --------------------------------------------------------------------------
   9.5 Come lavoro — step numerati su sezione dark-card
   -------------------------------------------------------------------------- */

.sunya-entry-content > .dd-home-steps {
    padding: var(--da-space-2xl) var(--da-space-md);
}

.dd-home-steps > h2 {
    margin-bottom: var(--da-space-lg);
}

.dd-step-num {
    font-family: var(--sunya-font-heading);
    font-size: 2.4rem;
    font-weight: 700;
    line-height: 1;
    color: var(--da-cyan);
    margin: 0 0 var(--da-space-xs);
}

.dd-home-steps h3 {
    margin: 0 0 0.4em;
}

.dd-home-steps .wp-block-column > p:last-child {
    color: var(--da-text-secondary);
    font-size: 0.98rem;
}

/* --------------------------------------------------------------------------
   9.6 Chi sono — styling pass (markup già live, classi dd-about-*)
   -------------------------------------------------------------------------- */

.sunya-entry-content > .dd-about-hero {
    padding: var(--da-space-2xl) var(--da-space-md);
}

.dd-about-hero .dd-lead {
    margin-left: 0;
    margin-right: 0;
}

.dd-about-photo img {
    border-radius: 12px;
    box-shadow: 0 8px 30px rgba(0, 0, 0, 0.35);
}

.dd-about-body {
    padding-top: var(--da-space-xl);
    padding-bottom: var(--da-space-xl);
}

/* --------------------------------------------------------------------------
   9.7 Spaziature per device + reduced motion
   -------------------------------------------------------------------------- */

@media (max-width: 781px) {
    .sunya-entry-content > .dd-home-hero {
        padding: calc(var(--sunya-header-height, 80px) + var(--da-space-lg)) 20px var(--da-space-2xl);
    }

    /* 2026-08-27: tolti padding-left/right (erano 20px). Ora li da' il parent
       con --sunya-content-gutter, che vale 20px sotto i 768px. Restano qui
       solo le verticali, che sono specifiche di queste tre sezioni. */
    .sunya-entry-content > .dd-home-services,
    .sunya-entry-content > .dd-home-steps,
    .sunya-entry-content > .dd-about-hero {
        padding-top: var(--da-space-xl);
        padding-bottom: var(--da-space-xl);
    }

    .dd-step-num {
        font-size: 1.8rem;
    }

    /* Colonne impilate: card e step respirano tra loro */
    .dd-home-services .wp-block-column:not(:last-child),
    .dd-home-steps .wp-block-column:not(:last-child) {
        margin-bottom: var(--da-space-sm);
    }
}

/* --------------------------------------------------------------------------
   9.8 Rifiniture post-live (2026-08-10, review screenshot MVP)
   -------------------------------------------------------------------------- */

/* Chi sono: meno vuoto tra hero e corpo testo */
.dd-about-body {
    padding-top: var(--da-space-md);
}

/* Pre-footer CTA Sunya: bottone allineato al primario brand
   (era bianco default) — hover a INVERSIONE come tutti i dd-btn */
.sunya-prefooter .sunya-prefooter__btn {
    background: var(--da-cyan);
    color: var(--da-dark-bg);
    border: 1.5px solid var(--da-cyan);
    border-radius: 8px;
    font-weight: 600;
    transition: background 0.15s, color 0.15s, border-color 0.15s, box-shadow 0.15s;
}

.sunya-prefooter .sunya-prefooter__btn:hover,
.sunya-prefooter .sunya-prefooter__btn:focus-visible {
    background: transparent;
    border-color: var(--da-cyan);
    color: var(--da-cyan);
    box-shadow: 0 4px 20px rgba(0, 229, 208, 0.3);
}

.sunya-prefooter .sunya-prefooter__btn:focus-visible {
    outline: 2px solid var(--da-cyan);
    outline-offset: 3px;
}

/* Badge reCAPTCHA — RITIRATO il 2026-08-27.

   Conteneva `.grecaptcha-badge { bottom: 96px !important }`, per scostarlo
   dal pulsante torna-su su cui si sovrapponeva.

   Dal parent 1.10.9 lo fa il tema, in css/footer.css accanto alla geometria
   del pulsante da cui il valore deriva. I 96px non erano un numero scelto a
   occhio: sono `--sunya-spacing-xl` (32) + l'altezza del pulsante (48) + un
   margine (16). Nel parent sono scritti cosi', in calc(), invece che come
   risultato — se un giorno cambia la geometria del pulsante, il numero si
   aggiorna da solo.

   Se servisse ritararlo su questo sito, la variabile e'
   --sunya-recaptcha-offset: non riscrivere la regola.

   ⚠️ Resta valida la nota sul nascondere il badge: Google lo consente SOLO
   affiancando al submit la disclosure testuale "Questo sito e' protetto da
   reCAPTCHA; si applicano la Privacy Policy e i Termini di servizio di
   Google". E' una scelta di contenuto, e su questo sito non e' stata fatta. */

/* .grecaptcha-badge { visibility: hidden; } */

/* --------------------------------------------------------------------------
   9.9 Respiro pagine interne — RITIRATA il 2026-08-27

   Conteneva l'aria di coda: padding-bottom sull'ultimo .wp-block-group e sul
   contenitore WPForms, 64px desktop e 48px sotto i 781px, con la home esclusa
   perche' il suo hero deve restare a filo header.

   Dal parent 1.10.3 la fa il tema, con la stessa forma inventata qui — il
   padding DENTRO l'ultimo blocco, cosi' lo sfondo colorato si estende invece
   di lasciare una fascia — e con gli stessi due accorgimenti:

   - il Cover e' escluso, perche' con min-height e contenuto centrato il
     padding sposta il testo invece di allungare il blocco;
   - la regola vale solo dove il contenitore e' a filo (.sunya-content-area
     --flush), altrimenti si sommerebbe al padding del template di default.

   Valori del tema: --sunya-spacing-section, 80px desktop e 48px mobile.

   La home non va piu' esclusa. Il suo ultimo blocco e' una sezione scura che
   deve toccare il pre-footer, ed e' esattamente il caso in cui il padding
   dentro il blocco fa la cosa giusta: lo sfondo si estende, nessuna fascia.
   (L'esclusione originale serviva per il padding-TOP dell'hero, che questa
   regola non ha mai toccato.)

   ⚠️ Perche' era rimasta in piedi anche dopo il deploy del parent: questa
   regola stava a 0,4,1 (body + :not(.home) + 2 classi + :last-child) e
   batteva quella del parent a 0,3,0. Misurato il 27/08: 64px invece di 80.
   -------------------------------------------------------------------------- */

@media (prefers-reduced-motion: reduce) {
    .sunya-prefooter .sunya-prefooter__btn {
        transition: none;
    }
}

/* --------------------------------------------------------------------------
   9.10 Lavori in homepage — .dd-home-work + .dd-work-grid + .dd-work-card

   Aggiunta il 2026-09-23 (child 2.8.0). Contratto:
   sunya\docs\SPEC-2026-09-22-sezione-15-lavori.md (§4, §6-bis).

   Sei tessere, una per lavoro, ognuna porta alla sua pagina (sezione 15).
   Sta DOPO "Come lavoro", su fondo chiaro, e le tessere sono SCURE (P3 H2).
   Scritta coi soli token --sunya-*, anche se sta nella fascia 1-9: e' il
   componente che la futura sezione 16 (indice /lavori/) consumera', e la
   pagina /lavori/ lo usa gia' con le stesse classi.

   ⚠️ LA DOMANDA DELLA 14: in home convivono 12 card, 6 servizi (9.4) e 6
   lavori. Sul telefono devono riconoscersi come oggetti diversi, e la
   differenza sta su TRE assi insieme — togliendone uno tornano uguali:
     fondo      servizi chiari          lavori scuri con la grafica (10.5)
     contenuto  titolo + testo + link   solo logo + nome
     ritmo      1 per riga, alte        2 per riga, basse (3:2)
   Per questo .dd-card NON si riusa qui, nemmeno come base.

   STRUTTURA (post_content, modo B):
     section.dd-home-work (Gruppo alignfull, light-bg, constrained 1200)
       h2 + p.dd-lead
       div.dd-work-grid (Gruppo, layout DEFAULT: flow, non constrained)
         div.dd-work-card (Gruppo)            x 6
           figure.dd-work-card__logo (Immagine, alt="")
           h3.dd-work-card__name > a          link della tessera
         div.dd-work-card.dd-work-card--cta   tessera invito (P5)
           p.dd-work-card__invite
           p.dd-work-card__name > a

   ⚠️ LA GRIGLIA E' UN GRUPPO FLOW, NON CONSTRAINED. Un Gruppo constrained
   da' ai figli `margin-inline: auto !important`, che in una cella di
   griglia restringe la tessera al suo contenuto (trappola della 13 v2).
   E in griglia i margini NON collassano: il `margin-block-start` del flow
   fra una tessera e l'altra si sommerebbe al gap. Azzerati sotto, 0,2,0.

   TUTTA LA TESSERA E' CLICCABILE: il link sta sul nome (testo visibile, il
   logo e' decorativo con alt=""), e il suo ::after copre la tessera. Il
   fuoco si disegna sulla tessera, non sul link.

   LOGO: A COLORI, velato da un OVERLAY SCURO A GRADIENTE che si toglie
   all'hover e al fuoco (Davide, 2026-09-24 — sostituisce il monocromo
   bianco a riposo del 23/09, che trasformava un bollino pieno come Pet
   Style in un disco bianco). L'overlay non altera i colori: e' un velo del
   fondo della tessera sopra il logo, non un filtro. Il file deve avere il
   fondo TRASPARENTE.
   `.dd-work-card--mono` porta il logo a BIANCO PIENO, sempre (anche
   all'hover): per i loghi scuri che sul fondo scuro spariscono comunque
   (Grigoletti). Bianco pieno e non scala di grigi: `grayscale()` lascia
   scure le parti scure. Si aggiunge nel campo "Classe CSS aggiuntiva".
   Sul telefono non c'e' hover: resta il velo. Voluto: il velo e' leggero
   abbastanza da lasciare leggibili i marchi, misurato in prova.
   -------------------------------------------------------------------------- */

.sunya-entry-content > .dd-home-work {
    padding: var(--sunya-spacing-3xl) var(--sunya-spacing-lg);
}

.dd-home-work > h2 {
    margin-bottom: var(--sunya-spacing-lg);
}

/* Il lead della 9.1 dichiara 620px e margini auto, ma dentro un Gruppo
   constrained il core gli rimette la larghezza del contenuto (1200): qui
   si ridichiara a 0,2,0, e si centra il testo come il titolo. */
.dd-home-work > .dd-lead {
    max-width: 40rem;
    text-align: center;
}

.dd-work-grid {
    display: grid;
    grid-template-columns: repeat(3, minmax(0, 1fr));
    gap: var(--sunya-spacing-lg);
    margin-top: var(--sunya-spacing-xl);
}

/* 0,2,0: batte il flow del core (`:root :where(.is-layout-flow) > * + *`,
   0,1,0) che metterebbe un margine sopra ogni tessera dopo la prima. */
.dd-work-grid > .dd-work-card {
    margin: 0;
}

.dd-work-card {
    position: relative;
    display: flex;
    flex-direction: column;
    border: 1px solid color-mix(in oklab, var(--sunya-color-text-on-dark) 12%, var(--sunya-color-surface-dark));
    border-radius: var(--sunya-radius-md);
    color: var(--sunya-color-text-on-dark);
    transition:
        transform var(--sunya-transition-base),
        border-color var(--sunya-transition-base),
        box-shadow var(--sunya-transition-base);
}

.dd-work-card:hover,
.dd-work-card:focus-within {
    transform: translateY(-3px);
    border-color: color-mix(in oklab, var(--sunya-color-accent) 45%, var(--sunya-color-surface-dark));
    box-shadow: 0 10px 30px color-mix(in srgb, var(--sunya-color-surface-dark) 22%, transparent);
}

/* Il fuoco e' della tessera intera: anello teal scuro, perche' sta sul
   fondo CHIARO della sezione (l'accent pieno li' non arriva a 3:1). */
.dd-work-card:has(a:focus-visible) {
    outline: 2px solid var(--sunya-color-accent-ink-on-light);
    outline-offset: 3px;
}

.dd-work-card a:focus-visible {
    outline: none;
}

/* Area del logo: 3:2, logo centrato e contenuto. Le misure massime sono in
   percentuale dell'area, cosi' un marchio largo e uno quadrato occupano
   un ingombro simile. `!important` non serve: l'Immagine del core mette
   width/height come ATTRIBUTI, che qualsiasi regola CSS batte.
   ⚠️ Il logo e' POSIZIONATO ASSOLUTO dentro l'area. In flusso, il
   `max-height` in percentuale di un'immagine dentro un box alto per
   aspect-ratio non si risolveva: un logo quadrato (PetStyle) sfondava
   l'area e spingeva giu' il nome — misurato in locale il 2026-09-23 a
   396px, nomi a quote diverse nella stessa riga. In assoluto le
   percentuali valgono sul box dell'area, sempre.
   I file dei loghi (2026-09-24) sono gia' tele 3:2 (600x400) col marchio
   centrato e il suo margine dentro: per questo il tetto e' 72% in
   entrambe le direzioni, non piu' stretto in altezza. */
.dd-work-card .dd-work-card__logo {
    position: relative;
    aspect-ratio: 3 / 2;
    margin: 0;
}

.dd-work-card .dd-work-card__logo img {
    position: absolute;
    inset: 0;
    margin: auto;
    width: auto;
    height: auto;
    max-width: 72%;
    max-height: 72%;
    object-fit: contain;
}

/* Il velo: sopra il logo (e' dopo l'immagine, entrambi posizionati), sotto
   il link esteso del nome (z-index 1), trasparente ai clic. Uniforme sul
   logo e sfumato a zero sul bordo basso dell'area: la riga del nome non
   ha velo, e un velo pieno fino al bordo disegnava uno scalino di luce
   sopra il nome (visto in prova il 2026-09-24). */
.dd-work-card .dd-work-card__logo::after {
    content: "";
    position: absolute;
    inset: 0;
    background-image: linear-gradient(
        180deg,
        color-mix(in srgb, var(--sunya-color-surface-dark) 50%, transparent) 0%,
        color-mix(in srgb, var(--sunya-color-surface-dark) 50%, transparent) 72%,
        transparent 100%
    );
    pointer-events: none;
    transition: opacity var(--sunya-transition-base);
}

.dd-work-card:hover .dd-work-card__logo::after,
.dd-work-card:focus-within .dd-work-card__logo::after {
    opacity: 0;
}

.dd-work-card.dd-work-card--mono .dd-work-card__logo img {
    filter: brightness(0) invert(1);
    opacity: .92;
}

/* Nome: e' il link della tessera. 0,2,0 per battere il `.dd-page h3` della
   11.1 (0,1,1) quando la griglia vive dentro una pagina .dd-page. */
.dd-work-card .dd-work-card__name {
    margin: auto 0 0;
    padding: 0 var(--sunya-spacing-md) var(--sunya-spacing-md);
    font-family: var(--sunya-font-heading);
    font-size: .95rem;
    font-weight: 600;
    line-height: 1.3;
    text-align: center;
    color: var(--sunya-color-text-on-dark);
}

.dd-work-card .dd-work-card__name a {
    color: inherit;
    text-decoration: none;
}

.dd-work-card .dd-work-card__name a::after {
    content: "";
    position: absolute;
    inset: 0;
    z-index: 1;
    border-radius: inherit;
}

/* Tessera invito (P5): stessa grafica, al posto del logo una domanda.
   Il bordo tratteggiato dice "questo posto e' libero". Diventa una tessera
   normale quando il sesto lavoro (Foto Interni Verona) e' online. */
.dd-work-card--cta {
    border-style: dashed;
    border-color: color-mix(in oklab, var(--sunya-color-accent) 40%, var(--sunya-color-surface-dark));
}

.dd-work-card .dd-work-card__invite {
    display: flex;
    align-items: center;
    justify-content: center;
    aspect-ratio: 3 / 2;
    margin: 0;
    padding: var(--sunya-spacing-lg);
    font-family: var(--sunya-font-heading);
    font-size: 1.35rem;
    font-weight: 600;
    line-height: 1.2;
    text-align: center;
    color: var(--sunya-color-accent-ink-on-dark);
}

@media (max-width: 781px) {
    .sunya-entry-content > .dd-home-work {
        padding-top: var(--sunya-spacing-2xl);
        padding-bottom: var(--sunya-spacing-2xl);
    }

    .dd-work-grid {
        grid-template-columns: repeat(2, minmax(0, 1fr));
        gap: var(--sunya-spacing-md);
        margin-top: var(--sunya-spacing-lg);
    }

    .dd-work-card .dd-work-card__invite {
        padding: var(--sunya-spacing-md);
    }

    .dd-work-card .dd-work-card__logo img {
        max-width: 80%;
        max-height: 80%;
    }

    .dd-work-card .dd-work-card__name {
        padding: 0 var(--sunya-spacing-sm) var(--sunya-spacing-sm);
        font-size: .85rem;
    }

    .dd-work-card .dd-work-card__invite {
        font-size: 1.05rem;
    }
}

@media (prefers-reduced-motion: reduce) {
    .dd-work-card,
    .dd-work-card .dd-work-card__logo::after {
        transition: none;
    }

    .dd-work-card:hover,
    .dd-work-card:focus-within {
        transform: none;
    }
}


/* ==========================================================================
   10. GRAFICHE E ANIMAZIONI (2026-08-10)

   10.1 Icone SVG card servizi
   10.2 Pattern geometrico hero
   10.3 Reveal on scroll (richiede js/reveal.js)

   Tutte le icone sono SVG inline in data-URI usati come `mask-image`:
   il colore arriva da `background-color`, quindi segue le variabili di
   palette e cambia con hover/tema senza duplicare i file. Nessuna
   richiesta HTTP aggiuntiva, nessun font di icone.

   Le icone sono geometriche e originali (stroke 1.5, viewBox 24),
   coerenti con lo stile line della style guide.
   ========================================================================== */

/* --------------------------------------------------------------------------
   10.1 Icone card servizi

   Il markup card ha una classe modificatore per servizio:
   dd-card--wordpress / --ecommerce / --manutenzione / --seo /
   --newsletter / --advertising / --fotografia / --consulenze

   CONSUMATORI (dal 2026-09-17, 2.6.0): le otto immagini sono consumate da
   `.dd-card--*` (home, 9.4) E da `.dd-hub__svc--*` (hub /servizi/, 14.5),
   con un secondo selettore su ogni regola `mask-image`. Le immagini stanno
   SOLO qui, non si duplicano nella 14. Le regole di POSIZIONE e di colore
   (`.dd-card h3::before`, l'hover) restano scopate su `.dd-card` e non
   raggiungono l'hub, che ha le sue nella 14.5.
   `--fotografia` e `--consulenze`, orfane in home dal 2026-09-03 (sei card),
   hanno di nuovo un consumatore nell'hub: la riserva del README e' chiusa.
   -------------------------------------------------------------------------- */

.dd-card {
    /* spazio per l'icona in alto */
    padding-top: calc(var(--da-space-md) + 52px);
}

.dd-card::after {
    content: "";
    position: absolute;
    top: var(--da-space-md);
    left: var(--da-space-md);
    width: 44px;
    height: 44px;
    border-radius: 10px;
    background-color: rgba(0, 229, 208, 0.1);
}

.dd-card .dd-icon,
.dd-card::before {
    /* ::before resta la barra gradient dell'hover (sezione 9.4) */
}

/* Glifo: elemento generato sul titolo per non toccare la struttura */
.dd-card h3::before {
    content: "";
    position: absolute;
    top: calc(var(--da-space-md) + 11px);
    left: calc(var(--da-space-md) + 11px);
    width: 22px;
    height: 22px;
    background-color: var(--sunya-color-accent-contrast, #00756C);
    -webkit-mask-repeat: no-repeat;
    mask-repeat: no-repeat;
    -webkit-mask-size: contain;
    mask-size: contain;
    -webkit-mask-position: center;
    mask-position: center;
    z-index: 1;
    transition: background-color 0.25s ease;
}

.dd-card:hover h3::before,
.dd-card:focus-within h3::before {
    background-color: var(--da-cyan-muted, #00BFB3);
}

/* --- Glifi per servizio --- */

/* WordPress: finestra browser + codice */
.dd-card--wordpress h3::before,
.dd-hub__svc--wordpress > h3::before {
    -webkit-mask-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='black' stroke-width='1.5' stroke-linecap='round' stroke-linejoin='round'%3E%3Crect x='2.5' y='4' width='19' height='16' rx='2'/%3E%3Cpath d='M2.5 8.5h19'/%3E%3Cpath d='M5.5 6.2h.01M8 6.2h.01'/%3E%3Cpath d='M9.5 12.5 7.5 14.5l2 2M14.5 12.5l2 2-2 2'/%3E%3C/svg%3E");
    mask-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='black' stroke-width='1.5' stroke-linecap='round' stroke-linejoin='round'%3E%3Crect x='2.5' y='4' width='19' height='16' rx='2'/%3E%3Cpath d='M2.5 8.5h19'/%3E%3Cpath d='M5.5 6.2h.01M8 6.2h.01'/%3E%3Cpath d='M9.5 12.5 7.5 14.5l2 2M14.5 12.5l2 2-2 2'/%3E%3C/svg%3E");
}

/* E-commerce: carrello */
.dd-card--ecommerce h3::before,
.dd-hub__svc--ecommerce > h3::before {
    -webkit-mask-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='black' stroke-width='1.5' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpath d='M2.5 3.5h2.2l2.4 11.2a1.6 1.6 0 0 0 1.6 1.3h8.4a1.6 1.6 0 0 0 1.6-1.2l1.6-6.3H6.2'/%3E%3Ccircle cx='9.5' cy='20' r='1.3'/%3E%3Ccircle cx='17' cy='20' r='1.3'/%3E%3C/svg%3E");
    mask-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='black' stroke-width='1.5' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpath d='M2.5 3.5h2.2l2.4 11.2a1.6 1.6 0 0 0 1.6 1.3h8.4a1.6 1.6 0 0 0 1.6-1.2l1.6-6.3H6.2'/%3E%3Ccircle cx='9.5' cy='20' r='1.3'/%3E%3Ccircle cx='17' cy='20' r='1.3'/%3E%3C/svg%3E");
}

/* Manutenzione: scudo + spunta */
.dd-card--manutenzione h3::before,
.dd-hub__svc--manutenzione > h3::before {
    -webkit-mask-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='black' stroke-width='1.5' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpath d='M12 2.5 4.5 5.5v6c0 4.5 3.1 8.6 7.5 10 4.4-1.4 7.5-5.5 7.5-10v-6z'/%3E%3Cpath d='m8.8 11.8 2.2 2.2 4.2-4.2'/%3E%3C/svg%3E");
    mask-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='black' stroke-width='1.5' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpath d='M12 2.5 4.5 5.5v6c0 4.5 3.1 8.6 7.5 10 4.4-1.4 7.5-5.5 7.5-10v-6z'/%3E%3Cpath d='m8.8 11.8 2.2 2.2 4.2-4.2'/%3E%3C/svg%3E");
}

/* SEO: lente + grafico in salita */
.dd-card--seo h3::before,
.dd-hub__svc--seo > h3::before {
    -webkit-mask-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='black' stroke-width='1.5' stroke-linecap='round' stroke-linejoin='round'%3E%3Ccircle cx='10.5' cy='10.5' r='7'/%3E%3Cpath d='m20.5 20.5-4.7-4.7'/%3E%3Cpath d='M7.5 12.2l2.2-2.4 2 1.7 2.6-3'/%3E%3C/svg%3E");
    mask-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='black' stroke-width='1.5' stroke-linecap='round' stroke-linejoin='round'%3E%3Ccircle cx='10.5' cy='10.5' r='7'/%3E%3Cpath d='m20.5 20.5-4.7-4.7'/%3E%3Cpath d='M7.5 12.2l2.2-2.4 2 1.7 2.6-3'/%3E%3C/svg%3E");
}

/* Newsletter: busta */
.dd-card--newsletter h3::before,
.dd-hub__svc--newsletter > h3::before {
    -webkit-mask-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='black' stroke-width='1.5' stroke-linecap='round' stroke-linejoin='round'%3E%3Crect x='2.5' y='5' width='19' height='14' rx='2'/%3E%3Cpath d='m3.5 6.5 8.5 6.2 8.5-6.2'/%3E%3C/svg%3E");
    mask-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='black' stroke-width='1.5' stroke-linecap='round' stroke-linejoin='round'%3E%3Crect x='2.5' y='5' width='19' height='14' rx='2'/%3E%3Cpath d='m3.5 6.5 8.5 6.2 8.5-6.2'/%3E%3C/svg%3E");
}

/* Advertising: megafono */
.dd-card--advertising h3::before,
.dd-hub__svc--advertising > h3::before {
    -webkit-mask-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='black' stroke-width='1.5' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpath d='M3.5 9.5v5a1.5 1.5 0 0 0 1.5 1.5h2l8 4.5V4L7 8.5H5a1.5 1.5 0 0 0-1.5 1.5z'/%3E%3Cpath d='M18.5 9.2a4 4 0 0 1 0 5.6'/%3E%3C/svg%3E");
    mask-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='black' stroke-width='1.5' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpath d='M3.5 9.5v5a1.5 1.5 0 0 0 1.5 1.5h2l8 4.5V4L7 8.5H5a1.5 1.5 0 0 0-1.5 1.5z'/%3E%3Cpath d='M18.5 9.2a4 4 0 0 1 0 5.6'/%3E%3C/svg%3E");
}

/* Fotografia: macchina fotografica */
.dd-card--fotografia h3::before,
.dd-hub__svc--fotografia > h3::before {
    -webkit-mask-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='black' stroke-width='1.5' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpath d='M2.5 8a2 2 0 0 1 2-2h2.6l1.4-2h7l1.4 2h2.6a2 2 0 0 1 2 2v9a2 2 0 0 1-2 2h-15a2 2 0 0 1-2-2z'/%3E%3Ccircle cx='12' cy='12.5' r='3.6'/%3E%3C/svg%3E");
    mask-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='black' stroke-width='1.5' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpath d='M2.5 8a2 2 0 0 1 2-2h2.6l1.4-2h7l1.4 2h2.6a2 2 0 0 1 2 2v9a2 2 0 0 1-2 2h-15a2 2 0 0 1-2-2z'/%3E%3Ccircle cx='12' cy='12.5' r='3.6'/%3E%3C/svg%3E");
}

/* Consulenze: fumetti dialogo */
.dd-card--consulenze h3::before,
.dd-hub__svc--consulenze > h3::before {
    -webkit-mask-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='black' stroke-width='1.5' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpath d='M15.5 12.5a2 2 0 0 1-2 2H7l-3.5 3v-11a2 2 0 0 1 2-2h8a2 2 0 0 1 2 2z'/%3E%3Cpath d='M18.5 8h1a2 2 0 0 1 2 2v9l-3-2.5h-5a2 2 0 0 1-2-2'/%3E%3C/svg%3E");
    mask-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='black' stroke-width='1.5' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpath d='M15.5 12.5a2 2 0 0 1-2 2H7l-3.5 3v-11a2 2 0 0 1 2-2h8a2 2 0 0 1 2 2z'/%3E%3Cpath d='M18.5 8h1a2 2 0 0 1 2 2v9l-3-2.5h-5a2 2 0 0 1-2-2'/%3E%3C/svg%3E");
}

/* --------------------------------------------------------------------------
   10.2 Pattern geometrico hero

   Griglia tecnica + nodi cyan a bassa opacità, sfumata verso il centro
   con mask radiale così il testo resta perfettamente leggibile.
   Puramente decorativo: nessun impatto su contrasto o accessibilità.
   -------------------------------------------------------------------------- */

.dd-home-hero {
    position: relative;
    overflow: hidden;
    isolation: isolate;
}

.dd-home-hero::before {
    content: "";
    position: absolute;
    inset: 0;
    z-index: -1;
    background-image:
        linear-gradient(rgba(0, 229, 208, 0.07) 1px, transparent 1px),
        linear-gradient(90deg, rgba(0, 229, 208, 0.07) 1px, transparent 1px);
    background-size: 64px 64px;
    /* Sfuma ai bordi: la griglia non "taglia" il bordo sezione */
    -webkit-mask-image: radial-gradient(ellipse 80% 70% at 50% 45%, #000 20%, transparent 78%);
    mask-image: radial-gradient(ellipse 80% 70% at 50% 45%, #000 20%, transparent 78%);
    pointer-events: none;
}

/* Nodi luminosi agli incroci — alone morbido, nessun bordo netto */
.dd-home-hero::after {
    content: "";
    position: absolute;
    inset: 0;
    z-index: -1;
    background-image:
        radial-gradient(circle at 18% 26%, rgba(0, 229, 208, 0.16), transparent 42%),
        radial-gradient(circle at 84% 68%, rgba(0, 229, 208, 0.12), transparent 45%),
        radial-gradient(circle at 62% 12%, rgba(92, 255, 240, 0.08), transparent 38%);
    pointer-events: none;
}

/* --------------------------------------------------------------------------
   10.3 Reveal on scroll

   Gli stili di partenza si applicano SOLO sotto .dd-js, aggiunta da
   js/reveal.js: senza JavaScript il contenuto è visibile e statico.
   Il ritardo per lo stagger arriva da --dd-reveal-delay (impostata dal JS).
   -------------------------------------------------------------------------- */

.dd-js .dd-reveal {
    opacity: 0;
    transform: translateY(18px);
    transition:
        opacity 0.5s ease-out,
        transform 0.5s ease-out;
    transition-delay: var(--dd-reveal-delay, 0ms);
    will-change: opacity, transform;
}

.dd-js .dd-reveal--in {
    opacity: 1;
    transform: none;
    will-change: auto;
}

@media (prefers-reduced-motion: reduce) {
    .dd-js .dd-reveal,
    .dd-js .dd-reveal--in {
        opacity: 1;
        transform: none;
        transition: none;
    }
}

/* --------------------------------------------------------------------------
   10.4 Icone su mobile: layout invariato, solo scala ridotta
   -------------------------------------------------------------------------- */

@media (max-width: 781px) {
    .dd-card {
        padding-top: calc(var(--da-space-md) + 46px);
    }

    .dd-card::after {
        width: 38px;
        height: 38px;
    }

    .dd-card h3::before {
        top: calc(var(--da-space-md) + 9px);
        left: calc(var(--da-space-md) + 9px);
        width: 20px;
        height: 20px;
    }
}

/* --------------------------------------------------------------------------
   10.5 Grafica dei lavori — tessera (9.10) e testata della pagina lavoro (15.2)

   Aggiunta il 2026-09-23 (child 2.8.0). E' la "grafica dadesign" su cui
   si appoggia il logo (decisione P2): lo stesso linguaggio del pattern
   della hero (10.2) — griglia tecnica e nodi luminosi — riscritto coi soli
   token, peso zero, nessuna immagine.

   Sta nella fascia 10 e non dentro la 9.10 o la 15 perche' la consumano
   tutte e due: chi apre una tessera ritrova in testa alla pagina la stessa
   immagine che ha appena cliccato. Un solo posto, due selettori (idioma
   gia' usato: la 14.5 consuma le icone della 10.1).

   Differenze dalla 10.2, volute:
   - colori da `--sunya-color-accent` via color-mix, non rgba() letterali;
   - maglia 32px invece di 64: la tessera e' larga ~370px, a 64 le linee
     sarebbero cinque e non si leggerebbe come griglia;
   - posizione dei nodi in variabili (--dd-work-gx/-gy), variata per
     tessera con :nth-child, cosi' sei tessere non sono sei fotocopie.

   Puramente decorativa: sta sotto il contenuto (z-index -1 dentro un
   contesto isolato) e non tocca i contrasti — misurati comunque sul testo
   sopra, vedi report.
   -------------------------------------------------------------------------- */

.dd-work-card,
.dd-page.dd-work > .dd-work__head {
    --dd-work-line: color-mix(in srgb, var(--sunya-color-accent) 9%, transparent);
    --dd-work-glow: color-mix(in srgb, var(--sunya-color-accent) 18%, transparent);
    --dd-work-gx: 24%;
    --dd-work-gy: 30%;
    position: relative;
    isolation: isolate;
    overflow: hidden;
    background-color: var(--sunya-color-surface-dark);
}

.dd-work-card::before,
.dd-page.dd-work > .dd-work__head::before,
.sunya-prefooter.sunya-prefooter--banner::before {
    content: "";
    position: absolute;
    inset: 0;
    z-index: -1;
    background-image:
        linear-gradient(var(--dd-work-line) 1px, transparent 1px),
        linear-gradient(90deg, var(--dd-work-line) 1px, transparent 1px);
    background-size: 32px 32px;
    background-position: -1px -1px;
    -webkit-mask-image: radial-gradient(ellipse 85% 80% at var(--dd-work-gx) var(--dd-work-gy), #000 10%, transparent 75%);
    mask-image: radial-gradient(ellipse 85% 80% at var(--dd-work-gx) var(--dd-work-gy), #000 10%, transparent 75%);
    pointer-events: none;
    transition: opacity var(--sunya-transition-base);
}

.dd-work-card::after,
.dd-page.dd-work > .dd-work__head::after,
.sunya-prefooter.sunya-prefooter--banner::after {
    content: "";
    position: absolute;
    inset: 0;
    z-index: -1;
    background-image:
        radial-gradient(circle at var(--dd-work-gx) var(--dd-work-gy), var(--dd-work-glow), transparent 48%),
        radial-gradient(circle at calc(100% - var(--dd-work-gx)) calc(100% - var(--dd-work-gy) / 2), color-mix(in srgb, var(--sunya-color-accent) 9%, transparent), transparent 42%);
    pointer-events: none;
}

/* Variazione per tessera: sei posizioni, il ciclo riparte dalla settima. */
.dd-work-grid > .dd-work-card:nth-child(6n+2) { --dd-work-gx: 76%; --dd-work-gy: 24%; }
.dd-work-grid > .dd-work-card:nth-child(6n+3) { --dd-work-gx: 50%; --dd-work-gy: 78%; }
.dd-work-grid > .dd-work-card:nth-child(6n+4) { --dd-work-gx: 82%; --dd-work-gy: 70%; }
.dd-work-grid > .dd-work-card:nth-child(6n+5) { --dd-work-gx: 18%; --dd-work-gy: 72%; }
.dd-work-grid > .dd-work-card:nth-child(6n+6) { --dd-work-gx: 58%; --dd-work-gy: 20%; }

/* Hover della tessera: la griglia si accende un poco. */
.dd-work-card:hover,
.dd-work-card:focus-within {
    --dd-work-line: color-mix(in srgb, var(--sunya-color-accent) 15%, transparent);
}

/* In testata la pagina e' larga: maglia della hero (64px), nodo a destra
   dove sta il logo. */
.dd-page.dd-work > .dd-work__head {
    --dd-work-gx: 78%;
    --dd-work-gy: 40%;
}

.dd-page.dd-work > .dd-work__head::before {
    background-size: 64px 64px;
}

/* Terzo consumatore (2026-09-24, child 2.8.3): il PRE-FOOTER banner. La
   pagina si apre con la griglia della hero (10.2) e si chiude con la
   stessa, sulla CTA — e il pre-footer si stacca dall'area widget, che ha
   lo stesso colore (#0D1117) e non aveva nulla che la separasse.
   Solo variabili e contesto: il FONDO resta quello del contratto del
   parent (--sunya-prefooter-bg), qui non si ridichiara. Il parent mette
   gia' position:relative e overflow:hidden sul pre-footer, e z-index:1
   sul contenuto (.sunya-prefooter__inner): con `isolation` i due
   pseudo-elementi a z-index -1 stanno sopra il fondo e sotto il testo.
   Maglia 64 e nodo a destra, dove sta il pulsante, come in testata.
   ⚠️ Vale solo per la variante --banner: con un'immagine di fondo
   (--has-bg) il pre-footer ha gia' la sua grafica e il suo overlay. */
.sunya-prefooter.sunya-prefooter--banner {
    --dd-work-line: color-mix(in srgb, var(--sunya-color-accent) 9%, transparent);
    --dd-work-glow: color-mix(in srgb, var(--sunya-color-accent) 18%, transparent);
    --dd-work-gx: 78%;
    --dd-work-gy: 50%;
    isolation: isolate;
}

.sunya-prefooter.sunya-prefooter--banner::before {
    background-size: 64px 64px;
}

@media (max-width: 1024px) {
    /* Sotto i 1024 il parent centra la CTA in colonna: nodo al centro. */
    .sunya-prefooter.sunya-prefooter--banner {
        --dd-work-gx: 50%;
        --dd-work-gy: 60%;
    }
}


/* ==========================================================================
   11. PAGINE EDITORIALI (blocchi HTML)

   Consolidamento del CSS che fino al 2026-08-12 viveva come <style> dentro
   il post_content di /servizi/ (3.880 B) e /contatti/ (6.600 B).

   Perche' e' stato spostato qui: il CSS nel post_content non e' versionato,
   non si trova cercando nei file, e vince su qualunque regola del child.
   E' lo stesso anti-pattern del padding inline che aveva mascherato il bug
   .alignfull (vedi changelog parent v1.2.9).

   Cosa e' cambiato rispetto all'inline:
   - Gli 11 token --dd-* sono spariti: dieci esistevano gia' come --da-*
     con lo stesso valore, --dd-header-offset:110px e' diventato il token
     vero dell'header.
   - Contenitore e tipografia fusi in .dd-page: erano dichiarati due volte,
     identici, in .dd-services e .dd-contact.
   - Utility de-scopate: .dd-note, .dd-nav, .dd-promise, .dd-social.
   - Rinominate per collisione con i componenti della home:
       .dd-contact .dd-card         -> .dd-info-card
       .dd-contact .dd-btn--primary -> .dd-btn--invert
     (.dd-btn--ghost era previsto ma si e' rivelato ridondante: coincide
      con la base .dd-page .dd-btn, vedi 11.6)
   - Rimosso .dd-cta (markup eliminato il 2026-08-10) e il suo hover
     cyan -> cyan-light, che contraddiceva la nota della 9.3.

   Una pagina nuova costruita con blocco HTML deve avere .dd-page sul
   contenitore, e nessuno <style> al suo interno.
   ========================================================================== */


/* --------------------------------------------------------------------------
   11.1 Contenitore pagina editoriale

   Base condivisa da ogni pagina costruita con blocco HTML. Una pagina
   nuova aggiunge .dd-page e parte gia' vestita.
   -------------------------------------------------------------------------- */

.dd-page {
    margin-inline: auto;
    color: var(--da-text-on-light);
    font-family: var(--sunya-font-body);
    font-size: 1rem;
    line-height: 1.65;
    -webkit-font-smoothing: antialiased;
}

/* 2026-09-19 — `max-width: 820px` tolto da .dd-page e spostato sulla sola
   pagina di contatto (13/14 non lo vogliono).

   Fino al parent 1.11.0 la riga qui era MORTA: il fallback del parent
   (`.sunya-entry-content > *:not()...`) pesava 0,7,0 contro lo 0,1,0 di
   .dd-page e vinceva sempre — misurato 1200px su tutte le pagine. Dalla
   1.11.1 quel fallback sta dentro :where() e pesa 0,1,0, quindi questa
   riga avrebbe iniziato a rendere di colpo su 10 pagine live.

   Misurato il 19/09 prima di decidere, applicando davvero la 1.11.1 sul
   servito: hub e pagine servizio passavano da 1200 a 820. Scelta di
   Davide: l'hub /servizi/ sta bene a 1200 (le tre card "Da dove partire"
   a 820 si stringono e il catalogo diventa una colonna sottile), le
   pagine servizio restano a 1200 in attesa della 13 v2 a due colonne.
   L'820 resta dove e' lettura pura affiancata a un form: .dd-contact.

   Chi rimette `max-width` su .dd-page riporta a 820 dieci pagine, non una. */

.dd-page.dd-contact {
    max-width: 820px;
}

/* 2026-08-27 — Tolto `padding: var(--da-space-xl) 4px var(--da-space-2xl)`.
   Le tre componenti se ne sono andate per tre motivi diversi:

   - il BASSO (64px) non arrivava comunque a schermo dal parent 1.10.3 in
     poi: l'aria di coda del tema sta a 0,3,0 e questa regola a 0,1,0.
   - i LATERALI (4px desktop, 0 nella variante mobile qui sotto) non sono
     MAI arrivati a schermo, nemmeno prima: il fallback del gutter nel
     parent sta a 0,10,0 (corretto il 19/09: la nota diceva 0,9,0, ma le
     classi nella catena sono dieci). Misurato a 390px il 27/08: 20px, non 0.
   - l'ALTO (48px) era l'unica delle tre ancora viva, e si sommava ai 24px
     di stacco che il parent 1.10.3 mette sotto la barra breadcrumb: 72px
     in testa contro i 24 di kinesis, a parita' di tipo di pagina. */

.dd-page h1,
.dd-page h2,
.dd-page h3 {
    font-family: var(--sunya-font-heading);
}

.dd-page h1 {
    font-size: 1.9rem;
    line-height: 1.25;
    margin: .2em 0 .15em;
    font-weight: 700;
}

.dd-page h2 {
    font-size: 1.4rem;
    margin: 2.4em 0 .5em;
    padding-bottom: .3em;
    border-bottom: 2px solid var(--da-light-border);
    font-weight: 600;
    /* era --dd-header-offset: 110px hardcoded nell'inline */
    scroll-margin-top: calc(var(--sunya-header-height, 80px) + var(--da-space-lg));
}

.dd-page h3 {
    font-size: 1.1rem;
    margin: 1.4em 0 .4em;
    font-weight: 600;
}

.dd-page p {
    margin: .6em 0;
}

.dd-page a {
    color: var(--da-teal);
    text-decoration: underline;
    text-underline-offset: 2px;
}

.dd-page a:hover {
    color: var(--da-teal-hover);
}

@media (max-width: 600px) {
    .dd-page    { font-size: .9375rem; }   /* 2026-08-27: via il padding, vedi 11.1 */
    .dd-page h1 { font-size: 1.55rem; }
    .dd-page h2 { font-size: 1.25rem; }
}


/* --------------------------------------------------------------------------
   11.2 Lead — variante di pagina

   .dd-lead esiste gia' nella 9.1 (1.15rem, centrato, max-width 620px): e'
   il lead delle sezioni full-width della home. Dentro .dd-page serve piu'
   piccolo, allineato a sinistra e in grigio.
   -------------------------------------------------------------------------- */

.dd-page .dd-lead {
    max-width: none;
    margin-left: 0;
    margin-right: 0;
    margin-bottom: 1.4em;
    font-size: 1.02rem;
    line-height: inherit;
    color: var(--da-text-light-sec);
}


/* --------------------------------------------------------------------------
   11.3 Callout — .dd-note
   -------------------------------------------------------------------------- */

.dd-note {
    background: var(--da-light-bg);
    border-left: 3px solid var(--da-teal);
    border-radius: 0 8px 8px 0;
    padding: 12px 18px;
    margin: .8em 0;
    font-size: .94rem;
}


/* --------------------------------------------------------------------------
   11.4 Indice ancore — .dd-nav

   RITIRATA il 2026-09-03 (child 2.4.0). VUOTA, non cancellata: il numero
   resta prenotato nella mappa condivisa (sunya-page-content-guide.md § 8),
   come le 11.4, 11.7, 11.9 e 11.11 dichiarate vuote su davidearduini.

   L'unico consumatore era l'indice a chip in cima a /servizi/, sparito col
   passaggio della pagina a modo B. Censimento sul SERVITO prima di
   rimuovere, su tutti e 15 i contenuti pubblicati letti dalla REST API:
   token di classe `dd-nav` = ZERO.
   ⚠️ Il conteggio va fatto sui TOKEN DI CLASSE esatti, non per sottostringa:
   nello stesso giro `\bdd-group\b` aveva segnato 3 occorrenze in home, che
   erano `dd-group-label` — una classe viva della 9.1, che non c'entra nulla.
   -------------------------------------------------------------------------- */

/* (nessuna regola — ritirata, vedi cartiglio) */


/* --------------------------------------------------------------------------
   11.5 Avviso con icona — .dd-promise
   -------------------------------------------------------------------------- */

.dd-promise {
    display: flex;
    align-items: center;
    gap: 10px;
    background: var(--da-light-bg);
    border: 1px solid var(--da-light-border);
    border-left: 3px solid var(--da-cyan);
    border-radius: 0 8px 8px 0;
    padding: 12px 18px;
    margin: 0 0 1.4em;
    font-size: .98rem;
    font-weight: 600;
}

.dd-promise svg {
    width: 20px;
    height: 20px;
    flex: none;
    fill: var(--da-teal);
}


/* --------------------------------------------------------------------------
   11.6 Bottoni delle pagine editoriali

   ATTENZIONE: la 9.3 NON definisce .dd-btn. Definisce
   `.dd-btn--primary .wp-block-button__link`, cioe' bersaglia i blocchi
   Bottone di Gutenberg, dove dd-btn--primary sta sul wrapper e lo stile
   va sul link interno. I bottoni delle pagine editoriali sono invece <a>
   scritti a mano: non ereditano niente dalla 9.3.

   Per questo la base sta qui ed e' autonoma. Valori ripresi dall'inline
   di Contatti (verificati live prima della rimozione, 2026-08-12).

   Tutto scopato sotto .dd-page: sulla home lo stesso prefisso dd-btn--*
   indica i wrapper Gutenberg, che non vanno toccati.

       <a class="dd-btn">              bottone chiaro, bordo teal
       <a class="dd-btn dd-btn--invert">   dark + cyan
   -------------------------------------------------------------------------- */

.dd-page .dd-btn {
    display: inline-flex;
    align-items: center;
    gap: 10px;
    padding: 13px 22px;
    min-height: 48px;
    border: 1.5px solid var(--da-teal);
    border-radius: 8px;
    background: var(--da-light-card);
    color: var(--da-teal);
    font-size: 1rem;
    font-weight: 600;
    line-height: 1;
    text-decoration: none;
    transition: background .15s, color .15s, border-color .15s, box-shadow .15s;
}

.dd-page .dd-btn:hover,
.dd-page .dd-btn:focus-visible {
    background: var(--da-light-bg);
    border-color: var(--da-teal-hover);
    color: var(--da-teal-hover);
}

/* Dark + cyan su fondo chiaro: 11.9:1 */
.dd-page .dd-btn--invert {
    background: var(--da-dark-bg);
    border-color: var(--da-dark-bg);
    color: var(--da-cyan);
}

.dd-page .dd-btn--invert:hover,
.dd-page .dd-btn--invert:focus-visible {
    background: var(--da-cyan);
    border-color: var(--da-cyan);
    color: var(--da-dark-bg);
    box-shadow: 0 4px 20px rgba(0, 229, 208, .35);
}

.dd-page .dd-btn:focus-visible {
    outline: 2px solid var(--da-teal);
    outline-offset: 2px;
}

.dd-page .dd-btn svg {
    width: 19px;
    height: 19px;
    flex: none;
    fill: currentColor;
}

/* 2026-09-23 (2.8.0) — Bottoni Gutenberg dentro .dd-page: niente sottolineatura.
   `.dd-page a` (11.1, 0,1,1) batteva `.wp-block-button__link` (0,1,0) del
   parent sul text-decoration: le CTA in spalla delle otto pagine servizio
   uscivano sottolineate sul servito (misurato il 23/09 su /servizi/consulenze/),
   e cosi' il pulsante di chiusura della pagina lavoro (15.7). Solo la
   decorazione: colori, fondo e bordo restano quelli della 20. Decisione di
   Davide, 23/09. */
.dd-page .wp-block-button__link {
    text-decoration: none;
}


/* --------------------------------------------------------------------------
   11.7 Social — .dd-social
   -------------------------------------------------------------------------- */

.dd-social {
    display: flex;
    gap: 10px;
    margin-top: .8em;
}

.dd-social a {
    display: inline-flex;
    align-items: center;
    justify-content: center;
    width: 42px;
    height: 42px;
    border: 1.5px solid var(--da-teal);
    border-radius: 8px;
    color: var(--da-teal);
    transition: background .15s, color .15s, border-color .15s;
}

.dd-social a:hover,
.dd-social a:focus-visible {
    background: var(--da-dark-bg);
    border-color: var(--da-dark-bg);
    color: var(--da-cyan);
}

.dd-social a:focus-visible {
    outline: 2px solid var(--da-teal);
    outline-offset: 2px;
}

.dd-social svg {
    width: 20px;
    height: 20px;
    fill: currentColor;
}


/* --------------------------------------------------------------------------
   11.8 Box informativo — .dd-info-card

   RINOMINATA da .dd-card: la card della home (9.4 + sezione 10) e' un
   componente diverso, con icona in alto, padding-top calcolato e ::after.
   -------------------------------------------------------------------------- */

.dd-info-card {
    background: var(--da-light-bg);
    border: 1px solid var(--da-light-border);
    border-radius: 8px;
    padding: 18px 22px;
}

.dd-info-card strong {
    display: block;
    margin-bottom: .5em;
    font-size: 1.05rem;
    font-family: var(--sunya-font-heading);
}

.dd-info-card ul {
    list-style: none;
    margin: 0;
    padding: 0;
}

.dd-info-card li {
    margin: .35em 0;
}

.dd-small {
    font-size: .92rem;
    color: var(--da-text-light-sec);
}


/* --------------------------------------------------------------------------
   11.9 Specifico pagina Servizi

   RITIRATA il 2026-09-03 (child 2.4.0). VUOTA, non cancellata.

   Vestiva /servizi/ quando la pagina era in modo C: griglia `.dd-services`
   con dentro `.dd-group` (etichetta di famiglia), `.dd-svc` (card),
   `.dd-who` e `.dd-svc-cta`. Dal 2026-09-03 la pagina è in modo B e la
   veste la SEZIONE 14 con nomi propri `.dd-hub*`.

   Censimento sul SERVITO prima di rimuovere, su tutti e 15 i contenuti
   pubblicati letti dalla REST API, contando i TOKEN DI CLASSE esatti:
   `dd-services` 0 · `dd-group` 0 · `dd-who` 0 · `dd-svc-cta` 0.

   ⚠️ `.dd-svc` NON è sparita e non va cercata insieme alle altre: dal
   2026-09-02 è il contenitore della pagina servizio (sezione 13) e vive su
   otto pagine. Qui muore soltanto l'uso che ne faceva la 11.9, scopato
   `.dd-services .dd-svc` — selettore che, senza `.dd-services` in pagina,
   non raggiungeva già più nulla.
   -------------------------------------------------------------------------- */

/* (nessuna regola — ritirata, vedi cartiglio) */


/* --------------------------------------------------------------------------
   11.10 Specifico pagina Contatti
   -------------------------------------------------------------------------- */

.dd-contact .dd-actions {
    display: flex;
    flex-wrap: wrap;
    gap: 12px;
    margin: 1.2em 0 2em;
}

.dd-contact .dd-info {
    display: grid;
    grid-template-columns: 1fr 1fr;
    gap: var(--da-space-sm);
    margin: 1.4em 0;
}

.dd-contact .dd-maps {
    display: inline-block;
    margin-top: .7em;
    font-size: .95rem;
}

@media (max-width: 600px) {
    .dd-contact .dd-info    { grid-template-columns: 1fr; }
    .dd-contact .dd-actions { flex-direction: column; }
    .dd-contact .dd-btn     { justify-content: center; }
}


/* --------------------------------------------------------------------------
   11.11 Skin WPForms

   Vale per tutto il sito, non solo per Contatti: anche nell'inline questi
   selettori erano gia' fuori dallo scope di pagina.
   Il secondo <style> di /contatti/ (#wpforms-10.wpforms-block-...) e'
   generato dal plugin: NON e' nostro e non va rimosso.
   -------------------------------------------------------------------------- */

div.wpforms-container-full {
    max-width: 820px;
    margin: 0 auto;
}

div.wpforms-container-full .wpforms-form .wpforms-field-label {
    font-weight: 600;
    color: var(--da-text-on-light);
}

div.wpforms-container-full .wpforms-form .wpforms-field-description {
    color: var(--da-text-light-sec);
}

div.wpforms-container-full .wpforms-form input[type="text"],
div.wpforms-container-full .wpforms-form input[type="email"],
div.wpforms-container-full .wpforms-form input[type="tel"],
div.wpforms-container-full .wpforms-form textarea {
    border: 1px solid var(--da-input-border);
    border-radius: 8px;
    background: var(--da-light-card);
    padding: 10px 14px;
    font-size: 1rem;
}

div.wpforms-container-full .wpforms-form input:focus,
div.wpforms-container-full .wpforms-form textarea:focus {
    border-color: var(--da-cyan);
    box-shadow: 0 0 0 2px rgba(0, 229, 208, .3);
    outline: none;
}

div.wpforms-container-full .wpforms-form button[type="submit"].wpforms-submit {
    background: var(--da-dark-bg);
    border: 1.5px solid var(--da-dark-bg);
    border-radius: 8px;
    color: var(--da-cyan);
    padding: 13px 28px;
    font-size: 1rem;
    font-weight: 600;
    min-height: 48px;
    transition: background .15s, color .15s, box-shadow .15s;
}

div.wpforms-container-full .wpforms-form button[type="submit"].wpforms-submit:hover {
    background: var(--da-cyan);
    color: var(--da-dark-bg);
    box-shadow: 0 4px 20px rgba(0, 229, 208, .35);
}

div.wpforms-container-full .wpforms-form button[type="submit"].wpforms-submit:focus-visible {
    outline: 2px solid var(--da-cyan);
    outline-offset: 3px;
}



/* ==========================================================================
   20. CORE BUTTONS BRAND (introdotta in v1.3.5 - rinumerata 2026-09-02)

   ⚠️ ERA LA SEZIONE 12. Rinumerata perche' la fascia 11-19 e' riservata
   alle SEZIONI DI PAGINA condivise fra tutti i child (11 = pagine
   editoriali, 12 = pagine persone/team, 13 = pagina servizio) e la 12 era
   gia' occupata altrove da un significato diverso. La fascia 20-29 e' la
   skin dei COMPONENTI GLOBALI: vale su tutto il sito, non su una pagina.
   Mappa autorevole: sunya-page-content-guide.md § 8, "Le fasce di
   numerazione". Nessuna regola CSS e' cambiata: solo il cartiglio.

   I block patterns del parent (v1.4.x) usano il core button generico.
   Qui --sunya-color-accent e' mappato su --da-dark-bg (#0D1117): il
   primario del parent rendeva quasi nero su hero quasi nero. Inversione
   cyan, stesso linguaggio dei dd-btn. Le guardie :where() lasciano
   vincere i colori scelti in editor (.has-background / .has-text-color).
   NB: le regole bottone della sezione 9.3 restano scopate ai wrapper
   dd-* e non toccano i pattern.
   ========================================================================== */

.wp-block-button:not(.is-style-outline) .wp-block-button__link:where(:not(.has-background)) {
    background: var(--da-cyan);
}

.wp-block-button:not(.is-style-outline) .wp-block-button__link:where(:not(.has-text-color)) {
    color: var(--da-dark-bg);
}

.wp-block-button:not(.is-style-outline) .wp-block-button__link:where(:not(.has-background)):hover {
    background: var(--da-cyan-light);
}

/* Outline: cyan muted su chiaro (piu' contrasto), cyan pieno su scuro */
.wp-block-button.is-style-outline .wp-block-button__link:where(:not(.has-text-color)) {
    color: var(--da-teal, #00756C);
    border-color: currentColor;
}

.has-surface-dark-background-color .wp-block-button.is-style-outline .wp-block-button__link:where(:not(.has-text-color)),
.has-surface-dark-alt-background-color .wp-block-button.is-style-outline .wp-block-button__link:where(:not(.has-text-color)) {
    color: var(--da-cyan);
}



/* ==========================================================================
   13. PAGINA SERVIZIO (blocchi Gutenberg — modo B)

   Slot semantico condiviso fra i child: la SCHEDA del singolo servizio,
   quella che si apre dalla griglia di /servizi/. Prima applicazione
   dadesign.it, 2026-09-03, otto pagine figlie di /servizi/.

   ⚠️ RICHIEDE PARENT >= 1.10.0.
   Scritta con i soli token --sunya-*, senza fallback `var(--token, #hex)`:
   e' la condizione per riappenderla su un altro child senza portarsi
   dietro i colori di dadesign. Su sportpix (parent 1.4.3) i token
   derivati non esistono: NON riappendere la 13 li' prima dell'upgrade —
   renderebbe senza colori invece che con i propri.

   ⚠️ .dd-svc E' STATA UNA CLASSE A DOPPIO SIGNIFICATO.
   Dal 2026-08-12 al 2026-09-17 marcava anche la card del singolo
   servizio nella griglia di /servizi/ (11.9). Con l'hub v2 le card sono
   `.dd-hub__svc`: censimento del 2026-09-22 sulle 15 pagine servite,
   `dd-svc` compare 8 volte, tutte come contenitore di pagina servizio.
   Il compound `.dd-page.dd-svc` RESTA comunque la regola: costa zero e
   protegge da un ritorno del vecchio uso. Mai `.dd-svc` nuda.
   Gli elementi `.dd-svc__*` sono nomi propri della 13: nessuna collisione.

   v2 (2026-09-22, child 2.7.0) — COLONNA DI LETTURA + SPALLA.
   A 1440px il testo correva su 1152px: 148-165 caratteri per riga.
   La pagina resta larga 1200 (scelta del 19/09): si stringe la colonna,
   e lo spazio avanzato diventa una spalla con nota, CTA e servizi
   fratelli. Due contenitori nuovi nel markup, nessun testo cambiato:
     .dd-svc__body   Gruppo flow: lead, "Cosa include", prosa
     .dd-svc__aside  Gruppo flow con tagName "aside": .dd-note, CTA,
                     .dd-svc__siblings
   La disposizione sta QUI, non nel post_content: tutto il layout vive
   sotto `.dd-page.dd-svc:has(> .dd-svc__aside)`, quindi una pagina
   ancora in markup v1 rende esattamente come prima — il CSS puo'
   salire prima delle incollate. Contratto:
   sunya\docs\SPEC-2026-09-22-sezione-13-v2.md

   ⚠️ LE DUE SCALE DI SPAZIATURA SONO SFALSATE DI UN GRADINO.
   --da-space-xs (8px) = --sunya-spacing-sm (0.5rem);
   --da-space-md (24px) = --sunya-spacing-lg (1.5rem).
   Leggendo la 11 e la 13 affiancate i nomi non corrispondono: i valori
   si', i gradini no. Non tradurre a occhio.

   NON si ridichiara max-width sul contenitore: dal 19/09 l'820 vive sulla
   sola `.dd-page.dd-contact` (11.1), e le pagine servizio prendono la
   larghezza del tema dal fallback del parent. Una seconda dichiarazione
   qui sarebbe la seconda.
   NON si ridichiarano i link: li possiede il parent dalla 1.8.3 e la 11.1
   ha gia' il suo livello.

   Le sotto-sezioni non usate restano DICHIARATE VUOTE, non si saltano:
   il confronto fra child regge solo se lo stesso numero sta nello stesso
   posto ovunque. Mappa autorevole: sunya-page-content-guide.md § 8.

   DOM di riferimento : wp-sites\dadesign.it\markup\servizio-*.html
   Contratto          : wp-sites\dadesign.it\docs\SPEC-SEZIONE-13-2026-09-02.md
   ========================================================================== */


/* --------------------------------------------------------------------------
   13.1 Contenitore pagina servizio + lead

   Il contenitore NON dichiara nulla, ed e' voluto: eredita tipografia,
   colore e base bottoni dalla 11.1, che il markup porta con la seconda
   classe (class="dd-page dd-svc"). Senza .dd-page i bottoni escono nudi.

   Il LEAD riusa la 11.2 (.dd-page .dd-lead) senza variante: sulla pagina
   servizio ha lo stesso ruolo che ha sulle editoriali. Se un giorno
   servisse diverso si scopa `.dd-page.dd-svc .dd-lead` — non si inventa
   un .dd-svc__lead.

   ARIA DI CODA: non dichiarata qui, di proposito. Dal parent 1.10.3
   l'aria di coda sta dentro l'ultimo blocco della pagina; aggiungerne
   altra la sommerebbe. Se dalla misura live lo stacco dal pre-footer
   risulta insufficiente si aggiunge `padding-bottom` su .dd-page.dd-svc
   — MAI `margin-bottom`, che il margin collapsing annulla.

   v2 — GRIGLIA A DUE COLONNE (sopra i 1024px; sotto vedi 13.11).
   Il contenitore resta NUDO: la griglia si accende solo se la pagina
   porta la spalla (`:has(> .dd-svc__aside)`, 0,3,0). Senza, il markup
   v1 non vede nessuna di queste regole.

     colonna  36rem ~ 79 caratteri a 16px DM Sans (misurati 7,3px medi)
     spalla   20rem (2.7.1; era 18rem nella 2.7.0: la CTA a piena
              larghezza andava a capo su 7 pagine su 8, a 20rem su 4 —
              le quattro etichette lunghe. 22rem ne recupera una sola e a
              1025px schiaccia la colonna a 546px. Misurato sul servito
              il 2026-09-22)
     stacco   2xl + md = 64px, come lo stacco di famiglia della 14.2
     aree     "head ." / "body aside": la testata sta sopra la colonna,
              mai accanto alla spalla (Davide, 2026-09-22)

   ⚠️ Il contenitore e' un Gruppo CONSTRAINED: il core da' ai suoi figli
   `margin-inline: auto !important`. In una cella di griglia un margine
   auto RESTRINGE l'elemento alla larghezza del contenuto e lo centra.
   `width: 100%` riporta le celle alla larghezza dell'area (i margini
   auto si risolvono a zero) senza combattere l'!important del core.

   ⚠️ In griglia i margini dei figli NON collassano: per questo corpo e
   spalla sono contenitori e non fratelli sparsi — dentro .dd-svc__body
   il ritmo verticale resta quello della v1, margini compresi.

   SPALLA STICKY: si ferma da sola in fondo alla griglia, cioe' prima
   dell'aria di coda e del pre-footer. `align-self: start` e' la
   condizione: una cella stirata all'altezza del corpo non ha dove
   scorrere. Nessun antenato deve avere `overflow` diverso da visible.
   -------------------------------------------------------------------------- */

@media (min-width: 1025px) {

    .dd-page.dd-svc:has(> .dd-svc__aside) {
        display: grid;
        grid-template-columns: minmax(0, 36rem) minmax(0, 20rem);
        grid-template-areas:
            "head ."
            "body aside";
        column-gap: calc(var(--sunya-spacing-2xl) + var(--sunya-spacing-md));
        justify-content: space-between;     /* P1 (a): colonna e spalla ai due bordi del contenitore */
        align-items: start;
    }

    .dd-page.dd-svc:has(> .dd-svc__aside) > * {
        width: 100%;
        margin-block: 0;
    }

    .dd-page.dd-svc:has(> .dd-svc__aside) > .dd-svc__head {
        grid-area: head;
        margin-bottom: var(--sunya-spacing-lg);
    }

    .dd-page.dd-svc:has(> .dd-svc__aside) > .dd-svc__body {
        grid-area: body;
    }

    .dd-page.dd-svc > .dd-svc__aside {
        grid-area: aside;
        position: sticky;
        top: calc(var(--sunya-header-height, 80px) + var(--sunya-spacing-xl));
    }
}

/* Ritmo interno della spalla, a ogni larghezza. 0,2,0: batte `.dd-page p`
   (0,1,1) sulla .dd-note e i margini propri di CTA e fratelli (13.9,
   13.10), che la v1 pensava per la coda della pagina. */
.dd-page.dd-svc > .dd-svc__aside > * {
    margin-block: 0;
}

.dd-page.dd-svc > .dd-svc__aside > * + * {
    margin-top: var(--sunya-spacing-lg);
}

/* Il primo figlio del corpo non apre un varco sotto la testata. */
.dd-page.dd-svc > .dd-svc__body > :first-child {
    margin-top: 0;
}


/* --------------------------------------------------------------------------
   13.2 Intestazione — .dd-svc__head + .dd-svc__eyebrow

   L'eyebrow e' il nome del GRUPPO di servizi ("Servizi web", "Marketing
   e crescita"): lo stesso testo che su /servizi/ fa da titolo di gruppo
   in `.dd-services .dd-group` (11.9). Stesso ruolo, stesso linguaggio
   visivo — chi arriva dall'hub ritrova l'etichetta da cui e' partito.
   E' TESTO, non un badge: niente pillola, niente sfondo.
   -------------------------------------------------------------------------- */

.dd-svc__head {
    margin-bottom: var(--sunya-spacing-lg);
}

/* 0,2,0 per battere `.dd-page p` (0,1,1) della 11.1, che qui aprirebbe
   un margine sopra il soprattitolo. */
.dd-page .dd-svc__eyebrow {
    margin: 0 0 var(--sunya-spacing-sm);
    font-family: var(--sunya-font-heading);
    font-size: .78rem;
    font-weight: 600;
    letter-spacing: 2px;
    text-transform: uppercase;
    color: var(--sunya-color-accent-ink);
}

/* Stessa ragione: `.dd-page h1` (0,1,1) porta `margin: .2em 0 .15em` e
   aprirebbe un varco fra soprattitolo e titolo. */
.dd-page .dd-svc__head h1 {
    margin-top: 0;
}


/* --------------------------------------------------------------------------
   13.3 Sintesi in evidenza / promessa — .dd-svc__claim

   VUOTA. Il ruolo lo fa gia' .dd-note (11.3), usata su /servizi/ per la
   nota budget e sulle pagine 1 e 3 per la garanzia del primo anno. Una
   classe in meno da mantenere.
   Verificato sui quattro markup consegnati: zero occorrenze di
   .dd-svc__claim. (L'ELENCO-PAGINE la dava usata sulle pagine 1, 3 e 6:
   riga rettificata il 2026-09-03.)
   -------------------------------------------------------------------------- */


/* --------------------------------------------------------------------------
   13.4 "Cosa include" — .dd-svc__includes + .dd-svc__level

   Regge DUE forme senza varianti di classe per pagina:

     FORMA A  (pagine 1,2,3,8)  h2 + ul, 6-8 voci brevi
     FORMA B  (pagine 4,5,7)    h2 + tre Gruppi .dd-svc__level, ognuno
                                h3 + p. Live sulla pagina 4 dal 2026-09-03
     FORMA B2 (pagina 6)        due famiglie x due livelli: si ottiene
                                annidando i .dd-svc__level sotto un h3 di
                                famiglia, senza classi nuove

   .dd-svc__includes NON diventa una griglia: i livelli restano in colonna
   e si distinguono col filetto laterale. Cosi' l'H2 non ha bisogno di
   `grid-column: 1 / -1` e il max-width del layout constrained non entra
   in gioco. Decisione di Davide, 2026-09-03.

   Un h3 QUI DENTRO significa "titolo di un livello di servizio", non una
   sotto-sezione editoriale: fuori da .dd-svc__includes l'h3 torna a
   valere quello che vale nella 11.1.

   L'H2 "Cosa include" tiene il filetto sotto che la 11.1 da' a tutti gli
   H2 di pagina: e' un H2 come gli altri, toglierglielo lo staccherebbe
   dalla gerarchia della pagina.
   -------------------------------------------------------------------------- */

.dd-svc__includes ul {
    margin: var(--sunya-spacing-md) 0;
    padding-left: 1.2em;
}

.dd-svc__includes li {
    margin: .3em 0;
}

.dd-svc__includes li::marker {
    color: var(--sunya-color-accent-ink);
}

/* Un livello di servizio: filetto laterale, NESSUNO SFONDO.
   Stesso tratto di .dd-note (11.3) — 3px sul lato — ma senza carta:
   dentro "Cosa include" i livelli sono contenuto, non un richiamo.
   Niente sfondo vuol dire anche nessuna carta piu' chiara della pagina,
   quindi accent-ink resta calcolato sulla carta su cui rende davvero
   (e' il difetto noto delle card, parent v1.10.0). */
.dd-svc__level {
    margin: var(--sunya-spacing-xl) 0;
    padding-left: var(--sunya-spacing-lg);
    border-left: 3px solid var(--sunya-color-accent-ink);
}

/* 0,2,0: battono `.dd-page h3` e `.dd-page p` (0,1,1), che altrimenti
   sfondano il filetto sopra e sotto. */
.dd-svc__level > :first-child { margin-top: 0; }
.dd-svc__level > :last-child  { margin-bottom: 0; }


/* --------------------------------------------------------------------------
   13.5 Processo / fasi di lavoro — .dd-svc__steps

   VUOTA. Su dadesign "Come funziona" e' un paragrafo di prosa (pagine 1,
   3, 8), non un processo a fasi: scelta confermata da Davide il
   2026-09-03. Se un giorno diventa tre fasi, il numero e' questo — non
   la 13.6, la 13.7 o la 13.8, che sono semanticamente occupate.
   (L'ELENCO-PAGINE la dava usata sulle pagine 1, 3 e 8: riga rettificata
   il 2026-09-03.)
   -------------------------------------------------------------------------- */


/* --------------------------------------------------------------------------
   13.6 Deliverable, tempi, prezzo indicativo — .dd-svc__facts

   VUOTA. Sito CTA-only, nessun prezzo pubblico.
   -------------------------------------------------------------------------- */


/* --------------------------------------------------------------------------
   13.7 Prove: casi, numeri, loghi — .dd-svc__proof

   VUOTA. Il portfolio e' la fase B, dopo queste otto pagine.
   -------------------------------------------------------------------------- */


/* --------------------------------------------------------------------------
   13.8 FAQ (core/details) — .dd-svc__faq

   VUOTA. Nessuna FAQ nei testi di febbraio.
   -------------------------------------------------------------------------- */


/* --------------------------------------------------------------------------
   13.9 CTA in pagina — solo POSIZIONAMENTO

   I colori del bottone li fanno il parent e la sezione 20: qui si
   dichiara soltanto dove sta e quanta aria ha intorno.
   Scopata al figlio DIRETTO del contenitore, cosi' un eventuale gruppo
   di bottoni dentro .dd-svc__includes non viene toccato.

   Su dadesign vale "una sola CTA di chiusura per pagina = pre-footer
   globale": questa e' la CTA dentro il flusso, non un pannello finale.

   v2: nelle pagine con spalla la CTA sta dentro .dd-svc__aside e la
   regola qui sotto (figlio DIRETTO del contenitore) non la raggiunge:
   margini dal ritmo della spalla (13.1).
   P5 (b), Davide 2026-09-22: in spalla il bottone prende TUTTA la
   larghezza, a ogni viewport. Le etichette lunghe superano la spalla
   (quattro su otto anche a 320px, 2.7.1) e vanno comunque su due righe:
   a piena larghezza le otto
   CTA hanno lo stesso blocco, allineato alla nota, e le righe spezzate
   restano centrate. Solo geometria: colori e padding restano della 20.
   -------------------------------------------------------------------------- */

.dd-page.dd-svc > .wp-block-buttons {
    margin: var(--sunya-spacing-2xl) 0 var(--sunya-spacing-xl);
}

.dd-svc__aside .wp-block-button {
    width: 100%;
}

.dd-svc__aside .wp-block-button__link {
    width: 100%;
    box-sizing: border-box;
    text-align: center;
}


/* --------------------------------------------------------------------------
   13.10 Rimando a Servizi e ai servizi fratelli — .dd-svc__siblings

   Coda della pagina: testo minore, staccato dal contenuto da un filetto.
   Lo stacco dal PRE-FOOTER si fa con padding, mai con margin — il margin
   collapsing lo annulla (gia' misurato sulle pagine live).
   Sulla pagina 4 il blocco esiste col solo "Tutti i servizi": la ul dei
   fratelli manca finche' le pagine 5 e 6 non sono pubblicate. Le regole
   qui sotto reggono entrambi i casi.
   -------------------------------------------------------------------------- */

.dd-svc__siblings {
    margin-top: var(--sunya-spacing-2xl);
    padding-top: var(--sunya-spacing-lg);
    border-top: 1px solid var(--sunya-color-border);
    font-size: .94rem;
}

/* 0,2,1 per battere `.dd-page p` (0,1,1): serve il colore, non solo il
   margine. I link dentro restano quelli del parent. */
.dd-page .dd-svc__siblings p {
    margin: .35em 0;
    color: var(--sunya-color-text-light);
}

.dd-svc__siblings ul {
    margin: .35em 0;
    padding-left: 1.2em;
}

.dd-svc__siblings li {
    margin: .25em 0;
}

.dd-svc__siblings li::marker {
    color: var(--sunya-color-accent-ink);
}


/* --------------------------------------------------------------------------
   13.11 Responsive

   Stesso breakpoint della 11.1 (600px), cosi' tipografia di pagina e
   sezione servizio cambiano passo insieme.
   I selettori ripetono quelli della 13.2: una media query NON alza la
   specificita', e `.dd-svc__eyebrow` nudo (0,1,0) perderebbe contro il
   `.dd-page .dd-svc__eyebrow` (0,2,0) dichiarato sopra.
   -------------------------------------------------------------------------- */

@media (max-width: 600px) {

    .dd-svc__head {
        margin-bottom: var(--sunya-spacing-md);
    }

    .dd-page .dd-svc__eyebrow {
        font-size: .72rem;
        letter-spacing: 1.5px;
    }

    .dd-svc__level {
        margin: var(--sunya-spacing-lg) 0;
        padding-left: var(--sunya-spacing-md);
    }

    .dd-page.dd-svc > .wp-block-buttons {
        margin: var(--sunya-spacing-xl) 0 var(--sunya-spacing-lg);
    }

    .dd-svc__siblings {
        margin-top: var(--sunya-spacing-xl);
    }
}

/* v2 sotto i 1025px: una colonna, ordine del DOM (testa, corpo, spalla).
   Testata, corpo e spalla restano larghi quanto la colonna di lettura; il
   `margin-inline: auto` del core li centra nel contenitore. Sotto i ~620px
   il tetto non morde piu': su telefono conta solo lo stacco della spalla.
   Il margine sopra la spalla collassa con quello dell'ultimo paragrafo del
   corpo (flusso normale, nessun padding in mezzo): resta il maggiore.
   P4 (b), Davide 2026-09-22: in colonna unica la spalla non ha piu' la
   posizione a dirle "altra cosa", e la nota finiva per leggersi come un
   seguito della prosa. Il filetto di 2px in accent-ink e' l'idioma di
   capitolo della 14.2 (lo stesso che un filetto in --sunya-color-border,
   1,41, non riusciva a dare). */
@media (max-width: 1024px) {

    .dd-page.dd-svc:has(> .dd-svc__aside) > * {
        max-width: 36rem;
    }

    .dd-page.dd-svc > .dd-svc__aside {
        margin-top: var(--sunya-spacing-2xl);
        padding-top: var(--sunya-spacing-xl);
        border-top: 2px solid var(--sunya-color-accent-ink);
    }
}



/* ==========================================================================
   14. PAGINA HUB SERVIZI (blocchi Gutenberg — modo B)

   Slot semantico condiviso fra i child: la pagina INDICE che raccoglie i
   servizi e instrada verso le schede della 13. Prima applicazione
   dadesign.it, 2026-09-03, /servizi/.

   Decisione 0 della SPEC, presa il 2026-09-03: strada A, numero 14 —
   sezione nuova invece di riscrivere la 11.9. La fascia 11-19 e' "una
   fascia, un tipo di pagina", e l'hub E' un tipo di pagina, gemello della
   13, non una sotto-parte di pagina editoriale. Riscrivere la 11.9 avrebbe
   rimesso due mestieri sullo stesso numero: e' l'errore che il 2026-09-02
   ha costretto a rinumerare la 12 in 20.

   ⚠️ RICHIEDE PARENT >= 1.10.0.
   Scritta con i soli token --sunya-*, senza fallback `var(--token, #hex)`,
   come la 13: e' la condizione per riappenderla su un altro child senza
   portarsi dietro i colori di dadesign. Unica eccezione, motivata sul
   posto, lo scroll-margin della 14.5.

   ⚠️ CONVIVE CON LA 11.9, PER SCELTA.
   Finche' /servizi/ resta in modo C la pagina live e' vestita dalla 11.9 e
   questa sezione non tocca nulla: nessuna classe .dd-hub* esiste nel child
   ne' nei markup pubblicati (verificato 2026-09-03, zero occorrenze).
   La 11.9 si ritira DOPO l'incollata e dopo la sovrapposizione, con un
   bump a parte — mai nello stesso giro.

   ⚠️ .dd-hub__svc NON E' .dd-svc — sono due token di classe distinti.
   La 13 e' scopata `.dd-page.dd-svc`, la 11.9 `.dd-services .dd-svc`:
   nessuna delle due raggiunge un elemento che porta solo .dd-hub__svc. Il
   contenitore di pagina qui e' `class="dd-page dd-hub"`, non .dd-svc.

   La pagina porta .dd-page, quindi eredita 11.1 (tipografia) e 11.2
   (lead). Le regole qui sotto qualificano con .dd-page SOLO dove devono
   battere i selettori 0,1,1 della 11.1 (`.dd-page h2`, `h3`, `p`), e
   restano nude dove non c'e' concorrenza.
   NON si ridichiarano i link: li possiede il parent e la 11.1 ha gia' il
   suo livello. La CTA della 14.7 tiene percio' colore e sottolineatura di
   pagina, esattamente come `.dd-svc-cta` nella 11.9: la resa non cambia.

   Le sotto-sezioni non usate restano DICHIARATE VUOTE, non si saltano: il
   confronto fra child regge solo se lo stesso numero sta nello stesso
   posto ovunque. Mappa autorevole: sunya-page-content-guide.md § 8.

   REVISIONE GRAFICA v2 (2026-09-17, 2.6.0 — strada C): percorsi come tre
   card affiancate (14.4, `.dd-hub__paths`), glifo del servizio inline con
   l'h3 (14.5, modificatore `.dd-hub__svc--<slug>`, immagini dalla 10.1),
   contatore sulle famiglie (14.2), micro-hover sulla CTA (14.7). Testi,
   link, ancore e gerarchia invariati. Le regole nuove che NON richiedono
   classi nuove (contatore, hover) sono consumate anche dalla v1 servita;
   card e glifo compaiono solo con l'incollata della v2.

   DOM di riferimento : wp-sites\dadesign.it\markup\servizi-hub-gutenberg-v2.html
                        (v1, storico: servizi-hub-gutenberg.html)
   Contratto          : wp-sites\dadesign.it\docs\SPEC-HUB-V2-2026-09-17.md
                        (14 originale: SPEC-SEZIONE-HUB-2026-09-03.md)
   ========================================================================== */


/* --------------------------------------------------------------------------
   14.1 Contenitore hub — .dd-page.dd-hub

   Nessuna regola, ed e' voluto: larghezza, tipografia e colore arrivano
   dalla 11.1 attraverso la seconda classe del markup; il lead riusa la
   11.2 senza variante. Se un giorno servisse diverso si scopa
   `.dd-page.dd-hub .dd-lead` — non si inventa un .dd-hub__lead.

   ARIA DI CODA: non dichiarata, come nella 13.1. Dal parent 1.10.3 sta
   dentro l'ultimo blocco della pagina: aggiungerne altra la sommerebbe.
   -------------------------------------------------------------------------- */

/* (nessuna regola — vedi cartiglio) */


/* --------------------------------------------------------------------------
   14.2 Etichetta di famiglia — .dd-hub__group

   E' il titolo di un GRUPPO di servizi ("Servizi web", "Marketing e
   crescita"): lo stesso linguaggio visivo del soprattitolo della 13.2, e
   lo stesso testo che ci si ritrova aprendo la scheda. E' TESTO, non un
   badge: niente pillola, niente sfondo.

   Nel modo C stava su un `div` e non ereditava nulla. Qui sta su un H2, e
   l'H2 di pagina della 11.1 porta 1.4rem, peso 600, `padding-bottom: .3em`
   e un filetto sotto: vanno azzerati esplicitamente, o l'etichetta esce
   grande e sottolineata. Selettore 0,2,0 per battere `.dd-page h2` (0,1,1).
   Lo `scroll-margin-top` che la 11.1 da' agli H2 si lascia ereditare: non
   da' fastidio, e se un giorno una famiglia prende un'ancora e' gia' giusto.

   ⚠️ `margin-top` in TOKEN, non in em, dal 2026-09-03 (child 2.4.0).
   Con `2.6em` su un carattere da 12.48px il margine valeva 32.4px e
   COLLASSAVA con i 2rem della 14.5: misurati in pagina 32px sia al cambio
   di SERVIZIO sia al cambio di FAMIGLIA — due salti gerarchici diversi resi
   con lo stesso spazio. Non era una regressione (la 11.9 faceva uguale), ma
   qui le famiglie sono H2 e i servizi H3: la gerarchia del markup deve
   trovare riscontro nello spazio. Con `--sunya-spacing-2xl` (48px) il
   cambio di famiglia vince il collasso e si legge piu' forte.
   Un em su un carattere piccolo produce un margine piccolo: per gli stacchi
   fra blocchi si usa la scala di spaziatura, non la dimensione del testo.
   ⚠️ CORPO E FILETTO (2026-09-04, 2.5.0). Fino alla 2.4.1 l'etichetta stava
   a .78rem: 12,5px contro i 17,6px degli h3 che deve contenere. Era un
   residuo di provenienza — nella 11.9 era un `div`, la didascalia sopra una
   griglia di card, e li' stava bene piccola. Qui porta un H2 e apre un
   capitolo: il markup diceva una cosa e il disegno un'altra.
   Rimedio scelto: NON alzarla al livello di un titolo (a 20px maiuscolo
   griderebbe, e smetterebbe di leggersi come categoria per competere coi
   nomi dei servizi), ma portarla a .9rem e farle aprire il capitolo con un
   FILETTO sopra. Resta piu' piccola dell'H3 in corpo; sono la riga, il
   maiuscoletto, il teal e i 48px di stacco a darle il grado.
   Il filetto e' lo stesso idioma della 13: `.dd-svc__siblings` apre con
   `border-top` + `padding-top`. Hub e schede parlano cosi' la stessa lingua.

   CONTATORE (2026-09-17, 2.6.0). Le etichette di famiglia prendono una
   cifra `01 02 03` prima del testo: un'indicazione di posizione, non un
   grado — la cifra e' in grigio (text-light), il testo resta in teal.
   Il contatore si azzera su `.dd-hub` e avanza su ogni etichetta; la prima
   ("Da dove partire") NON e' una famiglia del catalogo e non conta:
   `:first-of-type` azzera l'incremento e nasconde la cifra. Stessa
   pseudo-classe gia' usata sotto per il primo stacco, stessa specificita'
   0,3,0. Guarda il TIPO (h2), non la classe: regge finche' l'unico h2
   prima delle famiglie e' "Da dove partire" — se un giorno l'hub prende un
   h2 in testa, la regola va spostata sul secondo.
   Screen reader: la maggior parte legge "zero uno Servizi web". Accettato:
   `content` alternativo non esiste per i counter.

   CORPO RIVISTO (2026-09-17, 2.6.1). La 2.5.0 aveva messo l'etichetta a
   .9rem "sotto l'h3 di proposito, a 20px maiuscolo griderebbe". Quel
   bilanciamento era contro un h3 NUDO da 17,6px; con la 2.6.0 l'h3 porta
   il glifo teal e pesa di piu', e l'etichetta era rimasta la riga debole
   della pagina — visto da Davide sul servito desktop. Provate in locale
   due strade a parita' di scala (etichetta a 1.05rem / cifra a 1.7rem):
   la cifra grande sposta il peso sul numero e lascia la parola debole, e
   la parola e' cio' che deve leggersi. Scelta: etichetta a 1.05rem (16,8px
   maiuscolo, otticamente pari all'h3 a 17,6 minuscolo) con tracking sceso
   a 1.5px per non gridare. La cifra resta in grigio: provata in teal,
   scartata a vista. `min-width` della cifra e' in em e si scala da sola.

   LINEA E STACCO (2026-09-17, 2.6.2). Dopo la 2.6.1 sul servito i tre
   capitoli si distinguevano ancora poco (Davide). Il filetto in
   `--sunya-color-border` (grigio 15%, contrasto 1.23) nell'hub non si vede:
   l'idioma della 13 (`.dd-svc__siblings`) separa due paragrafi, qui deve
   aprire un capitolo. Provate in locale a parita' di scala: A linea 2px teal,
   B stacco 64/32, C entrambe. Scelta C: linea 2px in `accent-ink` (lega la
   riga all'etichetta teal, tre righe in tutto non sono rumore) + stacco
   64 sopra e 32 sotto. 64 = 2xl + md, in calc(), non in px. (Il parent HA
   un --sunya-spacing-3xl = 4rem: la nota "non c'e' un 3xl" era sbagliata,
   rettificata il 2026-09-23; il calc resta, vale uguale.) La prima etichetta ("Da dove partire") non cambia.
   Lo stacco NON si scala sotto 600px, come dalla 2.4.1.
   -------------------------------------------------------------------------- */

.dd-page.dd-hub {
    counter-reset: dd-family;
}

.dd-page .dd-hub__group {
    counter-increment: dd-family;
    margin: calc(var(--sunya-spacing-2xl) + var(--sunya-spacing-md)) 0 .4em;
    padding-top: var(--sunya-spacing-xl);
    padding-bottom: 0;
    border-top: 2px solid var(--sunya-color-accent-ink);
    border-bottom: 0;
    font-family: var(--sunya-font-heading);
    font-size: 1.05rem;
    font-weight: 600;
    letter-spacing: 1.5px;
    text-transform: uppercase;
    color: var(--sunya-color-accent-ink);
}

/* Cifra di posizione: tabulare, larghezza fissa cosi' i tre testi partono
   allineati; `letter-spacing: 0` perche' il tracking dell'etichetta
   allargherebbe anche le cifre. Il colore e' quello del testo secondario,
   non del brand: provata in teal nella 2.6.1, Davide ha preferito il grigio
   — la cifra e' posizione, il grado lo da' la parola. */
.dd-page .dd-hub__group::before {
    content: counter(dd-family, decimal-leading-zero);
    display: inline-block;
    min-width: 2.2em;
    font-variant-numeric: tabular-nums;
    letter-spacing: 0;
    color: var(--sunya-color-text-light);
}

/* La prima etichetta segue il lead, non un blocco di servizi: un capitolo non
   si apre sopra la riga d'introduzione. Niente filetto e niente padding —
   disegnerebbero una linea SOTTO il lead, come se lo chiudessero — e stacco
   ridotto, o si aprirebbe un buco in testa alla pagina.
   Specificita' 0,3,0 (`:first-of-type` conta nella colonna b): batte la regola
   sopra, anche dentro la media query della 14.8. */
.dd-page .dd-hub__group:first-of-type {
    counter-increment: none;
    margin-top: var(--sunya-spacing-lg);
    padding-top: 0;
    border-top: 0;
}

.dd-page .dd-hub__group:first-of-type::before {
    content: none;
}


/* --------------------------------------------------------------------------
   14.3 Introduzione di famiglia — .dd-hub__intro

   Paragrafo normale: dice a chi serve quella famiglia, prima dei servizi.
   Cambia solo la spaziatura — attaccato all'etichetta sopra (che chiude a
   .4em), staccato dal primo blocco sotto. Il colore resta quello di
   pagina: e' contenuto, non una didascalia.
   0,2,0 per battere `.dd-page p` (0,1,1), che aprirebbe .6em sopra.
   -------------------------------------------------------------------------- */

.dd-page .dd-hub__intro {
    margin: 0 0 var(--sunya-spacing-lg);
}


/* --------------------------------------------------------------------------
   14.4 Percorso — .dd-hub__path

   I tre blocchi di "Da dove partire": una domanda del visitatore (h3), una
   o due righe, e i due-tre servizi che rispondono. L'elenco e' fatto di
   LINK, non di voci descrittive: la spaziatura e' piu' stretta di quella
   di un elenco di contenuto.
   I marker riprendono i marker della 13.4: e' lo stesso alfabeto visivo
   fra hub e schede.
   `> :first-child` e `> :last-child` valgono 0,2,0 (la pseudo-classe conta
   nella colonna b) e battono `.dd-page h3` e `.dd-page p` a 0,1,1, che
   altrimenti sfonderebbero il blocco sopra e sotto.

   VARIANTE CARD (2026-09-17, 2.6.0) — `.dd-hub__paths`.
   I tre percorsi sono lo strumento con cui il visitatore SCEGLIE, e sono
   esattamente tre: una riga piena. Dalla v2 del markup stanno in un
   `wp:columns` col contenitore `.dd-hub__paths`; il `.dd-hub__path` dentro
   e' identico e diventa una card. Sopra 782px tre card di pari altezza,
   sotto tre in colonna (stacking del core, nessun attributo nel markup).
   - `.dd-hub__path` nudo (0,1,0) resta col margine di oggi: se un percorso
     vivesse fuori dalle colonne, tiene il comportamento della 2.5.0. Dentro
     le colonne lo batte `.dd-hub__paths .dd-hub__path` (0,2,0) e azzera il
     margine, che altrimenti si sommerebbe al `gap`.
   - Il `gap` sul contenitore (0,2,0) batte il blockGap del layout engine
     (`.wp-block-columns` 0,1,0 + `.wp-container-*`): e' l'unica regola sul
     blocco Columns di tutto il child, il parent non ne ha (blocks.css).
   - NIENTE hover-lift e NIENTE barra gradient: sono il marchio della card
     cliccabile (9.4). Questa contiene tre link distinti: sollevare il
     contenitore mentirebbe.
   - FONDO: `--sunya-color-bg-alt`, NON `--sunya-color-surface`. Verificato
     sul parent 1.11.0 (template-functions.php ~892): `surface` e' la carta
     stessa, lo stesso valore di `--sunya-color-bg` — una card con quel fondo
     sarebbe invisibile. `bg-alt` e' il velo (carta 94% + inchiostro) delle
     zebre e delle fasce alternate, sempre dichiarato, fallback #f8f9fa nel
     :root del parent. Con bordo + velo la card si legge anche in Scuro.
   - Raggio 8px: lo stesso di `.dd-card` (9.4), stesso alfabeto.
   - h3 di lunghezza diversa possono far partire le `ul` a quote diverse:
     accettato in prima stesura, da guardare sul reso (SPEC 14.4).
   -------------------------------------------------------------------------- */

.dd-hub__path {
    margin: var(--sunya-spacing-lg) 0;
}

.dd-page .dd-hub__paths {
    margin: var(--sunya-spacing-lg) 0 0;
    gap: var(--sunya-spacing-md);
}

/* colonna a piena altezza, come 9.4 fa in home: la card riempie la colonna */
.dd-hub__paths .wp-block-column {
    display: flex;
    flex-direction: column;
}

.dd-hub__paths .dd-hub__path {
    flex: 1;
    margin: 0;
    padding: var(--sunya-spacing-md);
    border: 1px solid var(--sunya-color-border);
    border-radius: 8px;
    background: var(--sunya-color-bg-alt);
}

.dd-hub__path > :first-child { margin-top: 0; }
.dd-hub__path > :last-child  { margin-bottom: 0; }

.dd-hub__path ul {
    margin: .5em 0 0;
    padding-left: 1.2em;
}

.dd-hub__path li {
    margin: .3em 0;
}

.dd-hub__path li::marker {
    color: var(--sunya-color-accent-ink);
}


/* --------------------------------------------------------------------------
   14.5 Blocco servizio — .dd-hub__svc

   Otto blocchi in colonna. Niente carta, niente filetto, niente griglia:
   sono otto, e lo STESSO segno ripetuto otto volte diventa rumore; l'h3
   apre gia' il blocco e le tre righe si leggono come un paragrafo solo.

   GLIFO (2026-09-17, 2.6.0). Ogni blocco porta il glifo del suo servizio,
   lo stesso delle card in home (10.1): un segno DIVERSO per ognuno degli
   otto, non lo stesso ripetuto, e sta al posto del marker che i blocchi
   non hanno. Stesso alfabeto, pagina diversa — la frase "nessuna
   decorazione" della 2.5.0 vale ancora per carta, filetti e griglia, non
   piu' per il segno.
   Il glifo sta INLINE con l'h3, non in angolo come in home: li' la card ha
   lo spazio riservato in alto, qui no. L'h3 prende `padding-left` e un
   `::before` assoluto, cosi' resta un h3 normale per tutto il resto
   (`.dd-page h3` non dichiara `position` ne' `padding`: verificato 11.1).
   `top: 50%` centra sul blocco anche quando l'h3 va su due righe (telefono,
   "Advertising Meta e Google"); alternativa `top: .15em` per allinearlo
   alla prima riga — da decidere sul reso.
   LE OTTO IMMAGINI STANNO NELLA 10.1 E NON SI DUPLICANO: il markup v2
   porta `dd-hub__svc--<slug>` con gli stessi suffissi dei `.dd-card--*`, e
   ogni regola `mask-image` della 10.1 ha un secondo selettore
   `.dd-hub__svc--<slug> > h3::before`. La regola di POSIZIONE della 10.1
   resta scopata su `.dd-card h3::before` e non raggiunge l'hub.
   Colore: `--sunya-color-accent-ink` (token puro, come tutta la 14); la
   10.1 usa `--sunya-color-accent-contrast`, che su dadesign vale lo stesso
   `--da-teal` — misurato, non dedotto (vedi handoff 2026-09-17).
   `.dd-hub__svc > h3` (0,1,1) batte `.dd-page h3` (0,1,1) per ordine
   sorgente; il `::before` non ha concorrenza.

   ⚠️ LE ANCORE ORA STANNO SUGLI H3.
   Nel modo C i servizi erano h2 e prendevano lo `scroll-margin-top` che
   la 11.1 da' a `.dd-page h2`; qui sono h3, che quel lascito non ce
   l'ha. Senza la regola sotto, un link con ancora (interno o esterno)
   porta il titolo del servizio sotto l'header fisso.
   Il fallback `80px` e' l'unica eccezione alla regola "niente fallback":
   `--sunya-header-height` non e' dichiarato da nessuna parte nel parent
   (verificato 2026-09-03, zero dichiarazioni; il parent stesso lo consuma
   col fallback in blog.css, sidebar.css e woocommerce.css). Senza
   fallback la calc() sarebbe invalida e lo scroll-margin sparirebbe.
   -------------------------------------------------------------------------- */

.dd-hub__svc {
    margin: var(--sunya-spacing-xl) 0;
}

.dd-hub__svc > :first-child { margin-top: 0; }
.dd-hub__svc > :last-child  { margin-bottom: 0; }

.dd-hub__svc > h3 {
    scroll-margin-top: calc(var(--sunya-header-height, 80px) + var(--sunya-spacing-lg));
}

/* Il glifo: solo posizione, misura e colore. L'immagine arriva dalla 10.1
   attraverso il modificatore `.dd-hub__svc--<slug>`.
   ⚠️ SCOPATO ALLA PRESENZA DEL MODIFICATORE, non a `.dd-hub__svc` nudo.
   Senza `mask-image` un box con `background-color` NON e' vuoto: e' un
   quadrato pieno. Su `.dd-hub__svc > h3` le due regole avrebbero disegnato
   un quadrato teal e 32px di rientro anche sulla v1 servita, che il
   modificatore non ce l'ha — il passo di controllo della SPEC (§5.6: la v1
   live non cambia) sarebbe fallito. `[class*="dd-hub__svc--"]` e' 0,2,1 sull'h3
   e 0,2,2 sul ::before: nessuna concorrenza a quel livello. E' un match di
   sottostringa, ma qui e' il comportamento voluto: "qualunque modificatore". */
.dd-hub__svc[class*="dd-hub__svc--"] > h3 {
    position: relative;
    padding-left: calc(24px + var(--sunya-spacing-sm));
}

.dd-hub__svc[class*="dd-hub__svc--"] > h3::before {
    content: "";
    position: absolute;
    left: 0;
    top: 50%;
    width: 24px;
    height: 24px;
    transform: translateY(-50%);
    background-color: var(--sunya-color-accent-ink);
    -webkit-mask-repeat: no-repeat;
    mask-repeat: no-repeat;
    -webkit-mask-size: contain;
    mask-size: contain;
    -webkit-mask-position: center;
    mask-position: center;
}


/* --------------------------------------------------------------------------
   14.6 Riga "quando invece serve un altro" — .dd-hub__alt

   La riga che manda altrove: piu' piccola e in grigio, perche' e' un
   servizio al lettore, non l'offerta. E' `.dd-who` della 11.9 che cambia
   mestiere — li' diceva "per chi e'", qui dice "per chi NON e'".
   Token: `--sunya-color-text-light`, lo stesso che la 13.10 usa per i
   paragrafi secondari. Su dadesign il testo secondario di pagina e'
   comunque sopra AA sulla carta chiara — da riverificare per misura sulla
   pagina viva, non qui.
   0,2,0 per coerenza con la 13, anche se oggi non c'e' concorrenza sul
   colore: `.dd-page p` dichiara solo il margine.
   -------------------------------------------------------------------------- */

.dd-page .dd-hub__alt {
    font-size: .92rem;
    color: var(--sunya-color-text-light);
}


/* --------------------------------------------------------------------------
   14.7 CTA alla pagina servizio — .dd-hub__cta

   In Gutenberg un link nudo non e' un blocco: la classe sta sul PARAGRAFO
   e il link e' dentro. Copiare la regola di `.dd-svc-cta` (11.9), che
   stava sull'`a`, non avrebbe vestito niente — vedi SPEC § 3.

   MICRO-HOVER (2026-09-17, 2.6.0). La freccia e' testo ("→") dentro il
   link: senza uno span non si muove da sola, quindi si muove tutto il link,
   di 3px. Il `display: inline-flex` c'e' gia': il `transform` non rompe il
   flusso. Rispettato `prefers-reduced-motion`. L'alternativa con
   `<span aria-hidden>` sulla freccia e' rimandata: cambierebbe le otto CTA
   nel post_content per un dettaglio. Questa regola e' gia' consumata dalla
   v1 servita: e' uno dei due cambi visibili prima dell'incollata (con il
   contatore della 14.2).
   -------------------------------------------------------------------------- */

.dd-page .dd-hub__cta {
    margin: .2em 0 0;
}

/* 0,2,1: batte `.dd-page a` (0,1,1) dove serve, e lascia a quella regola
   colore e sottolineatura — la CTA resta un link di pagina. */
.dd-page .dd-hub__cta > a {
    display: inline-flex;
    align-items: center;
    gap: 6px;
    font-weight: 600;
    font-size: .98rem;
    /* `transition` non e' additiva: il parent da' ad ogni `a`
       `color var(--sunya-transition-fast)` (style.css ~190, misurato .15s sul
       servito) e una dichiarazione col solo transform lo cancellerebbe.
       Si ripete col token del parent, non con il valore copiato. */
    transition: color var(--sunya-transition-fast), transform .2s ease;
}

.dd-page .dd-hub__cta > a:hover {
    transform: translateX(3px);
}

.dd-page .dd-hub__cta > a:focus-visible {
    outline: 2px solid var(--sunya-color-accent-ink);
    outline-offset: 2px;
}

@media (prefers-reduced-motion: reduce) {
    .dd-page .dd-hub__cta > a { transition: none; }
    .dd-page .dd-hub__cta > a:hover { transform: none; }
}


/* --------------------------------------------------------------------------
   14.8 Responsive

   Stesso breakpoint della 11.1 e della 13.11 (600px), cosi' tipografia di
   pagina e sezione cambiano passo insieme.
   I selettori ripetono per intero quelli sopra: una media query NON alza
   la specificita', e `.dd-hub__group` nudo (0,1,0) perderebbe contro il
   `.dd-page .dd-hub__group` (0,2,0) dichiarato nella 14.2.

   ⚠️ LO STACCO DI FAMIGLIA NON SI SCALA (corretto il 2026-09-03, 2.4.1).
   Fino alla 2.4.0 qui il `margin-top` dell'etichetta scendeva a
   `--sunya-spacing-xl` (32px) contro i 24px dei servizi: otto pixel di
   differenza su un carattere sceso a .72rem, e su telefono le tre famiglie
   non aprivano piu' un capitolo — sembravano righe come le altre in mezzo a
   quattordici blocchi dallo stesso passo. Verificato su schermo reale.
   Il valore della 14.2 (48px, dalla 2.6.2 64px) vale ora anche sotto i 600px, e per questo la
   dichiarazione qui e' STATA TOLTA invece che ripetuta: un valore ripetuto
   e' un valore che prima o poi diverge da quello che copia.
   Su schermo stretto 48px non sono troppi: il testo e' piu' piccolo, quindi
   il rapporto fra lo stacco e la riga e' persino piu' forte che su desktop.
   -------------------------------------------------------------------------- */

@media (max-width: 600px) {

    .dd-page .dd-hub__group {
        padding-top: var(--sunya-spacing-lg);   /* 2.6.2: era md, segue i 32 desktop */
        font-size: .95rem;      /* 2.6.1: era .82, segue il corpo della 14.2 */
        letter-spacing: 1.2px;
    }

    .dd-page .dd-hub__intro {
        margin-bottom: var(--sunya-spacing-md);
    }

    .dd-hub__path {
        margin: var(--sunya-spacing-md) 0;
    }

    /* Card percorso (2.6.0): padding ridotto; il margine resta 0, la regola
       0,2,0 della 14.4 batte comunque il `.dd-hub__path` qui sopra. */
    .dd-hub__paths .dd-hub__path {
        padding: var(--sunya-spacing-sm) var(--sunya-spacing-md);
    }

    .dd-hub__svc {
        margin: var(--sunya-spacing-lg) 0;
    }

    /* Glifo (2.6.0): scende a 20px, il rientro dell'h3 lo segue. */
    .dd-hub__svc[class*="dd-hub__svc--"] > h3 {
        padding-left: calc(20px + var(--sunya-spacing-sm));
    }

    .dd-hub__svc[class*="dd-hub__svc--"] > h3::before {
        width: 20px;
        height: 20px;
    }
}


/* ==========================================================================
   15. PAGINA LAVORO (blocchi Gutenberg — modo B)

   Slot semantico condiviso fra i child: la SCHEDA del singolo lavoro,
   quella che si apre da una tessera lavoro (9.10 in home, e dalla futura
   16, indice /lavori/). Prima applicazione dadesign.it, 2026-09-23, sei
   pagine figlie di /lavori/. Contratto:
   sunya\docs\SPEC-2026-09-22-sezione-15-lavori.md

   Il numero: fino al 22/09 la 15 era prenotata per l'INDICE portfolio.
   L'indice non si fa ora (Davide, P0, 23/09): la 15 passa alla pagina
   lavoro, l'indice prendera' la 16.

   ⚠️ RICHIEDE PARENT >= 1.10.0. Soli token --sunya-*, nessun fallback
   esadecimale: condizione per riappenderla su un altro child. Dipende
   dalla 10.5 (grafica della testata) e dalla 11.1 (tipografia, link,
   bottoni: il markup porta class="dd-page dd-work"). Mai `.dd-work` nuda.

   DUE VARIANTI NELLO STESSO CSS, scelte dal MARKUP:
     B  corpo = colonna di lettura 36rem centrata, h2 normali della 11.1
     C  corpo diviso in capitoli `.dd-work__chapter` (Gruppi): etichetta a
        sinistra, testo a destra, sopra i 1024px. L'interruttore e'
        `:has(.dd-work__chapter)` sul contenitore: una pagina senza
        capitoli rende B senza nessuna regola della C.

   STRUTTURA (post_content):
     div.dd-page.dd-work (Gruppo constrained)
       div.dd-work__head   (Gruppo flow)  testata scura, grafica 10.5
         figure.dd-work__logo (Immagine, alt="")
         div.dd-work__title (Gruppo flow): p.dd-work__eyebrow, h1, p.dd-work__intro
       div.dd-work__facts  (Gruppo flow)  dati in riga
         div.dd-work__fact x 3-4 (Gruppo): p.dd-work__label + p valore
       div.dd-work__body   (Gruppo flow)
         B: p.dd-lead, h2, p ...
         C: div.dd-work__chapter x 3 (Gruppo flow): h2 + p ...
         div.dd-work__end  (Gruppo flow): Pulsanti + div.dd-work__others

   ⚠️ Il contenitore e' un Gruppo CONSTRAINED: i figli prendono
   `margin-inline: auto !important` e max-width = content size. Qui e'
   quello che si vuole (testata e dati larghi quanto la pagina, corpo
   stretto e centrato): si stringe solo il corpo, con max-width.
   ⚠️ Testata, dati e capitoli sono GRIGLIE: i margini dei figli non
   collassano. Ogni griglia azzera i margini dei figli e mette lo stacco
   col gap o con un margine solo.

   Le sotto-sezioni non usate restano DICHIARATE VUOTE.
   ========================================================================== */


/* --------------------------------------------------------------------------
   15.1 Contenitore pagina lavoro

   Nessuna regola sul contenitore, come la 13.1 e la 14.1: larghezza,
   tipografia, colore e bottoni arrivano dalla 11.1. Solo il contatore dei
   capitoli (15.5), che deve azzerarsi per pagina.
   ARIA DI CODA: non dichiarata, la mette il parent (>= 1.10.3).
   -------------------------------------------------------------------------- */

.dd-page.dd-work {
    counter-reset: dd-chapter;
}


/* --------------------------------------------------------------------------
   15.2 Testata visiva — .dd-work__head

   Pannello scuro con la grafica della 10.5 (la stessa della tessera che si
   e' cliccata), titolo a sinistra e logo a destra sopra i 1024px; sotto,
   logo sopra e titolo sotto.
   Il logo qui e' A COLORI (sulla tessera lo e' solo all'hover). Per un logo
   che sul fondo scuro non regge: classe `dd-work__head--mono` sulla
   testata, stesso filtro della tessera.
   Colori: il testo della testata e' esplicito, perche' `.dd-page` porta
   `text-on-light` e gli h1 del tema il colore dei titoli su chiaro —
   sul pannello scuro sarebbero scuri su scuro.
   -------------------------------------------------------------------------- */

.dd-page.dd-work > .dd-work__head {
    display: grid;
    grid-template-columns: minmax(0, 1fr);
    gap: var(--sunya-spacing-lg);
    padding: var(--sunya-spacing-xl) var(--sunya-spacing-lg);
    border-radius: var(--sunya-radius-lg);
    color: var(--sunya-color-text-on-dark);
}

.dd-page.dd-work > .dd-work__head > * {
    margin: 0;
}

.dd-page.dd-work .dd-work__logo {
    display: flex;
    align-items: center;
    justify-content: flex-start;
    height: 6rem;
    margin: 0;
}

.dd-page.dd-work .dd-work__logo img {
    width: auto;
    height: auto;
    max-width: 70%;
    max-height: 100%;
    object-fit: contain;
}

.dd-page.dd-work > .dd-work__head--mono .dd-work__logo img {
    filter: brightness(0) invert(1);
    opacity: .92;
}

.dd-page.dd-work .dd-work__title > * {
    margin-block: 0;
}

.dd-page.dd-work .dd-work__eyebrow {
    margin-bottom: var(--sunya-spacing-sm);
    font-family: var(--sunya-font-heading);
    font-size: .78rem;
    font-weight: 600;
    letter-spacing: 2px;
    text-transform: uppercase;
    color: var(--sunya-color-accent-ink-on-dark);
}

.dd-page.dd-work .dd-work__head h1 {
    color: var(--sunya-color-text-on-dark);
}

.dd-page.dd-work .dd-work__intro {
    margin-top: var(--sunya-spacing-sm);
    max-width: 36rem;
    font-size: 1.05rem;
    color: color-mix(in oklab, var(--sunya-color-text-on-dark) 82%, var(--sunya-color-surface-dark));
}

@media (min-width: 1025px) {

    .dd-page.dd-work > .dd-work__head {
        grid-template-columns: minmax(0, 1fr) minmax(0, 20rem);
        grid-template-areas: "title logo";
        align-items: center;
        column-gap: calc(var(--sunya-spacing-2xl) + var(--sunya-spacing-md));
        padding: var(--sunya-spacing-2xl) calc(var(--sunya-spacing-2xl) + var(--sunya-spacing-md));
    }

    .dd-page.dd-work > .dd-work__head > .dd-work__title {
        grid-area: title;
    }

    .dd-page.dd-work > .dd-work__head > .dd-work__logo {
        grid-area: logo;
        justify-content: center;
        height: 9rem;
    }

    .dd-page.dd-work .dd-work__logo img {
        max-width: 100%;
    }
}


/* --------------------------------------------------------------------------
   15.3 Dati — .dd-work__facts

   Settore, anno, servizi (link alle pagine della 13), sito. Una riga di
   coppie etichetta/valore sotto la testata; va a capo da sola
   (auto-fit), due per riga sul telefono.
   Niente <dl>: Gutenberg non ha un blocco lista di definizioni, e un
   blocco HTML dentro una pagina modo B e' il primo passo verso il modo C.
   Coppie di paragrafi dentro un Gruppo: leggibili nell'editor.
   -------------------------------------------------------------------------- */

.dd-page.dd-work > .dd-work__facts {
    display: grid;
    grid-template-columns: repeat(auto-fit, minmax(11rem, 1fr));
    gap: var(--sunya-spacing-lg) var(--sunya-spacing-xl);
    margin-top: 0;
    padding: var(--sunya-spacing-lg) 0;
    border-bottom: 1px solid var(--sunya-color-border);
}

.dd-page.dd-work > .dd-work__facts > .dd-work__fact {
    margin: 0;
}

.dd-page.dd-work .dd-work__fact > p {
    margin: 0;
    font-size: .95rem;
    line-height: 1.5;
}

.dd-page.dd-work .dd-work__fact > .dd-work__label {
    margin-bottom: var(--sunya-spacing-xs);
    font-family: var(--sunya-font-heading);
    font-size: .75rem;
    font-weight: 600;
    letter-spacing: 1.5px;
    text-transform: uppercase;
    color: var(--sunya-color-text-light);
}


/* --------------------------------------------------------------------------
   15.4 Corpo — .dd-work__body

   Variante B: colonna di lettura 36rem (~79 caratteri, la misura della 13
   v2), centrata dal constrained del contenitore.
   Variante C: sopra i 1024px il corpo si allarga di etichetta + stacco, e
   tutto cio' che NON e' un capitolo (lead, chiusura) si allinea alla
   colonna del testo dei capitoli, non al bordo dell'etichetta.
   -------------------------------------------------------------------------- */

.dd-page.dd-work > .dd-work__body {
    max-width: 36rem;
    margin-top: var(--sunya-spacing-xl);
}

.dd-page.dd-work > .dd-work__body > :first-child {
    margin-top: 0;
}

@media (min-width: 1025px) {

    .dd-page.dd-work:has(.dd-work__chapter) > .dd-work__body {
        max-width: calc(13rem + var(--sunya-spacing-2xl) + 36rem);
    }

    .dd-page.dd-work:has(.dd-work__chapter) > .dd-work__body > :not(.dd-work__chapter) {
        margin-left: calc(13rem + var(--sunya-spacing-2xl));
    }
}


/* --------------------------------------------------------------------------
   15.5 Capitoli (solo variante C) — .dd-work__chapter

   Tre capitoli: "Il punto di partenza / Cosa ho fatto / Com'e' andata".
   Stesso idioma dell'etichetta di famiglia della 14.2, cosi' hub e pagine
   lavoro parlano la stessa lingua: filetto 2px accent-ink, stacco 64/32,
   maiuscoletto teal, cifra 01 02 03 in grigio.
   Differenza dalla 14.2: qui la regola e' sul GRUPPO del capitolo (il
   filetto attraversa etichetta e testo), e l'H2 e' solo l'etichetta.

   Sopra i 1024px il capitolo e' una griglia: etichetta nella prima
   colonna, su tutte le righe; testo nella seconda. Le righe sono
   implicite: `span 20` crea righe vuote ad altezza zero, quindi NIENTE
   row-gap (venti gap vuoti si sommerebbero) — lo stacco fra paragrafi e'
   un margine sul secondo in poi.
   -------------------------------------------------------------------------- */

.dd-page.dd-work .dd-work__chapter {
    counter-increment: dd-chapter;
    margin-top: calc(var(--sunya-spacing-2xl) + var(--sunya-spacing-md));
    padding-top: var(--sunya-spacing-xl);
    border-top: 2px solid var(--sunya-color-accent-ink);
}

.dd-page.dd-work .dd-work__body > .dd-work__chapter:first-child {
    margin-top: 0;
}

.dd-page.dd-work .dd-work__chapter > * {
    margin-block: 0;
}

.dd-page.dd-work .dd-work__chapter > * + * {
    margin-top: .9em;
}

.dd-page.dd-work .dd-work__chapter > h2 {
    padding: 0;
    border: 0;
    font-size: 1.05rem;
    font-weight: 600;
    letter-spacing: 1.5px;
    line-height: 1.35;
    text-transform: uppercase;
    color: var(--sunya-color-accent-ink);
}

.dd-page.dd-work .dd-work__chapter > h2::before {
    content: counter(dd-chapter, decimal-leading-zero);
    display: inline-block;
    min-width: 2.2em;
    font-variant-numeric: tabular-nums;
    letter-spacing: 0;
    color: var(--sunya-color-text-light);
}

@media (min-width: 1025px) {

    .dd-page.dd-work .dd-work__chapter {
        display: grid;
        grid-template-columns: 13rem minmax(0, 36rem);
        column-gap: var(--sunya-spacing-2xl);
        align-items: start;
    }

    .dd-page.dd-work .dd-work__chapter > * {
        grid-column: 2;
    }

    .dd-page.dd-work .dd-work__chapter > h2 {
        grid-column: 1;
        grid-row: 1 / span 20;
    }

    /* L'etichetta sta accanto al primo paragrafo: il secondo figlio non
       prende il margine del "dopo un fratello". */
    .dd-page.dd-work .dd-work__chapter > h2 + * {
        margin-top: 0;
    }

    /* Due righe al massimo: la cifra si mette sopra la parola. */
    .dd-page.dd-work .dd-work__chapter > h2::before {
        display: block;
        margin-bottom: var(--sunya-spacing-xs);
    }
}


/* --------------------------------------------------------------------------
   15.6 Servizi usati — VUOTA

   Il ruolo lo fa il dato "Servizi" della 15.3, con i link alle pagine
   della 13. Una lista in coda lo ripeterebbe.
   -------------------------------------------------------------------------- */


/* --------------------------------------------------------------------------
   15.7 Chiusura: CTA — .dd-work__end

   Pulsante della 11.6 (base bottoni delle pagine .dd-page), nessuna regola
   sul pulsante. Qui solo lo stacco e il filetto che chiudono il racconto.
   -------------------------------------------------------------------------- */

.dd-page.dd-work .dd-work__end {
    margin-top: calc(var(--sunya-spacing-2xl) + var(--sunya-spacing-md));
    padding-top: var(--sunya-spacing-xl);
    border-top: 1px solid var(--sunya-color-border);
}

.dd-page.dd-work .dd-work__end > * {
    margin-block: 0;
}

.dd-page.dd-work .dd-work__end > * + * {
    margin-top: var(--sunya-spacing-xl);
}


/* --------------------------------------------------------------------------
   15.8 Altri lavori — .dd-work__others

   Stesso ruolo dei servizi fratelli della 13.10: un'etichetta e i link in
   riga. Nomi propri della 15, nessuna dipendenza dalla 13.
   -------------------------------------------------------------------------- */

.dd-page.dd-work .dd-work__others > * {
    margin-block: 0;
}

.dd-page.dd-work .dd-work__others > p:first-child {
    font-family: var(--sunya-font-heading);
    font-size: .75rem;
    font-weight: 600;
    letter-spacing: 1.5px;
    text-transform: uppercase;
    color: var(--sunya-color-text-light);
}

.dd-page.dd-work .dd-work__others ul {
    display: flex;
    flex-wrap: wrap;
    gap: var(--sunya-spacing-xs) var(--sunya-spacing-lg);
    margin-top: var(--sunya-spacing-sm);
    padding: 0;
    list-style: none;
}


/* --------------------------------------------------------------------------
   15.9 Responsive

   Le due griglie (testata, capitoli) si accendono sopra i 1024px, come la
   13 v2: sotto non c'e' nulla da spegnere. Qui solo il passo tipografico
   dei 600px della 11.1 e della 14.8.
   -------------------------------------------------------------------------- */

@media (max-width: 600px) {

    .dd-page.dd-work > .dd-work__facts {
        grid-template-columns: repeat(2, minmax(0, 1fr));
        gap: var(--sunya-spacing-md);
    }

    .dd-page.dd-work .dd-work__logo {
        height: 5rem;
    }

    .dd-page.dd-work .dd-work__chapter > h2 {
        font-size: .95rem;
        letter-spacing: 1.2px;
    }
}
