/* ==========================================================================
   tokens.css — Dakota Lawn & Landscape (dakota-lawn-landscape-grand-forks-nd)

   Compiled from the approved brief (runs/dakota-lawn-landscape-grand-forks-nd/
   brief.md §2). family: bold-industrial · archetype: editorial-stack ·
   palette: iron-frost / concrete-ivory, light. Every value below is the
   brief's, translated into the house token names (house-tech-spec §3). No
   value here is improvised.
   ========================================================================== */

:root {

  /* --- Colour (brief §2.1) -------------------------------------------------
     Derivation order per design-rules §6: no real-world colour exists to
     echo (dossier §4.5, no brand_color recorded) -> local character (a
     modest, home-based Red River Valley shop) -> family norms
     (bold-industrial's steel/high-contrast register). Contrast table: brief
     §2.2, every pair computed, 0.00% of body text below AA at 375px. */

  --scheme: light;

  --color-bg: #EFF1F0;                /* concrete-ivory — page ground */
  --color-surface: #FFFFFF;           /* raised bands, cards */
  --color-ink: #1A2023;               /* body + heading text */
  --color-ink-muted: #52585C;         /* secondary text, eyebrow */
  --color-accent: #3E5566;            /* iron-frost — dominant hue, usable as text/links */
  --color-accent-ink: #F5F6F5;        /* text on --color-accent-strong */

  /* House-required structural colours */
  --color-border: #C9D0D2;            /* decorative hairlines only */
  --color-border-strong: #7C868A;     /* control-boundary use, >= 3:1 vs bg AND surface */

  --color-focus: #22323D;             /* :focus-visible ring */
  --color-selection-bg: #3E5566;
  --color-selection-ink: #F5F6F5;

  /* Brief-specific colours */
  --color-accent-strong: #22323D;     /* deep steel — CTA fill, control fill */
  --color-accent-2: #B0502B;          /* kiln-rust — warm support accent, labels/tags */
  --color-accent-3: #4B7A52;          /* moss-green — the vertical's semantic anchor.
                                          4.40:1 on --color-bg (icon-fill/decorative/
                                          large-text ONLY there); 4.96:1 on
                                          --color-surface (the one ground it may carry
                                          running text, brief §2.2 rows 10-11). */

  /* --- Typography (brief §2.3) --------------------------------------------
     Archivo (variable, wght 100-900) ships as ONE woff2 covering 600/700/800;
     CSS sets weight with plain font-weight on the range-declared @font-face,
     never font-variation-settings (house-tech-spec §8's wght-naming trap).
     Barlow has no variable axis on Google Fonts (confirmed against the live
     family metadata at build time — axes: []), so it ships as two genuinely
     static instances, 400 and 600; weight 500 is never called by any token or
     component in this brief's own "Weights" list (§2.3), so it is not
     fetched — the "-> 1 woff2" language in the brief's font table describes
     Barlow's role, not a promise of the variable-file mechanism, which does
     not exist for this family. Recorded in README.md's Fonts section. */

  --font-display: 'Archivo', 'Archivo Fallback', 'Arial Narrow', sans-serif;
  --font-body: 'Barlow', 'Barlow Fallback', 'Helvetica Neue', sans-serif;

  --font-weight-body: 400;
  --font-weight-body-strong: 600;
  --font-weight-display: 800;         /* H1, eyebrow labels */
  --font-weight-subhead: 700;         /* Archivo 700 — index group headers, section H2s */

  /* --- Type scale (brief §2.3, fluid via clamp(), floor 375px / ceiling 1440px) */

  --text-hero: clamp(1.85rem, 1.2rem + 3vw, 3.3rem);
  --text-h2: clamp(1.5rem, 1.2rem + 1.4vw, 2.1rem);
  --text-h3: var(--text-lead);        /* unused by this brief's section plan (no <h3>) */
  --text-lead: clamp(1.05rem, 0.95rem + 0.5vw, 1.2rem);
  --text-body: clamp(1rem, 0.94rem + 0.3vw, 1.0625rem);
  --text-small: clamp(0.85rem, 0.8rem + 0.2vw, 0.95rem);
  --text-eyebrow: clamp(0.75rem, 0.66rem + 0.4vw, 0.85rem);

  --leading-tight: 1.05;
  --leading-snug: 1.25;
  --leading-body: 1.6;

  --tracking-tight: -0.01em;
  --tracking-normal: 0em;
  --tracking-wide: 0.06em;            /* eyebrows / index numerals */

  /* --- Space (house default, brief §2.4) ----------------------------------- */

  --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-2xl);    /* 96px, fixed at every breakpoint (brief §2.4) */

  /* --- Layout --------------------------------------------------------------
     House defaults unchanged (brief §2.4), plus one brief-added structural
     value: the fixed 56px header bar the sticky-chrome arithmetic (§3.2)
     depends on. A raw px value belongs here, never in site.css. */

  --layout-container: 72rem;
  --layout-measure: 62ch;
  --layout-gutter: clamp(1.25rem, 5vw, 3rem);
  --layout-tap-min: 44px;
  --layout-header-height: 3.5rem;     /* 56px, brief §3.2's sticky-chrome term */

  /* --- Radius / shadow / border (brief §2.4) --------------------------------
     Whole-site answer: zero rounding, zero elevation — argued from the
     family's "no-nonsense" register (design-rules §4's ban on defaulting to
     uniform rounding is answered here by naming the family reason). */

  --radius-none: 0;
  --radius-sm: 0;
  --radius-md: 0;
  --radius-lg: 0;
  --radius-pill: 0;

  --shadow-none: none;
  --shadow-sm: none;
  --shadow-md: none;
  --shadow-lg: none;

  --border-hairline: 1px;
  --border-thick: 3px;
  --border-style: solid;

  /* --- Motion (brief §2.4 + §5) --------------------------------------------- */

  --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-device tokens ("the blade sets," brief §5) — brief-added, not
     house-required. */
  --duration-blade-settle: 2.2s;
  --ease-blade-settle: cubic-bezier(0.2, 0.9, 0.2, 1);
  --duration-grass-1: 6.8s;
  --duration-grass-2: 8.3s;
  --grass-2-offset: -1.4s;
  --duration-worklight: 4.6s;
  --worklight-rest-opacity: 0.55;

  /* Signature-device geometry — decorative sizes with no space-scale match
     (spec §3: no raw size literal outside this file). Where a value DOES
     match an existing space-scale step, site.css reuses that token instead
     of duplicating it here (0.5rem -> --space-2xs, 2.5rem -> --space-lg,
     4rem -> --space-xl). */
  --hero-blade-lift: -0.9rem;
  --hero-grass-1-height: 3.25rem;
  --hero-worklight-size: 2.75rem;

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

/* --------------------------------------------------------------------------
   @font-face — self-hosted woff2, latin subset, font-display: swap.
   Licences: assets/fonts/OFL-Archivo.txt, assets/fonts/OFL-Barlow.txt
   (SIL OFL 1.1, both). Sourced from fonts.gstatic.com 2026-09-12, re-subset
   locally to the house declared safe range (house-tech-spec §8) with
   pyftsubset — no remote font request ships on this site.

   Archivo ships as its native variable file (fvar wght 100-900 intact after
   subsetting, confirmed with a fontTools table read) so font-weight on the
   range-declared face resolves 600/700/800 without font-variation-settings
   ever naming wght (house-tech-spec §8's trap). Barlow ships as two static
   instances since it has no variable axis on Google Fonts. -------------- */

@font-face {
  font-family: 'Archivo';
  src: url('../assets/fonts/archivo-variable.woff2') format('woff2');
  font-weight: 100 900;
  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-600.woff2') format('woff2');
  font-weight: 600;
  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;
}

/* Metrics-matched fallbacks (house-tech-spec §7/§8). Measured with
   scripts/font-metrics.mjs (the fontaine algorithm, English-letter-frequency
   weighted) against the two shipped webfonts, donor Liberation Sans (Arial's
   metric-compatible open clone — the only proxy available on this build
   machine for either named local() face; the shipped CSS still names the
   brief's own first-choice local face first, per house-tech-spec §7.1's
   exception-5 precedent, `grant-creek-lawns-missoula-mt` README). See
   README.md's Fonts section for the full measurement record. */

@font-face {
  font-family: 'Archivo Fallback';
  src: local('Arial Narrow'), local('Arial');
  size-adjust: 101.78%;
  ascent-override: 86.27%;
  descent-override: 20.63%;
  line-gap-override: 0%;
}

@font-face {
  font-family: 'Barlow Fallback';
  src: local('Helvetica Neue'), local('Arial');
  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');
  font-weight: 600;
  size-adjust: 91.42%;
  ascent-override: 109.38%;
  descent-override: 21.88%;
  line-gap-override: 0%;
}
