/* ==========================================================================
   tokens.css — brief.md v1 (approved 2026-09-21), family `bold-industrial`,
   archetype `split-hero`, signature "the mast rises once and holds." Values
   copied from brief.md §2.2/§2.4/§3/§4/§7 — the design brief, compiled.
   ========================================================================== */

:root {

  /* --- Colour (brief §2.1/§2.2). No real-world brand colour at any tier
     (dossier §4.5 OMITTED) -> local character (San Joaquin Valley steel/
     casing/open-ground, playbook §6.1) -> family norms (bold-industrial).
     Dark mode argued at brief §2.1, guarded against design-rules §0's
     dark-luxe-gloom never: warm graphite, never near-black; weight 900,
     never thin light type; true worklight amber, never gold. */

  --scheme: dark;

  --color-bg:            #21201B;  /* warm graphite — never near-black */
  --color-surface:       #2A2822;  /* raised section ground */
  --color-ink:            #F3EDE2;  /* warm cream */
  --color-ink-muted:      #C9C0AE;
  --color-accent:         #E08A2E;  /* scorch-amber — worklight, not gold, not red */
  --color-accent-ink:     #21201B;  /* dark text ON the amber accent — reuses --color-bg */

  /* House-required structural colours (consumed by base.css) */
  --color-border:         #3A382F;  /* decorative hairline only — no contrast floor
                                        (brief §2.6 N3: services-index row rules,
                                        fact-chip borders, never a control's own
                                        boundary) */

  /* Control boundary, WCAG 1.4.11 (>=3:1 vs bg/surface). Brief §2.6 N3 never
     names a value (argues no control's sole shape is a hairline); filled by
     REUSE — --color-ink-muted is already verified 9.04:1/8.17:1 (brief §2.5
     F3/F4), not a new hue. Reaches the mobile nav-toggle. See README.md. */
  --color-border-strong:  #C9C0AE;

  --color-focus:          #E08A2E;  /* reuses accent — clears 3:1 on bg and surface (brief §2.6 N2) */
  --color-selection-bg:   #E08A2E;
  --color-selection-ink:  #21201B;

  /* No --color-focus-on-band: the whole page is one dark ground (no inverted
     band sits on a lighter section), so the band-safe focus token has no
     call site — left absent per the skeleton's own instruction rather than
     declared unused. */

  /* Brief-specific colours (brief §2.2) */
  --hero-halo-hue:        224, 138, 46;  /* accent RGB, reused as the atmosphere tint */
  --hero-halo-peak-alpha: 0.16;          /* REDUCED from the tile's 0.22 — brief §2.3 */
  --color-flow:           #5C97A8;       /* the one cool accent — water shown once,
                                             as the outcome, never as text (brief §2.2) */
  --color-field-bg:       #171610;       /* field's own separate near-black linear tint
                                             (brief §2.6 N5's stated ground for the
                                             flow-line stroke) */


  /* --- Typography (brief §3). Two families, both self-hosted, SIL OFL 1.1.
     Archivo ships as ONE variable woff2 (fvar wght 100-900 confirmed intact
     at build time) — cheaper than the brief's assumed two static files,
     same two weights, set with font-weight only (house-tech-spec §8's
     wght-naming trap). Barlow has NO variable axis on Google Fonts
     (confirmed live, axes: [] — same finding as two sibling READMEs), so
     brief §3's "one variable Barlow file" isn't achievable; static instead.
     Full reconciliation (flagged to the AD, not silently decided) in
     README.md's Fonts section. */

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

  --font-weight-display-strong: 900;  /* H1, all words including the accent word (Archivo) */
  --font-weight-display-mid:    700;  /* section titles, services index names (Archivo) */
  --font-weight-body:           400;  /* running copy, service notes, hero lede body (Barlow) */
  --font-weight-body-medium:    500;  /* hero lead (Barlow) */
  --font-weight-body-strong:    700;  /* eyebrow, CTA label, trust-strip fact chips (Barlow) —
                                          reconciled: brief §3.1 lists fact chips at 600,
                                          conflicting with this token's own §3 grouping.
                                          Resolved to 700 (reuses the eyebrow's weight,
                                          keeps Barlow at 2 files). See README.md. */

  /* base.css's shared h1-h4 rule reads --font-weight-display; this site's H1
     carries its own heavier weight via site.css, so the shared default
     points at the lighter of the two display roles actually used. */
  --font-weight-display: var(--font-weight-display-mid);

  /* --- Type scale (brief §2.4, computed at every clamp floor/ceiling) ----- */

  --text-eyebrow: clamp(0.72rem, 0.68rem + 0.18vw, 0.82rem);
  --text-h1:      clamp(2.15rem, 1.55rem + 2.6vw, 3.9rem);
  --text-lead:    clamp(1.05rem, 0.98rem + 0.3vw, 1.25rem);
  --text-body:    clamp(0.98rem, 0.94rem + 0.16vw, 1.08rem);
  --text-fact:    clamp(0.72rem, 0.68rem + 0.16vw, 0.8rem);

  /* Section titles (services/trust, service-area, CTA band) and the header
     wordmark: brief §3.1 assigns these Archivo 700 uppercase but states no
     size — kept at the house default fluid step, unargued against by the
     brief (design-rules §5: silence keeps the house default; it is not an
     invented value). --text-h3 likewise kept house-default for the header
     brand mark. */
  --text-h2: clamp(1.9rem, 5vw, 3rem);
  --text-h3: clamp(1.3rem, 3vw, 1.75rem);
  --text-small: 0.9375rem;

  --leading-tight: 1.02;              /* H1 line-height (brief §5.0's 1.02 3-line budget) */
  --leading-snug: 1.25;
  --leading-body: 1.6;

  --tracking-tight: -0.01em;
  --tracking-normal: 0em;
  --tracking-wide: 0.08em;            /* eyebrow letter-spacing, brief §3.1: ".08em" exactly */

  /* --- Space (brief §4 — house scale, no new steps introduced) ------------ */

  --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-xl);     /* 64px, FIXED at every width — brief §4 */

  /* --- Layout ---------------------------------------------------------------
     House defaults kept where brief §4/§5 is silent (container, measure,
     gutter, tap-min — none argued against). Brief-added: --layout-numeral-col
     (§2.4) and --header-height (§5.0's own computed 56px content term, used
     by the sticky-stack recipe below). */

  --layout-container: 72rem;
  --layout-measure: 62ch;
  --layout-gutter: clamp(1.25rem, 5vw, 3rem);
  --layout-tap-min: 44px;
  --layout-numeral-col: 4rem;         /* services-index numeral column, brief §2.4 — fixed,
                                          content is always exactly two digits ("01"-"05") */
  --header-height: 3.5rem;            /* 56px content, brief §5.0's sticky-chrome term */
  --hero-field-desktop-min-height: 26rem;  /* brief §5.0 names no desktop field height;
                                               kept at a Builder-filled floor so the
                                               split-hero's right column never collapses
                                               to near-zero height on a short viewport */

  /* --- Radius / shadow / border. Brief names neither. Kept at the whole-
     site sharp/flat answer design-rules §4 explicitly allows, argued the
     same way as the other two built bold-industrial rows (boulder-tree-
     care, dakota-lawn): the family's own no-nonsense register. Flagged in
     README.md, not an invented aesthetic. */

  --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 §7 — house reveal system below the hero; the one
     signature device is the hero's own mast-rise + two ambient loops) ------ */

  --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 mast rises," brief §7 code block — exact
     values, not re-derived). */
  --duration-mast-rise:  1.6s;   /* one-shot, on load */
  --ease-mast-rise:      cubic-bezier(0.2, 0.7, 0.3, 1);
  --duration-glint:      6.4s;   /* independent loop, worklight pulse at mast head */
  --duration-cable-sway: 7.8s;   /* independent loop, different period from the glint */
  --delay-flow-line:     0.9s;   /* one-shot, after mast-rise completes */
  --duration-flow-line:  0.9s;   /* the flow-line's own one-shot draw-in duration */

  /* --- 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, OFL-Barlow.txt (SIL OFL 1.1). Re-subset
   locally to the house declared safe range (house-tech-spec §8) — no remote
   font request ships. Archivo: native variable file (fvar 100-900 intact).
   Barlow: two static instances (400, 700), no variable axis on Google
   Fonts. See README.md for the full record. */

@font-face {
  font-family: 'Archivo';
  src: url('../assets/fonts/archivo-variable-latin.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-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), measured with
   scripts/font-metrics.mjs (the fontaine algorithm). Archivo temporarily
   instanced at wght=700/900 to measure per-weight widths (not shipped, only
   the variable webfont above is). Donor: Liberation Sans / Bold, the
   measurement proxy for both families on this build machine — the CSS still
   names the real first-choice local face first. See README.md. */

@font-face {
  font-family: 'Archivo Fallback';
  src: local('Arial'), local('Liberation Sans');
  font-weight: 700;
  size-adjust: 105.35%;
  ascent-override: 83.34%;
  descent-override: 19.93%;
  line-gap-override: 0%;
}

@font-face {
  font-family: 'Archivo Fallback';
  src: local('Arial Bold'), local('Liberation Sans Bold');
  font-weight: 900;
  size-adjust: 109.29%;
  ascent-override: 80.33%;
  descent-override: 19.21%;
  line-gap-override: 0%;
}

@font-face {
  font-family: 'Barlow Fallback';
  src: local('Helvetica Neue'), local('Arial'), local('Liberation Sans');
  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'), local('Liberation Sans Bold');
  font-weight: 700;
  size-adjust: 92.39%;
  ascent-override: 108.23%;
  descent-override: 21.65%;
  line-gap-override: 0%;
}
