/* ==========================================================================
   tokens.css — the design brief, compiled.

   Values below are taken verbatim from the approved brief
   (runs/professional-lawn-care-waterloo-ia/brief.md §3.3). Nothing here is
   improvised; every token traces to a brief line.
   ========================================================================== */

:root {
  --scheme: light;

  /* --- ground + ink --------------------------------------------------- */
  --color-bg:        #F4EFE4;  /* husk-ivory — warm off-white, Cedar Valley grain tone */
  --color-surface:   #E8E1D2;  /* deeper husk-ivory — Grounds/Fleet band ground, tenure band ground */
  --color-ink:       #21201D;  /* asphalt-charcoal */
  --color-ink-muted: #5C574C;

  /* --- accent — SODIUM-AMBER. Text-safe at every declared use. --------- */
  --color-accent:        #8F4A0A; /* dominant hue — 5.81:1 on bg, usable as running text */
  --color-accent-strong: #6B3607; /* CTA fill; band-label colour; big-numeral fill */
  --color-accent-ink:    #FBF7EF; /* text ON the accent-strong fill */

  /* --- anchor — turf-reveal green. Imagery-only, per brief §3.2. NEVER text. - */
  --color-anchor: #4C7A3E; /* the hero's revealed-turf shelf and tuft-1 fill; icon-fill only */

  /* --- hero SVG scene colours (brief §8.1's geometry table, §4.4's contrast
     table). These are named tokens rather than site.css literals for the
     same reason every other colour on this site is: house-tech-spec §3. --- */
  --color-atmosphere-end:    #E4DAC5; /* atmosphere gradient's darkest stop, 165deg from --color-bg */
  --color-atmosphere-mound:  #DCCFB0; /* salt-pile mound, background depth */
  --color-atmosphere-tuft-2: #3D6432; /* turf tuft 2's own slightly-darker green, brief §8.1 */
  --color-atmosphere-beacon: #B5650A; /* loader beacon fill, brief §8.1 — distinct from --color-accent */

  /* --- structural (house-required roles) -------------------------------- */
  --color-border:        #D3CCBB; /* decorative hairlines only — one value, consolidated from Tile A's three near-duplicate greys (brief §3.4) */
  --color-border-strong: #6B3607; /* reused accent-strong — >=3:1 vs bg AND surface (brief §3.4); reserved for any future outlined control, none exists on this build */
  --color-focus:         #21201D; /* :focus-visible ring — ink, 14.20:1 vs bg, 12.52:1 vs surface */
  --color-selection-bg:  #8F4A0A;
  --color-selection-ink: #FBF7EF;

  /* --- type (brief §2) --------------------------------------------------- */
  --font-display: 'Bebas Neue', 'Bebas Neue Fallback', 'Arial Narrow', Arial, sans-serif;
  --font-body:    'Barlow', 'Barlow Fallback', Arial, sans-serif;
  --font-weight-body: 400; --font-weight-body-strong: 700; --font-weight-display: 400;

  /* House alias: base.css references --text-small for form labels/hints. */
  --text-small: clamp(0.85rem, 0.8rem + 0.2vw, 0.95rem);

  /* --- fluid scale (brief §2.8) -------------------------------------------------- */
  --text-eyebrow: clamp(0.72rem, 0.6rem + 0.4vw, 0.85rem);
  --text-h1:      clamp(1.9rem, 1.3rem + 3vw, 3.6rem);
  --text-h2:      clamp(1.5rem, 1.2rem + 1.4vw, 2.1rem);
  --text-body:    clamp(1rem, 0.94rem + 0.3vw, 1.0625rem);

  /* House alias: site.css's .site-header__brand reads --text-h3, which this
     brief's own fluid scale (brief §2.8) does not declare a distinct value
     for. Aliased to --text-h2 — the wordmark reads at the same visual
     weight as an h2 heading, matching this family's generous, no-nonsense
     display-type register (design-rules §5: "be generous"). */
  --text-h3: var(--text-h2);

  --leading-tight: 0.98; --leading-body: 1.5;
  /* House alias: base.css's .btn/.field__label read --leading-snug. Tile A
     carries no distinct "snug" value; the button/label register is the same
     tight, no-nonsense register as the rest of this bold-industrial brief. */
  --leading-snug: 0.98;
  --tracking-eyebrow: 0.12em; --tracking-band-label: 0.03em; --tracking-spec-eyebrow: 0.14em;
  /* House alias: base.css's h1-h4 read --tracking-tight. This brief tracks no
     heading negatively (Bebas Neue is drawn at its own native spacing). */
  --tracking-tight: 0em;

  /* --- space — the house scale (skeleton/css/tokens.css, unchanged) -------- */
  --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;

  /* design-rules §7.1's ONE inter-section token. Two call sites only:
     .section's padding-block, and .hero's padding-block-end. */
  --section-gap: var(--space-2xl);   /* 96px, fixed, at every width — Tile A's own value */

  /* --- layout -------------------------------------------------------------- */
  --layout-container:     73.75rem; /* 1180px, Tile A's own .rail max-width */
  --layout-measure:       64ch;     /* Tile A's own .spec-body max-width */
  --layout-gutter:        clamp(1.25rem, 5vw, 3rem);
  --layout-tap-min:       44px;
  --layout-header-height: calc(var(--layout-tap-min) + var(--space-xs)); /* 56px */

  /* --- hero geometry (bespoke, argued, brief §7) --------------------------------- */
  --hero-content-pad-top:    0.9rem;  /* Tile A's own value */
  --hero-content-pad-x:      1.1rem;
  --hero-content-pad-bottom: 1.4rem;
  --hero-eyebrow-height:     20px;
  --hero-eyebrow-gap:        12px;
  --hero-h1-box:             130px;  /* fixed box, overflow:hidden — width-invariant (brief §7.2) */
  --hero-h1-gap:             18px;
  --cta-height:              52px;
  --hero-min-height-mobile:  522px;  /* <45rem — content-driven, matches brief §7.2 arithmetic exactly */
  --hero-min-height-desktop: 480px;  /* >=45rem — Tile A's own base default */

  /* --- band rhythm (bespoke, named from Tile A's own literals, brief §6.1) - */
  --band-gap:         2rem;   /* 32px — band-to-band gap inside Grounds & Fleet, Tile A's own `.band` padding */
  --band-grid-gap:    0.6rem; /* 9.6px — band-grid row gap between service rows within one band, Tile A's own value */
  --band-grid-col-min: 220px; /* Tile A's own `minmax(220px, 1fr)` column floor, brief §2.8's repeated ornament */

  /* --- secondary-image accent sizing (bespoke, argued) --------------------- */
  --texture-accent-size: 6rem;  /* small square accent thumbnail — tenure tool-edge and Fleet salt-texture accents */
  --fleet-copy-basis:    18rem; /* flex-basis for the Fleet paragraph beside its texture accent */

  /* --- radius + border. NO PILL TOKEN USED. -------------------------------- */
  --radius-none: 0;
  /* House alias: base.css's skip-link/nav-toggle/focus-ring read --radius-sm.
     This brief carries no rounded corners anywhere — see §3.3's own header. */
  --radius-sm: 0;
  --border-hairline: 1px; --border-thick: 3px; --border-style: solid;

  /* --- motion (brief §9) ---------------------------------------------------------- */
  --duration-settle: 1800ms;  /* blade settle, Tile A's own value */
  --duration-turf:   1300ms;  /* turf-shelf grow */
  --turf-delay:      1700ms;  /* after blade settle */
  --duration-fast:   380ms;   /* body-section reveal */
  /* House aliases: base.css's reveal system reads --duration-base/--duration-slow
     and the reduced-motion kill switch collapses all three. The one-shot
     fade-and-rise (brief §7) is 380ms regardless of the alias used to reach it. */
  --duration-base:   380ms;
  --duration-slow:   380ms;
  --ease-settle: cubic-bezier(0.2, 0.8, 0.3, 1); /* Tile A's own value */
  /* House alias: base.css's reveal transitions read --ease-out. */
  --ease-out: cubic-bezier(0.2, 0.8, 0.3, 1);
  --loop-tuft-1: 6.8s; --loop-tuft-1-delay: 2.8s;
  --loop-tuft-2: 8.1s; --loop-tuft-2-delay: 3.4s;
  --loop-beacon: 5.2s; --loop-beacon-delay: 0.6s;

  /* Reveal geometry — house alias consumed by base.css's [data-reveal] rules.
     Brief §7's one-shot fade-and-rise distance: --space-2xs, 8px. */
  --reveal-shift: 0.5rem;
  --reveal-stagger: 90ms;

  --z-atmosphere: 0; --z-field: 1; --z-header: 100; --z-skip-link: 300;
  /* Bespoke, added at build (brief §7.2/§8.1's paint order names only
     --z-atmosphere/--z-field; the hero's text content needs one level
     higher than both, since the turf-shelf CSS band (added at build, see
     site.css) sits at --z-field, above the decorative SVG). */
  --z-hero-content: 2;
  /* House aliases, unused by this brief's archetype. */
  --z-base: 0; --z-nav-panel: 200;
}

/* --------------------------------------------------------------------------
   @font-face — self-hosted woff2, latin subset, font-display: swap.
   Bebas Neue 400 and Barlow 400/700, SIL OFL 1.1 (assets/fonts/OFL-*.txt).
   Sourced from the google/fonts GitHub repo 2026-09-12, subset locally with
   pyftsubset to the house declared safe range (house-tech-spec §8),
   identical unicode-range on all three files — no remote font request.

   COVERAGE GAP (house-tech-spec §8, measured via fontTools cmap, full
   detail in README.md): U+2011/U+2015 absent from both faces (symmetric).
   U+2010, U+2012 and U+2032/U+2033 are each present in one face and absent
   from the other (asymmetric). This site's copy uses no dash beyond the
   plain hyphen-minus and no prime mark, so none of these gaps is exercised.
   Only non-ASCII characters actually used: · (U+00B7) and the straight
   apostrophe (U+0027) — both inside the range, in both faces.
   -------------------------------------------------------------------------- */

@font-face {
  font-family: 'Bebas Neue';
  src: url('../assets/fonts/bebas-neue-400-latin.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-latin.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-latin.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;
}

/* --------------------------------------------------------------------------
   Metrics-matched fallbacks (house-tech-spec §7/§8), computed with
   scripts/font-metrics.mjs (the fontaine reference formula) against the
   shipped woff2 files directly. Full source metrics and derivation are in
   README.md.

   DONOR: the brief names Arial Narrow (Bebas Neue) and Arial (Barlow), but
   neither is installable under those exact names on this build machine, so
   both blocks below are MEASURED against Liberation Sans — Arial's verified
   metric-compatible open clone (same substitution as this repo's
   dakota-lawn-landscape-grand-forks-nd precedent) — while the shipped CSS
   still names the brief's first-choice local faces first.
   -------------------------------------------------------------------------- */

@font-face {
  font-family: 'Bebas Neue Fallback';
  src: local('Arial Narrow'), local('Liberation Sans');
  size-adjust: 77.48%;
  ascent-override: 116.16%;
  descent-override: 38.72%;
  line-gap-override: 0%;
}

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

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

/* Brief §5.3's own two breakpoints (45rem / 64rem) are consumed directly in
   site.css from --hero-min-height-mobile/-desktop and the other tokens above
   — no synthetic breakpoint-only token is introduced here. */
