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

:root {

  /* Colour (brief §2). Order per design-rules §6: no real-world brand
     colour (dossier §4.5, correctly skipped) -> local character
     (haint-blue) -> family norms (clapboard-cream). Every pairing is in
     the brief's §2 contrast table (WCAG relative luminance). */

  --scheme: light;

  --color-bg:          #F7F3EA;  /* clapboard-cream */
  --color-surface:     #EFE8D8;
  --color-ink:         #262A2C;
  --color-ink-muted:   #565F5F;
  --color-accent:      #356866;  /* haint-blue, deepened for AA body text */
  --color-accent-pale: #A9CBC5;  /* porch-ceiling tint — DECORATIVE ONLY, never text */
  --color-accent-ink:  #F7F3EA;  /* cream text ON accent (CTA label) */
  --color-turf-1:      #35592C;  /* turf band, dark edge — §6.1 anchor */
  --color-turf-2:      #557A44;  /* turf band, light edge */
  --color-line:        #356866;  /* rules/dividers = accent (brief §2) */

  /* House-contract completion. No separate "border" role in brief §2, so
     these alias the roles it did give: dividers = --color-line ("rules/
     dividers = accent"); a control edge needs >=3:1 vs bg AND surface,
     which --color-ink-muted clears (5.9:1 / 5.4:1) without reaching for ink. */
  --color-border:        var(--color-line);
  --color-border-strong: var(--color-ink-muted);
  --color-focus:         var(--color-accent);  /* 5.7:1 / 5.2:1, brief §2 */

  /* One light register (brief §2) — no dark band. */
  --color-selection-bg:  var(--color-accent);
  --color-selection-ink: var(--color-accent-ink);

  /* Builder execution fill: hero wood-post prop, from the C2 tile's own
     `.post` fill — a shape colour, not a text/bg pairing, no ratio needed. */
  --color-post: #5B4632;

  /* --- Typography (brief §3). Bevan 400 + Barlow 400/700 + Barlow Italic
     400 — 4 woff2 files, the house §7 cap exactly. OFL, self-hosted, Latin
     subset, swap, each with a metrics-matched fallback (below). */

  --font-display:  'Bevan', 'Bevan Fallback', Georgia, serif;
  --font-body:     'Barlow', 'Barlow Fallback', -apple-system, Segoe UI, sans-serif;
  --font-emphasis: 'Barlow', 'Barlow Fallback', sans-serif; /* italic via font-style */

  --font-weight-body:        400;
  --font-weight-body-strong: 700;  /* CTA labels, board tags, process numerals */
  --font-weight-display:     400;  /* Bevan's one static weight */

  /* Fluid scale (brief §3). */
  --text-eyebrow: clamp(0.72rem, 0.68rem + 0.2vw, 0.82rem);
  --text-hero:    clamp(2rem, 1.5rem + 2.8vw, 3.1rem);
  --text-h2:      clamp(1.4rem, 1.25rem + 0.9vw, 2rem);
  --text-h3:      clamp(1.05rem, 1rem + 0.3vw, 1.25rem);
  --text-body:    clamp(1rem, 0.96rem + 0.15vw, 1.1rem);
  --text-small:   0.875rem;  /* fixed (brief §3) */

  /* Line-heights brief §4.1 names: eyebrow 1.3, h1 1.1, wordmark/h3 1.2.
     Body leading is unnamed; kept at the house default (1.6). */
  --leading-tight:   1.1;
  --leading-snug:    1.2;
  --leading-eyebrow: 1.3;
  --leading-body:    1.6;   /* house default */

  --tracking-tight: -0.02em;  /* house default — brief states no value */
  --tracking-wide:  0.06em;  /* eyebrow — carried from the C2 tile's own rule */

  /* --- Space (brief §3) — fixed rem, no vw term, identical at every
     breakpoint. --space-3xs/-3xl sit outside the brief's own 2xs...2xl
     scale; kept at the house default as infrastructure the brief does not
     reach (3xs happens to equal the brief's own 2xs; 3xl's one call site,
     the skeleton's textarea min-height, the brief never mentions). */
  --space-3xs: 0.25rem;
  --space-2xs: 0.25rem;   /* 4px */
  --space-xs:  0.5rem;    /* 8px */
  --space-sm:  0.85rem;   /* 13.6px */
  --space-md:  1.35rem;   /* 21.6px */
  --space-lg:  2.25rem;   /* 36px */
  --space-xl:  3.25rem;   /* 52px */
  --space-2xl: 4.75rem;   /* 76px */
  --space-3xl: 9rem;      /* house default */

  --section-gap: var(--space-xl);  /* 52px, fixed (brief §3) */

  /* Brief §3's rhythm paragraph names this literal explicitly ("the
     services/porch-swatch grid gap 2rem = 32px") — its own named token,
     since it matches no scale step (md 21.6 / lg 36). */
  --grid-gap-services: 2rem;

  /* --layout-container/-measure: house default (brief silent). --layout-
     gutter fixed at --space-md (21.6px): brief's 375px arithmetic needs
     exactly 331.8px = 375 - 2x21.6, holding only at a fixed gutter. */
  --layout-container: 72rem;
  --layout-measure:   62ch;
  --layout-gutter:    var(--space-md);
  --layout-tap-min:   44px;

  --header-pad-block: var(--space-sm);  /* brief §4.1: ~48px wordmark row, non-sticky */

  /* Hero geometry (brief §4.1, §6). 667px floor on `.hero__inner` (not
     `.hero`) so the field's rendered height still matches the brief's
     stated 458.75px while `.hero`'s own trailing padding can still equal
     `--section-gap` (design-rules §7.1) — see README "Builder execution
     fills" for the full reconciliation. */
  --hero-min-height:  667px;
  --hero-pad-top:     var(--space-lg);   /* 36px */
  --hero-gap-eyebrow: var(--space-sm);   /* 13.6px */
  --hero-gap-h1:      var(--space-md);   /* 21.6px */
  --hero-gap-cta:     var(--space-lg);   /* 36px */

  /* Builder fix, Critic round 1: `.hero__copy`'s flex-basis floor at
     >=40em — a flat 40% column is narrower than the H1 needs in the
     ~640-870px band (measured wrap); 40% never shrinks below this. */
  --hero-copy-min: 22rem;

  /* Weather-vane / sign geometry — Builder execution fill, sized to the
     tile's own ~22px vane footprint (brief §6), not a new design. */
  --vane-size:   22px;
  --sign-width:  130px;
  --sign-height: 60px;
  --post-width:  6px;
  --post-height: 120px;

  /* --- Radius / border / shadow (brief §3). */
  --radius-none: 0;
  --radius-sm: 2px;      /* buttons, painted boards */
  --radius-md: 4px;      /* chips, small panels */
  --radius-lg: 6px;      /* cards, larger panels */
  --radius-pill: 999px;  /* house default — unused */

  /* --border-hairline/-thick/-style keep the house SHAPE (bare width + a
     style token) because base.css consumes them pre-combined
     (`var(--border-hairline) var(--border-style) var(--color-border)`);
     the brief's own §3 block writes full shorthand ("1px solid
     var(--color-line)") — decomposed here rather than reproduced as
     unusable shorthand, same discipline as
     df-landscapes-grand-junction-co/css/tokens.css. */
  --border-hairline: 1px;   /* = brief's --border-hairline width */
  --border-thick:    3px;   /* = brief's --border-heavy width (sign only) */
  --border-style:    solid;
  --border-board:    2px;   /* = brief's --border-medium width (boards) */

  --shadow-none:   none;
  --shadow-sm:     none;   /* brief §3: no drop shadow on cards */
  --shadow-md:     none;
  --shadow-lg:     none;
  --shadow-object: 0 6px 14px -8px rgba(38, 42, 44, 0.35);  /* the sign only */

  /* --- Motion (brief §6). */
  --ease-standard: cubic-bezier(0.4, 0, 0.2, 1);  /* scroll reveals */
  --ease-swing:    ease-in-out;                    /* sign pendulum */
  --ease-turn:     linear;                         /* vane, constant speed */

  --duration-reveal: 600ms;
  --duration-swing:  5.4s;
  --duration-turn:   9s;

  /* base.css's reveal system reads --duration-slow/--ease-out by name;
     pointed at the brief's own reveal timing (one real value, two names). */
  --duration-slow: var(--duration-reveal);
  --ease-out:      var(--ease-standard);

  /* House defaults, unmodified — infrastructure the brief does not reach. */
  --duration-fast: 140ms;
  --duration-base: 320ms;
  --ease-in-out:   cubic-bezier(0.65, 0, 0.35, 1);
  --reveal-shift:   1.25rem;
  --reveal-stagger: 90ms;

  --z-base: 0;
  --z-header: 100;
  --z-nav-panel: 200;
  --z-skip-link: 300;
}

/* @font-face — self-hosted woff2, Latin subset, static. Bevan: SIL OFL 1.1,
   Vernon Adams. Barlow: SIL OFL 1.1, Jeremy Tribby. Subset to the house
   declared safe range, identical on all four faces.
   Coverage gap (§8): U+2010-2012, U+2015 absent from all four (fontTools
   cmap, 2026-09-14) — unused in this site's copy (only U+00B7 and the
   plain hyphen U+002D appear) and identical across every face, so never a
   mid-sentence split. Not narrowed — that would make the range per-site. */

@font-face {
  font-family: 'Bevan';
  src: url('../assets/fonts/bevan-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-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-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;
}

@font-face {
  font-family: 'Barlow';
  src: url('../assets/fonts/barlow-400italic.woff2') format('woff2');
  font-weight: 400;
  font-style: italic;
  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;
}

/* Metrics-matched fallbacks (§8). Donors: Georgia (Bevan) and Helvetica
   Neue/Arial (Barlow) — neither reachable on the Linux build host, so each
   was measured via a metric-compatible proxy (Gelasio; Liberation Sans),
   same method bend-lawn-service-bend-or/css/tokens.css records. Computed
   with scripts/font-metrics.mjs (fontaine, English-letter-frequency
   weighted).
   `local('DejaVu Serif'/'Sans')` is appended to each src as an ADDITIONAL
   match, never the primary — Georgia/Helvetica/Arial stay first for real
   Windows/Mac visitors. `local()` does no fontconfig substitution, so
   where none of those names exist the fallback face previously errored
   and the browser used an un-overridden generic face, narrower than Bevan
   (see README). Naming a Linux-resolvable font keeps the override applying
   to SOME local face — CLS 0.000 here. HOUSE-WIDE gap (A-cf). */

@font-face {
  font-family: 'Bevan Fallback';
  src: local('Georgia'), local('DejaVu Serif');
  font-weight: 400;
  font-style: normal;
  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'), local('DejaVu Sans');
  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 Bold'), local('Arial Bold'), local('Arial'), local('DejaVu Sans Bold');
  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: 'Barlow Fallback';
  src: local('Helvetica Neue Italic'), local('Arial Italic'), local('Arial'), local('DejaVu Sans');
  font-weight: 400;
  font-style: italic;
  size-adjust: 94.58%;
  ascent-override: 105.73%;
  descent-override: 21.15%;
  line-gap-override: 0%;
}
