/* ==========================================================================
   tokens.css — the design brief, compiled. Eastview Landscaping, Huntsville
   AL: warm-craft / kiln-brick-cream / sidebar-anchor ("the line runs true").
   Every value transcribed from the approved brief (§2, §3, §4, §5, §7);
   nothing chosen at build time. THIS FILE IS THE ONLY PLACE RAW VALUES LIVE
   (house-tech-spec §3). Full derivation notes: README.md.

   Builder fills (brief-silent, not violations — full list: README.md):
   --text-h3/--text-small, tracking/base-reveal-timing/radius/shadow/border
   (brief gives no direction, house defaults retained), hero geometry
   (brief §5's 375/1440 arithmetic stepped at 48em), --rail-width and the
   decorative-image/satellite sizing tokens (execution detail). */

:root {

  /* Colour (brief §2). Step 1 N/A (dossier §4.5, no real-world asset) ->
     step 2 licenses a register, not a hue -> step 3, family + trade
     material: kiln-brick, from brick and cedar (dossier §4.1).
     --color-sod: semantic-anchor carrier, decorative only. No dark band. */

  --scheme: light;

  --color-bg:          #F7F1E8;  /* cream ground */
  --color-surface:     #EFE6D8;  /* raised panels: rail bg, fields, opaque hero-plate chip */
  --color-ink:         #2B2118;
  --color-ink-muted:   #5B4E40;
  --color-accent:      #A84A28;  /* kiln-brick — DOMINANT, hsl(19.5°,60.2%,40.0%) */
  --color-accent-ink:  #FFF8EF;

  --color-border:      #E1D5C4;
  --color-focus:       #2B2118;  /* = ink; clears 3:1 vs bg AND surface */
  --color-selection-bg:  #A84A28;
  --color-selection-ink: #FFF8EF;

  /* Decorative-only (brief §2b/§3/§4): sod bullet + hero sod strip. */
  --color-sod: #4B6B3A;

  /* Hero atmosphere — 340px plate only, never the section ground (brief §2
     hard constraint: accent text never sits on this gradient). */
  --color-atmo-1: #FAF5EC;
  --color-atmo-3: #E3D5C0;

  /* --- Typography (brief §3). Bitter 700 (no italic file — emphasis is
     colour + one accent quote-glyph) + Karla 400/700. 3 woff2, 2 families,
     OFL 1.1, self-hosted, subset to the house declared range (§8). */

  --font-display: 'Bitter', 'Bitter Fallback', Georgia, 'Iowan Old Style', 'Times New Roman', serif;
  --font-body:    'Karla', 'Karla Fallback', 'Helvetica Neue', Arial, sans-serif;

  --font-weight-body:        400;
  --font-weight-body-strong: 700;
  --font-weight-display:     700;

  /* Fluid scale (brief §3): floor at 375px, ceiling at 1440px, by construction. */
  --text-display: clamp(2.125rem, 1.4648rem + 2.8169vw, 4rem);        /* 34 -> 64px */
  --text-h2:      clamp(1.25rem, 1.0299rem + 0.939vw, 1.875rem);      /* 20 -> 30px */
  --text-lead:    clamp(1.0625rem, 1.0075rem + 0.2347vw, 1.21875rem); /* 17 -> 19.5px */
  --text-body:    1rem;
  --text-eyebrow: 0.75rem;
  --text-micro:   0.6875rem;

  /* Builder fill — house-required names the brief's table omits. h3 lands
     at h2's own floor (20px, fixed); small is the unchanged house default. */
  --text-h3:    1.25rem;
  --text-small: 0.9375rem;

  /* Header wordmark — smaller than --text-h3 so brand + tel: + toggle fit
     one line in the fixed 56px header at 375px (brief §4.1). Stepped at
     48em (precedent: crystal-peak-landscaping-spokane-wa). */
  --text-wordmark: 0.875rem;

  --leading-tight: 1.1;  /* display — h1/h2/h3 (base.css) */
  --leading-snug:  1.3;  /* eyebrow */
  --leading-lead:  1.4;  /* review quotes */
  --leading-body:  1.6;  /* running body copy */

  /* Builder fill, house defaults retained (brief gives no direction). */
  --tracking-tight:  -0.02em;
  --tracking-normal:  0em;
  --tracking-wide:    0.08em;

  /* --- Space — house scale (brief §4/§5's arithmetic resolves entirely to
     these steps; nothing below is invented). */

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

  /* Inter-section rhythm (brief §4): 64px, fixed. Two call sites: .section
     padding-block, hero padding-block-end. */
  --section-gap: var(--space-xl);

  /* --- Layout — house defaults. */
  --layout-container: 72rem;
  --layout-measure:   62ch;
  --layout-gutter:    clamp(1.25rem, 5vw, 3rem);
  --layout-tap-min:   44px;

  /* Header: 56px + 1px border, fixed (brief §4.1). Feeds the sticky-chrome
     term (brief §5: 44+56+1=101px) and the rail's sticky `top` (§4). */
  --header-height: 3.5rem;

  /* Falls back to 0px post-purchase, once preview.css is deleted
     (precedent: valley-landscape-spokane-newman-lake-wa). */
  --sticky-offset: calc(var(--expiry-height, 0px) + var(--header-height) + var(--border-hairline));

  /* Hero geometry (brief §5). CTA/field fixed; gaps step at 48em, between
     brief §5's 375/1440 point-values. */
  --hero-cta-height:   52px;     /* fixed, both breakpoints */
  --hero-field-height: 21.25rem; /* 340px, fixed, both breakpoints */
  --hero-h1-max:       11ch;     /* brief §5's H1 wrap container */

  --hero-pad-start:     var(--space-md);   /* 24px <48em */
  --hero-eyebrow-gap:   var(--space-2xs);  /* 8px <48em */
  --hero-h1-cta-gap:    var(--space-sm);   /* 16px <48em */
  --hero-cta-field-gap: var(--space-md);   /* 24px <48em */

  /* Sidebar-anchor rail column width — brief names no number (§4). */
  --rail-width: 16rem;

  /* Living-hero satellites (brief §7): sizing/travel-distance are execution
     detail; the loops' own DURATIONS below are brief-stated. */
  --mote-size: 0.25rem;
  --shaving-width: 1.5rem;
  --shaving-height: 0.375rem;
  --mote-drift-x: 1.5rem;
  --mote-drift-y: 2.5rem;
  --shaving-drift-x: 0.75rem;
  --shaving-drift-y: 1.25rem;

  /* Sod bullet (brief §3): fixed-size, never width-relative, 6px. */
  --sod-bullet-size: 0.375rem;

  /* Decorative backdrops (brief §6 slots 2, 5) — low-opacity execution
     values, kept below the rail/footer text. */
  --rail-texture-opacity: 0.14;
  --footer-band-opacity: 0.16;

  /* Head-rule's stated minimum (brief §3: "never shorter than 3rem"). */
  --headrule-min: 3rem;

  --hero-caption-max: 28rem;    /* caption chip width — execution value */
  --about-image-width: 9rem;    /* brief §6 slot 3 — execution value */
  --reviews-image-width: 12rem; /* brief §6 slot 4 — execution value */

  /* Accent quote-glyph's vertical nudge (brief §3) — aligns it against the
     quote's own first line. */
  --quote-glyph-offset: -0.15em;

  /* --- Radius / shadow / border — house scale (brief gives no direction).
     Shadow tint recomputed against this site's own ink, rgb(43 33 24). */

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

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

  /* Head-rule stroke weight AND the signature string/satellite overlay's
     stroke-width — the same 2px, literalising the settled string BECOMING
     the head-rule (brief §7). */
  --border-trim: 2px;

  /* --- Motion (brief §7). Reveal geometry is brief-stated; base reveal
     timing (read by name in base.css) is the unchanged house default. */

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

  /* The signature move (brief §7): "the line runs true" — string sags then
     snaps taut once on load; two independent dust motes; one independent
     wood-shaving drift+rotate loop. */
  --duration-signature: 1100ms;
  --ease-signature: cubic-bezier(.32, 1.4, .4, 1);
  --duration-drift-a: 16s;
  --duration-drift-b: 24s;
  --duration-drift-c: 19s;
  --ease-drift: ease-in-out;

  /* --- Z layers --------------------------------------------------------- */
  --z-base: 0; --z-field: 0; --z-atmosphere: 1; --z-content: 2;
  --z-header: 100; --z-nav-panel: 200; --z-skip-link: 300;
}

/* Stepped at 48em — brief §5's 1440px point, the same breakpoint the
   rail steps at (§4). */
@media (min-width: 48em) {
  :root {
    --hero-pad-start:     var(--space-2xl); /* 96px */
    --hero-eyebrow-gap:   var(--space-sm);  /* 16px */
    --hero-h1-cta-gap:    var(--space-lg);  /* 40px */
    --hero-cta-field-gap: var(--space-lg);  /* 40px */
    --text-wordmark:      1.0625rem;        /* 17px */
  }
}

/* @font-face — self-hosted woff2, subset to the house safe range (§8),
   identical on all three faces (brief §3). Bitter 700 static upright +
   Karla 400/700 static. Both OFL 1.1, Google Fonts. COVERAGE: U+2010/11/
   12/2015 absent from all three alike (documented universal gap). Karla
   ALSO lacks U+2032/2033, which Bitter carries — a cross-face mismatch,
   recorded not triggered (no feet/inches mark in copy.md). See README. */

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

@font-face {
  font-family: 'Karla';
  src: url('../assets/fonts/karla-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: 'Karla';
  src: url('../assets/fonts/karla-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 (§8), MEASURED via scripts/font-metrics.mjs.
   Each Karla face also lists its own metrics donor (Liberation Sans) as a
   final local() candidate so the override still engages on hosts lacking
   Helvetica Neue/Arial (Critic round 2 FIX perf/cls). Bitter's donor is
   Gelasio 700. Inputs: README. */

@font-face {
  font-family: 'Bitter Fallback';
  src: local('Georgia Bold'), local('Georgia');
  font-weight: 700;
  font-style: normal;
  size-adjust: 91.87%;
  ascent-override: 101.77%;
  descent-override: 28.84%;
  line-gap-override: 0%;
}

@font-face {
  font-family: 'Karla Fallback';
  src: local('Helvetica Neue'), local('Arial'), local('Liberation Sans');
  font-weight: 400;
  font-style: normal;
  size-adjust: 103.53%;
  ascent-override: 88.57%;
  descent-override: 24.34%;
  line-gap-override: 0%;
}

@font-face {
  font-family: 'Karla Fallback';
  src: local('Helvetica Neue Bold'), local('Arial Bold'), local('Arial'), local('Liberation Sans');
  font-weight: 700;
  font-style: normal;
  size-adjust: 100.06%;
  ascent-override: 91.64%;
  descent-override: 25.18%;
  line-gap-override: 0%;
}
