/* tokens.css — the design brief, compiled.
   Right Edge Lawn Care, Springfield IL. Source: brief.md (approved 2026-09-13)
   §2 palette, §3 typography, §4 layout, §6 motion. Every value below is the
   brief's. This file is the only place raw values live (house-tech-spec §3). */

:root {

  /* --- Colour — brief §2.2 ------------------------------------------------
     Derivation order (design-rules §6): step 1 (real-world colour) inert —
     nothing found (dossier §4.5); step 2, Big Bluestem / Illinois local
     character; step 3, fresh-organic family norms for register only. */

  --scheme: light;

  --color-bg:          #FAF3E7;   /* page ground — oat cream */
  --color-surface:     #F0E5D0;   /* panels, cards, form fields */
  --color-ink:         #2B2117;   /* primary text */
  --color-ink-muted:   #6B5A43;   /* secondary text — accent-word restriction, §2.4 */
  --color-accent:      #8B5A2B;   /* bluestem-bronze — "act" colour; large-text-only
                                      as a text colour, unrestricted as a fill */
  --color-accent-ink:  #FFFDF8;   /* text ON accent fill */

  --color-border:        #E1D3B4; /* decorative hairlines only, no contrast floor */
  --color-border-strong: #6B5A43; /* control boundary, WCAG 1.4.11, >=3:1 vs bg AND surface */
  --color-focus:          #8B5A2B; /* = accent; >=3:1 vs bg AND surface */
  /* --color-focus-on-band: not declared — no dark band or inverted section anywhere
     on this site (brief §2.2): single light mode, and the final-CTA band uses
     --color-surface as its ground, not a saturated fill. */
  --color-selection-bg: #8B5A2B;
  --color-selection-ink: #FFFDF8;

  /* Brief §2.3 — hero atmosphere gradient stops (radial-gradient(120% 85% at
     50% 0%, --color-atmos-top 0%, --color-bg 55%, --color-atmos-edge 100%)).
     Not reusable palette roles, but still tokens rather than site.css literals. */
  --color-atmos-top:  #FEFBF4;
  --color-atmos-edge: #F2E7D2;

  /* Brief-specific — imagery-only, NEVER used as a text/bg pair (brief §2.4) */
  --color-turf:        #5E8A45;   /* living-turf band base */
  --color-turf-dark:   #3F6430;   /* turf band shadow edge; section-boundary head-rule */
  --color-turf-blade:  #7FAF5F;   /* seed-head silhouette stroke, drawn over the image */

  /* --- Typography — brief §3.1, §3.3 --------------------------------------
     Manrope (display) + Nunito Sans (body). Both self-hosted variable woff2,
     OFL, subset to the house declared safe range (house-tech-spec §8).
     Metrics-matched fallbacks declared below, ahead of the real faces. */

  --font-display: 'Manrope', 'Manrope Fallback', Arial, sans-serif;
  --font-body:    'Nunito Sans', 'Nunito Sans Fallback', Arial, sans-serif;

  --font-weight-body:          400;
  --font-weight-body-strong:   700;
  --font-weight-display-medium: 700;   /* CTA/button label, header wordmark */
  --font-weight-display:       800;    /* H1, poster numerals */

  /* --- Type scale — brief §3.2, fluid via clamp() ------------------------- */

  --text-hero:    clamp(3rem, 2.1rem + 4.3vw, 5.4rem);
  --text-lead:    clamp(1.05rem, 0.95rem + 0.5vw, 1.3rem);
  --text-h2:      clamp(0.95rem, 0.9rem + 0.3vw, 1.15rem);
  --text-h3:      clamp(1.1rem, 1rem + 0.5vw, 1.4rem);
  --text-body:    clamp(1rem, 0.95rem + 0.2vw, 1.125rem);
  --text-small:   0.85rem;
  --text-eyebrow: 0.78rem;

  /* Brief-specific — poster service numerals (§3.2), not one of the required 7 */
  --index-num-size: clamp(1.6rem, 1.3rem + 2vw, 2.4rem);

  /* H1 line-height, carried from Tile C and the §4.2 arithmetic (0.94 × two
     lines = 93.4px at 375px) — tighter than the house default, "type IS the
     visual" register (design-rules §7). Applies to every heading (h1-h4) via
     base.css; this brief's section headings (h2) are small kicker-scale
     labels by the token table above, so the tight leading suits them too. */
  --leading-tight: 0.94;
  --leading-snug:  1.25;
  --leading-body:  1.6;

  /* Brief-specific — hero lede line-height (§4.2: "17.1px × 1.4") */
  --leading-lead: 1.4;

  --tracking-tight: -0.02em;
  --tracking-normal: 0em;
  --tracking-wide: 0.08em;

  /* --- Space — house scale, unchanged (brief §4.2, §4.4 use these steps
     directly: space-2xs 8px, space-xs 12px, space-sm 16px, space-md 24px,
     space-xl 64px) ------------------------------------------------------- */

  --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 rhythm — brief §4.4: --space-xl (64px). Two call sites only:
     .section's padding-block and the hero's padding-block-end. */
  --section-gap: var(--space-xl);

  /* --- Layout --------------------------------------------------------------
     Brief does not override container/measure/gutter — house defaults stand. */

  --layout-container: 72rem;
  --layout-measure: 62ch;
  --layout-gutter: clamp(1.25rem, 5vw, 3rem);
  --layout-tap-min: 44px;

  /* Brief-specific — poster numeral column (brief §4.6 correction): fixed
     min-width, not a space-scale step, so the numeral never wraps or shrinks
     below its own ceiling width. */
  --index-numeral-col: 2.4rem;

  /* Brief-specific — living-turf band height (brief §4.1, §5.1): 16vh,
     clamped 84-118px, and it never shrinks past the floor. */
  --hero-field-height: clamp(84px, 16vh, 118px);

  /* Brief-specific — sticky header height (brief §4.2: padding-block
     --space-xs top/bottom + border-bottom, content row dominated by the
     44px WCAG touch-target floor on the phone control, per house-tech-spec
     §8 — 12 + 12 + 44 + 1 = 69px). Used by css/preview.css to stack the
     sticky header under the sticky expiry bar and to offset anchor scroll
     targets (design-rules §7.2 rule 3: the measured stack, not the sum of
     tokens named in the brief's own prose). */
  --header-height: 4.3125rem;

  /* Brief-specific — fixed width for the header phone control (measured;
     see the comment at its call site in site.css). Sized with headroom over
     "Call (217) 816-6348" set in either the webfont or its fallback face, so
     the box never resizes across the font-display swap (perf/cls). */
  --header-phone-width: 8.5rem;

  /* Brief-specific — fixed width for the header nav-toggle control, same
     font-swap-decoupling reasoning, sized for "Close" (the longer of its
     two labels) with headroom in either face. */
  --header-toggle-width: 4.5rem;

  /* --- Radius / shadow / border — brief §3.3, deliberately NOT uniform ---- */

  --radius-none: 0;
  --radius-sm: 2px;
  --radius-md: 6px;
  --radius-lg: 16px;
  --radius-pill: 999px;

  --shadow-none: none;
  --shadow-sm: 0 1px 2px rgb(43 33 23 / 0.06);
  --shadow-md: 0 6px 24px rgb(43 33 23 / 0.09);
  --shadow-lg: 0 24px 60px rgb(43 33 23 / 0.14);

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

  /* --- Motion — brief §6 ---------------------------------------------------
     Standard house scroll-reveal at house defaults; nothing brief-specific
     about ordinary section entrances. */

  --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;

  /* Brief-specific — "turkey-foot sway" signature move (brief §6): three
     independent, non-synchronised loops, carried forward from Tile C. */
  --sway-duration-a: 5.6s;
  --sway-duration-b: 6.8s;
  --sway-duration-c: 7.6s;
  --sway-delay-b: -1.6s;
  --sway-delay-c: -0.7s;
  /* Second, offset pair of silhouettes further along the band (Tile C). */
  --sway-delay-a2: -2.4s;
  --sway-delay-b2: -3.1s;
  --sway-delay-c2: -4.2s;

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

/* Brief §6: motion tokens collapse at their source under reduced-motion.
   base.css already collapses the house durations and --reveal-shift; this
   site's own sway timing needs no separate collapse because site.css turns
   the animation off entirely (`.blade-a, .blade-b, .blade-c { animation: none }`)
   at matching specificity — no !important (house-tech-spec §12). */

/* --------------------------------------------------------------------------
   @font-face — two families, two files (brief §3.1). Both SIL OFL 1.1;
   assets/fonts/OFL.txt carries the notices. Subset to the HOUSE declared
   safe range (house-tech-spec §8).

   Metrics-matched fallbacks first, so the swap costs no CLS (spec §8).
   Measured with scripts/font-metrics.mjs against Liberation Sans — the
   metric-compatible open-source clone of Arial, used here as the measurable
   proxy for the 'Arial' the CSS local() actually resolves to on a reader's
   machine (both faces share the same hhea/OS-2 metrics by design). -------- */

@font-face {
  font-family: 'Manrope Fallback';
  src: local('Arial');
  size-adjust: 99.89%;         /* measured: Manrope 874.78 vs Liberation Sans 896.76 (avg char width) */
  ascent-override: 106.72%;    /* 2132/2000 ÷ 0.9989 */
  descent-override: 30.03%;    /* 600/2000 ÷ 0.9989 */
  line-gap-override: 0%;
}

@font-face {
  font-family: 'Nunito Sans Fallback';
  src: local('Arial');
  size-adjust: 97.91%;         /* measured: Nunito Sans 428.70 vs Liberation Sans 896.76 (avg char width) */
  ascent-override: 103.26%;    /* 1011/1000 ÷ 0.9791 */
  descent-override: 36.06%;    /* 353/1000 ÷ 0.9791 */
  line-gap-override: 0%;
}

@font-face {
  font-family: 'Manrope';
  src: url('../assets/fonts/manrope-variable-latin.woff2') format('woff2');
  font-weight: 400 800;
  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: 'Nunito Sans';
  src: url('../assets/fonts/nunito-sans-variable-latin.woff2') format('woff2');
  font-weight: 400 800;
  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;
}

/* Coverage note (house-tech-spec §8): U+2010, U+2011, U+2012 and U+2015 are in
   the declared range and absent from BOTH subset faces here — same pattern as
   the house's own first measurement. A page rendering one of them falls to
   the metrics-matched fallback consistently across every face, never
   mid-sentence in two faces, so the range is not narrowed for it.

   U+2032/U+2033 (prime marks, feet/inches) ARE present in Nunito Sans but
   ABSENT from Manrope's subset. This site's copy (copy.md) contains no prime
   marks anywhere, on any page, so the gap is never exercised — recorded here
   per §8's instruction rather than left to be rediscovered, and re-checked by
   the census check every QA round. */
