/* tokens.css — the design brief, compiled (house-tech-spec §3).
   brief.md (C3 APPROVED 2026-09-15), family `retro-local`, archetype
   `poster-hero`, signature "the ring sways, the arc sweeps". Values cite
   brief.md by section; Builder execution fills (unnumbered by the brief)
   are flagged inline where they occur. */

:root {

  /* --- Colour (brief §2.2). Derivation order per design-rules §6: the
     business's real-world colour (#1395C7, dossier §4.5) is explicitly
     NOT echoed — argued departure on distance + provenance grounds (brief
     §2.1) — so the palette runs on local character + family norms
     (retro-local: hydrant-red accent on warm parchment). Every pairing is
     in the brief's §2.3 contrast table, corrected at §2.4. */

  --scheme: light;

  --color-bg:          #F6EFDF;  /* parchment — page ground */
  --color-surface:     #EFE4C8;  /* trust-plate cards, form fields */
  --color-ink:         #241C16;  /* warm near-black — primary text */
  --color-ink-muted:   #6B5C4A;  /* secondary text */
  --color-accent:      #B23A2E;  /* hydrant-red — the one colour that means "act" */
  --color-accent-ink:  #FFFFFF;  /* text ON accent fill */

  --color-border:        #DCCDA9;  /* decorative hairlines only — no contrast floor */
  --color-border-strong: #6B5C4A;  /* = ink-muted; >=3:1 vs bg AND surface (brief §2.2) */
  --color-focus:          #B23A2E; /* = accent; >=3:1 vs bg AND surface (brief §2.3 row 11) */
  /* --color-focus-on-band: not declared — one light mode, no dark band or
     inverted section anywhere on this site (brief §2.2's own instruction). */
  --color-selection-bg:  #B23A2E;
  --color-selection-ink: #FFFFFF;

  /* Brief-specific — imagery/atmosphere only, NEVER a text/bg pair
     (brief §2.3's own rule; rows 8-10 measure text against this stop). */
  --color-hero-atmosphere: #E8D9B8;

  /* --- Typography (brief §3.1). Bevan 400 (display, its only weight) +
     Barlow 400/500/700 (body/medium/strong). SIL OFL, self-hosted, subset
     to the house declared safe range, each with a metrics-matched
     fallback (below). No italic file — emphasis is weight + colour
     (brief §3.1). */

  --font-display: 'Bevan', 'Bevan Fallback', Georgia, serif;
  --font-body:    'Barlow', 'Barlow Fallback', -apple-system, 'Helvetica Neue', Arial, sans-serif;

  --font-weight-body:        400;
  --font-weight-body-medium: 500;  /* facts row, ring captions (brief §3.1) */
  --font-weight-body-strong: 700;  /* eyebrow, CTA-adjacent labels, section kickers */
  --font-weight-display:     400;  /* Bevan's only weight */

  /* Fluid scale (brief §3.2), every clamp() reproduced verbatim. */
  --text-hero:    clamp(2.2rem, 1.5rem + 3.8vw, 4rem);
  --text-h2:      clamp(1.6rem, 1.35rem + 1.6vw, 2.3rem);
  --text-h3:      0.95rem;   /* fixed (brief §3.2) */
  --text-lead:    clamp(1.05rem, 1rem + 0.3vw, 1.2rem);
  --text-body:    clamp(1rem, 0.96rem + 0.2vw, 1.1rem);
  --text-small:   0.82rem;   /* fixed (brief §3.2) */
  --text-eyebrow: clamp(0.72rem, 0.68rem + 0.2vw, 0.82rem);
  --text-label:   clamp(0.85rem, 0.8rem + 0.15vw, 0.95rem);
  --text-ring:    0.7rem;    /* fixed, brief-specific — badge/plate caption */

  /* Leading (brief §4.2's own arithmetic pins these exactly): H1 1.05
     leading already equals the house --leading-tight default, kept as is.
     Eyebrow/facts 1.3, lead 1.4 are brief-specific — new tokens, since
     neither matches an existing house step. */
  --leading-tight:   1.05;   /* H1 (brief §4.2) — matches house default */
  --leading-snug:    1.25;   /* house default, unused by name in this brief */
  --leading-eyebrow: 1.3;    /* eyebrow AND facts row (brief §4.2) */
  --leading-lead:    1.4;    /* hero lead line (brief §4.2) */
  --leading-body:    1.6;    /* house default */

  --tracking-tight: -0.02em;  /* house default — brief states no override */
  --tracking-normal: 0em;
  --tracking-wide:  0.08em;   /* house default — eyebrow letter-spacing */

  /* --- Space (brief §4.2's arithmetic table resolves entirely on house
     default steps — no override needed; every gap the brief computes
     against matches the skeleton's own scale value for value). */
  --space-3xs: 0.25rem;
  --space-2xs: 0.5rem;
  --space-xs:  0.75rem;
  --space-sm:  1rem;
  --space-md:  1.5rem;
  --space-lg:  2.5rem;
  --space-xl:  4rem;
  --space-2xl: 6rem;
  --space-3xl: 9rem;

  --section-gap: var(--space-xl);  /* 64px (brief §4.4) */

  /* --- Layout — house default, brief silent (§4 does not override). */
  --layout-container: 72rem;
  --layout-measure:   62ch;
  --layout-gutter:    clamp(1.25rem, 5vw, 3rem);
  --layout-tap-min:   44px;

  /* Brief-specific — hero field geometry (brief §3.2, correction 2,
     2026-09-15): floor dropped 110px -> 96px to recover hero-foot anchor
     image fold visibility (brief §4.2 round 2, §5.1); ceiling unchanged. */
  --hero-field-height: clamp(6rem, 3.6rem + 10.5vw, 9.375rem);  /* 96px -> 150px */

  /* Builder execution fills — geometry the brief's prose implies but does
     not itself tokenise (house-tech-spec §12, flagged not silent; see
     README "Builder execution fills"). */
  --plate-ring-size: 64px;        /* trust-plate ring, fixed (brief §3.3) */
  --index-num-min-width: 2.5rem;  /* services numeral column floor (brief §4.6) */
  --step-num-size: 1rem;          /* compliance step numeral, fixed (brief §4.6) */
  --accent-img-max-width: 28rem;  /* slot 2/3 accent-image display cap — Builder
                                      execution fill, not stated by the brief */

  /* --- Radius (brief §3.4) — deliberately not uniform. */
  --radius-none: 0;
  --radius-sm: 2px;      /* CTA buttons — sign-painted/stamped register */
  --radius-md: 6px;      /* house default, unused by this brief */
  --radius-lg: 16px;     /* house default, unused by this brief */
  --radius-pill: 999px;  /* house default, unused by this brief */

  /* --- Shadow (brief §3.4) — --shadow-none everywhere except the hero
     field's enamel ring, which carries --shadow-sm (a stamped-metal lift). */
  --shadow-none: none;
  --shadow-sm: 0 1px 2px rgb(36 28 22 / 0.14);
  --shadow-md: 0 6px 24px rgb(36 28 22 / 0.09);  /* house default, unused */
  --shadow-lg: 0 24px 60px rgb(36 28 22 / 0.14); /* house default, unused */

  --border-hairline: 1px;
  --border-thick:    3px;   /* ring/arc stroke-width, non-scaling (brief §3.3) */
  --border-style:    solid;

  /* --- Motion (brief §6). House reveal defaults kept; two brief-specific
     ambient loops added for the signature move. */
  --duration-fast: 140ms;
  --duration-base: 320ms;
  --duration-slow: 640ms;

  --ease-out:    cubic-bezier(0.16, 1, 0.3, 1);
  --ease-in-out: cubic-bezier(0.65, 0, 0.35, 1);

  --reveal-shift:   1.25rem;
  --reveal-stagger: 90ms;

  /* Signature move — "the ring sways, the arc sweeps" (brief §6). Two
     independent, non-synchronised ambient loops. Arc easing is a Builder
     execution fill (linear — a continuous flowing sweep, not stated by
     the brief, distinct on purpose from the ring's stated ease-in-out). */
  --duration-ring-sway: 6.8s;   /* brief §6 */
  --duration-arc-sweep: 4.4s;   /* brief §6 */
  --ease-ring-sway: var(--ease-in-out);  /* brief §6: "ease-in-out loop" */
  --ease-arc-sweep: linear;              /* Builder execution fill */

  /* --- Z layers — house default. */
  --z-base: 0;
  --z-header: 100;
  --z-nav-panel: 200;
  --z-skip-link: 300;
}

/* --------------------------------------------------------------------------
   @font-face — Bevan 400 (display) + Barlow 400/500/700 (body), self-hosted,
   SIL OFL 1.1. Subset to the HOUSE declared safe range (house-tech-spec §8),
   identical on all four faces.

   BUILDER EXECUTION NOTE (flagged, not silent): brief §3.1's Files column
   names "1 variable woff2" for Barlow. Barlow has no published variable
   axis on Google Fonts (confirmed 2026-09-15 against fonts.google.com's own
   css2/download endpoints — static instances only). Shipped as 3 static
   weights instead (400/500/700) — 4 files total against the house §7 cap of
   4, still "well under" nothing broken, but not the 2-file count the brief's
   prose assumed. Not a design decision: no weight, colour or role changes,
   only the file count and total bytes (47.98 KB vs. the brief's assumed
   lower figure), still comfortably inside the ≤100 KB/≤60 KB-per-face budget.

   Metrics-matched fallbacks first, so the swap costs no CLS (house-tech-spec
   §8). size-adjust/overrides measured with scripts/font-metrics.mjs (the
   fontaine algorithm, English-letter-frequency weighted) against Gelasio
   (Google's own metric-compatible replacement for Georgia — neither donor's
   own binary is reachable on the Linux build host) and Liberation Sans
   (Red Hat's open replacement for Helvetica Neue/Arial). The shipped
   local() stacks name the REAL donor fonts; the proxies stood in for the
   measurement only — see README "Fonts". */

@font-face {
  font-family: 'Bevan Fallback';
  src: local('Georgia');
  size-adjust: 126.26%;
  ascent-override: 91.5%;
  descent-override: 35.77%;
  line-gap-override: 0%;
}

@font-face {
  font-family: 'Barlow Fallback';
  src: local('Helvetica Neue'), local('Arial');
  font-weight: 400;
  font-style: normal;
  size-adjust: 96.96%;
  ascent-override: 103.14%;
  descent-override: 20.63%;
  line-gap-override: 0%;
}

@font-face {
  font-family: 'Barlow Fallback';
  src: local('Helvetica Neue Medium'), local('Helvetica Neue'), local('Arial');
  font-weight: 500;
  font-style: normal;
  size-adjust: 98%;
  ascent-override: 102.04%;
  descent-override: 20.41%;
  line-gap-override: 0%;
}

@font-face {
  font-family: 'Barlow Fallback';
  src: local('Helvetica Neue Bold'), local('Arial Bold'), local('Arial');
  font-weight: 700;
  font-style: normal;
  size-adjust: 92.39%;
  ascent-override: 108.23%;
  descent-override: 21.65%;
  line-gap-override: 0%;
}

@font-face {
  font-family: 'Bevan';
  src: url('../assets/fonts/bevan-latin-400.woff2') format('woff2');
  font-weight: 400;
  font-style: normal;
  font-display: swap;
  unicode-range:
    U+0020-007E, U+00A0, U+00A9, U+00AE, U+2122, U+00B0, U+00B7, U+00BF,
    U+00C0-00FF, U+2010-2015, U+2018-201A, U+201C-201E, U+2026, U+2032-2033;
}

@font-face {
  font-family: 'Barlow';
  src: url('../assets/fonts/barlow-latin-400.woff2') format('woff2');
  font-weight: 400;
  font-style: normal;
  font-display: swap;
  unicode-range:
    U+0020-007E, U+00A0, U+00A9, U+00AE, U+2122, U+00B0, U+00B7, U+00BF,
    U+00C0-00FF, U+2010-2015, U+2018-201A, U+201C-201E, U+2026, U+2032-2033;
}

@font-face {
  font-family: 'Barlow';
  src: url('../assets/fonts/barlow-latin-500.woff2') format('woff2');
  font-weight: 500;
  font-style: normal;
  font-display: swap;
  unicode-range:
    U+0020-007E, U+00A0, U+00A9, U+00AE, U+2122, U+00B0, U+00B7, U+00BF,
    U+00C0-00FF, U+2010-2015, U+2018-201A, U+201C-201E, U+2026, U+2032-2033;
}

@font-face {
  font-family: 'Barlow';
  src: url('../assets/fonts/barlow-latin-700.woff2') format('woff2');
  font-weight: 700;
  font-style: normal;
  font-display: swap;
  unicode-range:
    U+0020-007E, U+00A0, U+00A9, U+00AE, U+2122, U+00B0, U+00B7, U+00BF,
    U+00C0-00FF, U+2010-2015, U+2018-201A, U+201C-201E, U+2026, U+2032-2033;
}
