/* ==========================================================================
   tokens.css — the design brief, compiled. Innovative Landscape Design,
   Florence SC — brief.md v1 (C3 approved 2026-09-15). Family: clean-clinical.
   Archetype: band-rhythm. Dominant hue: grove-green/porcelain (anchor carried
   in imagery + copy roles, not the ground) with oxblood as a re-pitched
   brand-echo accent (dossier §4.5, logo #9d0002 → #8C1116 for AA headroom,
   brief §2.1). Display: Public Sans. Body: Source Sans 3. THIS FILE IS THE
   ONLY PLACE RAW VALUES LIVE (house-tech-spec §3).
   ========================================================================== */

:root {

  /* --- Colour (brief §2.1). Derivation order (design-rules §6): (1) ILD's
     real-world colour — the logo's #9d0002 oxblood (dossier §4.5, V-tier,
     the business's only real-world visual asset), re-pitched to #8C1116 for
     AA headroom, carried as accent rather than ground (brand-echo escape
     hatch, brief §2.1); (2) local character — Pee Dee-region cool porcelain/
     grove tones; (3) family norms — clean-clinical's airy, high-white,
     precise register. One deliberate mode: light. */

  --scheme: light;

  --color-bg:         #F7F7F2;   /* page ground — clean-clinical porcelain */
  --color-surface:    #EDEFE6;   /* raised panels, cards, form fields — cool sage-adjacent */
  --color-ink:        #23291F;   /* body + heading text — near-black warmed toward the growth accent */
  --color-ink-muted:  #5B6156;   /* secondary text, captions, lead line */
  --color-accent:     #8C1116;   /* re-pitched oxblood — the one colour that means "act": CTA fill */
  --color-accent-ink: #FFFFFF;   /* text on --color-accent */

  /* House-required structural colours (consumed by base.css). */
  --color-border:        #D7DCC7;   /* DECORATIVE hairlines only — no contrast floor */
  --color-border-strong: #5B6156;   /* = ink-muted, reused per WCAG 1.4.11 — control boundaries (nav-toggle, .btn--quiet) */

  /* :focus-visible ring — the brief's growth token, not the accent: >= 3:1
     vs bg (8.23:1) and surface (7.62:1), brief §2.2 contrast table. */
  --color-focus: #2F5233;

  /* No dark band on this site (brief §2.1: "light, single deliberate mode,
     no dark band"), so no --color-focus-on-band is declared. */
  /* --color-focus-on-band: …; */

  --color-selection-bg: var(--color-accent);
  --color-selection-ink: var(--color-accent-ink);

  /* Brief-specific: the anchor carrier (brief §2.1). Playbook §6.1's "green
     and growth" is not in the ground on this site, so it is carried in copy
     roles — eyebrow, ratio/trust labels, the plan-line device, the focus
     ring (above) — and in the imagery (brief §5). */
  --color-growth: #2F5233;

  /* Hero-field placeholder ground, paints before the raster image decodes —
     a soft porcelain/sage tone so there is no flash of an unrelated colour
     under the "atmosphere" gradient (design-rules §0's living-hero radial). */
  --color-field-placeholder: #EDEFE6;

  /* --- Typography (brief §2.2). Display: Public Sans (600, 700). Body:
     Source Sans 3 (400, 600). 4 woff2 files total, at the §5 budget
     ceiling. emphasis_font: null — Source Sans 3 600 carries emphasis, not
     a third family. */

  --font-display: 'Public Sans', 'Public Sans Fallback', Arial, 'Helvetica Neue', sans-serif;
  --font-body:    'Source Sans 3', 'Source Sans 3 Fallback', Arial, 'Helvetica Neue', sans-serif;

  --font-weight-display:     700;   /* h1, h2, h3, the mid-page display-feature line (brief §2.2) */
  --font-weight-brand:       600;   /* nav, buttons, tags, labels — Public Sans 600 (brief §2.2) */
  --font-weight-body:        400;   /* body copy */
  --font-weight-body-strong: 600;   /* emphasis within body — review pull-quotes, FAQ question labels (brief §2.2) */

  /* Fluid scale — brief §2.3 table, every clamp() copied byte-identical.
     Floor at 375px, ceiling at 1440px (most reach their ceiling before
     1440, per the brief's own annotations). */

  --text-eyebrow:         clamp(0.75rem, 0.72rem + 0.15vw, 0.8125rem);   /* 12.1px @375 -> 13.0px ceiling */
  --text-small:           clamp(0.875rem, 0.84rem + 0.18vw, 0.9375rem); /* 14.1px @375 -> 15.0px ceiling */
  --text-body:            clamp(1rem, 0.96rem + 0.2vw, 1.0625rem);      /* 16.1px @375 -> 17.0px ceiling */
  --text-lead:            clamp(1.125rem, 1.06rem + 0.32vw, 1.3125rem); /* 18.2px @375 -> 21.0px ceiling */
  --text-h3:              clamp(1.375rem, 1.24rem + 0.65vw, 1.75rem);   /* 22.3px @375 -> 28.0px ceiling */
  --text-h2:              clamp(1.75rem, 1.5rem + 1.25vw, 2.5rem);      /* 28.7px @375 -> 40.0px ceiling */
  --text-display-feature: clamp(2.25rem, 1.8rem + 2.25vw, 3.5rem);      /* 37.2px @375 -> 56.0px ceiling — one mid-page display statement (brief §2.3, §3 item 5) */
  --text-hero:            clamp(1.9rem, 1.6rem + 2vw, 2.4rem);          /* 33.1px @375 -> 38.4px ceiling — H1 only, deliberately restrained (brief §2.3) */

  /* H1's own arithmetic (brief §4) is computed at line-height 1.08 — kept as
     the site's --leading-tight so base.css's h1/h2/h3/h4 rule reproduces it
     exactly. Eyebrow lines are computed at 1.55 (brief §4), given their own
     token since base.css does not carry one. */
  --leading-tight:   1.08;
  --leading-eyebrow: 1.55;
  --leading-snug:    1.3;
  --leading-body:    1.6;

  --tracking-tight: -0.01em;
  --tracking-normal: 0em;
  --tracking-wide:  0.08em;   /* eyebrows / uppercase labels */

  /* --- Space — house scale, unmodified (brief does not override it). ---- */

  --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 §3's one token, fixed at every breakpoint
     (the house space scale is rem-based and non-fluid): 96px at 375 and at
     1440 alike. Two call sites only: .section's padding-block and the
     hero's padding-block-end (brief §3 corrects Tile A's ad hoc hero-bottom
     padding to this same token). */
  --section-gap: var(--space-2xl);   /* 96px */

  /* --- Layout — house defaults, unmodified: the brief does not state a
     narrower card-section width for this archetype. ---------------------- */

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

  /* Header is NOT sticky (house default, brief §3 does not opt in); no
     sticky-offset token needed. */

  /* --- Radius / shadow / border ------------------------------------------
     clean-clinical's airy, precise register: one small structural radius,
     no drop-shadow anywhere — flat, ruled surfaces read "precise" rather
     than "soft" (family norm; design-rules §4 bans a shadow on every card
     regardless). House scale unmodified; --radius-sm is the one step used. */

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

  --shadow-none: none;
  --shadow-sm: 0 1px 2px rgb(35 41 31 / 0.06);
  --shadow-md: 0 6px 24px rgb(35 41 31 / 0.09);
  --shadow-lg: 0 24px 60px rgb(35 41 31 / 0.14);

  --border-hairline: 1px;
  --border-plan: 2px;     /* the plan-line's own stroke weight, reused as the section head-rule below the hero (echoes grass-tenders' precedent: the signature device's static half doing a second job) */
  --border-thick: 3px;
  --border-style: solid;

  /* --- Motion (brief §6). base.css collapses --duration-fast/base/slow
     under prefers-reduced-motion: reduce (spec §8) — no exceptions. House
     motion tokens for standard scroll-triggered reveals; the signature
     move's own one-shot draw and ambient sprig-sway loop carry the brief's
     own literal timings on two dedicated tokens instead, deliberately not
     synchronised with each other or with the reveal system. */

  --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 hero's own signature timings (brief §6, §3.1). */
  --duration-plan-draw: 2.4s;    /* one-shot plan-line draw-in, ease-out */
  --loop-sprig-sway: 6.5s;       /* independent ambient sprig sway, ease-in-out, non-synchronised with the draw */

  /* --- Component sizing ---------------------------------------------------
     Brief-specific one-off sizes that don't belong on the house space scale
     (house-tech-spec §3 — tokens only, no raw literal in site.css). */
  --hero-field-ratio: 3 / 2;      /* the generated hero asset's own crop ratio, and the plan-line overlay's viewBox ratio */
  --size-node: 0.625rem;          /* plan-node marker diameter — hero overlay and the Process section's reused step markers (brief §3.1) */
  --size-study-sm: 4.5rem;        /* service-card material-study thumbnail (Hardscapes/Waterscapes/Outdoor Lighting cards) */
  --size-motif-process: 9rem;     /* Process section's turf/flora study image */

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

/* --------------------------------------------------------------------------
   @font-face — self-hosted woff2, SIL OFL 1.1 (brief §2.3, both Google
   Fonts). Static instances at the brief's two weights per family. Subset to
   the house declared safe range (house-tech-spec §8), byte-identical
   unicode-range on every face. Measured post-subset: 11.2 + 11.2 + 10.9 +
   10.9 = 44.1 KB total, largest face 11.2 KB — comfortably under the ≤100 KB
   total / ≤60 KB per-face budget.
   -------------------------------------------------------------------------- */

@font-face {
  font-family: 'Public Sans';
  src: url('../assets/fonts/public-sans-600.woff2') format('woff2');
  font-weight: 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: 'Public Sans';
  src: url('../assets/fonts/public-sans-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: 'Source Sans 3';
  src: url('../assets/fonts/source-sans-3-400.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: 'Source Sans 3';
  src: url('../assets/fonts/source-sans-3-600.woff2') format('woff2');
  font-weight: 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;
}

/* Metrics-matched fallbacks (house-tech-spec §7/§8) — MEASURED, not
   eyeballed, via scripts/font-metrics.mjs (the fontaine algorithm) against
   the shipped, subset woff2 files. Donor: Liberation Sans (already on this
   build system; metric-compatible with Arial), the same donor-substitution
   precedent as grass-tenders-llc-pauline-sc and tyler-roofing-tyler-tx.
   Public Sans measured against its 700 instance; Source Sans 3 against its
   400 instance — the weight either family's fallback stack is most often
   read at. */

@font-face {
  font-family: 'Public Sans Fallback';
  src: local('Liberation Sans Bold'), local('Liberation Sans'), local('Arial'), local('Helvetica Neue');
  size-adjust: 99.41%;
  ascent-override: 95.57%;
  descent-override: 22.63%;
  line-gap-override: 0%;
}

@font-face {
  font-family: 'Source Sans 3 Fallback';
  src: local('Liberation Sans'), local('Arial'), local('Helvetica Neue');
  size-adjust: 94.14%;
  ascent-override: 108.77%;
  descent-override: 42.49%;
  line-gap-override: 0%;
}
