/* tokens.css — the design brief, compiled.
   Amazing Lawn Care, Killeen TX. Source: runs/amazing-lawn-care-killeen-tx/brief.md
   (C3 PASS), family editorial-modern, archetype proof-column. Every value
   below is the brief's — nothing improvised (house-tech-spec §3). */

:root {

  /* --- Colour — brief §2.1. No real-world brand colour recorded (dossier
     §4.5/§4.8 — BLOCKED, not a confirmed "no brand colour" finding), so the
     palette falls to family norms (caliche-limestone / bone-parchment /
     light) with the semantic anchor carried by imagery, not hue
     (playbooks/landscaping.md §6.1a). --- */

  --scheme: light;

  --color-bg:            #F4EEE4;  /* bone-parchment */
  --color-surface:       #EAE0D0;  /* caliche-limestone */
  --color-ink:           #2B2620;
  --color-ink-muted:     #6B6152;
  --color-accent:        #3F6E4A;  /* turf-green — the anchor */
  --color-accent-ink:    #FFFFFF;

  /* Hairline neutrals — not stated by the brief (no §2 border row), so
     derived proportionally from the brief's own surface/ink pair rather
     than a new hue (design-rules §6 family-norms fallback). Decorative
     border: 20% surface->ink mix, #C4BBAD (no contrast floor owed).
     Control-boundary border: 55% mix, #817A6F — measured >=3:1 against BOTH
     grounds (WCAG 1.4.11): 3.68:1 vs bg, 3.25:1 vs surface. */
  --color-border:        #C4BBAD;
  --color-border-strong: #817A6F;

  --color-focus: #3F6E4A;  /* = accent; brief §2.1 measures 5.14:1 vs bg,
                               4.54:1 vs surface — both clear the 3:1 floor */

  /* No dark band anywhere on this site (hero's living-turf band is a photo,
     never a full-bleed dark CSS ground; no inverted section exists), so
     --color-focus-on-band is not declared (base.css / skeleton convention). */

  --color-selection-bg: #3F6E4A;
  --color-selection-ink: #FFFFFF;

  /* --- Typography — brief §2.2. Three families (display/body/emphasis),
     inherited from C2's scored decision, flagged for the C3 scorer against
     design-rules §5's literal "max 2" text but with registry precedent
     (milhorn-appliance-kingsport-tn, row 88). All three subset to the house
     declared safe range, unicode-range identical on every face. */

  --font-display:  'Schibsted Grotesk', 'Schibsted Grotesk Fallback', Arial, sans-serif;
  --font-body:     'Figtree', 'Figtree Fallback', Arial, sans-serif;
  /* Emphasis face is called by its own family name directly where used (the
     hero's one italic emphasis word) — the token contract's two required
     roles (display, body) are unchanged, per brief §2.2 and the
     milhorn-appliance-kingsport-tn precedent for a third role. */
  --font-emphasis: 'EB Garamond', 'EB Garamond Fallback', 'EB Garamond Fallback 2', Georgia, serif;

  --font-weight-body:        400;  /* Figtree Regular */
  --font-weight-body-strong: 600;  /* Figtree SemiBold — eyebrows, CTA labels */
  --font-weight-display:     700;  /* Schibsted Grotesk Bold — the only weight shipped */
  --font-weight-emphasis:    500;  /* EB Garamond Italic 500 — the only weight shipped */

  /* --- Type scale — brief §2.2, fluid via clamp(), computed at every
     stated crossover width and at 375/1440 in the brief's own table. */

  --text-eyebrow: clamp(0.75rem, 0.7rem + 0.2vw, 0.85rem);
  --text-h1:      clamp(2.1rem, 1.6rem + 2.4vw, 3.6rem);
  --text-h2:      clamp(1.5rem, 1.3rem + 1vw, 2.2rem);
  --text-lead:    clamp(1rem, 0.95rem + 0.2vw, 1.15rem);
  --text-body:    clamp(0.95rem, 0.92rem + 0.1vw, 1rem);

  /* Not in the brief's own table (which only covers eyebrow/h1/h2/lead/body):
     the header wordmark size, stated in prose at brief §4.3 ("~18px"), fixed
     rather than fluid, matching that sentence exactly. */
  --text-h3: 1.125rem;  /* 18px, fixed — brief §4.3 */

  /* Small print (nav links, footer, field hints, form status) has no brief
     row either. Rather than invent a new size literal, it reuses the
     brief's own smallest named token instead of a fresh number. */
  --text-small: var(--text-eyebrow);

  /* Proof-column numeral — brief §2.2: "fixed, not fluid: font-size: 2rem
     (32px), unchanged across every breakpoint." */
  --text-proof-numeral: 2rem;

  /* House defaults, unmodified — the brief does not override these. */
  --leading-tight: 1.05;
  --leading-snug:  1.25;
  --leading-body:  1.6;

  --tracking-tight:  -0.02em;
  --tracking-normal: 0em;
  --tracking-wide:   0.08em;  /* eyebrows — applied via text-transform on
                                  naturally-cased source copy, never typed in
                                  caps (house-tech-spec §8) */

  /* --- Space — brief §2.3's own chosen step values (not the skeleton
     defaults: this brief's lg/xl/2xl/3xl differ). --- */

  --space-3xs: 0.25rem;  /*  4px */
  --space-2xs: 0.5rem;   /*  8px */
  --space-xs:  0.75rem;  /* 12px */
  --space-sm:  1rem;     /* 16px */
  --space-md:  1.5rem;   /* 24px */
  --space-lg:  2rem;     /* 32px */
  --space-xl:  3rem;     /* 48px */
  --space-2xl: 4rem;     /* 64px */
  --space-3xl: 6rem;     /* 96px */

  /* Inter-section rhythm — brief §2.3: 64px, fixed at every breakpoint
     including 375 and 1440. Two call sites only: .section's padding-block
     and the hero's padding-block-end. */
  --section-gap: var(--space-2xl);

  /* --- Layout — not overridden by the brief; house defaults. --- */

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

  /* Brief §4.2/§4.3's own explicit target figures, implemented as explicit
     block-sizes rather than left to derive from padding around a 44px
     control (the milhorn-appliance-kingsport-tn --bar-height precedent for
     hitting a stated figure exactly). */
  --header-height:    56px;  /* brief §4.2/§4.3, non-sticky at every width */
  --hero-band-height: 220px; /* brief §4.2/§6 — the living-turf field, fixed */

  /* Hero's own internal gaps — brief §2.3's exact figures (not on the space
     scale; the brief computed these directly for the first-screen table). */
  --hero-gap-eyebrow-h1: 9.6px;
  --hero-gap-h1-cta:     17.6px;
  --hero-gap-cta-band:   22.4px;

  /* --- Radius / shadow / border — the brief states none of this. Kept at
     the house scale (design-rules §5's --radius-none is a legitimate
     whole-site answer; --radius-sm is the near-zero step every other
     editorial-modern site in this registry uses for buttons/fields), so no
     new aesthetic value is introduced here. --- */

  --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 38 32 / 0.06);
  --shadow-md: 0 6px 24px rgb(43 38 32 / 0.09);
  --shadow-lg: 0 24px 60px rgb(43 38 32 / 0.14);

  --border-hairline: 1px;
  --border-thick:    3px;   /* the reused head-rule, brief §2.2 */
  --border-style:    solid;

  /* --- Motion — brief §2.4 verbatim, plus §7's named signature-move
     durations and the Services row's stagger. --- */

  --duration-fast: 200ms;
  --duration-base: 400ms;
  --duration-slow: 700ms;
  --ease-out:    cubic-bezier(0.16, 1, 0.3, 1);
  --ease-in-out: cubic-bezier(0.65, 0, 0.35, 1);  /* house default; unused by
                                                       this brief's own moves,
                                                       kept for token-group
                                                       completeness (spec §3) */

  --reveal-shift:   1.25rem;  /* house default; brief does not override */
  --reveal-stagger: 80ms;     /* brief §7: "each offset by 80ms" */

  /* The three independent, non-synchronised turf-blade loops — brief §7. */
  --duration-blade-a: 5.4s;
  --duration-blade-b: 6.8s;
  --duration-blade-c: 7.6s;
  --delay-blade-b:    0.4s;
  --delay-blade-c:    1.1s;

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

/* --------------------------------------------------------------------------
   @font-face — self-hosted woff2 only, subset to house-tech-spec §8's
   declared safe range (identical unicode-range on every face). Three static
   faces + one variable instance (Figtree, restricted 400-600 by the
   font-weight descriptor, per brief §2.2 — "not the full available range").
   Measured post-subset: 20,868 B (display) + 16,864 B (body, variable) +
   22,876 B (emphasis) = 60,608 B total, 22,876 B largest single face — both
   comfortably inside the house ≤100 KB / ≤60 KB-per-face budget (§7).
   -------------------------------------------------------------------------- */

@font-face {
  font-family: 'Schibsted Grotesk';
  src: url('../assets/fonts/schibsted-grotesk-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: 'Figtree';
  src: url('../assets/fonts/figtree-variable.woff2') format('woff2');
  font-weight: 400 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;
}

@font-face {
  font-family: 'EB Garamond';
  src: url('../assets/fonts/eb-garamond-italic-500.woff2') format('woff2');
  font-weight: 500;
  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 (house-tech-spec §7/§8) — MEASURED against the
   real shipped woff2 files with scripts/font-metrics.mjs (Fontaine's
   size-adjust/ascent-override/descent-override formula), never guessed.

   Schibsted Grotesk and Figtree both donor to Arial, and Arial resolves
   directly to Liberation Sans on this build/QA environment (`fc-match Arial`
   -> Liberation Sans) — the same resolution path a real visitor's browser
   takes when Arial itself is not installed, so one tier is measured and
   shipped for each, against the real Liberation Sans files.

   EB Garamond Italic donors to Georgia, which is NOT installed anywhere in
   this environment (no measurable file), so it ships TWO tiers, on the
   auto-evolution-north-logan-ut / alex-landscaping precedent: tier 1 is
   measured against Gelasio (Google's open metric twin of Georgia, fetched
   for measurement only, never shipped) for the real-world majority
   (Windows/macOS/iOS all ship Georgia); tier 2 is measured against DejaVu
   Serif, which genuinely is installed here, so CLS reads 0.000 in THIS
   environment too rather than falling through to an unmatched generic serif.
   -------------------------------------------------------------------------- */

@font-face {
  font-family: 'Schibsted Grotesk Fallback';
  src: local('Arial'), local('Liberation Sans');
  font-weight: 700;
  font-style: normal;
  size-adjust: 101.57%;
  ascent-override: 96.15%;
  descent-override: 25.38%;
  line-gap-override: 0%;
}

@font-face {
  font-family: 'Figtree Fallback';
  src: local('Arial'), local('Liberation Sans');
  font-weight: 400 600;
  font-style: normal;
  size-adjust: 100.03%;
  ascent-override: 94.97%;
  descent-override: 24.99%;
  line-gap-override: 0%;
}

@font-face {
  font-family: 'EB Garamond Fallback';
  src: local('Georgia'), local('Gelasio');
  font-weight: 500;
  font-style: italic;
  size-adjust: 85.93%;
  ascent-override: 117.18%;
  descent-override: 34.68%;
  line-gap-override: 0%;
}

@font-face {
  font-family: 'EB Garamond Fallback 2';
  src: local('DejaVu Serif');
  font-weight: 500;
  font-style: italic;
  size-adjust: 75.18%;
  ascent-override: 133.95%;
  descent-override: 39.64%;
  line-gap-override: 0%;
}
