/* static-page.css — il "chrome" delle pagine standalone di StaticPageRenderer.js. Compagno di
   lib/vendor/rich.css: quello veste l'ARTICOLO (.rich-doc + i 5 temi), questo tutto cio' che sta
   intorno (testata, main, sidebar, piede, slot pubblicitari) e le PAGINE ELENCO (sezione in fondo).

   SI DEPLOYA UNA VOLTA PER SITO, a /assets/static-page.css, e le pagine lo REFERENZIANO. Non si
   cuoce inline: un blocco condiviso si paga N volte in storage e ogni sua modifica riscrive N
   oggetti = N operazioni classe A (la voce che fattura, $4,50 a blocchi interi da 1M). E' il
   meccanismo che ha prodotto 148 GB su R2 col roster di 19.527 citta' in ogni pagina.

   NON definisce colori propri: legge le variabili che il tema per-sito (.theme-a … .theme-e di
   rich.css) mette sull'<html>, piu' --accent inline. Ogni var(--accent|--surf|--ink|--muted|
   --line|--fd|--fb) porta SEMPRE un ripiego valido (tema A): mai un colore "rotto", mai la
   stringa `undefined`. */

*, *::before, *::after { box-sizing: border-box; }

html { -webkit-text-size-adjust: 100%; }

/* NIENTE tipografia sul <body>: font e interlinea del corpo li detta GeneratePress
   (`body,…{font-family:-apple-system,…;font-size:17px;line-height:1.5}`, main.min.css). Fino al
   01/09/2026 qui c'era `font-family:var(--fb,Georgia,serif)`+`line-height:1.6`: ULTIMO foglio
   della catena, vinceva sul tema e mandava in SERIF l'INTERO sito (testata, menu, elenchi,
   piede) mentre un GeneratePress vero e' sans di sistema — la differenza piu' visibile fra i
   nostri siti e i siti madre. Il serif del testo lungo NON va rimesso qui: lo mette rich.css
   sull'ARTICOLO (`.rich-doc{font-family:var(--fb)}`), il solo posto dove serve. `margin:0`
   resta: ripiego identico al tema, utile se generatepress.css non arriva (404 gia' visto). */
/* ── PONTE tema-per-sito → variabili di GeneratePress ────────────
   GeneratePress disegna schede, testata, sidebar, piede e form con le SUE variabili (schede
   `--base-3` #fff su fondo `--base-2` #f7f8f9). Fino al 01/09/2026 qui c'era
   `body{background:var(--surf,#fff)}` che, ultimo della catena, schiacciava il fondo pagina sul
   bianco delle schede — i riquadri sparivano; e toglierlo non basta, il fondo resterebbe chiaro
   sui temi SCURI (theme-c). Quindi non si sceglie un colore qui: si REINDIRIZZANO le variabili
   di GeneratePress su quelle del tema che rich.css mette sull'<html>. `:root.theme-X` (0,2,0)
   batte il `:root` (0,1,0) del customizer per SPECIFICITA': la riparazione non dipende
   dall'ordine dei fogli, dichiarato altrove (SHARED_STYLESHEETS). */
:root.theme-a, :root.theme-b, :root.theme-c, :root.theme-d, :root.theme-e {
  --base-3: var(--surf, #fff);        /* superficie delle SCHEDE */
  --contrast: var(--ink, #16202B);    /* testo primario */
  --contrast-2: var(--muted, #5A6B7B);/* meta, didascalie */
  --base: var(--line, #DDE4EA);       /* bordi e filetti */
}
/* Fondo PAGINA. I temi a e d non ne hanno uno proprio: restano sul grigio di GeneratePress
   (`:root{--base-2:#f7f8f9}`). b, c ed e ce l'hanno gia' (rich.css sull'<html>): qui si RIPETE
   quel valore, e `tests/visual/palette-cascade.test.mjs` lo riconfronta con rich.css, cosi' una
   divergenza futura diventa rossa. theme-c e' il caso scuro. */
:root.theme-b { --base-2: #FBF7F1; }
:root.theme-c { --base-2: #0E1B1E; }
:root.theme-e { --base-2: #FAF8FF; }

body {
  margin: 0;
  background: var(--base-2, #f7f8f9);
  color: var(--ink, #16202B);
}

/* ── header ──────────── */
.site-head {
  display: flex;
  flex-wrap: wrap;
  align-items: baseline;
  gap: 10px 26px;
  max-width: 1160px;
  margin: 0 auto;
  padding: 18px 22px;
  border-bottom: 1px solid var(--line, #DDE4EA);
}
.site-brand {
  font-family: var(--fd, system-ui, sans-serif);
  font-size: 1.18rem;
  font-weight: 700;
  color: var(--accent, #2C6E8F);
  text-decoration: none;
  letter-spacing: -0.01em;
}
.site-nav { display: flex; flex-wrap: wrap; gap: 18px; }
.site-nav a {
  font-family: var(--fd, system-ui, sans-serif);
  font-size: 0.94rem;
  color: var(--muted, #5A6B7B);
  text-decoration: none;
}
.site-nav a:hover { color: var(--accent, #2C6E8F); text-decoration: underline; text-underline-offset: 3px; }

/* ── layout ──────────── */
/* `div.page`: `page` e' anche una classe del <body> GP — vedi `.post` qui sotto. */
div.page {
  display: grid;
  grid-template-columns: minmax(0, 1fr);
  gap: 40px;
  max-width: 1160px;
  margin: 0 auto;
  padding: 30px 22px 56px;
}
@media (min-width: 1000px) {
  div.page { grid-template-columns: minmax(0, 1fr) 300px; align-items: start; }
  .post-sidebar { position: sticky; top: 24px; }
}

.post { min-width: 0; }
/* `:not(.entry-title)`: `post` e' anche una classe GP, e senza l'esclusione questo blocco
   rubava al titolo dell'articolo carattere, corpo, interlinea e crenatura. */
.post h1:not(.entry-title) {
  font-family: var(--fd, system-ui, sans-serif);
  font-size: clamp(1.7rem, 1.15rem + 2vw, 2.6rem);
  line-height: 1.15;
  margin: 0 0 12px;
  text-wrap: balance;
  letter-spacing: -0.015em;
}
.post-cat {
  font-family: var(--fd, system-ui, sans-serif);
  font-size: 0.78rem;
  text-transform: uppercase;
  letter-spacing: 0.09em;
  color: var(--accent, #2C6E8F);
  margin: 0 0 18px;
}
.post-hero { margin: 0 0 26px; }
.post-hero img {
  display: block;
  width: 100%;
  height: auto;
  aspect-ratio: 16 / 9;
  object-fit: cover;
  border-radius: 10px;
}
.post-body > :first-child { margin-top: 0; }

/* ── slot pubblicitari ────────────
   Riservano spazio verticale prima che il widget carichi: senza min-height ogni unita'
   AdsKeeper spinge il testo verso il basso a caricamento avvenuto (layout shift), che e'
   un difetto di Core Web Vitals pagato su OGNI pagina della rete. */
.ad-slot { margin: 26px 0; min-height: 120px; }
.ad-slot--sidebar { margin: 0; min-height: 250px; }
.ad-slot--before-content { margin-top: 0; }

.post-sidebar { min-width: 0; }

/* ── footer ──────────── */
.site-foot {
  border-top: 1px solid var(--line, #DDE4EA);
  padding: 26px 22px 40px;
}
.site-foot p {
  max-width: 1160px;
  margin: 0 auto;
  font-family: var(--fd, system-ui, sans-serif);
  font-size: 0.86rem;
  color: var(--muted, #5A6B7B);
}

/* ── MENU: la tendina si apre anche SENZA JavaScript e da TASTIERA ────────────
   La testata sta su UNA riga per costruzione: GeneratePressShell.capPrimaryNav tiene al massimo
   PRIMARY_NAV_MAX_TOP_LEVEL (5) voci di primo livello e raccoglie tutte le altre sotto una
   tendina. Qui NON si nasconde niente (niente nowrap, niente overflow:hidden sulla barra): il
   CSS si limita a rendere quella tendina raggiungibile e alta il giusto.

   GeneratePress rivela il sotto-menu su `li:hover>ul` e su `.sfHover`, che il suo JS mette al
   TOCCO (main.min.css). Due strade che il TABULATORE non percorre: chi naviga da tastiera mette
   a fuoco «More» e non vede nulla — le voci in tendina sarebbero pagine del sito senza alcun
   percorso. `:focus-within` ripete la STESSA rivelazione con le stesse cinque dichiarazioni del
   tema, quindi non c'e' un secondo stato da tenere allineato. E' anche il motivo per cui la voce
   di raccolta porta `href="#"`: un `<a>` senza href non prende fuoco e questa regola non
   scatterebbe mai. Senza JS, su schermo largo, la tendina funziona lo stesso. */
.main-navigation:not(.toggled) ul li:focus-within > ul {
  left: auto; opacity: 1; transition-delay: 0s; pointer-events: auto; height: auto; overflow: visible;
}
.main-navigation:not(.toggled) ul ul li:focus-within > ul { left: 100%; top: 0; }

/* La tendina di RACCOLTA e' l'unica che puo' portare decine di voci (una per categoria oltre il
   tetto, e le categorie crescono a ogni articolo). Senza limite diventerebbe piu' alta dello
   schermo e le ultime voci resterebbero fuori portata: si SCORRE dentro la tendina, non si
   nasconde nulla. I 200px fissi del tema tagliano etichette come «Sauces & Condiments», e su
   schermo stretto una tendina larga uscirebbe dalla pagina: da qui min-width + max-width.
   Le due regole aperte hanno specificita' 0,4,3 perche' devono battere lo `overflow:visible`
   che il tema applica sull'aperto (0,3,3): a parita' persa, il max-height non scatterebbe. */
.main-navigation .sub-menu.nav-overflow-menu { width: auto; min-width: 220px; max-width: 92vw; }
.main-navigation:not(.toggled) ul li:hover > .nav-overflow-menu,
.main-navigation:not(.toggled) ul li:focus-within > .nav-overflow-menu {
  max-height: 70vh; overflow-y: auto; overflow-x: hidden;
}

/* ── accessibilita' ──────────── */
:where(a):focus-visible,
:where(button):focus-visible,
:where(summary):focus-visible {
  outline: 2px solid var(--accent, #2C6E8F);
  outline-offset: 3px;
  border-radius: 2px;
}
@media (prefers-reduced-motion: reduce) {
  * { transition: none !important; animation: none !important; scroll-behavior: auto !important; }
}

/* ════════════
   PAGINE ELENCO — home, archivio, indice, autore, 404, about/contatti. Cio' che rich.css fa per
   il TESTO dell'articolo, questa sezione lo fa per gli ELENCHI. Due gusci le producono (leggi
   le sorgenti, non ridefinirle qui):
     1) EdgeSiteSurfaces.renderListingPage -> STESSO guscio dell'articolo (.post.rich-doc): qui
        h2/p/a/.lead sono GIA' vestiti da rich.css, e questa sezione veste solo cio' che rich.css
        non conosce — le LISTE di link (buildLinkListHtml -> .archive-list|.home-recent|
        .home-categories|.home-authors|.notfound-recent|.article-index-list), la .pagination e i
        paragrafi di richiamo (all-articles-link, feed-link, archive-back, about-*, contact-*).
     2) EdgeSitePages.pageShell -> guscio NUDO, <main class="page"> senza .rich-doc (indice
        /recipes/, pagina autore): la STESSA themeForSite gira anche qui, quindi --accent/--surf/
        --ink/--muted/--line/--fd ereditano da <html class="theme-X">. Qui si veste TUTTO: h1/h2
        diretti, .post-grid/.post-card, .pager, .empty-state, .author-avatar/.author-bio.
   La regola per <img> dentro .post-card resta pronta e innocua finche' l'elemento manca. */

/* Il guscio NUDO (indice, autore) non ha `.post-sidebar`: senza questa riga i suoi figli
   diretti (h1, liste, griglia di card) si spargerebbero sulle due colonne pensate per
   articolo+sidebar invece di impilarsi in una colonna sola. Un `.page` CON sidebar
   (articolo) non e' toccato — la regola scatta solo in assenza di `.post-sidebar`. */
@media (min-width: 1000px) {
  .page:not(:has(.post-sidebar)) { grid-template-columns: minmax(0, 1fr); }
}

/* Titoli diretti del guscio nudo: nel guscio .rich-doc l'h1/h2 sono gia' vestiti da
   `.post h1` e `.rich-doc h2` — qui il selettore `.page > h1` prende SOLO l'h1 che
   EdgeSitePages.pageShell mette come figlio diretto di <main class="page">. */
div.page > h1 {
  font-family: var(--fd, system-ui, sans-serif);
  font-size: clamp(1.6rem, 1.1rem + 1.9vw, 2.4rem);
  line-height: 1.15;
  margin: 0 0 0.5em;
  text-wrap: balance;
  letter-spacing: -0.015em;
  color: var(--ink, #16202B);
}
div.page > h2 {
  font-family: var(--fd, system-ui, sans-serif);
  font-size: 1.3rem;
  font-weight: 700;
  margin: 1.5em 0 0.6em;
  color: var(--accent, #2C6E8F);
}

/* ── liste-schede: archive-list, home-recent, home-categories, home-authors, notfound-recent,
      article-index-list (l'indice /recipes/ SENZA guscio GP, EdgeSiteSurfaces ~riga 1529) ──
   Stessa struttura HTML per tutte (buildLinkListHtml): <li><a>titolo</a> <time>data</time> —
   estratto</li>, testo semplice dopo <time>. L'<a> e' display:block (va a capo da solo) cosi'
   titolo e riga data+estratto si separano senza bisogno di elementi che l'HTML non ha. */
.archive-list, .home-recent, .home-categories, .home-authors, .notfound-recent, .article-index-list {
  list-style: none;
  margin: 0 0 1.7em;
  padding: 0;
  display: grid;
  grid-template-columns: 1fr;
  gap: 10px;
}
@media (min-width: 640px) {
  .archive-list, .home-recent, .home-categories, .home-authors, .notfound-recent, .article-index-list {
    grid-template-columns: repeat(2, minmax(0, 1fr));
  }
}
.archive-list li, .home-recent li, .home-categories li, .home-authors li, .notfound-recent li, .article-index-list li {
  position: relative;
  border: 1px solid var(--line, #DDE4EA);
  border-radius: 10px;
  padding: 14px 16px;
  background: var(--surf, #fff);
  transition: transform 0.18s ease, box-shadow 0.18s ease, border-color 0.18s ease;
}
.archive-list li a, .home-recent li a, .home-categories li a, .home-authors li a,
.notfound-recent li a, .article-index-list li a {
  display: block;
  font-family: var(--fd, system-ui, sans-serif);
  font-weight: 650;
  font-size: 1.03rem;
  line-height: 1.35;
  color: var(--ink, #16202B);
  text-decoration: none;
  margin: 0 0 4px;
}
/* Area cliccabile estesa a tutta la scheda (stretched-link), senza aggiungere un wrapper
   che l'HTML di buildLinkListHtml non produce. */
.archive-list li a::before, .home-recent li a::before, .home-categories li a::before,
.home-authors li a::before, .notfound-recent li a::before, .article-index-list li a::before {
  content: '';
  position: absolute;
  inset: 0;
  border-radius: inherit;
}
.archive-list li time, .home-recent li time, .home-categories li time, .home-authors li time,
.notfound-recent li time, .article-index-list li time {
  font-size: 0.82rem;
  color: var(--muted, #5A6B7B);
}
@media (hover: hover) {
  .archive-list li:hover, .home-recent li:hover, .home-categories li:hover,
  .home-authors li:hover, .notfound-recent li:hover, .article-index-list li:hover {
    transform: translateY(-2px);
    box-shadow: 0 8px 20px rgba(20, 30, 40, 0.1);
    border-color: var(--accent, #2C6E8F);
  }
  .archive-list li:hover a, .home-recent li:hover a, .home-categories li:hover a,
  .home-authors li:hover a, .notfound-recent li:hover a, .article-index-list li:hover a { color: var(--accent, #2C6E8F); }
}
.archive-list li:focus-within, .home-recent li:focus-within, .home-categories li:focus-within,
.home-authors li:focus-within, .notfound-recent li:focus-within, .article-index-list li:focus-within {
  outline: 2px solid var(--accent, #2C6E8F);
  outline-offset: 2px;
  border-radius: 10px;
}

/* ── paginazione numerata (EdgeSiteSurfaces.buildPaginationHtml, <nav class="pagination">) ── */
.pagination { margin: 1.8em 0 0; }
.pagination ol { display: flex; flex-wrap: wrap; gap: 6px; margin: 0; padding: 0; list-style: none; }
.pagination li { display: flex; }
.pagination li.gap { color: var(--muted, #5A6B7B); padding: 0 4px; align-items: center; }
.pagination a, .pagination span[aria-current] {
  display: inline-flex;
  align-items: center;
  justify-content: center;
  min-width: 2.2em;
  height: 2.2em;
  padding: 0 0.5em;
  border-radius: 8px;
  font-family: var(--fd, system-ui, sans-serif);
  font-size: 0.92rem;
  text-decoration: none;
  border: 1px solid var(--line, #DDE4EA);
  color: var(--ink, #16202B);
}
.pagination span[aria-current] {
  background: var(--accent, #2C6E8F);
  border-color: var(--accent, #2C6E8F);
  color: #fff;
  font-weight: 700;
}
@media (hover: hover) {
  .pagination a:hover { border-color: var(--accent, #2C6E8F); color: var(--accent, #2C6E8F); }
}

/* ── pager prev/next del guscio nudo (EdgeSitePages.renderAllPostsPage, <nav class="pager">) ── */
.pager {
  display: flex;
  flex-wrap: wrap;
  align-items: center;
  gap: 14px;
  margin: 1.8em 0 0;
  padding-top: 18px;
  border-top: 1px solid var(--line, #DDE4EA);
  font-family: var(--fd, system-ui, sans-serif);
}
.pager-prev, .pager-next { font-size: 0.92rem; font-weight: 650; color: var(--accent, #2C6E8F); text-decoration: none; }
.pager-prev:hover, .pager-next:hover { text-decoration: underline; text-underline-offset: 3px; }
.pager-next { margin-left: auto; }
.pager-status { font-size: 0.84rem; color: var(--muted, #5A6B7B); }

/* ── griglia di card del guscio nudo (EdgeSitePages: postGrid -> .post-grid/.post-card) ────
   La miniatura non c'e' ancora in ogni voce (lavoro in corso altrove): la regola per <img> qui
   sotto resta pronta e innocua finche' l'elemento manca — un'assenza non produce spazio vuoto
   grazie a `margin` che si applica solo quando l'img esiste. */
.post-grid { list-style: none; margin: 0 0 1.6em; padding: 0; display: grid; grid-template-columns: 1fr; gap: 20px; }
@media (min-width: 640px) { .post-grid { grid-template-columns: repeat(2, minmax(0, 1fr)); } }
@media (min-width: 1000px) { .post-grid { grid-template-columns: repeat(3, minmax(0, 1fr)); } }
.post-card {
  position: relative;
  border: 1px solid var(--line, #DDE4EA);
  border-radius: 10px;
  padding: 14px;
  background: var(--surf, #fff);
  transition: transform 0.18s ease, box-shadow 0.18s ease, border-color 0.18s ease;
}
/* `.article-thumb` = la miniatura che buildLinkListHtml mette dentro <li class="has-thumb">
   <a class="article-link">. Non e' una seconda estetica: e' la STESSA della card, percio' sta
   nella stessa regola. Senza, al bordo l'<img> esce nuda — larghezza intrinseca del file
   dentro una scheda di ~300px (scheda sfondata) e nessun aspect-ratio prima del caricamento,
   cioe' CLS su OGNI pagina di elenco con miniature. */
.post-card img, .article-thumb {
  display: block;
  width: 100%;
  height: auto;
  aspect-ratio: 16 / 9;
  object-fit: cover;
  border-radius: 8px;
  margin: 0 0 10px;
}
.post-card-link { display: block; text-decoration: none; color: inherit; }
.post-card-link::before { content: ''; position: absolute; inset: 0; border-radius: inherit; }
.post-card-title {
  font-family: var(--fd, system-ui, sans-serif);
  font-size: 1.08rem;
  font-weight: 700;
  line-height: 1.3;
  margin: 0;
  color: var(--ink, #16202B);
}
.post-card-cat {
  display: inline-block;
  position: relative; /* sopra allo stretched-link del titolo: resta cliccabile per suo conto */
  z-index: 1;
  margin: 10px 0 0;
  font-family: var(--fd, system-ui, sans-serif);
  font-size: 0.74rem;
  font-weight: 650;
  text-transform: uppercase;
  letter-spacing: 0.08em;
  color: var(--accent, #2C6E8F);
  text-decoration: none;
}
.post-card-excerpt { margin: 8px 0 0; font-size: 0.92rem; line-height: 1.5; color: var(--muted, #5A6B7B); }
@media (hover: hover) {
  .post-card:hover { transform: translateY(-3px); box-shadow: 0 10px 24px rgba(20, 30, 40, 0.12); border-color: var(--accent, #2C6E8F); }
  .post-card:hover .post-card-title { color: var(--accent, #2C6E8F); }
  .post-card-cat:hover { text-decoration: underline; }
}
.post-card:focus-within { outline: 2px solid var(--accent, #2C6E8F); outline-offset: 2px; }

.empty-state {
  padding: 30px 16px;
  text-align: center;
  color: var(--muted, #5A6B7B);
  border: 1px dashed var(--line, #DDE4EA);
  border-radius: 10px;
}

/* ── pagina autore (EdgeSitePages.renderAuthorPage) ──────────── */
.author-avatar { display: block; border-radius: 50%; margin: 0 0 14px; }
.author-bio { max-width: 62ch; font-size: 1.05rem; line-height: 1.6; color: var(--muted, #5A6B7B); margin: 0 0 1.2em; }

/* ── richiami di paragrafo: verso l'archivio, il feed, l'indice (about/contact) ─────────── */
.all-articles-link, .feed-link, .archive-back, .about-cta, .contact-cta { margin: 0 0 1.2em; }
.all-articles-link a, .feed-link a, .archive-back a, .about-cta a, .contact-cta a {
  font-family: var(--fd, system-ui, sans-serif);
  font-weight: 650;
  color: var(--accent, #2C6E8F);
  text-decoration: none;
}
.all-articles-link a:hover, .feed-link a:hover, .archive-back a:hover,
.about-cta a:hover, .contact-cta a:hover { text-decoration: underline; text-underline-offset: 3px; }

/* ritratto autore: TONDO, sotto la <h2> che lo NOMINA, col testo che gli scorre accanto.
   ⚠️ Sotto i 640px NON diventa piu' a piena larghezza: un cerchio stirato a tutta colonna e' un
   ovale, e `height:auto` toglieva il lato quadrato su cui poggia il `border-radius:50%`. Resta un
   disco di 180px centrato — piu' piccolo, ma ancora un ritratto. */
.about-portrait { float: left; width: 160px; height: 160px; object-fit: cover; border-radius: 50%; margin: .35em 1.5em .9em 0; }
.about-portrait ~ h2, .about-portrait ~ .about-cta { clear: left; }
@media (max-width: 640px) { .about-portrait { float: none; display: block; width: 180px; height: 180px; margin: .2em auto 1.1em; } }

/* LA MASCOTTE — piccola e a DESTRA, mai a piena larghezza (02/09/2026).
   Difetto visto dal proprietario: la si stampava dentro una `figure.post-hero`, che e' la figura
   di TESTATA di un articolo e occupa tutta la colonna. Un logo quadrato di 1024px steso su una
   colonna di 700 si deforma e schiaccia la sezione che dovrebbe accompagnare.
   Qui e' un disco di 140px che galleggia a destra col testo che gli scorre accanto — l'opposto
   del ritratto autore, che sta a SINISTRA: due immagini sullo stesso lato si sovrapporrebbero. */
.about-mascot { float: right; width: 140px; height: 140px; object-fit: contain; margin: .2em 0 .8em 1.4em; }
.about-mascot ~ h2, .about-mascot ~ .about-cta { clear: both; }
@media (max-width: 640px) { .about-mascot { float: none; display: block; width: 120px; height: 120px; margin: .2em auto .9em; } }

/* ── about / contact (EdgeSitePages: aboutBodyHtml, contactBodyHtml) ──────────── */
.about-intro, .contact-intro { max-width: 62ch; font-size: 1.12rem; line-height: 1.7; color: var(--ink, #16202B); }
.about-author { max-width: 62ch; font-size: 1.05rem; color: var(--muted, #5A6B7B); }
.contact-form { display: grid; gap: 10px; max-width: 480px; margin: 1.4em 0 0; }
.contact-form label {
  font-family: var(--fd, system-ui, sans-serif);
  font-size: 0.86rem;
  font-weight: 650;
  color: var(--ink, #16202B);
}
.contact-form input, .contact-form textarea {
  font: inherit;
  font-size: 0.98rem;
  padding: 10px 12px;
  border: 1px solid var(--line, #DDE4EA);
  border-radius: 8px;
  background: var(--surf, #fff);
  color: var(--ink, #16202B);
}
.contact-form input:focus-visible, .contact-form textarea:focus-visible {
  outline: 2px solid var(--accent, #2C6E8F);
  outline-offset: 1px;
  border-color: var(--accent, #2C6E8F);
}
.contact-form button {
  justify-self: start;
  margin-top: 6px;
  padding: 10px 22px;
  font: inherit;
  font-weight: 700;
  color: #fff;
  background: var(--accent, #2C6E8F);
  border: none;
  border-radius: 8px;
  cursor: pointer;
}
@media (hover: hover) {
  .contact-form button:hover { filter: brightness(0.92); }
}
