/* ==========================================================================
   SUNYA - Core Blocks + Pattern Utilities (v1.4.0)

   Copertura frontend dei blocchi Gutenberg core: table, quote, pullquote,
   button, separator, image caption (roadmap #0, v1.3.x) + utility neutre
   dei block patterns (sezione in coda, v1.4.0).

   REGOLE DI SPECIFICITA':
   - Selettori normali: vincono su wp-block-library per ordine sorgente.
   - Guardie colore in :where(:not(.has-*)) a PESO ZERO (v1.3.1): la
     specificita' resta quella del selettore base, cosi' i child pareggiano
     e vincono per ordine sorgente anche con selettori semplici (0,1,0).
   - MAI sovrascrivere .has-background / .has-text-color: i colori scelti
     in editor vincono sempre.
   - Valori sempre da token --sunya-* con fallback: i child ritemano
     ridefinendo i token nel proprio :root.

   PARITA' EDITOR: questo file e' caricato anche via add_editor_style()
   (WP prefissa i selettori con .editor-styles-wrapper). Unica fonte di
   verita' per il look dei blocchi. Niente regole editor-only qui.
   ========================================================================== */


/* --------------------------------------------------------------------------
   Button (wp-block-button)

   Stesso linguaggio di .sunya-btn--primary (css/buttons.css): accent,
   radius-md, hover lift. Le guardie :not(.has-background) e
   :not(.has-text-color) lasciano vincere i colori scelti in editor e le
   regole child piu' specifiche (es. .dd-btn--primary .wp-block-button__link).
   -------------------------------------------------------------------------- */

.wp-block-button__link {
    display: inline-flex;
    align-items: center;
    justify-content: center;
    gap: var(--sunya-spacing-sm, 0.5rem);
    padding: 0.75em 1.75em;
    font-family: var(--sunya-font-body, inherit);
    font-size: var(--sunya-font-size-base, 1rem);
    font-weight: var(--sunya-font-weight-medium, 500);
    line-height: 1.4;
    text-decoration: none;
    border: 2px solid transparent;
    border-radius: var(--sunya-radius-md, 8px);
    cursor: pointer;
    transition: color var(--sunya-transition-base, 250ms ease),
                background-color var(--sunya-transition-base, 250ms ease),
                border-color var(--sunya-transition-base, 250ms ease),
                box-shadow var(--sunya-transition-base, 250ms ease),
                transform var(--sunya-transition-fast, 150ms ease);
}

/* Colori default: solo senza scelte esplicite dell'editor.
   v1.3.1: guardie in :where() a peso zero — la specificita' resta quella
   del selettore base, cosi' le regole bottone dei child (anche a 0,1,0
   come roxzone) vincono per ordine sorgente. Il :not() nudo (0,2,0/0,2,1)
   batteva l'hover dei child e imponeva accent-hover (rosso default). */
.wp-block-button__link:where(:not(.has-background)) {
    background-color: var(--sunya-color-accent);
    border-color: var(--sunya-color-accent);
}

.wp-block-button__link:where(:not(.has-text-color)) {
    color: var(--sunya-color-on-accent, #ffffff);
}

.wp-block-button__link:where(:not(.has-text-color)):hover,
.wp-block-button__link:where(:not(.has-text-color)):focus-visible {
    color: var(--sunya-color-on-accent-hover, var(--sunya-color-on-accent, #ffffff));
}

.wp-block-button__link:where(:not(.has-background)):hover,
.wp-block-button__link:where(:not(.has-background)):focus-visible {
    background-color: var(--sunya-color-accent-hover);
    border-color: var(--sunya-color-accent-hover);
    box-shadow: 0 4px 12px color-mix(in srgb, var(--sunya-color-accent) 30%, transparent);
}

/* Motion language del tema: lift su hover, sempre */
.wp-block-button__link:hover {
    transform: translateY(-2px);
}

.wp-block-button__link:active {
    transform: translateY(0);
    box-shadow: none;
}

/* Variante outline (core style) — stesse guardie :where() a peso zero:
   specificita' 0,3,0/0,3,1, pareggiabile e vincibile dai child */
/* v1.7.5: qui l'accent e' INCHIOSTRO (il bordo segue via currentColor),
   quindi va su accent-ink, che segue la superficie. Stesso difetto e
   stessa correzione di .sunya-btn--outline in buttons.css: sull'accent
   nudo il contorno spariva sulle superfici chiare. Le guardie :where()
   e la specificita' 0,3,0 restano invariate. */
.wp-block-button.is-style-outline > .wp-block-button__link:where(:not(.has-text-color)) {
    color: var(--sunya-color-accent-ink, var(--sunya-color-accent));
}

.wp-block-button.is-style-outline > .wp-block-button__link:where(:not(.has-background)) {
    background-color: transparent;
    border-color: currentColor;
    box-shadow: none;
}

.wp-block-button.is-style-outline > .wp-block-button__link:where(:not(.has-background)):where(:not(.has-text-color)):hover,
.wp-block-button.is-style-outline > .wp-block-button__link:where(:not(.has-background)):where(:not(.has-text-color)):focus-visible {
    background-color: var(--sunya-color-accent);
    border-color: var(--sunya-color-accent);
    color: var(--sunya-color-on-accent, #ffffff);
}


/* --------------------------------------------------------------------------
   Inchiostro accent dentro le superfici scure (v1.7.6)

   accent-ink segue la MODALITA' del sito, ma una sezione surface-dark e'
   un'isola scura anche in Chiara: li' l'inchiostro tarato sulla carta
   chiara e' illeggibile. Misurato sul lab il 15/08 con la v1.7.5:
   pulsante contorno del pattern hero a 1.05 su #0a0a0a — invisibile,
   peggio del difetto che la v1.7.5 correggeva (1.23).

   Si ridefinisce il TOKEN sul contenitore, non il colore sul pulsante:
   una riga sola copre .sunya-btn--outline, --ghost, il bottone core
   is-style-outline e qualunque futuro consumatore, per eredita'.

   Stesso set di selettori gia' usato in questo file per le superfici
   (stili di blocco + preset has-*, perche' le pagine gia' fatte usano i
   preset). Specificita' (0,1,0): un child pareggia e vince per ordine
   sorgente, come per gli altri token.

   In modalita' Scuro accent-ink vale gia' accent-ink-on-dark: qui la
   regola e' un no-op, non un secondo comportamento da collaudare.
   -------------------------------------------------------------------------- */

.is-style-sunya-dark,
.is-style-sunya-dark-alt,
.has-surface-dark-background-color,
.has-surface-dark-alt-background-color {
    --sunya-color-accent-ink: var(--sunya-color-accent-ink-on-dark, var(--sunya-color-accent-bright, var(--sunya-color-accent)));
    --sunya-color-accent-ink-hover: color-mix(in oklab, var(--sunya-color-accent-ink-on-dark, var(--sunya-color-accent-bright, var(--sunya-color-accent))) 82%, white);
}


/* --------------------------------------------------------------------------
   Quote (wp-block-quote)
   -------------------------------------------------------------------------- */

.wp-block-quote {
    margin-top: var(--sunya-spacing-xl, 2rem);
    margin-bottom: var(--sunya-spacing-xl, 2rem);
    padding-block: var(--sunya-spacing-sm, 0.5rem);
    padding-inline-start: var(--sunya-spacing-lg, 1.5rem);
    border-inline-start: 3px solid var(--sunya-color-accent);
}

.wp-block-quote p {
    font-size: var(--sunya-font-size-lg, 1.125rem);
    line-height: 1.6;
}

.wp-block-quote cite {
    display: block;
    margin-top: var(--sunya-spacing-sm, 0.5rem);
    font-size: var(--sunya-font-size-sm, 0.875rem);
    font-style: normal;
    color: var(--sunya-color-text-light, #6b7280);
}

/* Stile "plain" (core): niente barra laterale */
.wp-block-quote.is-style-plain {
    border-inline-start: none;
    padding-inline-start: 0;
}


/* --------------------------------------------------------------------------
   Pullquote (wp-block-pullquote)
   -------------------------------------------------------------------------- */

.wp-block-pullquote {
    margin-top: var(--sunya-spacing-xl, 2rem);
    margin-bottom: var(--sunya-spacing-xl, 2rem);
    padding: var(--sunya-spacing-xl, 2rem) 0;
    border-top: 3px solid var(--sunya-color-accent);
    border-bottom: 3px solid var(--sunya-color-accent);
    text-align: center;
}

.wp-block-pullquote blockquote {
    margin: 0;
    border: none;
    padding: 0;
}

.wp-block-pullquote p {
    font-size: var(--sunya-font-size-xl, 1.25rem);
    line-height: 1.4;
}

.wp-block-pullquote cite {
    display: block;
    margin-top: var(--sunya-spacing-sm, 0.5rem);
    font-size: var(--sunya-font-size-sm, 0.875rem);
    font-style: normal;
    color: var(--sunya-color-text-light, #6b7280);
}


/* --------------------------------------------------------------------------
   Table (wp-block-table)
   Header scuro + righe zebrate: replica il look gia' definito in editor.
   Il wrapper <figure> scrolla in orizzontale su viewport stretti.
   -------------------------------------------------------------------------- */

.wp-block-table {
    margin-top: var(--sunya-spacing-lg, 1.5rem);
    margin-bottom: var(--sunya-spacing-lg, 1.5rem);
    overflow-x: auto;
}

.wp-block-table table {
    width: 100%;
    border-collapse: collapse;
    margin-bottom: 0;
}

.wp-block-table thead {
    border-bottom: none;
}

.wp-block-table th {
    /* v1.5.4: surface-dark coincideva con lo sfondo pagina in modalita'
       Scuro e la riga di testata spariva. surface-dark-alt e' staccata in
       entrambe le modalita': scura sul chiaro, rialzata sullo scuro. */
    background-color: var(--sunya-color-surface-dark-alt, var(--sunya-color-surface-dark, #1a1a2e));
    color: var(--sunya-color-text-on-dark, #ffffff);
    text-align: start;
    padding: var(--sunya-spacing-sm, 0.5rem) var(--sunya-spacing-md, 1rem);
    font-size: var(--sunya-font-size-sm, 0.875rem);
    font-weight: var(--sunya-font-weight-bold, 700);
    border: none;
}

.wp-block-table td {
    padding: var(--sunya-spacing-sm, 0.5rem) var(--sunya-spacing-md, 1rem);
    border: none;
    border-bottom: 1px solid var(--sunya-color-border, #e5e7eb);
    font-size: var(--sunya-font-size-sm, 0.875rem);
}

/* Zebra di default (parita' con l'editor). Esclusa la variante stripes
   che ha la propria zebra sulle righe dispari.
   v1.5.5: --sunya-color-bg-alt non e' mai stato emesso da nessuna parte,
   quindi la riga cadeva sul fallback #f8f9fa: in modalita' Scuro una
   riga chiara con testo chiaro sopra. Ora e' un velo derivato dallo
   sfondo pagina, come la barra breadcrumb. */
.wp-block-table:not(.is-style-stripes) tbody tr:nth-child(even) {
    background-color: var(--sunya-color-bg-alt, color-mix(in oklab, var(--sunya-color-bg, #ffffff) 94%, var(--sunya-color-text, #1a1a2e)));
}

/* Variante stripes (core): riallineata ai token, senza bordo figure */
.wp-block-table.is-style-stripes {
    border-bottom: none;
}

.wp-block-table.is-style-stripes tbody tr:nth-child(odd) {
    background-color: var(--sunya-color-bg-alt, color-mix(in oklab, var(--sunya-color-bg, #ffffff) 94%, var(--sunya-color-text, #1a1a2e)));
}


/* --------------------------------------------------------------------------
   Separator (wp-block-separator)
   Il colore custom scelto in editor (.has-text-color) vince sempre.
   -------------------------------------------------------------------------- */

.wp-block-separator {
    border: none;
    border-top: 1px solid;
    margin-top: var(--sunya-spacing-xl, 2rem);
    margin-bottom: var(--sunya-spacing-xl, 2rem);
}

.wp-block-separator:where(:not(.has-text-color)) {
    border-top-color: var(--sunya-color-border, #e5e7eb);
}

.wp-block-separator.is-style-wide {
    border-top-width: 2px;
}

/* Dots: il glifo "..." lo genera il core via ::before, qui solo colore */
.wp-block-separator.is-style-dots {
    border: none;
    background: none;
    height: auto;
    text-align: center;
}

.wp-block-separator.is-style-dots:where(:not(.has-text-color)) {
    color: var(--sunya-color-accent);
}


/* --------------------------------------------------------------------------
   Image / Caption condivise
   Nota: .sunya-entry-content > .alignfull img { border-radius: 0 } in
   style.css (0,2,1) vince su questa regola (0,1,1) per le immagini full.
   -------------------------------------------------------------------------- */

.wp-block-image img {
    border-radius: var(--sunya-radius-md, 8px);
}

.wp-block-image figcaption,
.wp-block-table figcaption,
.wp-block-embed figcaption,
.wp-block-gallery figcaption {
    font-size: var(--sunya-font-size-sm, 0.875rem);
    color: var(--sunya-color-text-light, #6b7280);
    text-align: center;
    margin-top: var(--sunya-spacing-sm, 0.5rem);
    margin-bottom: 0;
}


/* --------------------------------------------------------------------------
   Columns (wp-block-columns)

   Nessuna regola necessaria: layout, gap (blockGap) e stacking mobile
   (<782px) sono gestiti da wp-block-library + layout engine di WP.
   Il ritmo verticale arriva dal blockGap del contenitore: aggiungere
   margini qui creerebbe doppia spaziatura. Sezione tenuta come
   documentazione della copertura.
   -------------------------------------------------------------------------- */


/* ==========================================================================
   PATTERN UTILITIES (v1.4.0)

   Design system dei block patterns (inc/block-patterns.php): utility
   neutre riusabili su tutti i siti. Porting delle dd-* validate in
   produzione su dadesign.it, colori SOLO via token --sunya-*.

   NAMING (anti-collisione): .sunya-card, .sunya-btn--*, .sunya-section
   sono GIA' occupati (cards.css, buttons.css, page-templates.css).
   Qui: .sunya-info-card, .sunya-pattern-*, bottoni via is-style-outline
   del core (stilato sopra). Stesse regole di specificita' del file:
   guardie in :where() a peso zero, i child vincono per ordine sorgente.
   ========================================================================== */

/* Sezione pattern: solo ritmo verticale. Il padding laterale arriva da
   has-global-padding (v1.2.9) sui gruppi alignfull constrained. */
.sunya-pattern-section {
    padding-top: var(--sunya-spacing-2xl, 3rem);
    padding-bottom: var(--sunya-spacing-2xl, 3rem);
}

/* Heading sulle superfici del design system (v1.4.1, completata v1.4.2).
   Il textColor del gruppo colora la sezione, ma parent E child colorano
   gli heading SULL'ELEMENTO: senza inherit l'H1 resta scuro su scuro
   (davidearduini/sportpix, v1.4.1) o chiaro su chiaro (roxzone, brand
   dark con heading chiari, sezioni light dei pattern — v1.4.2).
   Specificita' 0,3,0 (gruppo + doppia classe, :where a zero): batte le
   regole heading dei child fino a 0,2,0 compresa
   `.sunya-entry-content .wp-block-heading` (roxzone) — che a 0,2,0
   pareggiava e vinceva per ordine sorgente, il child carica dopo il
   parent. Perde da .has-*-color (core, !important). `.wp-block-group`
   e `.has-background` accompagnano sempre le sezioni pattern con
   preset di sfondo: il selettore non aggiunge condizioni reali. */
.wp-block-group.has-surface-dark-background-color.has-background :where(h1, h2, h3, h4, h5, h6),
.wp-block-group.has-surface-dark-alt-background-color.has-background :where(h1, h2, h3, h4, h5, h6),
.wp-block-group.has-surface-light-background-color.has-background :where(h1, h2, h3, h4, h5, h6) {
    color: inherit;
}


/* --------------------------------------------------------------------------
   SUPERFICI COME STILI DI BLOCCO (v1.6.0)

   I pattern non impostano piu' backgroundColor/textColor come attributi:
   dichiarano una SUPERFICIE tramite stile di blocco (register_block_style()
   in inc/block-patterns.php). Tre conseguenze volute:

   1. I colori escono dal post_content. Rinominare uno slug della palette
      non richiede piu' una migrazione DB — e' il problema che ha rotto
      dadesign il 2026-08-12.
   2. La sezione risponde alla modalita' Chiaro/Scuro senza essere
      reinserita: cambia il token, non il markup.
   3. La scelta in editor diventa di RUOLO ("questa sezione e' scura"),
      non di tinta.

   PERCHE' NON SI PUO' AVERE ENTRAMBI: le classi core has-*-background-color
   sono emesse con !important da wp-block-library. Finche' un blocco porta
   l'attributo backgroundColor, nessuno stile di blocco puo' vincere senza
   ricorrere a !important nel parent. Da qui la scelta di togliere
   l'attributo (decisione 2026-08-14).

   MIGRAZIONE: le sezioni gia' inserite in pagina conservano le classi
   has-* e restano corrette — le regole sopra continuano a coprirle — ma
   non rispondono allo switch finche' non vengono reinserite.
   -------------------------------------------------------------------------- */

.wp-block-group.is-style-sunya-dark {
    background-color: var(--sunya-color-surface-dark, #1a1a2e);
    color: var(--sunya-color-text-on-dark, #ffffff);
}

/* Superficie scura "rialzata": staccata dal fondo pagina in ENTRAMBE le
   modalita' (in Scuro surface-dark coincide con lo sfondo della pagina). */
.wp-block-group.is-style-sunya-dark-alt {
    background-color: var(--sunya-color-surface-dark-alt, var(--sunya-color-surface-dark, #16213e));
    color: var(--sunya-color-text-on-dark, #ffffff);
}

/* In modalita' Scuro il token surface-light e' gia' invertito a monte
   (inc/template-functions.php): la sezione diventa un pannello scuro
   rialzato senza che questa regola cambi. */
.wp-block-group.is-style-sunya-light {
    background-color: var(--sunya-color-surface-light, #f8f9fa);
    color: var(--sunya-color-text-on-light, #2d2d2d);
}

/* Heading: stessa necessita' delle superfici a preset — il color della
   sezione si eredita, ma parent e child colorano gli heading SULL'ELEMENTO.

   CLASSE RADDOPPIATA, non `.sunya-entry-content` (correzione 2026-08-14).
   Il primo tentativo usava l'entry content come terza classe, "condizione
   reale invece di un trucco". Sembrava piu' pulito ed era sbagliato:
   `.sunya-entry-content` e' un wrapper SOLO FRONTEND, nell'editor non
   esiste. Verificato nell'iframe: la regola non si applicava e l'H1
   dell'hero risultava #1a1a2e su fondo #1a1a2e — invisibile.
   La parita' editor dichiarata in cima a questo file vale piu'
   dell'eleganza del selettore: `.is-style-X.is-style-X` e' 0,3,0 ovunque,
   frontend e editor, e batte le regole heading dei child fino a 0,2,0
   (compresa `.sunya-entry-content .wp-block-heading` di roxzone). */
.wp-block-group.is-style-sunya-dark.is-style-sunya-dark :where(h1, h2, h3, h4, h5, h6),
.wp-block-group.is-style-sunya-dark-alt.is-style-sunya-dark-alt :where(h1, h2, h3, h4, h5, h6),
.wp-block-group.is-style-sunya-light.is-style-sunya-light :where(h1, h2, h3, h4, h5, h6) {
    color: inherit;
}

.sunya-pattern-hero,
.sunya-pattern-cta {
    text-align: center;
}

/* Eyebrow: kicker uppercase.
   v1.9.3 (fase 4): l'accent qui e' INCHIOSTRO -> accent-ink, che segue
   la carta della modalita'. Il vecchio override sulle superfici scure
   (accent-bright a 0,2,0) e' RIMOSSO: la regola contenitore v1.7.6 in
   questo stesso file ridefinisce gia' il TOKEN sulle stesse quattro
   superfici, quindi l'eyebrow lo eredita. Effetto cascata: senza
   l'override, un child che stila .sunya-eyebrow a 0,1,0 vince anche
   dentro le superfici scure (sovranita' del child; al 21/08 nessun
   child lo stila). La catena termina su accent, unico token della
   famiglia garantito dal :root di style.css: un var() che risolvesse
   a nulla renderebbe la dichiarazione invalida a computed-value time. */
.sunya-eyebrow {
    font-family: var(--sunya-font-heading, inherit);
    font-size: 0.8125rem;
    font-weight: 600;
    letter-spacing: 0.2em;
    text-transform: uppercase;
    color: var(--sunya-color-accent-ink, var(--sunya-color-accent-contrast, var(--sunya-color-accent)));
    margin-bottom: var(--sunya-spacing-sm, 0.5rem);
}

/* Lead: pensato per contesti centrati (hero, CTA). */
.sunya-lead {
    font-size: 1.15rem;
    line-height: 1.7;
    max-width: 620px;
    margin-left: auto;
    margin-right: auto;
}

/* Card informativa: superficie chiara, barra accent superiore su hover.
   NON e' .sunya-card (cards.css, card blog): stesso rename gia' fatto
   su dadesign (dd-card -> dd-info-card). */
/* v1.5.0: la card e' ancorata alla COPPIA CHIARA, non ai token globali.
   I pattern la collocano sempre dentro sezioni surface-light: usando
   --sunya-color-bg prendeva lo sfondo scuro in modalita' Scuro e
   finiva testo scuro su card scura dentro una sezione chiara. */
.sunya-info-card {
    position: relative;
    height: 100%;
    padding: var(--sunya-spacing-lg, 1.5rem);

    /* v1.10.0 — LA SUPERFICIE DICHIARA LA PROPRIA COPPIA.
       La card era l'unica superficie del sistema a schiarirsi la carta
       da sola, senza un gancio con cui il child potesse ridichiarare
       l'inchiostro. In modalita' Scura --sunya-color-surface-light e'
       gia' rimappato dal PHP verso il fondo scuro, e questo ulteriore
       88% verso il bianco allontana la card dalla pagina: l'inchiostro
       pero' restava calcolato sulla carta di PAGINA. Misurato il
       2026-08-24: link a 2.90 sul lab e 3.84 su davidearduini, mentre
       dadesign (7.59) e roxzone (9.91) reggono solo perche' partono da
       11.82 e 14.66.

       Ora la carta ha un nome, e l'inchiostro dei link della card lo
       segue: chi dichiara --sunya-card-bg dichiara anche --sunya-card-ink
       e i discendenti leggono senza che nessuna regola debba vincere.
       Chi non dichiara nulla ha esattamente il colore di prima. */
    --sunya-card-bg: color-mix(in oklab, var(--sunya-color-surface-light, #f8f9fa) 88%, white);

    background: var(--sunya-card-bg);
    border: 1px solid color-mix(in oklab, var(--sunya-color-text-on-light, #2d2d2d) 12%, var(--sunya-color-surface-light, #f8f9fa));
    border-radius: var(--sunya-radius-md, 8px);
    overflow: hidden;
    transition: transform var(--sunya-transition-base, 250ms ease),
                border-color var(--sunya-transition-base, 250ms ease),
                box-shadow var(--sunya-transition-base, 250ms ease);
}

.sunya-info-card::before {
    content: "";
    position: absolute;
    top: 0;
    left: 0;
    right: 0;
    height: 3px;
    background: var(--sunya-color-accent);
    opacity: 0;
    transition: opacity var(--sunya-transition-base, 250ms ease);
}

.sunya-info-card:hover,
.sunya-info-card:focus-within {
    transform: translateY(-3px);
    border-color: var(--sunya-color-accent);
    box-shadow: 0 8px 30px color-mix(in srgb, var(--sunya-color-accent) 12%, transparent);
}

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

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

.sunya-info-card p:where(:not(.sunya-info-card__link)) {
    font-size: 0.95rem;
    color: color-mix(in oklab, var(--sunya-color-text-on-light, #2d2d2d) 68%, var(--sunya-color-surface-light, #f8f9fa));
    margin: 0 0 0.8em;
}

.sunya-info-card__link {
    margin-bottom: 0;
}

/* Doppia classe (0,2,1, v1.4.4): il link e' parte del componente e
   l'inchiostro del parent deve reggere sulle regole link generiche
   dei child a 0,1,1 (es. "link dorati" della base), che a pari
   specificita' vincerebbero per ordine sorgente. Un child ribrandizza
   in modo esplicito a >=0,2,1.
   v1.9.3 (fase 4): accent-contrast fisso -> accent-ink. La card e'
   ancorata alla COPPIA CHIARA, che si inverte con la modalita': anche
   accent-ink segue la modalita', quindi i due si muovono insieme.
   EDGE NOTO e accettato (briefing fase 4, D1=A): card collocata dentro
   una superficie scura con sito in Chiara — il contenitore ridefinisce
   accent-ink a on-dark ma la card resta chiara. I pattern non producono
   mai quel caso; se servisse, la via e' un token dedicato alla coppia. */
.sunya-info-card .sunya-info-card__link a {
    font-weight: 600;
    font-size: 0.95rem;
    /* v1.10.0: prima --sunya-card-ink, che e' l'inchiostro calibrato
       sulla carta DELLA CARD. La catena successiva e' invariata, quindi
       chi non dichiara il token vede esattamente il colore di prima. */
    color: var(--sunya-card-ink, var(--sunya-color-accent-ink, var(--sunya-color-accent-contrast, var(--sunya-color-accent))));
    text-decoration: none;
}

.sunya-info-card .sunya-info-card__link a:hover {
    text-decoration: underline;
    text-underline-offset: 2px;
}

.sunya-info-card .sunya-info-card__link a:focus-visible {
    outline: 2px solid var(--sunya-color-accent-ink, var(--sunya-color-accent-contrast, var(--sunya-color-accent)));
    outline-offset: 2px;
}

/* Card a piena altezza nelle colonne: link ancorato in basso anche con
   testi di lunghezza diversa. */
.sunya-pattern-cards .wp-block-column {
    display: flex;
    flex-direction: column;
}

.sunya-pattern-cards .wp-block-column > .sunya-info-card {
    display: flex;
    flex-direction: column;
    flex: 1;
}

.sunya-pattern-cards .sunya-info-card .sunya-info-card__link {
    margin-top: auto;
}

/* --------------------------------------------------------------------------
   Griglia staff / team (v1.6.2, pattern sunya/team-grid-3)

   Colori ancorati alla COPPIA CHIARA (surface-light / text-on-light) e non
   ai token globali, come .sunya-info-card: il pattern colloca la sezione
   su superficie chiara, e la coppia chiara si inverte da sola in modalita'
   Scuro (inc/template-functions.php). Usare --sunya-color-text-light qui
   darebbe un grigio tarato sul FOGLIO della pagina, non sulla sezione.
   -------------------------------------------------------------------------- */

.sunya-team-member {
    text-align: center;
    height: 100%;
}

/* Il blocco immagine nasce VUOTO nel pattern: senza <img> la figure
   collassa a zero e non lascia un buco in pagina. */
.sunya-team-member__photo {
    margin: 0 0 var(--sunya-spacing-md, 1rem);
}

.sunya-team-member__photo img {
    width: 100%;
    aspect-ratio: 1;
    object-fit: cover;
    border-radius: var(--sunya-radius-md, 8px);
}

.sunya-team-member h3 {
    font-size: 1.1rem;
    margin: 0 0 0.25em;
}

/* Ruolo: stesso linguaggio dell'eyebrow ma classe distinta — l'eyebrow e'
   il kicker di una SEZIONE, questo e' un attributo di una persona. */
.sunya-team-member__role {
    font-family: var(--sunya-font-heading, inherit);
    font-size: 0.8125rem;
    font-weight: 600;
    letter-spacing: 0.12em;
    text-transform: uppercase;
    /* v1.9.3 (fase 4): stesso linguaggio e stessa correzione
       dell'eyebrow — l'accent qui e' inchiostro. */
    color: var(--sunya-color-accent-ink, var(--sunya-color-accent-contrast, var(--sunya-color-accent)));
    margin: 0 0 0.6em;
}

.sunya-team-member__bio {
    font-size: 0.95rem;
    color: color-mix(in oklab, var(--sunya-color-text-on-light, #2d2d2d) 68%, var(--sunya-color-surface-light, #f8f9fa));
    margin: 0;
}

/* Colonne a pari altezza, come .sunya-pattern-cards. */
.sunya-pattern-team .wp-block-column {
    display: flex;
    flex-direction: column;
}


/* --------------------------------------------------------------------------
   Griglia loghi (v1.6.3, pattern sunya/logo-grid-4)

   Grid con auto-fit invece di wp:columns: le colonne core sotto 782px
   collassano a UNA sola, e quattro loghi impilati a piena larghezza sono
   peggio del problema che risolvono.

   I VALORI SONO MISURATI, non scelti a occhio (v1.6.4). La prima
   versione aveva minmax(150px) + gap 2rem: due colonne richiedono
   150+32+150 = 332px, ma su un telefono al contenitore ne restano ~312
   e la griglia collassava lo stesso a UNA colonna — esattamente il
   difetto che l'auto-fit doveva evitare. Con minmax(120px) + gap 1.5rem
   servono 264px e regge fino a contenitore 320px.

   Verificato: contenitore 1100px -> 4 colonne; 420px -> 2; 360px -> 2;
   320px -> 2.

   Il grid vale anche in editor (blocks.css e' caricato via
   add_editor_style): il gruppo non impila i loghi in verticale.
   -------------------------------------------------------------------------- */

.sunya-logo-grid {
    display: grid;
    grid-template-columns: repeat(auto-fit, minmax(120px, 1fr));
    gap: var(--sunya-spacing-lg, 1.5rem);
    align-items: center;
}

.sunya-logo-grid .wp-block-image {
    margin: 0;
}

/* Normalizzazione: loghi di formato e proporzioni diverse allineati sulla
   stessa altezza ottica. contain, mai cover: un logo non si ritaglia. */
.sunya-logo-grid img {
    display: block;
    max-height: 56px;
    width: auto;
    max-width: 100%;
    margin-inline: auto;
    object-fit: contain;
    border-radius: 0;
}

/* Stile di blocco OPZIONALE sul gruppo interno (vedi block-patterns.php).
   Il default resta a colori: su mobile l'hover non esiste e un logo
   scolorito che non torna mai a colori e' un difetto, non uno stile. */
.wp-block-group.is-style-sunya-logos-muted img {
    filter: grayscale(1);
    opacity: 0.65;
    transition: filter var(--sunya-transition-base, 250ms ease),
                opacity var(--sunya-transition-base, 250ms ease);
}

.wp-block-group.is-style-sunya-logos-muted img:hover,
.wp-block-group.is-style-sunya-logos-muted a:focus-visible img {
    filter: grayscale(0);
    opacity: 1;
}

@media (prefers-reduced-motion: reduce) {
    .wp-block-group.is-style-sunya-logos-muted img {
        transition: none;
    }
}


/* Numero step: decorativo (aria-hidden nel pattern), ma visibile.
   v1.9.3 (fase 4): accent-bright fisso assumeva carta scura; su carta
   chiara un accent luminoso e' il difetto 1.23 dei brand tipo roxzone.
   Testo grande e bold (soglia 3:1): accent-ink (>=4.5 per costruzione)
   la supera su qualsiasi carta e segue le superfici via v1.7.6. */
.sunya-step-number {
    font-family: var(--sunya-font-heading, inherit);
    font-size: clamp(1.8rem, 3vw, 2.4rem);
    font-weight: 700;
    line-height: 1;
    color: var(--sunya-color-accent-ink, var(--sunya-color-accent-bright, var(--sunya-color-accent)));
    margin: 0 0 var(--sunya-spacing-sm, 0.5rem);
}

@media (prefers-reduced-motion: reduce) {
    .sunya-info-card,
    .sunya-info-card::before {
        transition: none;
    }

    .sunya-info-card:hover,
    .sunya-info-card:focus-within {
        transform: none;
    }
}


/* ==========================================================================
   QUERY LOOP (v1.6.5)

   Trasferito da css/blog.css, che e' condizionale (is_singular('post'),
   is_home(), is_archive(), is_search(), is_front_page()): un Query Loop
   inserito in una PAGINA usciva senza stili, e non ne aveva nemmeno in
   editor. Il Query Loop e' un blocco core, quindi vive qui.

   Censimento pre-spostamento (2026-08-14): zero occorrenze di
   .wp-block-query / .wp-block-post-* sui quattro siti live — davidearduini
   usa i template PHP classici, gli altri non hanno archivio blog con
   questo markup. Lo spostamento non poteva quindi invertire nessun
   vincitore di ordine sorgente: rischio misurato, non stimato.
   ========================================================================== */

.wp-block-post-template {
    list-style: none;
    margin: 0;
    padding: 0;
    display: grid;
    grid-template-columns: repeat(auto-fill, minmax(min(100%, 300px), 1fr));
    gap: var(--sunya-spacing-2xl, 3rem) var(--sunya-spacing-xl, 2rem);
}

.wp-block-post {
    display: flex;
    flex-direction: column;
}

/* Immagine in evidenza */
.wp-block-post .wp-block-post-featured-image {
    display: block;
    margin-bottom: var(--sunya-spacing-md, 1rem);
    border-radius: var(--sunya-radius-lg, 12px);
    overflow: hidden;
}

.wp-block-post .wp-block-post-featured-image a {
    display: block;
}

.wp-block-post .wp-block-post-featured-image img {
    display: block;
    width: 100%;
    height: auto;
    max-height: 320px;
    object-fit: cover;
    transition: transform var(--sunya-transition-slow, 400ms ease);
}

.wp-block-post .wp-block-post-featured-image a:hover img {
    transform: scale(1.04);
}

@media (prefers-reduced-motion: reduce) {
    .wp-block-post .wp-block-post-featured-image img {
        transition: none;
    }
    .wp-block-post .wp-block-post-featured-image a:hover img {
        transform: none;
    }
}

/* Titolo
   v1.6.5: era --sunya-color-primary. Qui primary significa INCHIOSTRO
   del titolo, quindi va su heading — stessa classificazione applicata a
   h1-h6 in style.css nella v1.5.2. */
.wp-block-post .wp-block-post-title {
    font-size: var(--sunya-font-size-xl, 1.25rem);
    line-height: 1.3;
    margin-bottom: var(--sunya-spacing-sm, 0.5rem);
    margin-top: 0;
}

.wp-block-post .wp-block-post-title a {
    color: var(--sunya-color-heading, var(--sunya-color-primary));
    text-decoration: none;
    transition: color var(--sunya-transition-fast, 150ms ease);
}

/* v1.9.3 (fase 4): accent nudo -> accent-ink. Fuori dalle superfici la
   carta e' quella della pagina: su carta chiara con accent luminoso
   l'hover misurava sotto soglia. Dentro le superfici vale la regola
   v1.6.5 qui sotto (accent-bright), che vince a 0,4,0/0,4,1. */
.wp-block-post .wp-block-post-title a:hover,
.wp-block-post .wp-block-post-title a:focus-visible {
    color: var(--sunya-color-accent-ink, var(--sunya-color-accent));
}

/* Meta: data, categorie, autore */
.wp-block-post .wp-block-post-date,
.wp-block-post .wp-block-post-author,
.wp-block-post .wp-block-post-terms {
    font-size: var(--sunya-font-size-sm, 0.875rem);
    color: var(--sunya-color-text-light, #6b7280);
    margin-bottom: var(--sunya-spacing-xs, 0.25rem);
}

/* v1.9.3 (fase 4): sono LINK, cioe' inchiostro sulla carta di pagina.
   Non su --sunya-color-link: quel token e' emesso come accent-contrast
   anche in Scuro (difetto a monte, voce aperta D3 del briefing fase 4);
   accent-ink e' gia' mode-aware. L'hover NON va su accent-hover, che e'
   derivato per stare SOTTO il testo (si avvicina alla carta):
   accent-ink-hover si allontana dalla carta, il contrasto solo cresce. */
.wp-block-post .wp-block-post-terms a,
.wp-block-post .wp-block-post-author a {
    color: var(--sunya-color-accent-ink, var(--sunya-color-accent));
    text-decoration: none;
    font-weight: var(--sunya-font-weight-medium, 500);
}

.wp-block-post .wp-block-post-terms a:hover,
.wp-block-post .wp-block-post-author a:hover {
    color: var(--sunya-color-accent-ink-hover, var(--sunya-color-accent-hover));
}

/* Estratto */
.wp-block-post .wp-block-post-excerpt {
    color: var(--sunya-color-text-light, #6b7280);
    font-size: var(--sunya-font-size-base, 1rem);
    line-height: 1.65;
    margin-bottom: var(--sunya-spacing-md, 1rem);
}

.wp-block-post .wp-block-post-excerpt__more-text {
    margin-top: var(--sunya-spacing-sm, 0.5rem);
}

/* v1.9.3 (fase 4): stessa correzione dei link meta qui sopra. */
.wp-block-post .wp-block-post-excerpt__more-link {
    color: var(--sunya-color-accent-ink, var(--sunya-color-accent));
    font-weight: var(--sunya-font-weight-medium, 500);
    text-decoration: none;
}

.wp-block-post .wp-block-post-excerpt__more-link:hover {
    color: var(--sunya-color-accent-ink-hover, var(--sunya-color-accent-hover));
}

/* --------------------------------------------------------------------------
   Query Loop DENTRO una superficie Sunya

   Serve la stessa cura degli heading, ma la regola degli heading qui NON
   basta: il colore del titolo sta sull'<a>, non sull'<h2>, quindi
   `color: inherit` sull'heading viene poi scavalcato dal link.
   Senza queste regole un Query Loop su is-style-sunya-dark esce con
   titolo scuro su fondo scuro.

   Specificita' 0,4,0 (superficie + .wp-block-post + classe + a): batte
   le regole base a 0,3,0 qui sopra. Coperti entrambi i sistemi, stili di
   blocco e preset has-*, perche' le pagine gia' fatte usano i preset.

   Meta ed estratto: --sunya-color-text-light e' tarato sul FOGLIO della
   pagina, non sulla sezione. Dentro una superficie si deriva invece dal
   colore ereditato, cosi' funziona su chiaro e su scuro senza saperlo.
   -------------------------------------------------------------------------- */

.is-style-sunya-dark .wp-block-post .wp-block-post-title a,
.is-style-sunya-dark-alt .wp-block-post .wp-block-post-title a,
.is-style-sunya-light .wp-block-post .wp-block-post-title a,
.has-surface-dark-background-color .wp-block-post .wp-block-post-title a,
.has-surface-dark-alt-background-color .wp-block-post .wp-block-post-title a,
.has-surface-light-background-color .wp-block-post .wp-block-post-title a {
    color: inherit;
}

/* L'hover torna all'accent: e' l'affordance, non deve sparire. */
.is-style-sunya-dark .wp-block-post .wp-block-post-title a:hover,
.is-style-sunya-dark-alt .wp-block-post .wp-block-post-title a:hover,
.is-style-sunya-light .wp-block-post .wp-block-post-title a:hover,
.has-surface-dark-background-color .wp-block-post .wp-block-post-title a:hover,
.has-surface-dark-alt-background-color .wp-block-post .wp-block-post-title a:hover,
.has-surface-light-background-color .wp-block-post .wp-block-post-title a:hover {
    color: var(--sunya-color-accent-bright, var(--sunya-color-accent));
}

/* currentColor risolve al colore EREDITATO dalla sezione: il testo
   secondario si stacca dal primario senza dipendere da un token globale. */
.is-style-sunya-dark .wp-block-post :where(.wp-block-post-excerpt, .wp-block-post-date, .wp-block-post-author, .wp-block-post-terms),
.is-style-sunya-dark-alt .wp-block-post :where(.wp-block-post-excerpt, .wp-block-post-date, .wp-block-post-author, .wp-block-post-terms),
.is-style-sunya-light .wp-block-post :where(.wp-block-post-excerpt, .wp-block-post-date, .wp-block-post-author, .wp-block-post-terms),
.has-surface-dark-background-color .wp-block-post :where(.wp-block-post-excerpt, .wp-block-post-date, .wp-block-post-author, .wp-block-post-terms),
.has-surface-dark-alt-background-color .wp-block-post :where(.wp-block-post-excerpt, .wp-block-post-date, .wp-block-post-author, .wp-block-post-terms),
.has-surface-light-background-color .wp-block-post :where(.wp-block-post-excerpt, .wp-block-post-date, .wp-block-post-author, .wp-block-post-terms) {
    color: color-mix(in oklab, currentColor 72%, transparent);
}

/* --------------------------------------------------------------------------
   Paginazione Query Loop
   -------------------------------------------------------------------------- */

.wp-block-query-pagination {
    display: flex;
    flex-wrap: wrap;
    align-items: center;
    gap: var(--sunya-spacing-xs, 0.25rem);
    margin-top: var(--sunya-spacing-2xl, 3rem);
    font-size: var(--sunya-font-size-sm, 0.875rem);
}

.wp-block-query-pagination-numbers {
    display: flex;
    gap: var(--sunya-spacing-xs, 0.25rem);
}

.wp-block-query-pagination-numbers .page-numbers,
.wp-block-query-pagination-previous,
.wp-block-query-pagination-next {
    display: inline-flex;
    align-items: center;
    justify-content: center;
    min-width: 2rem;
    height: 2rem;
    padding: 0 var(--sunya-spacing-sm, 0.5rem);
    /* v1.9.3 (D2, misurato sul lab): --sunya-color-border e' al 15% e
       misurava 1.45 in Chiara / 1.31 in Scuro — il confine di un
       CONTROLLO chiede 3:1 (WCAG 1.4.11), stesso caso dei campi form
       v1.8.8. field-border e' il token calcolato a contrasto garantito;
       con la patch: 3.45 su carta chiara, 5.22 su scura. */
    border: 1px solid var(--sunya-color-field-border, var(--sunya-color-border, #e5e7eb));
    border-radius: var(--sunya-radius-sm, 4px);
    color: var(--sunya-color-text);
    text-decoration: none;
    transition: background-color var(--sunya-transition-fast, 150ms ease),
                color var(--sunya-transition-fast, 150ms ease),
                border-color var(--sunya-transition-fast, 150ms ease);
}

/* v1.9.3 (D2): su hover e stato corrente il riempimento resta accent —
   e' una SUPERFICIE con on-accent gia' derivato — ma su carta chiara con
   accent luminoso misura 1.23 rispetto alla carta: il confine lo tiene
   il bordo, che resta su field-border invece di sparire nell'accent.
   Misurato: bordo 3.45 su chiara, 5.22 su scura, testo interno 14.66. */
.wp-block-query-pagination-numbers .page-numbers:hover,
.wp-block-query-pagination-previous:hover,
.wp-block-query-pagination-next:hover {
    background-color: var(--sunya-color-accent);
    border-color: var(--sunya-color-field-border, var(--sunya-color-border, #e5e7eb));
    color: var(--sunya-color-on-accent, #fff);
}

.wp-block-query-pagination-numbers .page-numbers.current {
    background-color: var(--sunya-color-accent);
    border-color: var(--sunya-color-field-border, var(--sunya-color-border, #e5e7eb));
    color: var(--sunya-color-on-accent, #fff);
    font-weight: var(--sunya-font-weight-medium, 500);
}

/* Dentro una superficie il bordo grigio globale sparisce o stona:
   si deriva dal colore ereditato, come meta ed estratto. */
.is-style-sunya-dark .wp-block-query-pagination-numbers .page-numbers,
.is-style-sunya-dark-alt .wp-block-query-pagination-numbers .page-numbers,
.is-style-sunya-light .wp-block-query-pagination-numbers .page-numbers,
.is-style-sunya-dark .wp-block-query-pagination-previous,
.is-style-sunya-dark .wp-block-query-pagination-next,
.is-style-sunya-dark-alt .wp-block-query-pagination-previous,
.is-style-sunya-dark-alt .wp-block-query-pagination-next,
.is-style-sunya-light .wp-block-query-pagination-previous,
.is-style-sunya-light .wp-block-query-pagination-next {
    border-color: color-mix(in oklab, currentColor 30%, transparent);
    color: inherit;
}

/* --------------------------------------------------------------------------
   Anteprima articoli a card (v1.6.6)
   Stile di blocco OPZIONALE su core/query: .is-style-sunya-post-cards

   La superficie della card NON e' ancorata alla coppia chiara come
   .sunya-info-card. Quella scelta va bene per i pattern servizi, che
   stanno sempre su sezione chiara; un Query Loop puo' invece finire su
   una sezione scura, e li' una card chiara sarebbe un pannello bianco
   in mezzo allo scuro.

   Qui la card e' un VELO su currentColor: si ricava dal colore ereditato
   dalla sezione. Su superficie chiara currentColor e' l'inchiostro scuro
   e il velo produce un pannello leggermente piu' scuro; su superficie
   scura currentColor e' chiaro e il pannello si alza. Funziona su
   entrambe senza doverle distinguere, e senza un solo token di superficie.
   Stessa tecnica di meta ed estratto (v1.6.5).
   -------------------------------------------------------------------------- */

.wp-block-query.is-style-sunya-post-cards .wp-block-post {
    --sunya-post-card-pad: var(--sunya-spacing-lg, 1.5rem);
    padding: var(--sunya-post-card-pad);
    background-color: color-mix(in oklab, currentColor 6%, transparent);
    border: 1px solid color-mix(in oklab, currentColor 12%, transparent);
    border-radius: var(--sunya-radius-md, 8px);
    overflow: hidden;
    transition: transform var(--sunya-transition-base, 250ms ease),
                border-color var(--sunya-transition-base, 250ms ease);
}

/* Immagine a filo card: il padding si annulla in negativo sui tre lati
   alti. Il raggio lo taglia la card con overflow:hidden, quindi qui va
   azzerato — altrimenti si vedrebbero due curve concentriche sfalsate. */
.wp-block-query.is-style-sunya-post-cards .wp-block-post .wp-block-post-featured-image {
    margin: calc(var(--sunya-post-card-pad) * -1);
    margin-bottom: var(--sunya-spacing-md, 1rem);
    border-radius: 0;
}

/* L'estratto spinge il fondo: card di pari altezza anche con titoli di
   lunghezza diversa (la griglia stira gia' gli item). */
.wp-block-query.is-style-sunya-post-cards .wp-block-post .wp-block-post-excerpt {
    margin-bottom: 0;
}

.wp-block-query.is-style-sunya-post-cards .wp-block-post:hover,
.wp-block-query.is-style-sunya-post-cards .wp-block-post:focus-within {
    border-color: var(--sunya-color-accent);
    transform: translateY(-3px);
}

@media (prefers-reduced-motion: reduce) {
    .wp-block-query.is-style-sunya-post-cards .wp-block-post {
        transition: none;
    }
    .wp-block-query.is-style-sunya-post-cards .wp-block-post:hover,
    .wp-block-query.is-style-sunya-post-cards .wp-block-post:focus-within {
        transform: none;
    }
}
