/* ==========================================================================
   Blueline Service Co LLC — site stylesheet
   One bundled stylesheet: tokens, fonts, base, layout, chrome, components.
   ========================================================================== */

/* Blueline Service Co — color tokens. Brand blues sampled directly from the logo PNG. */
:root {
  /* Brand blues (from logo) */
  --blue-950: #050B26; /* near-black navy — droplet/wave shadows */
  --blue-900: #0A1745; /* wordmark navy — headings, dark surfaces */
  --blue-800: #0F2559;
  --blue-700: #123A80;
  --blue-600: #0B57B4; /* royal — primary brand color */
  --blue-500: #0895E4; /* bright — primary CTA, links */
  --blue-400: #22ABF4; /* sky — hover, accents on dark */
  --blue-300: #5CD9F6; /* light — wave highlight, accents on dark */
  --blue-100: #D6EDFC;
  --blue-50:  #EFF7FE;

  /* Neutrals (cool, navy-tinted) */
  --gray-950: #0D1220;
  --gray-900: #1A2233;
  --gray-700: #39435A;
  --gray-500: #5D6880;
  --gray-400: #8A94A8;
  --gray-300: #C3CAD6;
  --gray-200: #DDE2EA;
  --gray-100: #EEF1F5;
  --gray-50:  #F7F9FB;
  --white:    #FFFFFF;

  /* Semantic accents (used sparingly) */
  --red-700:  #A32B1E; /* emergency hover/pressed */
  --red-600:  #C4392B; /* emergency actions only */
  --red-50:   #FCEEEC;
  --green-700:#116239;
  --green-600:#177A46; /* availability, success */
  --green-50: #EAF6EF;
  --amber-600:#9A6A0B;
  --amber-50: #FBF3E2;

  /* Semantic aliases */
  --color-brand: var(--blue-600);
  --color-brand-bright: var(--blue-500);
  --color-emergency: var(--red-600);
  --color-success: var(--green-600);

  --text-heading: var(--blue-900);
  --text-body: var(--gray-700);
  --text-muted: var(--gray-500);
  --text-on-dark: #FFFFFF;
  --text-on-dark-muted: #AFC2E4;
  --text-link: var(--blue-600);
  --text-link-hover: var(--blue-500);

  --surface-page: #FFFFFF;
  --surface-tint: var(--blue-50);   /* alternating sections */
  --surface-card: #FFFFFF;
  --surface-navy: var(--blue-900);  /* footer, hero, top bar */
  --surface-inset: var(--gray-50);

  --border-default: var(--gray-200);
  --border-strong: var(--gray-300);
  --border-on-dark: rgba(255,255,255,.14);
  --focus-ring: var(--blue-400);

  /* Brand gradients — echo the logo's wave and navy depth */
  --grad-wave: linear-gradient(90deg, var(--blue-700), var(--blue-500) 55%, var(--blue-300)); /* @kind color */
  --grad-navy: linear-gradient(180deg, #10265E, #081335); /* @kind color */
  --grad-cta: linear-gradient(180deg, #1BA2EE, #0784CE); /* @kind color */
}

/* Blueline Service Co — typography tokens.
   Display: Archivo (sturdy, civic grotesque — echoes the heavy logo wordmark).
   Body: Source Sans 3 (humanist, highly legible at small mobile sizes).
   Both loaded from Google Fonts (see fonts.css) — substitutes; no brand font files were provided. */
:root {
  --font-display: "Archivo", "Helvetica Neue", Arial, sans-serif;
  --font-body: "Source Sans 3", "Segoe UI", Arial, sans-serif;

  /* Scale — mobile-first: body never below 16px */
  --text-xs: 13px;
  --text-sm: 15px;
  --text-md: 17px;   /* default body */
  --text-lg: 19px;
  --text-xl: 22px;
  --text-2xl: 28px;
  --text-3xl: 34px;
  --text-4xl: 44px;
  --text-5xl: 56px;  /* hero, desktop only */

  --leading-tight: 1.08;
  --leading-snug: 1.25;
  --leading-body: 1.55;

  --tracking-display: -0.015em;
  --tracking-caps: 0.09em;   /* eyebrow labels, echoes "SERVICE CO LLC" lockup */

  --weight-regular: 400;
  --weight-medium: 500;
  --weight-semibold: 600;
  --weight-bold: 700;
  --weight-display: 800;     /* headings */
}

/* Blueline Service Co — spacing & layout tokens. 4px base. */
:root {
  --space-1: 4px;
  --space-2: 8px;
  --space-3: 12px;
  --space-4: 16px;
  --space-5: 20px;
  --space-6: 24px;
  --space-8: 32px;
  --space-10: 40px;
  --space-12: 48px;
  --space-16: 64px;
  --space-20: 80px;
  --space-24: 96px;

  --container: 1160px;      /* max content width */
  --gutter: 20px;           /* mobile side padding */
  --gutter-desktop: 32px;
  --section-pad: 64px;      /* vertical rhythm between page sections (96px desktop) */
  --tap-target: 44px;       /* minimum interactive height — mobile-first rule */
}

/* Blueline Service Co — radii, shadows, motion. */
:root {
  --radius-sm: 8px;    /* inputs, badges */
  --radius-md: 12px;   /* buttons, small cards */
  --radius-lg: 16px;   /* cards, form panels */
  --radius-xl: 24px;   /* hero panels, images */
  --radius-pill: 999px;/* phone CTA, tags */

  /* Navy-tinted shadows — never pure black */
  --shadow-sm: 0 1px 2px rgba(10, 23, 69, .08);
  --shadow-md: 0 2px 8px -2px rgba(10, 23, 69, .10), 0 6px 20px -4px rgba(10, 23, 69, .10);
  --shadow-lg: 0 4px 16px -4px rgba(10, 23, 69, .12), 0 18px 44px -10px rgba(10, 23, 69, .18);
  --shadow-cta: 0 4px 14px -2px rgba(8, 149, 228, .40);       /* glow under bright-blue CTAs */
  --shadow-emergency: 0 4px 14px -2px rgba(196, 57, 43, .35);

  --ring: 0 0 0 3px rgba(34, 171, 244, .35);  /* focus ring, on --focus-ring color */

  --ease-out: cubic-bezier(.2, .7, .3, 1); /* @kind other */
  --dur-fast: 120ms; /* @kind other */
  --dur: 200ms; /* @kind other */
}

/* Blueline Service Co — self-hosted webfonts.
   Archivo (display) 500/700/800/900 + Source Sans 3 (body) 400/600/700.
   Latin subset woff2, fetched from fonts.gstatic.com and stored in src/fonts/.
   font-display: swap on every face so text renders in a fallback immediately. */

@font-face {
  font-family: "Archivo";
  font-style: normal;
  font-weight: 500;
  font-display: swap;
  src: url("/fonts/archivo-500.woff2") format("woff2");
}
@font-face {
  font-family: "Archivo";
  font-style: normal;
  font-weight: 700;
  font-display: swap;
  src: url("/fonts/archivo-700.woff2") format("woff2");
}
@font-face {
  font-family: "Archivo";
  font-style: normal;
  font-weight: 800;
  font-display: swap;
  src: url("/fonts/archivo-800.woff2") format("woff2");
}
@font-face {
  font-family: "Archivo";
  font-style: normal;
  font-weight: 900;
  font-display: swap;
  src: url("/fonts/archivo-900.woff2") format("woff2");
}

@font-face {
  font-family: "Source Sans 3";
  font-style: normal;
  font-weight: 400;
  font-display: swap;
  src: url("/fonts/source-sans-3-400.woff2") format("woff2");
}
@font-face {
  font-family: "Source Sans 3";
  font-style: normal;
  font-weight: 600;
  font-display: swap;
  src: url("/fonts/source-sans-3-600.woff2") format("woff2");
}
@font-face {
  font-family: "Source Sans 3";
  font-style: normal;
  font-weight: 700;
  font-display: swap;
  src: url("/fonts/source-sans-3-700.woff2") format("woff2");
}

/* Minimal global element styles. */
body {
  font-family: var(--font-body);
  font-size: var(--text-md);
  line-height: var(--leading-body);
  color: var(--text-body);
  background: var(--surface-page);
  margin: 0;
  -webkit-font-smoothing: antialiased;
}
h1, h2, h3, h4 {
  font-family: var(--font-display);
  color: var(--text-heading);
  letter-spacing: var(--tracking-display);
  line-height: var(--leading-tight);
  margin: 0;
}
a { color: var(--text-link); text-decoration: none; }
a:hover { color: var(--text-link-hover); }
::selection { background: var(--blue-100); }
:focus-visible { outline: none; box-shadow: var(--ring); border-radius: 4px; }

/* ==========================================================================
   hero.css — Home hero V2: statement composition.
   Two large cropped tools + one soft-focus depth element + a water sandwich
   (back splash BEHIND the headline, front splash ACROSS it as glass).
   Layers (z): 0 glow · 1 bg-depth + splash-back · 2 statement tools ·
   3 content column · 4 curve. Inside the content column's stacking context:
   h1 at content level (auto) · splash-front 5 · eyebrow/sub/CTAs/badges 6 —
   so the front water paints above the headline and below every control.
   All motion is transform/opacity only; every animation lives inside the
   prefers-reduced-motion: no-preference block below.
   ========================================================================== */

/* --------------------------------------------------------------------------
   FLOATING-ELEMENT SLOT CONTRACT (future 4K art swap) — V2 SLOT SET

   Markup:  <div class="hero-float" data-slot="<name>" data-depth="±0.x"
                 data-rot="<deg per scrolled px>" aria-hidden="true">
              <div class="hero-float__bob"> …inline SVG (today) or <img> (later)… </div>
            </div>

   | slot         | subject (art file)                  | aspect   | layer            |
   |--------------|-------------------------------------|----------|------------------|
   | wrench-hero  | red pipe wrench (tool-wrench.svg)   | 1:1      | z2, enters top-right, handle crops off the top edge |
   | trap-corner  | chrome P-trap (tool-pipe.svg)       | 1:1      | z2, anchors lower-left corner, cropped off left+bottom |
   | bg-depth     | defocused valve (bg-valve.svg)      | 1:1      | z1, dim soft-focus depth, upper-left |
   | splash-back  | wave-crown system (splash-back.svg) | 1440:620 | z1, spans hero width behind the headline |
   | splash-front | water whip (splash-front.svg)       | 720:560  | z5 inside the content column, crosses the headline's left third IN FRONT of the type |

   - The .hero-float wrapper owns placement AND receives the JS motion
     transforms (scroll drift + pointer parallax). Never position the art.
   - Slot size/position live ONLY in the [data-slot="…"] rules below
     (--w plus left/right/top/bottom and --ar aspect, overridden per
     breakpoint). Swapping art never requires touching them.
   - A future 4K render drops in as
       <img src="/img/hero/<name>.png" alt="" width="4096" height="…"
            loading="lazy" decoding="async">
     replacing the inline <svg> inside .hero-float__bob — the CSS sizes ANY
     child of __bob to 100% width at the slot's --ar aspect. Tool slots are
     square transparent PNGs; splash-back renders at 4096x1762 and
     splash-front at 2880x2240 (transparent).
   - data-depth: scroll drift factor (negative rises, positive sinks; the
     statement pieces are HEAVY — keep magnitudes ≤ 0.1). data-rot: degrees
     per scrolled px (≤ 0.004 ≈ 3–4°/screen). data-pointer="0" opts out of
     pointer parallax (bg-depth and splash-front stay planted so the
     text-behind-water relationship never wanders).
   - splash-front legibility guardrails live in the art file itself:
     over-glyph fills #0895E4–#38B6F2 at .34–.42 opacity, nothing over the
     eyebrow/CTAs/badges, sparkles off glyph centers. Keep them if the art
     is ever regenerated.
   -------------------------------------------------------------------------- */

.hero {
  position: relative;
  overflow: hidden;
  /* Real worksite behind everything: dark out-of-focus plumber's workshop
     plate under a navy scrim — same treatment the client approved on the
     services band, graded darker so the water/tools/type stay in charge. */
  background:
    linear-gradient(180deg, rgba(16, 38, 94, .32) 0%, rgba(10, 23, 69, .5) 55%, rgba(8, 19, 53, .88) 100%),
    url("/img/gen/bg-hero-worksite.jpg") center 40% / cover no-repeat,
    var(--grad-navy);
  display: flex;
  align-items: center;
  min-height: 88vh; /* fallback */
  min-height: clamp(560px, calc(100svh - 116px), 1000px); /* 116px = topbar + header */
  --hero-emphasis: linear-gradient(92deg, var(--blue-400), var(--blue-300) 78%);
  --hero-curve-h: clamp(40px, 7vw, 96px);
}

/* ---------- Ambient glow + blueprint whisper (the flyer's navy DNA);
   a deepening base roots the splash system in darkness. ---------- */
.hero__glow {
  position: absolute;
  inset: 0;
  z-index: 0;
  pointer-events: none;
  background:
    radial-gradient(ellipse 62% 46% at 50% 40%, rgba(11, 87, 180, .22), transparent 68%),
    radial-gradient(ellipse 40% 30% at 50% 44%, rgba(8, 149, 228, .14), transparent 70%),
    linear-gradient(180deg, transparent 62%, rgba(3, 8, 28, .3) 100%),
    repeating-linear-gradient(0deg, rgba(92, 217, 246, .045) 0 1px, transparent 1px 64px),
    repeating-linear-gradient(90deg, rgba(92, 217, 246, .045) 0 1px, transparent 1px 64px);
}

/* ---------- Float wrappers (shared base — why-blueline reuses it) -------- */
.hero-float {
  position: absolute;
  z-index: 2;
  width: var(--w, 100px);
  pointer-events: none;
}
.hero-float__bob > * {
  display: block;
  width: 100%;
  height: auto;
  aspect-ratio: var(--ar, 1 / 1);
}
/* Grounding shadow: statement tools only — water and the defocused depth
   element cast none (static filter; motion stays transform-only). */
.hero-float[data-slot="wrench-hero"] .hero-float__bob svg,
.hero-float[data-slot="wrench-hero"] .hero-float__bob img,
.hero-float[data-slot="trap-corner"] .hero-float__bob svg,
.hero-float[data-slot="trap-corner"] .hero-float__bob img {
  filter: drop-shadow(0 18px 30px rgba(3, 8, 28, .55));
}

/* ---------- Slot placement (desktop-first) ---------- */
/* Protagonist: ~40vh tall, meaningfully cropped off the top-right. */
.hero-float[data-slot="wrench-hero"] {
  --w: clamp(250px, 33vh, 430px);
  right: -3%;
  top: -5%;
}
.hero-float[data-slot="wrench-hero"] svg { transform: rotate(6deg); }

/* Secondary: chrome P-trap anchoring the opposite corner. */
.hero-float[data-slot="trap-corner"] {
  --w: clamp(210px, 28vh, 360px);
  left: -2%;
  bottom: -3%;
  z-index: 2;
}
.hero-float[data-slot="trap-corner"] img { transform: rotate(-6deg); }

/* Depth-of-field: dim, pre-blurred-by-construction, upper-left. */
.hero-float[data-slot="bg-depth"] {
  --w: clamp(200px, 26vh, 340px);
  left: 3%;
  top: 6%;
  z-index: 1;
  opacity: .55;
}

/* Water, back layer: spans the hero width, rises behind the text. */
.hero-float[data-slot="splash-back"] {
  --ar: 5504 / 3072;
  width: auto;
  left: -3%;
  right: -3%;
  bottom: -17%;
  z-index: 1;
  /* no opacity here — element opacity isolates compositing and would
     defeat the img's screen blend (black background would reappear) */
}

/* Water, front layer: anchored to the SAME column as the headline so the
   text-behind-glass relationship holds at every viewport. z5 — above the
   h1 (content level), below the z6 controls. */
.hero-float[data-slot="splash-front"] {
  --ar: 4800 / 3584;
  --w: 70%;
  left: -14%;
  top: 104px;
  z-index: 5;
}
/* Client feedback: full-strength water over the glyphs hurt readability —
   the whip keeps crossing the headline, but as a lighter glass layer. */
.hero-float[data-slot="splash-front"] img { opacity: .58; }

/* ---------- Photographic art (Nano Banana renders) ----------
   Water is shot on pure black and blended as LIGHT (screen) — genuinely
   translucent over the navy and over the headline (screen can never darken
   text, so legibility only improves). The defocused depth element fades
   out at its edges via a radial mask so it melts into the gradient. */
.hero-float img { object-fit: contain; }
/* Both water layers ship as TRUE alpha (luminance-keyed WebP). Blend modes
   are useless here: every z-indexed float wrapper is an isolated compositing
   group, so mix-blend-mode sees no backdrop and renders the raw black. */
.hero-float[data-slot="bg-depth"] img {
  mask-image: radial-gradient(closest-side, #000 55%, transparent 98%);
  -webkit-mask-image: radial-gradient(closest-side, #000 55%, transparent 98%);
}

/* ---------- Content column ---------- */
.hero__inner {
  position: relative;
  z-index: 3;
}
.hero__content {
  position: relative; /* anchor for the splash-front slot */
  max-width: 800px;
  margin: 0 auto;
  text-align: center;
  padding-top: clamp(96px, 13svh, 132px);
  padding-bottom: calc(var(--hero-curve-h) + clamp(56px, 9svh, 88px));
}
/* Controls ride above the front water; the h1 stays at content level so
   the splash passes in front of it. */
.hero__eyebrow,
.hero__sub,
.hero__ctas,
.hero__badges {
  position: relative;
  z-index: 6;
}

.hero__eyebrow {
  display: inline-flex;
  align-items: center;
  gap: 8px;
  margin: 0 0 18px;
  padding: 8px 16px;
  border-radius: var(--radius-pill);
  border: 1px solid rgba(255, 255, 255, .14);
  background: rgba(255, 255, 255, .06);
  font-family: var(--font-body);
  font-weight: 700;
  font-size: 13px;
  letter-spacing: var(--tracking-caps);
  text-transform: uppercase;
  color: var(--blue-300);
}
.hero__eyebrow svg { width: 15px; height: 15px; flex: none; }

.hero__title {
  color: #fff;
  font-size: clamp(40px, 30px + 2.8vw, 64px);
  font-weight: var(--weight-display);
  line-height: 1.04;
  letter-spacing: -0.02em;
  margin: 0 0 20px;
  /* lifts the type off the busy water behind/over it */
  text-shadow: 0 2px 26px rgba(3, 8, 28, .6), 0 1px 5px rgba(3, 8, 28, .45);
}
.hero__sub { text-shadow: 0 1px 14px rgba(3, 8, 28, .55); }
.hero__title-line { display: block; text-wrap: balance; }
.hero__title-em {
  /* solid fill — gradient-clipped text turns to mud when combined with the
     title's text-shadow (shadow bleeds through transparent glyphs) */
  color: var(--blue-300);
}

.hero__sub {
  color: var(--text-on-dark-muted);
  font-size: clamp(17px, 16px + .4vw, 20px);
  line-height: 1.6;
  max-width: 54ch;
  margin: 0 auto 30px;
}

.hero__ctas {
  display: flex;
  flex-wrap: wrap;
  justify-content: center;
  align-items: center;
  gap: 12px 14px;
  margin: 0 0 30px;
}
.hero .hero__cta-call {
  height: 60px;
  padding: 0 30px;
  font-size: 20px;
  letter-spacing: .01em;
}
.hero .hero__cta-call svg { width: 21px; height: 21px; }
.hero .hero__cta-request {
  height: 60px;
  padding: 0 26px;
  font-size: 17px;
}
.hero .hero__cta-request svg { width: 18px; height: 18px; }

.hero__badges {
  list-style: none;
  display: flex;
  flex-wrap: wrap;
  justify-content: center;
  gap: 10px 26px;
  margin: 0;
  padding: 0;
}
.hero__badges li {
  display: inline-flex;
  align-items: center;
  gap: 8px;
  font-family: var(--font-body);
  font-weight: 600;
  font-size: 14.5px;
  color: var(--text-on-dark-muted);
  white-space: nowrap;
}
.hero__badges svg { width: 16px; height: 16px; flex: none; color: var(--blue-400); }
.hero__badge-star svg { color: #FFC531; fill: currentColor; }

/* ---------- Bottom transition: a single shallow water horizon ---------- */
.hero__curve {
  position: absolute;
  left: 0;
  right: 0;
  bottom: -1px;
  z-index: 4;
  height: var(--hero-curve-h);
  pointer-events: none;
}
.hero__curve svg { width: 100%; height: 100%; display: block; }

/* ==========================================================================
   Motion — retuned to MASS. Idle drifts run 15–22s at ±4–7px with ≤0.6°
   of roll; the front splash barely breathes (±2px) so the text-behind-water
   read stays stable. Every animation is declared ONLY under no-preference,
   so prefers-reduced-motion gets a fully static composition for free.
   The hero-bob-* keyframes are shared by the site-wide drift floats.
   ========================================================================== */
@media (prefers-reduced-motion: no-preference) {
  /* Entrance stagger — pure CSS, done in <900ms, no scroll dependency */
  .hero__content > * { animation: hero-rise 420ms var(--ease-out) both; }
  .hero__content > :nth-child(2) { animation-delay: 70ms; }
  .hero__content > :nth-child(3) { animation-delay: 140ms; }
  .hero__content > :nth-child(4) { animation-delay: 210ms; }
  .hero__content > :nth-child(5) { animation-delay: 270ms; }

  .hero-float { animation: hero-fade 700ms ease-out both; will-change: transform; }
  .hero-float[data-slot="bg-depth"]     { animation-delay: 60ms; }
  .hero-float[data-slot="splash-back"]  { animation-delay: 140ms; }
  .hero-float[data-slot="trap-corner"]  { animation-delay: 220ms; }
  .hero-float[data-slot="wrench-hero"]  { animation-delay: 260ms; }
  /* splash-front is both a content child and a JS-driven wrapper: its
     entrance must stay opacity-only (hero-rise animates transform, which
     would pin the JS drift once filled). */
  .hero__content > .hero-float {
    animation: hero-fade 900ms ease-out both;
    animation-delay: 320ms;
  }

  /* Idle drift KILLED (client: self-moving frozen-splash photos read as
     fake). The scene is a frozen photograph — the only motion is depth
     parallax driven by the user's own scroll/cursor, which reads as camera
     movement. Keyframes below stay defined for the site-wide accent floats. */
  .hero-float__bob { animation: none; }
}
/* Outside the media query and ID-scoped: why-blueline.css re-assigns a bob
   (wb-bob) to the same class later in the bundle — the frozen-photo scenes
   must win on both pages, in every motion preference. */
#hero .hero-float__bob,
#wb-open .hero-float__bob { animation: none; }
@media (prefers-reduced-motion: no-preference) {

  .hero-float[data-slot="wrench-hero"]  { --bob-dur: 19s; --bob-delay: -6.2s; }
  .hero-float[data-slot="trap-corner"]  { --bob-dur: 22s; --bob-delay: -9s; }
  .hero-float[data-slot="bg-depth"]     { --bob-dur: 21s; --bob-delay: -4s; }
  .hero-float[data-slot="splash-back"]  { --bob-dur: 17s; --bob-delay: -11s; }
  .hero-float[data-slot="splash-front"] { --bob-dur: 15s; --bob-delay: -5s; }
}

@keyframes hero-rise {
  from { opacity: 0; transform: translateY(16px); }
  to { opacity: 1; transform: none; }
}
@keyframes hero-fade {
  from { opacity: 0; }
}
/* Shared idle-drift keyframes (also used by story.css / services-index.css
   drift floats) — massive, slow, minimal roll. */
@keyframes hero-bob-a {
  from { transform: translate3d(0, -6px, 0) rotate(-.5deg); }
  to { transform: translate3d(0, 7px, 0) rotate(.4deg); }
}
@keyframes hero-bob-b {
  from { transform: translate3d(-5px, 4px, 0) rotate(.4deg); }
  to { transform: translate3d(4px, -6px, 0) rotate(-.35deg); }
}
@keyframes hero-bob-c {
  from { transform: translate3d(3px, 5px, 0) rotate(.25deg); }
  to { transform: translate3d(-3px, -5px, 0) rotate(-.3deg); }
}
@keyframes hero-bob-d {
  from { transform: translate3d(0, -2px, 0); }
  to { transform: translate3d(0, 2px, 0); }
}

/* ==========================================================================
   Mobile (≤720px) — same grammar, cropped harder. The wrench stays LARGE
   off the top-right; the trap tucks into the lower-left corner; the front
   splash narrows (reduced headline coverage) and ends above the CTA stack
   so it can never cross the call button.
   ========================================================================== */
@media (max-width: 720px) {
  .hero-float[data-slot="bg-depth"] { display: none; }

  .hero-float[data-slot="wrench-hero"]  { --w: 230px; right: -17%; top: -8%; }
  .hero-float[data-slot="trap-corner"]  { --w: 170px; left: -14%; bottom: -4%; }
  .hero-float[data-slot="splash-back"]  { left: -14%; right: -14%; }
  .hero-float[data-slot="splash-front"] { --w: 96%; left: -24%; top: 96px; }

  .hero__content {
    padding-top: 140px;
    padding-bottom: calc(var(--hero-curve-h) + 130px);
  }
  .hero__eyebrow { font-size: 12px; padding: 7px 13px; }
  .hero__sub { margin-bottom: 26px; }
  .hero__ctas { flex-direction: column; align-items: stretch; margin-bottom: 26px; }
  .hero .hero__cta-call { width: 100%; }
  .hero .hero__cta-request { width: 100%; }
  .hero__badges { gap: 8px 18px; }
  .hero__badges li { font-size: 13.5px; }
}

/* ==========================================================================
   story.css — Home story bridge (#story) + home "life layer".
   Three editorial beats threaded by THE BLUE LINE: a scroll-drawn wave path
   whose draw progress is the section's --progress custom property (set by
   scroll.js on [data-scrub-section] — pure CSS consumption, no extra JS).
   Restyled hero art drifts in the margin; a whisper of blueprint grid gives
   the white surface atmosphere. All motion transform/opacity + dashoffset
   fed by --progress; reduced-motion and no-JS get the fully drawn line and
   static, fully legible art.
   ========================================================================== */

/* --------------------------------------------------------------------------
   DRIFT-FLOAT SLOT CONTRACT (shared: story bridge + services index)
   Mirrors the hero's .hero-float contract for sections outside the hero:

   Markup:  <section … data-float-field>            (owns the coordinate space)
              <div class="drift-float" data-slot="<name>" data-depth="±0.x"
                   data-rot="<deg per px>" aria-hidden="true">
                <div class="drift-float__bob"> …inline SVG (today) or <img>… </div>
              </div>

   - The .drift-float wrapper owns placement AND receives the JS scroll-drift
     transform (src/js/floats.js, via window.BL_SCROLL). Never position art.
   - Slot size/position live ONLY in [data-slot="…"] rules (below for story-*,
     in services-index.css for svcx-*). Swapping art never touches them.
   - Slots are square (1:1); a future 4K render drops in as
       <img src="/img/…" alt="" width="1024" height="1024" loading="lazy">
     replacing the inline svg — __bob sizes any child to 100% width at 1:1.
   - data-depth: drift factor relative to the section's viewport-center
     crossing (negative rises, positive sinks). data-rot: deg per drifted px.
   -------------------------------------------------------------------------- */
.drift-float {
  position: absolute;
  z-index: 0;
  width: var(--w, 90px);
  pointer-events: none;
}
.drift-float__bob > * {
  display: block;
  width: 100%;
  height: auto;
  aspect-ratio: 1 / 1;
  filter: drop-shadow(0 14px 22px rgba(10, 23, 69, .16));
}

/* ---------- Section surface: white + blueprint whisper + cool tints ------ */
.story {
  position: relative;
  overflow: hidden;
  background:
    radial-gradient(ellipse 46% 34% at 84% 12%, rgba(92, 217, 246, .10), transparent 70%),
    radial-gradient(ellipse 42% 32% at 8% 92%, rgba(11, 87, 180, .06), transparent 70%),
    repeating-linear-gradient(0deg, rgba(11, 87, 180, .035) 0 1px, transparent 1px 56px),
    repeating-linear-gradient(90deg, rgba(11, 87, 180, .035) 0 1px, transparent 1px 56px),
    var(--surface-page);
  padding: clamp(72px, 11vh, 128px) 0 clamp(56px, 9vh, 104px);
}
.story .container {
  position: relative;
  z-index: 1;
}

/* ---------- The blue line: rail + thread + beats ---------- */
.story__flow {
  --story-rail: clamp(46px, 7vw, 72px);
  position: relative;
  padding-left: var(--story-rail);
}
.story__thread {
  position: absolute;
  top: -6px;
  bottom: 0;
  left: calc(var(--story-rail) / 2 - 14px);
  width: 28px;
  overflow: hidden;
}
.story__thread svg {
  display: block;
  width: 28px;
  /* stretch to the wrapper's REAL height (driven by the three beats'
     text/margins) instead of a fixed 1000px — otherwise the path (and the
     scroll-drawn stroke) runs out before the last node whenever the actual
     content is taller than the viewBox, which it usually is. */
  height: 100%;
}
.story__thread-draw {
  stroke-dasharray: 1000;
  stroke-dashoffset: calc((1 - clamp(0, calc(var(--progress, 1) * 1.5 - 0.05), 1)) * 1000);
}

.story__line {
  position: relative;
  font-family: var(--font-display);
  font-weight: var(--weight-display);
  color: var(--blue-900);
  font-size: clamp(26px, 20px + 1.9vw, 38px);
  line-height: 1.2;
  letter-spacing: var(--tracking-display);
  max-width: 30ch;
  margin: 0 0 clamp(56px, 10vh, 112px);
}
.story__line:last-child { margin-bottom: 0; }
.story__line em {
  font-style: normal;
  color: var(--blue-600);
}

/* Node where the thread meets each beat */
.story__node {
  position: absolute;
  left: calc(var(--story-rail) / -2 - 8px);
  top: -6px;
  width: 16px;
  height: 16px;
  border-radius: 50%;
  background: radial-gradient(circle at 35% 30%, var(--blue-300), var(--blue-600) 72%);
  box-shadow: 0 0 0 4px rgba(8, 149, 228, .14);
}

/* Wave-gradient rule per beat — widths step up 36 → 52 → 68px */
.story__rule {
  display: block;
  height: 4px;
  width: 52px;
  border-radius: 2px;
  background: var(--grad-wave);
  margin: 0 0 18px;
}
.story__line:nth-child(1) .story__rule { width: 36px; }
.story__line:nth-child(3) .story__rule { width: 68px; }

/* ---------- Margin art slots (see contract above) ---------- */
.story .drift-float[data-slot="story-droplets"] { --w: clamp(58px, 6.5vw, 88px); right: 6.5%; top: 5%; }
.story .drift-float[data-slot="story-plunger"]  { --w: clamp(84px, 9.5vw, 136px); right: 9%;  top: 36%; }
.story .drift-float[data-slot="story-tee"]      { --w: clamp(60px, 7vw, 96px);   right: 24%; bottom: 3%; opacity: .85; }
.story .drift-float[data-slot="story-plunger"] svg { transform: rotate(9deg); }
.story .drift-float[data-slot="story-tee"] svg     { transform: rotate(-7deg); }

/* ---------- Reveal choreography ---------- */
html.js .story .story__line.is-revealed {
  transition-delay: calc(var(--stagger-i, 0) * 140ms);
}
html.js .story .story__rule {
  transform: scaleX(0);
  transform-origin: left center;
  transition: transform 640ms var(--ease-out);
  transition-delay: calc(var(--stagger-i, 0) * 140ms + 240ms);
}
html.js .story .story__line.is-revealed .story__rule {
  transform: scaleX(1);
}
html.js .story .story__node {
  transform: scale(0);
  transition: transform 460ms var(--ease-out);
  transition-delay: calc(var(--stagger-i, 0) * 140ms + 360ms);
}
html.js .story .story__line.is-revealed .story__node {
  transform: scale(1);
}

/* Idle bob for margin art (keyframes live in hero.css) */
@media (prefers-reduced-motion: no-preference) {
  .drift-float__bob { animation: hero-bob-a var(--bob-dur, 10s) ease-in-out var(--bob-delay, 0s) infinite alternate; }
  .story .drift-float[data-slot="story-droplets"] .drift-float__bob { animation-name: hero-bob-b; --bob-dur: 8s;   --bob-delay: -3.1s; }
  .story .drift-float[data-slot="story-plunger"]  .drift-float__bob { animation-name: hero-bob-c; --bob-dur: 10.5s; --bob-delay: -5.4s; }
  .story .drift-float[data-slot="story-tee"]      .drift-float__bob { --bob-dur: 9s; --bob-delay: -1.6s; }
}
@media (prefers-reduced-motion: reduce) {
  html.js .story .story__rule,
  html.js .story .story__node {
    transform: none;
    transition: none;
  }
}

/* ---------- Services teaser seasoning (home): art per chapter card ------- */
.chapter-card { position: relative; }
.chapter-card__art {
  position: absolute;
  top: 10px;
  right: -14px;
  width: 96px;
  opacity: .95;
  transform: rotate(8deg);
  pointer-events: none;
}
.chapter-card__art svg { width: 100%; height: auto; }
#services-teaser .card {
  transition: transform var(--dur) var(--ease-out), box-shadow var(--dur) var(--ease-out);
}
#services-teaser .card:hover {
  transform: translateY(-3px);
  box-shadow: var(--shadow-md);
}
@media (prefers-reduced-motion: no-preference) {
  .chapter-card__art { transition: transform 320ms var(--ease-out); }
  #services-teaser .card:hover .chapter-card__art { transform: rotate(3deg) scale(1.05); }
}
/* keep the card title/list clear of the art on the wrap-prone middle sizes */
.chapter-card__kicker,
.chapter-card__title { max-width: calc(100% - 74px); }

/* ---------- Mobile ---------- */
@media (max-width: 720px) {
  .story__flow { --story-rail: 40px; }
  .story .drift-float[data-slot="story-droplets"] { --w: 52px; right: 5%; top: 3.5%; }
  .story .drift-float[data-slot="story-plunger"]  { --w: 68px; right: 4%; top: auto; bottom: 6%; }
  .story .drift-float[data-slot="story-tee"]      { display: none; }
  .chapter-card__art { width: 78px; right: -10px; }
}

/* ==========================================================================
   services-index.css — /services/ cinematic chapter presentation.
   Rhythm: compact navy band → sticky quick-jump rail → three chapters
   (white / tint / white) each with a ghost numeral, a scroll-drawn wave
   rule (fed by the [data-scrub-section] --progress custom property), one
   signature drift-float (slot contract: see story.css) and zigzag service
   "moments" → slim navy closer. All motion transform/opacity + dash draw;
   reduced-motion and no-JS get everything static and fully legible.

   DRIFT-FLOAT SLOTS registered on this page (contract in story.css):
     svcx-droplets, svcx-nut          — opening band edges
     svcx-wrench / svcx-pipe / svcx-plunger — one signature per chapter
     svcx-gauge                       — closer band
   ========================================================================== */

/* Anchor jumps glide (rail links); instant under reduced motion */
@media (prefers-reduced-motion: no-preference) {
  html { scroll-behavior: smooth; }
}

.svcx { counter-reset: svcx-chapter; }

/* ---------- Opening band (compact navy, page h1) ---------- */
.svcx-hero {
  position: relative;
  overflow: hidden;
  background: var(--grad-navy);
  padding: clamp(56px, 9vh, 96px) 0 clamp(48px, 8vh, 84px);
}
.svcx-hero__bg {
  position: absolute;
  inset: 0;
  pointer-events: none;
  background:
    linear-gradient(180deg, rgba(8, 19, 53, .58) 0%, rgba(8, 19, 53, .84) 72%, rgba(6, 15, 44, .96) 100%),
    url("/img/gen/bg-worksite-services.jpg") center 32% / cover no-repeat;
}
.svcx-hero__glow {
  position: absolute;
  inset: 0;
  pointer-events: none;
  background:
    radial-gradient(ellipse 58% 70% at 50% 30%, rgba(11, 87, 180, .35), transparent 70%),
    repeating-linear-gradient(0deg, rgba(92, 217, 246, .05) 0 1px, transparent 1px 64px),
    repeating-linear-gradient(90deg, rgba(92, 217, 246, .05) 0 1px, transparent 1px 64px);
}
.svcx-hero__inner {
  position: relative;
  z-index: 1;
  text-align: center;
}
.svcx-hero__eyebrow {
  display: inline-flex;
  align-items: center;
  margin: 0 0 16px;
  padding: 8px 16px;
  border-radius: var(--radius-pill);
  border: 1px solid rgba(255, 255, 255, .14);
  background: rgba(255, 255, 255, .06);
  font-family: var(--font-body);
  font-weight: 700;
  font-size: 13px;
  letter-spacing: var(--tracking-caps);
  text-transform: uppercase;
  color: var(--blue-300);
}
.svcx-hero__title {
  color: #fff;
  font-size: clamp(36px, 26px + 3vw, 58px);
  font-weight: var(--weight-display);
  line-height: 1.05;
  letter-spacing: -0.02em;
  margin: 0;
}
.svcx-hero__inner .wave-bar--underline {
  margin-left: auto;
  margin-right: auto;
}
.svcx-hero__sub {
  color: var(--text-on-dark-muted);
  font-size: clamp(16px, 15px + .4vw, 19px);
  line-height: 1.6;
  max-width: 52ch;
  margin: 16px auto 0;
}
.svcx-hero .drift-float[data-slot="svcx-droplets"] { --w: clamp(64px, 7.5vw, 104px); left: 7%;  top: 16%; }
.svcx-hero .drift-float[data-slot="svcx-nut"]      { --w: clamp(48px, 5.5vw, 76px);  right: 8%; top: 26%; }
.svcx-hero .drift-float[data-slot="svcx-nut"] svg  { transform: rotate(12deg); }

/* ---------- Sticky quick-jump rail ---------- */
.svcx-rail {
  position: sticky;
  top: 76px; /* under the sticky site header */
  z-index: 30;
  background: rgba(255, 255, 255, .92);
  backdrop-filter: blur(10px);
  -webkit-backdrop-filter: blur(10px);
  border-bottom: 1px solid var(--gray-200);
}
.svcx-rail__row {
  display: flex;
  align-items: center;
  gap: 6px;
  height: 56px;
  overflow-x: auto;
  scrollbar-width: none;
}
.svcx-rail__row::-webkit-scrollbar { display: none; }
.svcx-rail__label {
  flex: none;
  font-family: var(--font-body);
  font-weight: 700;
  font-size: 12.5px;
  letter-spacing: var(--tracking-caps);
  text-transform: uppercase;
  color: var(--gray-500);
  margin-right: 8px;
}
.svcx-rail__link {
  flex: none;
  display: inline-flex;
  align-items: center;
  min-height: 40px;
  padding: 0 16px;
  border-radius: var(--radius-pill);
  font-family: var(--font-body);
  font-weight: 600;
  font-size: 15px;
  color: var(--gray-900);
  text-decoration: none;
  transition: background var(--dur) var(--ease-out), color var(--dur) var(--ease-out);
}
.svcx-rail__link:hover { background: var(--blue-50); color: var(--blue-700); }
.svcx-rail__link.is-active {
  background: var(--blue-50);
  color: var(--blue-700);
  box-shadow: inset 0 0 0 1.5px var(--blue-100);
}

/* ---------- Chapters ---------- */
.svcx-chapter {
  position: relative;
  overflow: hidden;
  counter-increment: svcx-chapter;
  padding: clamp(72px, 10vh, 120px) 0;
  scroll-margin-top: 148px; /* header + rail */
  background:
    radial-gradient(ellipse 40% 36% at 92% 4%, rgba(92, 217, 246, .09), transparent 70%),
    var(--surface-page);
}
#big-systems.svcx-chapter {
  background:
    radial-gradient(ellipse 44% 38% at 90% 6%, rgba(92, 217, 246, .12), transparent 70%),
    repeating-linear-gradient(0deg, rgba(11, 87, 180, .03) 0 1px, transparent 1px 56px),
    repeating-linear-gradient(90deg, rgba(11, 87, 180, .03) 0 1px, transparent 1px 56px),
    var(--surface-tint);
}
.svcx-chapter__inner {
  position: relative;
  z-index: 1;
}

.svcx-chapter__head { position: relative; }
/* Ghost chapter numeral — pure atmosphere behind the title */
.svcx-chapter__head::before {
  content: "0" counter(svcx-chapter) / "";
  position: absolute;
  top: -.32em;
  left: -10px;
  z-index: 0;
  font-family: var(--font-display);
  font-weight: var(--weight-display);
  font-size: clamp(96px, 18vw, 200px);
  line-height: 1;
  letter-spacing: -0.04em;
  color: transparent;
  -webkit-text-stroke: 1.5px rgba(11, 87, 180, .13);
  pointer-events: none;
}
.svcx-chapter__kicker,
.svcx-chapter__title,
.svcx-chapter__wave { position: relative; z-index: 1; }
.svcx-chapter__kicker {
  margin: 0;
  font-family: var(--font-body);
  font-weight: 700;
  font-size: 13.5px;
  letter-spacing: var(--tracking-caps);
  text-transform: uppercase;
  color: var(--blue-600);
}
.svcx-chapter__title {
  margin: 10px 0 0;
  font-size: clamp(38px, 28px + 3vw, 64px);
  font-weight: var(--weight-display);
  color: var(--text-heading);
  letter-spacing: -0.02em;
  line-height: 1.04;
}
.svcx-chapter__wave {
  display: block;
  margin-top: 18px;
  max-width: 60%;
}
/* The wave rule draws itself as the chapter scrolls into view */
.svcx-chapter__wave-draw {
  stroke-dasharray: 100;
  stroke-dashoffset: calc((1 - clamp(0, calc(var(--progress, 1) * 2.4 - 0.12), 1)) * 100);
}

/* Chapter signature art slots */
.svcx-chapter .drift-float[data-slot="svcx-wrench"]  { --w: clamp(118px, 13.5vw, 186px); right: 5%;   top: 5%; }
.svcx-chapter .drift-float[data-slot="svcx-pipe"]    { --w: clamp(124px, 14.5vw, 198px); right: 5.5%; top: 4.5%; }
.svcx-chapter .drift-float[data-slot="svcx-plunger"] { --w: clamp(108px, 12.5vw, 168px); right: 5%;   top: 5%; }
.svcx-chapter .drift-float[data-slot="svcx-wrench"] svg  { transform: rotate(-12deg); }
.svcx-chapter .drift-float[data-slot="svcx-pipe"] svg    { transform: rotate(6deg); }
.svcx-chapter .drift-float[data-slot="svcx-plunger"] svg { transform: rotate(10deg); }

/* ---------- Service moments (zigzag reveals) ---------- */
.svcx-moments {
  display: flex;
  flex-direction: column;
  gap: clamp(44px, 7vh, 76px);
  margin-top: clamp(44px, 6vh, 68px);
}
.svcx-moment {
  display: flex;
  gap: clamp(22px, 4vw, 48px);
  align-items: center;
  justify-content: space-between;
  width: 100%;
}
.svcx-moment:nth-child(even) {
  margin-left: auto;
  flex-direction: row-reverse;
}
.svcx-moment__body { max-width: 540px; }
/* Real job photography fills the formerly-empty half of each zigzag row. */
.svcx-moment__photo {
  flex: 0 1 clamp(280px, 34vw, 470px);
  margin: 0;
  border-radius: var(--radius-xl);
  overflow: hidden;
  box-shadow: var(--shadow-lg);
}
.svcx-moment__photo img {
  display: block;
  width: 100%;
  height: 100%;
  aspect-ratio: 16 / 9;
  object-fit: cover;
}
@media (max-width: 900px) {
  .svcx-moment { flex-wrap: wrap; }
  .svcx-moment__photo { flex: 1 1 100%; max-width: 560px; }
}
.svcx-moment__tile {
  position: relative;
  flex: none;
  width: 64px;
  height: 64px;
  border-radius: 18px;
  background: var(--grad-navy);
  color: var(--blue-300);
  display: flex;
  align-items: center;
  justify-content: center;
  box-shadow: var(--shadow-md);
}
.svcx-moment__tile svg { width: 30px; height: 30px; }
.svcx-moment__tile::after {
  content: "";
  position: absolute;
  left: 50%;
  bottom: -10px;
  width: 28px;
  height: 4px;
  border-radius: 2px;
  background: var(--grad-wave);
  transform: translateX(-50%);
}
.svcx-moment__body { min-width: 0; }
.svcx-moment__name {
  margin: 0;
  font-size: clamp(24px, 20px + 1.2vw, 30px);
  font-weight: var(--weight-display);
  line-height: 1.12;
}
.svcx-moment__name a {
  color: var(--text-heading);
  text-decoration: none;
  transition: color var(--dur) var(--ease-out);
}
.svcx-moment__name a:hover { color: var(--blue-600); }
.svcx-moment__blurb {
  margin: 7px 0 0;
  font-size: 16.5px;
  line-height: 1.55;
  color: var(--text-muted);
  max-width: 52ch;
}
.svcx-moment__points {
  list-style: none;
  margin: 14px 0 0;
  padding: 0;
  display: flex;
  flex-direction: column;
  gap: 7px;
}
.svcx-moment__points li {
  display: flex;
  gap: 9px;
  font-family: var(--font-body);
  font-size: 15px;
  line-height: 1.45;
  color: var(--text-body);
}
.svcx-moment__points svg {
  flex: none;
  width: 16px;
  height: 16px;
  margin-top: 3px;
  color: var(--blue-600);
}
.svcx-moment__links {
  display: flex;
  flex-wrap: wrap;
  align-items: center;
  gap: 4px 26px;
  margin-top: 8px;
}
.svcx-moment__more,
.svcx-moment__request {
  display: inline-flex;
  align-items: center;
  gap: 6px;
  min-height: var(--tap-target);
  font-family: var(--font-body);
  text-decoration: none;
  transition: color var(--dur) var(--ease-out);
}
.svcx-moment__more {
  font-weight: 700;
  font-size: 15.5px;
  color: var(--blue-600);
}
.svcx-moment__more:hover { color: var(--blue-500); }
.svcx-moment__request {
  font-weight: 600;
  font-size: 15px;
  color: var(--gray-700);
}
.svcx-moment__request:hover { color: var(--blue-600); }
.svcx-moment__more svg,
.svcx-moment__request svg { width: 15px; height: 15px; }
@media (prefers-reduced-motion: no-preference) {
  .svcx-moment__more svg,
  .svcx-moment__request svg { transition: transform var(--dur) var(--ease-out); }
  .svcx-moment__more:hover svg,
  .svcx-moment__request:hover svg { transform: translateX(3px); }
}

/* ---------- Closer band ---------- */
.svcx-closer {
  position: relative;
  overflow: hidden;
  background:
    radial-gradient(ellipse 50% 70% at 50% 20%, rgba(11, 87, 180, .3), transparent 70%),
    repeating-linear-gradient(0deg, rgba(92, 217, 246, .04) 0 1px, transparent 1px 64px),
    repeating-linear-gradient(90deg, rgba(92, 217, 246, .04) 0 1px, transparent 1px 64px),
    var(--grad-navy);
  padding: clamp(56px, 8vh, 88px) 0;
}
.svcx-closer__inner {
  position: relative;
  z-index: 1;
  display: flex;
  flex-wrap: wrap;
  align-items: center;
  justify-content: space-between;
  gap: 24px 32px;
}
.svcx-closer__title {
  margin: 0;
  color: #fff;
  font-size: clamp(26px, 20px + 2vw, 38px);
  font-weight: var(--weight-display);
  letter-spacing: -0.015em;
}
.svcx-closer__title em {
  font-style: normal;
  color: var(--blue-300);
}
.svcx-closer__actions {
  display: flex;
  flex-wrap: wrap;
  align-items: center;
  gap: 16px 26px;
}
.svcx-closer .drift-float[data-slot="svcx-gauge"] { --w: clamp(72px, 8vw, 104px); right: 6%; top: 10%; opacity: .9; }
.svcx-closer .drift-float[data-slot="svcx-gauge"] svg { transform: rotate(-8deg); }

/* ---------- Idle bob personalities for this page's floats ---------- */
@media (prefers-reduced-motion: no-preference) {
  .svcx-hero .drift-float[data-slot="svcx-droplets"] .drift-float__bob { animation-name: hero-bob-b; --bob-dur: 7.5s; --bob-delay: -2.2s; }
  .svcx-hero .drift-float[data-slot="svcx-nut"] .drift-float__bob      { --bob-dur: 8.5s;  --bob-delay: -4.6s; }
  .svcx-chapter .drift-float[data-slot="svcx-wrench"] .drift-float__bob  { --bob-dur: 11s;  --bob-delay: -3.2s; }
  .svcx-chapter .drift-float[data-slot="svcx-pipe"] .drift-float__bob    { animation-name: hero-bob-c; --bob-dur: 12s; --bob-delay: -5.8s; }
  .svcx-chapter .drift-float[data-slot="svcx-plunger"] .drift-float__bob { animation-name: hero-bob-b; --bob-dur: 9s;  --bob-delay: -1.9s; }
  .svcx-closer .drift-float[data-slot="svcx-gauge"] .drift-float__bob    { animation-name: hero-bob-c; --bob-dur: 8s;  --bob-delay: -3.7s; }
}

/* ---------- Responsive ---------- */
@media (max-width: 980px) {
  .svcx-moment { max-width: 620px; }
}
@media (max-width: 720px) {
  .svcx-rail__row { height: 52px; }
  .svcx-rail__link { padding: 0 13px; font-size: 14.5px; }
  .svcx-chapter { scroll-margin-top: 140px; }
  .svcx-chapter__head { max-width: calc(100% - 92px); }
  .svcx-chapter__head::before { left: -6px; }
  .svcx-chapter__wave { max-width: 82%; }
  .svcx-chapter .drift-float[data-slot="svcx-wrench"],
  .svcx-chapter .drift-float[data-slot="svcx-pipe"],
  .svcx-chapter .drift-float[data-slot="svcx-plunger"] { --w: 84px; right: 3.5%; top: 24px; }
  .svcx-hero .drift-float[data-slot="svcx-droplets"] { --w: 52px; left: 4%; top: 12%; }
  .svcx-hero .drift-float[data-slot="svcx-nut"]      { --w: 42px; right: 4%; top: 20%; }
  .svcx-moments { gap: 44px; }
  .svcx-moment { gap: 16px; }
  .svcx-moment:nth-child(even) {
    margin-left: 0;
    flex-direction: row;
  }
  .svcx-moment__tile { width: 52px; height: 52px; border-radius: 15px; }
  .svcx-moment__tile svg { width: 25px; height: 25px; }
  .svcx-closer .drift-float[data-slot="svcx-gauge"] { --w: 60px; right: 4%; top: 8%; }
  .svcx-closer__inner { flex-direction: column; align-items: flex-start; }
}

/* ==========================================================================
   service-page.css — /services/<id>/ detail pages (breadcrumb, main column,
   sticky sidebar). Everything here is scoped under .service-page so it can't
   collide with other pages. Layout grid + card/btn/badge/alert primitives
   are reused from site.css (.service-grid, .card, .btn, .badge, .alert) —
   this file only adds what's specific to the service-detail layout.
   ========================================================================== */

/* ---------- Breadcrumb: horizontal scroll on narrow screens, no chrome ---------- */
.service-page .breadcrumb__row {
  overflow-x: auto;
  white-space: nowrap;
  scrollbar-width: none; /* Firefox */
  -ms-overflow-style: none; /* old Edge/IE */
}
.service-page .breadcrumb__row::-webkit-scrollbar { display: none; }
.service-page .breadcrumb__row svg { flex-shrink: 0; }

/* ---------- Main column ---------- */
.svc-main__points {
  display: flex;
  flex-direction: column;
  gap: var(--space-3);
  margin-top: var(--space-6);
}
.svc-point {
  display: flex;
  gap: 10px;
  align-items: flex-start;
  font-size: 16.5px;
  color: var(--text-body);
  font-family: var(--font-body);
}
.svc-point__icon {
  color: var(--color-success);
  margin-top: 2px;
  flex-shrink: 0;
  display: flex;
}
.svc-point__icon svg { width: 19px; height: 19px; }

/* ---------- Reserved image slot ----------
   NOTE for the later art pass: this is a placeholder panel only. To wire in
   a real photo, replace the inner .img-slot__placeholder <span> with:
     <img src="/img/services/<id>.jpg" alt="…" loading="lazy" decoding="async">
   Keep the .img-slot element itself untouched (radius, aspect-ratio, and
   the blue-50→blue-100 gradient background all live on .img-slot below) —
   an <img> with a normal object-fit: cover will fill the slot exactly as
   the placeholder gradient does today. Slot sizing must not change. */
.img-slot {
  width: 100%;
  aspect-ratio: 16 / 9;
  border-radius: var(--radius-xl);
  background: linear-gradient(135deg, var(--blue-50), var(--blue-100));
  display: flex;
  align-items: center;
  justify-content: center;
  overflow: hidden;
  margin-top: var(--space-8);
}
.img-slot__placeholder {
  font-family: var(--font-body);
  font-size: 14px;
  color: var(--text-muted);
}
.img-slot img {
  width: 100%;
  height: 100%;
  object-fit: cover;
  display: block;
}

.svc-main__alert {
  margin-top: var(--space-6);
}

.svc-main__cta {
  margin-top: var(--space-8);
}

/* ---------- Sidebar ---------- */
.svc-sidebar {
  display: flex;
  flex-direction: column;
  gap: var(--space-4);
}
@media (min-width: 981px) {
  .svc-sidebar {
    position: sticky;
    top: 96px;
  }
}

.svc-emergency__eyebrow {
  font-family: var(--font-body);
  font-weight: 700;
  font-size: 13.5px;
  letter-spacing: var(--tracking-caps);
  text-transform: uppercase;
  color: var(--blue-500);
}
.svc-emergency__phone {
  display: block;
  font-family: var(--font-display);
  font-weight: 800;
  font-size: 30px;
  color: var(--blue-900);
  margin: 10px 0 4px;
  text-decoration: none;
}
.svc-emergency__phone:hover { color: var(--blue-700); }
.svc-emergency__sub {
  margin: 0 0 var(--space-4);
  font-size: 14.5px;
  color: var(--text-muted);
}
.svc-emergency__actions {
  display: flex;
  flex-direction: column;
  gap: 10px;
}
.svc-emergency__badges {
  display: flex;
  flex-wrap: wrap;
  gap: 6px;
  margin-top: var(--space-4);
}

.svc-related__title {
  font-family: var(--font-display);
  font-weight: 700;
  font-size: 17px;
  color: var(--text-heading);
  margin-bottom: var(--space-3);
}
.svc-related__list {
  display: flex;
  flex-direction: column;
  gap: 4px;
}
.svc-related__item {
  display: flex;
  align-items: center;
  gap: 10px;
  padding: 10px 8px;
  min-height: 44px;
  border-radius: 10px;
  font-family: var(--font-body);
  font-size: 15.5px;
  font-weight: 600;
  color: var(--blue-700);
  text-decoration: none;
  transition: background var(--dur) var(--ease-out);
}
.svc-related__item:hover { background: var(--blue-50); color: var(--blue-700); }
.svc-related__item svg:first-child { color: var(--blue-500); width: 17px; height: 17px; flex-shrink: 0; }
.svc-related__item-chevron {
  margin-left: auto;
  display: flex;
  color: var(--gray-400);
  flex-shrink: 0;
}
.svc-related__item-chevron svg { width: 15px; height: 15px; }
.svc-related__see-all {
  display: inline-flex;
  align-items: center;
  gap: 6px;
  color: var(--blue-600);
  font-weight: 700;
  font-size: 14.5px;
  font-family: var(--font-body);
  margin-top: var(--space-4);
  text-decoration: none;
  min-height: 44px;
}
.svc-related__see-all svg { width: 15px; height: 15px; }
.svc-related__see-all:hover { color: var(--blue-500); }

/* ---------- Responsive ----------
   .service-grid already collapses to a single column at <=980px (see
   site.css). On mobile the sidebar simply follows main content in source
   order (it's already second in the DOM), so all that's needed here is to
   cancel the sticky/desktop-only positioning above (scoped to min-width:981px)
   and make sure sidebar cards aren't visually pinned. */
@media (max-width: 980px) {
  .svc-sidebar {
    position: static;
    top: auto;
  }
}

/* ==========================================================================
   request.css — /request-service/ page.
   Reuses .contact-grid, .card, .field/.input/.select/.textarea, .btn,
   .badge, .alert, .phone-pill, .wave-bar, .section--navy from site.css.
   Everything below is page-scoped (prefixed .req-) so it can't leak onto
   or collide with any other page's rules — including hero.css's
   .hero-float[data-slot="…"] placement rules, which this page does not use.
   ========================================================================== */

.req-section {
  position: relative;
  overflow: hidden;
}
.req-section__bg {
  position: absolute;
  inset: 0;
  pointer-events: none;
  background:
    linear-gradient(180deg, rgba(8, 19, 53, .82) 0%, rgba(8, 19, 53, .9) 60%, rgba(6, 15, 44, .97) 100%),
    url("/img/gen/bg-worksite-request.jpg") center 55% / cover no-repeat;
}

.req-grid {
  position: relative;
  z-index: 1;
  align-items: center;
}

/* ---------- Left column copy ---------- */
.req-copy {
  color: #fff;
}
.req-copy__title {
  color: #fff;
  font-size: var(--text-3xl);
  font-weight: 800;
  margin-top: 8px;
}
.req-copy__line {
  color: var(--text-on-dark-muted);
  font-size: var(--text-lg);
  line-height: 1.6;
  margin: 16px 0 0;
  max-width: 46ch;
}

.req-copy__phone {
  margin-top: 26px;
}

.req-copy__reassurance {
  color: var(--text-on-dark-muted);
  font-size: 15px;
  margin: 12px 0 0;
}

.req-copy__badges {
  display: flex;
  flex-wrap: wrap;
  gap: 10px;
  margin-top: 22px;
}

/* ---------- One floating art element (scoped slot, independent of
   hero.css's [data-slot] system — this page never loads hero.css rules
   for it, it defines its own placement here) ---------- */
.req-float {
  position: absolute;
  z-index: 0;
  width: clamp(90px, 11vw, 150px);
  right: 4%;
  top: 8%;
  pointer-events: none;
  opacity: .85;
}
.req-float__bob > * {
  display: block;
  width: 100%;
  height: auto;
  aspect-ratio: 1 / 1;
}
@media (prefers-reduced-motion: no-preference) {
  .req-float__bob {
    animation: req-float-bob 9s ease-in-out -3s infinite alternate;
  }
}
@keyframes req-float-bob {
  from { transform: translate3d(0, -8px, 0) rotate(-1.5deg); }
  to   { transform: translate3d(0, 8px, 0) rotate(1.5deg); }
}
@media (max-width: 980px) {
  .req-float { display: none; }
}

/* ---------- Form card ---------- */
.req-card {
  border: none;
  box-shadow: var(--shadow-lg);
}
.req-form {
  display: flex;
  flex-direction: column;
  gap: 16px;
}
.req-card__noscript {
  margin: 0 0 4px;
}

/* Honeypot — offscreen but still in the tab/DOM flow so bots that fill
   every input still get caught; real users never perceive it. */
.req-honeypot {
  position: absolute;
  left: -9999px;
  top: -9999px;
  width: 1px;
  height: 1px;
  overflow: hidden;
}

/* ---------- Urgency radio-cards ---------- */
.req-urgency {
  display: flex;
  flex-direction: column;
  gap: 10px;
}
.req-urgency__card {
  position: relative;
  display: flex;
  flex-direction: column;
  gap: 2px;
  padding: 14px 16px;
  min-height: var(--tap-target);
  border: 1.5px solid var(--gray-300);
  border-radius: var(--radius-md);
  cursor: pointer;
  transition: border-color var(--dur) var(--ease-out), box-shadow var(--dur) var(--ease-out),
    background var(--dur) var(--ease-out);
  font-family: var(--font-body);
}
.req-urgency__card input {
  position: absolute;
  opacity: 0;
  width: 1px;
  height: 1px;
}
.req-urgency__label {
  font-weight: 700;
  font-size: 16px;
  color: var(--gray-900);
}
.req-urgency__sub {
  font-size: 14px;
  color: var(--text-muted);
}
.req-urgency__card:hover { border-color: var(--gray-400); }
.req-urgency__card input:focus-visible ~ .req-urgency__label {
  outline: none;
}
.req-urgency__card:has(input:focus-visible) {
  box-shadow: var(--ring);
}

/* Selected state: emergency card → red ring/accents */
.req-urgency__card--emergency:has(input:checked) {
  border-color: var(--red-600);
  background: var(--red-50);
  box-shadow: 0 0 0 1.5px var(--red-600);
}
.req-urgency__card--emergency:has(input:checked) .req-urgency__label { color: var(--red-700); }

/* Selected state: scheduled card → blue accents */
.req-urgency__card--scheduled:has(input:checked) {
  border-color: var(--blue-600);
  background: var(--blue-50);
  box-shadow: 0 0 0 1.5px var(--blue-600);
}
.req-urgency__card--scheduled:has(input:checked) .req-urgency__label { color: var(--blue-800); }

/* Fastest-option hint bar — shown only while emergency is selected
   (toggled via [data-urgency="emergency"] on the form, set by JS; the
   template subset can't branch on live form state, so this is CSS-only
   using an attribute the form itself carries and defaults correctly
   server-side since emergency is checked by default). */
.req-urgency__hint {
  display: none;
  margin: 0;
  padding: 10px 14px;
  border-radius: var(--radius-sm);
  background: var(--red-50);
  color: var(--red-700);
  font-size: 14px;
  font-weight: 600;
}
.req-urgency__hint a { color: inherit; text-decoration: underline; }
.req-form[data-urgency="emergency"] .req-urgency__hint { display: block; }
/* [hidden] must always win — author display rules (btn inline-flex, hint block)
   otherwise override the success-state hiding of leftover form controls */
.req-form [hidden] { display: none !important; }

/* ---------- Submit + microcopy ---------- */
.req-submit { margin-top: 4px; }
.req-form__microcopy {
  margin: 0;
  font-size: 13.5px;
  color: var(--text-muted);
  text-align: center;
}

/* ---------- Status region (loading / success / error) ---------- */
.req-status:empty { display: none; }
.req-status-success {
  display: flex;
  flex-direction: column;
  gap: 14px;
}
.req-status-success__icon {
  width: 46px;
  height: 46px;
  border-radius: 99px;
  background: var(--green-50);
  color: var(--green-600);
  display: flex;
  align-items: center;
  justify-content: center;
}
.req-status-success__icon svg { width: 24px; height: 24px; }

@media (max-width: 980px) {
  .req-copy { text-align: left; }
}

/* ==========================================================================
   why-blueline.css — /why-blueline/ page only. Everything below is scoped
   under a section id (#wb-open, #how-it-works, #proof, #reviews, #areas,
   #wb-cta) so it can never leak into other pages. Reuses primitives from
   site.css (.section, .card, .btn, .badge, .phone-pill) and the reveal
   choreography from html.js [data-reveal] — this file only adds what's
   specific to this page's sections.

   Floating-art elements here follow the SAME slot contract as hero.css
   (see the comment block at the top of that file): a .hero-float wrapper
   owns placement + receives hero.js-style motion, an inner .hero-float__bob
   holds the swappable art and gets the idle bob keyframes. Depth/rotation
   are read from data-depth/data-rot by hero.js today only inside #hero, so
   floats on this page get their OWN lightweight CSS-only idle bob (no JS
   scroll-drift dependency) — see "Floating art" below.
   ========================================================================== */

/* --------------------------------------------------------------------------
   1. OPENING BAND — compact navy intro, NOT full viewport.
   -------------------------------------------------------------------------- */
#wb-open {
  position: relative;
  overflow: hidden;
  background: var(--grad-navy);
  padding: clamp(64px, 10vh, 108px) 0 clamp(56px, 9vh, 92px);
}
.wb-open__bg {
  position: absolute;
  inset: 0;
  z-index: 0;
  pointer-events: none;
  background:
    linear-gradient(180deg, rgba(8, 19, 53, .6) 0%, rgba(8, 19, 53, .85) 70%, rgba(6, 15, 44, .96) 100%),
    url("/img/gen/bg-worksite-why.jpg") center 62% / cover no-repeat;
}
.wb-open__glow {
  position: absolute;
  inset: 0;
  z-index: 0;
  pointer-events: none;
  background: radial-gradient(ellipse 60% 70% at 50% 20%, rgba(11, 87, 180, .32), transparent 70%);
}
.wb-open__inner {
  position: relative;
  z-index: 2;
  max-width: 700px;
  margin: 0 auto;
  text-align: center;
}
.wb-open__eyebrow {
  display: inline-flex;
  align-items: center;
  gap: 8px;
  margin: 0 0 16px;
  padding: 8px 16px;
  border-radius: var(--radius-pill);
  border: 1px solid rgba(255, 255, 255, .14);
  background: rgba(255, 255, 255, .06);
  font-family: var(--font-body);
  font-weight: 700;
  font-size: 13px;
  letter-spacing: var(--tracking-caps);
  text-transform: uppercase;
  color: var(--blue-300);
}
.wb-open__title {
  color: #fff;
  font-size: clamp(32px, 24px + 2.6vw, 50px);
  font-weight: var(--weight-display);
  line-height: 1.08;
  letter-spacing: -0.02em;
  margin: 0 0 14px;
  text-wrap: balance;
}
.wb-open__sub {
  color: var(--text-on-dark-muted);
  font-size: clamp(16px, 15px + .3vw, 18px);
  line-height: 1.6;
  max-width: 46ch;
  margin: 0 auto;
}

/* Floating art — reuses the .hero-float / .hero-float__bob slot contract.
   Only two slots on this compact band, positioned in the side margins so
   they never collide with the centered copy column. */
#wb-open .hero-float { position: absolute; z-index: 1; width: var(--w, 90px); pointer-events: none; }
#wb-open .hero-float__bob > * { display: block; width: 100%; height: auto; aspect-ratio: 1 / 1; }
#wb-open .hero-float[data-slot="droplets"] { --w: clamp(58px, 6vw, 84px); left: 8%; top: 18%; opacity: .85; }
#wb-open .hero-float[data-slot="gauge"]    { --w: clamp(54px, 5.6vw, 78px); right: 9%; top: 58%; opacity: .78; }

/* --------------------------------------------------------------------------
   2. THE DISPATCH TIMELINE (#how-it-works) — centerpiece scroll journey.
   A wave-gradient connective line down the center draws itself via
   stroke-dashoffset scrubbed by --progress (set on [data-scrub-section] by
   scroll.js). Steps alternate left/right of the line on desktop; single
   column, line moves to the left edge, on mobile.
   -------------------------------------------------------------------------- */
#how-it-works {
  position: relative;
  background: var(--surface-page);
  overflow: hidden;
}
/* Ambient atmosphere so the white background isn't flat */
.dispatch__atmosphere {
  position: absolute;
  inset: 0;
  z-index: 0;
  pointer-events: none;
  background:
    radial-gradient(ellipse 46% 30% at 14% 12%, var(--blue-50), transparent 70%),
    radial-gradient(ellipse 40% 34% at 88% 86%, var(--blue-50), transparent 72%);
}

.dispatch {
  position: relative;
  z-index: 1;
  max-width: 760px;
  margin: clamp(40px, 6vh, 64px) auto 0;
}

/* The scrubbed connective line — an SVG spanning the full track height,
   centered; stroke-dashoffset is driven by --progress via inline style
   set from why-blueline.js (offset = length * (1 - progress)). */
.dispatch__line {
  position: absolute;
  left: 50%;
  top: 0;
  bottom: 0;
  width: 6px;
  transform: translateX(-50%);
  z-index: 0;
  pointer-events: none;
}
.dispatch__line svg { width: 100%; height: 100%; display: block; }
.dispatch__line-track { stroke: var(--gray-200); stroke-width: 3; fill: none; }
.dispatch__line-fill {
  stroke: url(#wb-dispatch-grad);
  stroke-width: 3;
  fill: none;
  stroke-linecap: round;
}

.dispatch__steps {
  position: relative;
  z-index: 1;
  display: flex;
  flex-direction: column;
  gap: clamp(48px, 8vh, 88px);
}

.dispatch__step {
  position: relative;
  display: grid;
  grid-template-columns: 1fr 1fr;
  gap: 0 40px;
  align-items: center;
}
/* Alternate sides: odd steps' card sits left of the line, even steps right.
   Achieved by placing the card in column 1 or 2 and leaving the other empty. */
.dispatch__step[data-side="left"] .dispatch__card { grid-column: 1; text-align: right; }
.dispatch__step[data-side="right"] .dispatch__card { grid-column: 2; text-align: left; }

.dispatch__marker {
  position: absolute;
  left: 50%;
  top: 50%;
  transform: translate(-50%, -50%);
  z-index: 2;
  width: 56px;
  height: 56px;
  border-radius: 50%;
  background: var(--blue-900);
  color: #fff;
  display: flex;
  align-items: center;
  justify-content: center;
  box-shadow: var(--shadow-md), 0 0 0 6px var(--surface-page);
  flex-shrink: 0;
}
.dispatch__marker svg { width: 24px; height: 24px; }
.dispatch__marker-n {
  position: absolute;
  bottom: -6px;
  right: -6px;
  width: 22px;
  height: 22px;
  border-radius: 50%;
  background: var(--blue-500);
  color: #fff;
  font-family: var(--font-display);
  font-weight: 800;
  font-size: 12px;
  display: flex;
  align-items: center;
  justify-content: center;
  box-shadow: 0 0 0 3px var(--surface-page);
}

.dispatch__card {
  max-width: 320px;
}
.dispatch__step[data-side="left"] .dispatch__card { margin-left: auto; margin-right: 44px; }
.dispatch__step[data-side="right"] .dispatch__card { margin-right: auto; margin-left: 44px; }

.dispatch__title {
  font-family: var(--font-display);
  font-weight: 800;
  font-size: clamp(19px, 17px + .6vw, 22px);
  color: var(--text-heading);
  margin: 0 0 6px;
}
.dispatch__desc {
  font-family: var(--font-body);
  font-size: 15.5px;
  line-height: 1.55;
  color: var(--text-muted);
  margin: 0;
}

/* --------------------------------------------------------------------------
   3. PROOF STRIP (#proof) — count-up stats + credential chips.
   -------------------------------------------------------------------------- */
#proof {
  position: relative;
  background: var(--grad-navy);
  overflow: hidden;
  padding: clamp(56px, 8vh, 88px) 0;
}
.proof__glow {
  position: absolute;
  inset: 0;
  z-index: 0;
  pointer-events: none;
  background: radial-gradient(ellipse 70% 60% at 50% 0%, rgba(11, 87, 180, .30), transparent 72%);
}
.proof__inner {
  position: relative;
  z-index: 1;
}

.proof__grid {
  display: grid;
  grid-template-columns: repeat(4, 1fr);
  gap: 20px;
  text-align: center;
}
.proof__stat-value {
  font-family: var(--font-display);
  font-weight: var(--weight-display);
  font-size: clamp(32px, 26px + 2vw, 46px);
  color: #fff;
  line-height: 1.05;
  letter-spacing: -0.01em;
}
.proof__stat-label {
  font-family: var(--font-body);
  font-weight: 600;
  font-size: 14px;
  color: var(--text-on-dark-muted);
  margin-top: 6px;
}

.proof__chips {
  display: flex;
  flex-wrap: wrap;
  justify-content: center;
  gap: 10px;
  margin-top: clamp(36px, 6vh, 52px);
  padding-top: clamp(28px, 5vh, 40px);
  border-top: 1px solid var(--border-on-dark);
}

/* --------------------------------------------------------------------------
   4. REVIEWS (#reviews) — one pull-quote moment + two staggered cards.
   -------------------------------------------------------------------------- */
#reviews {
  position: relative;
  background: var(--surface-page);
  overflow: hidden;
}
.reviews__atmosphere {
  position: absolute;
  inset: 0;
  z-index: 0;
  pointer-events: none;
  background: radial-gradient(ellipse 50% 40% at 90% 8%, var(--blue-50), transparent 70%);
}
.reviews__inner { position: relative; z-index: 1; }

.reviews__layout {
  display: grid;
  grid-template-columns: 1.15fr .85fr;
  gap: 40px;
  align-items: stretch;
  margin-top: clamp(28px, 4vh, 40px);
}

/* Pull-quote moment */
.reviews__feature {
  position: relative;
  background: var(--surface-tint);
  border-radius: var(--radius-xl);
  padding: clamp(32px, 4vw, 48px);
  display: flex;
  flex-direction: column;
  justify-content: center;
}
.reviews__feature-stars {
  display: flex;
  gap: 3px;
  color: #FFB400;
  margin-bottom: 18px;
}
.reviews__feature-stars svg { width: 20px; height: 20px; fill: currentColor; }
.reviews__feature-quote {
  font-family: var(--font-display);
  font-weight: 700;
  font-size: clamp(22px, 18px + 1.4vw, 30px);
  line-height: 1.32;
  letter-spacing: -0.01em;
  color: var(--text-heading);
  margin: 0 0 22px;
}
.reviews__feature-attrib {
  font-family: var(--font-body);
  font-weight: 700;
  font-size: 15.5px;
  color: var(--gray-900);
}
.reviews__feature-attrib span {
  font-weight: 400;
  color: var(--text-muted);
}

/* Staggered secondary cards */
.reviews__cards {
  display: flex;
  flex-direction: column;
  gap: 16px;
}
.reviews__cards .card:nth-child(2) { margin-left: clamp(0px, 4vw, 28px); }
.reviews__card-stars {
  display: flex;
  gap: 3px;
  color: #FFB400;
  margin-bottom: 12px;
}
.reviews__card-stars svg { width: 15px; height: 15px; fill: currentColor; }
.reviews__card-text {
  font-size: 15px;
  line-height: 1.55;
  color: var(--text-body);
  margin: 0 0 14px;
}
.reviews__card-attrib {
  font-family: var(--font-body);
  font-weight: 700;
  font-size: 14.5px;
  color: var(--gray-900);
}
.reviews__card-attrib span {
  font-weight: 400;
  color: var(--text-muted);
}

/* --------------------------------------------------------------------------
   5. SERVICE AREA (#areas) — map-pin badge chips + floating water element.
   -------------------------------------------------------------------------- */
#areas {
  position: relative;
  background: var(--surface-tint);
  overflow: hidden;
}
#areas .hero-float { position: absolute; z-index: 0; width: var(--w, 110px); pointer-events: none; opacity: .5; }
#areas .hero-float__bob > * { display: block; width: 100%; height: auto; aspect-ratio: 1 / 1; }
#areas .hero-float[data-slot="droplets"] { --w: clamp(70px, 7vw, 100px); right: 6%; top: 10%; }

.areas__inner { position: relative; z-index: 1; }
.areas__chips {
  display: flex;
  flex-wrap: wrap;
  gap: 10px;
}

/* --------------------------------------------------------------------------
   6. CLOSING CTA (#wb-cta) — compact navy band.
   -------------------------------------------------------------------------- */
#wb-cta {
  background: var(--grad-navy);
  padding: clamp(48px, 7vh, 72px) 0;
}
.wb-cta__row {
  display: flex;
  align-items: center;
  justify-content: space-between;
  flex-wrap: wrap;
  gap: 20px;
}
.wb-cta__line {
  font-family: var(--font-display);
  font-weight: 800;
  font-size: clamp(20px, 17px + 1vw, 27px);
  color: #fff;
  line-height: 1.2;
  max-width: 30ch;
  margin: 0;
}
.wb-cta__actions {
  display: flex;
  align-items: center;
  gap: 18px;
  flex-wrap: wrap;
}
.wb-cta__actions .phone-pill { font-size: 26px; }
.wb-cta__actions .phone-pill__icon { width: 44px; height: 44px; }
.wb-cta__actions .phone-pill__icon svg { width: 20px; height: 20px; }

/* ==========================================================================
   Motion — declared only under no-preference; reduced-motion gets the
   fully static, already-revealed composition for free (see [data-reveal]
   base rules in site.css and the count-up script's own RM branch).
   ========================================================================== */
@media (prefers-reduced-motion: no-preference) {
  /* Opening band entrance stagger — CSS only, fast, matches hero's rhythm */
  .wb-open__inner > * { animation: wb-rise 420ms var(--ease-out) both; }
  .wb-open__inner > :nth-child(2) { animation-delay: 70ms; }
  .wb-open__inner > :nth-child(3) { animation-delay: 140ms; }
  #wb-open .hero-float { animation: wb-fade 480ms ease-out both; animation-delay: 200ms; will-change: transform; }

  /* Idle float bob — same idea as hero-float, self-contained keyframes */
  .hero-float__bob { animation: wb-bob 8.5s ease-in-out infinite alternate; }
  #wb-open .hero-float[data-slot="gauge"] .hero-float__bob { animation-duration: 10.5s; animation-delay: -3.2s; }
  #areas .hero-float[data-slot="droplets"] .hero-float__bob { animation-duration: 9.5s; animation-delay: -1.6s; }

  /* Dispatch marker: small pop as its step reveals */
  .dispatch__marker { transition: transform 420ms var(--ease-out); }
  [data-reveal] .dispatch__marker { transform: translate(-50%, -50%) scale(.7); }
  [data-reveal].is-revealed .dispatch__marker { transform: translate(-50%, -50%) scale(1); }
}

@keyframes wb-rise {
  from { opacity: 0; transform: translateY(14px); }
  to { opacity: 1; transform: none; }
}
@keyframes wb-fade {
  from { opacity: 0; }
}
@keyframes wb-bob {
  from { transform: translate3d(0, -7px, 0) rotate(-1.4deg); }
  to { transform: translate3d(0, 7px, 0) rotate(1.2deg); }
}

/* ==========================================================================
   Responsive — timeline collapses to single column, line to the left edge.
   ========================================================================== */
@media (max-width: 900px) {
  .proof__grid { grid-template-columns: repeat(2, 1fr); gap: 28px 20px; }
  .reviews__layout { grid-template-columns: 1fr; }
  .reviews__cards .card:nth-child(2) { margin-left: 0; }
}

@media (max-width: 720px) {
  #wb-open .hero-float { display: none; }

  .dispatch__line { left: 20px; transform: none; }
  .dispatch__step { grid-template-columns: 1fr; padding-left: 52px; }
  .dispatch__step[data-side="left"] .dispatch__card,
  .dispatch__step[data-side="right"] .dispatch__card {
    grid-column: 1;
    text-align: left;
    margin: 0;
    max-width: none;
  }
  .dispatch__marker { left: 20px; transform: translate(-50%, -50%); width: 44px; height: 44px; }
  .dispatch__marker svg { width: 19px; height: 19px; }
  [data-reveal] .dispatch__marker,
  [data-reveal].is-revealed .dispatch__marker { transform: translate(-50%, -50%); }

  #areas .hero-float { display: none; }

  .wb-cta__row { flex-direction: column; align-items: stretch; text-align: center; }
  .wb-cta__actions { justify-content: center; }
}

@media (max-width: 560px) {
  .proof__grid { grid-template-columns: repeat(2, 1fr); }
}


/* ---------- Reset extras not covered by tokens/base.css ---------- */
*, *::before, *::after { box-sizing: border-box; }
img, svg { max-width: 100%; display: block; }
button { font: inherit; }

html.js [data-reveal],
html.js [data-reveal-stagger] > * {
  opacity: 0;
  transform: translateY(20px);
}
html.js [data-reveal].is-revealed,
html.js [data-reveal-stagger] > *.is-revealed {
  opacity: 1;
  transform: none;
  transition: opacity 600ms var(--ease-out), transform 600ms var(--ease-out);
  transition-delay: calc(var(--stagger-i, 0) * 70ms);
}

/* ---------- Layout ---------- */
.container {
  max-width: var(--container);
  margin: 0 auto;
  padding: 0 var(--gutter);
  width: 100%;
  box-sizing: border-box;
}
@media (min-width: 900px) {
  .container { padding: 0 var(--gutter-desktop); }
}

.wave-bar {
  height: 4px;
  background: var(--grad-wave);
}
.wave-bar--top { width: 100%; }
.wave-bar--underline {
  width: 64px;
  height: 4px;
  border-radius: 2px;
  margin-top: 14px;
}

.desktop-nav { display: flex; }
/* scoped: must outrank the later .icon-btn { display: inline-flex } base rule */
.site-header .mobile-menu-btn { display: none; }

body {
  min-height: 100vh;
  display: flex;
  flex-direction: column;
}
#main { flex: 1 0 auto; }

/* ==========================================================================
   Chrome — Top bar
   ========================================================================== */
.topbar {
  background: var(--blue-900);
  color: #fff;
}
.topbar__row {
  display: flex;
  align-items: center;
  justify-content: space-between;
  height: 40px;
  font-size: 14px;
  font-family: var(--font-body);
  gap: 12px;
}
.topbar__status {
  display: flex;
  align-items: center;
  gap: 8px;
  font-weight: 600;
  letter-spacing: 0.02em;
  white-space: nowrap;
  /* no overflow/ellipsis here — a flex row can't ellipsis anyway, and it
     was clipping the pulse-dot's box-shadow ring on every pulse */
}
.pulse-dot {
  width: 8px;
  height: 8px;
  border-radius: 99px;
  background: #3DDC84;
  box-shadow: 0 0 0 3px rgba(61, 220, 132, .25);
  flex-shrink: 0;
  animation: pulse-dot 2s var(--ease-out) infinite;
}
@keyframes pulse-dot {
  0%, 100% { box-shadow: 0 0 0 3px rgba(61, 220, 132, .25); }
  50% { box-shadow: 0 0 0 6px rgba(61, 220, 132, .12); }
}
@media (prefers-reduced-motion: reduce) {
  .pulse-dot { animation: none; }
}
.topbar__trust {
  gap: 18px;
  color: var(--text-on-dark-muted);
  align-items: center;
}
.topbar__trust-item {
  display: inline-flex;
  align-items: center;
  gap: 6px;
  white-space: nowrap;
}
.topbar__trust-item svg { width: 15px; height: 15px; }
.topbar__trust-item--star svg { color: #FFC531; fill: currentColor; }

/* ==========================================================================
   Chrome — Header
   ========================================================================== */
.site-header {
  position: sticky;
  top: 0;
  z-index: 40;
  background: #fff;
  border-bottom: 1px solid var(--gray-200);
  transition: box-shadow var(--dur) var(--ease-out);
}
.site-header.is-scrolled {
  box-shadow: var(--shadow-sm);
}
.site-header__row {
  display: flex;
  align-items: center;
  justify-content: space-between;
  height: 76px;
  gap: 16px;
}
.site-header__brand {
  display: flex;
  align-items: center;
  gap: 12px;
  text-decoration: none;
  min-width: 0;
}
.site-header__mark { height: 46px; width: auto; }
.site-header__lockup {
  font-family: var(--font-display);
  font-weight: 800;
  font-size: 22px;
  letter-spacing: 0.01em;
  color: var(--blue-900);
  line-height: 1;
  white-space: nowrap;
}
.site-header__lockup-sub {
  display: block;
  font-family: var(--font-body);
  font-weight: 700;
  font-size: 9.5px;
  letter-spacing: 0.14em;
  color: var(--gray-500);
  margin-top: 3px;
}
.site-header__nav {
  gap: 26px;
  align-items: center;
}
.site-header__nav a {
  font-family: var(--font-body);
  font-weight: 600;
  font-size: 16px;
  color: var(--gray-900);
  padding: 8px 2px;
  text-decoration: none;
}
.site-header__nav a:hover { color: var(--blue-600); }
.site-header__actions {
  display: flex;
  align-items: center;
  gap: 10px;
}
.site-header__phone {
  flex-direction: column;
  align-items: flex-end;
  line-height: 1;
}
.site-header__phone-label {
  font-size: 12.5px;
  font-weight: 700;
  letter-spacing: 0.08em;
  color: var(--text-muted);
  text-transform: uppercase;
}
.site-header__phone-number {
  font-family: var(--font-display);
  font-weight: 800;
  font-size: 21px;
  color: var(--blue-900);
  margin-top: 4px;
  text-decoration: none;
}
.site-header__phone-number:hover { color: var(--blue-600); }

.icon-btn__close { display: none; }
.mobile-menu-btn[aria-expanded="true"] .icon-btn__open { display: none; }
.mobile-menu-btn[aria-expanded="true"] .icon-btn__close { display: inline-flex; }

.mobile-menu {
  border-top: 1px solid var(--gray-200);
  background: #fff;
  padding: 8px 0;
}
.mobile-menu[hidden] { display: none; }
.mobile-menu__list {
  display: flex;
  flex-direction: column;
}
.mobile-menu__list a {
  font-family: var(--font-body);
  font-weight: 600;
  font-size: 16px;
  color: var(--gray-900);
  text-decoration: none;
  text-align: left;
  padding: 14px 2px;
  min-height: 44px;
  display: flex;
  align-items: center;
  border-bottom: 1px solid var(--gray-100);
}

/* ==========================================================================
   Chrome — Footer
   ========================================================================== */
.site-footer {
  background: var(--grad-navy);
  color: #fff;
  margin-top: auto;
}
.site-footer__inner { padding: 56px var(--gutter); }
@media (min-width: 900px) {
  .site-footer__inner { padding-left: var(--gutter-desktop); padding-right: var(--gutter-desktop); }
}
.footer-grid {
  display: grid;
  grid-template-columns: 1.4fr 1fr 1fr 1fr;
  gap: 32px;
}
.footer-col {
  font-family: var(--font-body);
  display: flex;
  flex-direction: column;
  gap: 10px;
}
.footer-col__head {
  font-family: var(--font-body);
  font-weight: 700;
  font-size: 13.5px;
  letter-spacing: var(--tracking-caps);
  text-transform: uppercase;
  color: var(--blue-300);
  margin-bottom: 4px;
}
.footer-col__head--spaced { margin-top: 12px; }
.footer-col__link {
  color: var(--text-on-dark-muted);
  font-size: 15px;
  text-decoration: none;
  min-height: 24px;
}
.footer-col__link:hover { color: #fff; }
.footer-col__text {
  color: var(--text-on-dark-muted);
  font-size: 15px;
}
.site-footer__brand {
  display: flex;
  align-items: center;
  gap: 12px;
}
.site-footer__lockup {
  font-family: var(--font-display);
  font-weight: 800;
  font-size: 20px;
  letter-spacing: 0.01em;
  color: #fff;
}
.site-footer__lockup-sub {
  display: block;
  font-family: var(--font-body);
  font-weight: 700;
  font-size: 9px;
  letter-spacing: 0.14em;
  color: var(--text-on-dark-muted);
  margin-top: 3px;
}
.site-footer__blurb {
  color: var(--text-on-dark-muted);
  font-size: 15px;
  line-height: 1.6;
  margin-top: 16px;
  max-width: 300px;
}
.site-footer__phone {
  display: inline-flex;
  align-items: center;
  gap: 10px;
  margin-top: 16px;
  font-family: var(--font-display);
  font-weight: 800;
  font-size: 24px;
  color: #fff;
  text-decoration: none;
}
.site-footer__phone svg { color: var(--blue-300); width: 20px; height: 20px; }
.site-footer__bottom {
  border-top: 1px solid var(--border-on-dark);
  margin-top: 40px;
  padding-top: 20px;
  display: flex;
  justify-content: space-between;
  flex-wrap: wrap;
  gap: 8px;
  font-size: 13.5px;
  color: var(--text-on-dark-muted);
}

/* ==========================================================================
   Chrome — Mobile sticky call bar
   ========================================================================== */
.sticky-call {
  display: none;
  position: fixed;
  left: 0;
  right: 0;
  bottom: 0;
  z-index: 50;
  background: rgba(255, 255, 255, .92);
  backdrop-filter: blur(10px);
  -webkit-backdrop-filter: blur(10px);
  border-top: 1px solid var(--gray-200);
  padding: 10px var(--gutter) calc(10px + env(safe-area-inset-bottom));
  gap: 10px;
  box-shadow: var(--shadow-lg);
  transform: translateY(100%);
  transition: transform var(--dur) var(--ease-out);
}
@media (max-width: 767px) {
  .sticky-call { display: flex; }
  body { padding-bottom: 84px; }
}
.sticky-call.is-visible { transform: translateY(0); }
.sticky-call__call { flex: 1.4; }
.sticky-call__request { flex: 1; }

/* ==========================================================================
   Section / SectionHead
   ========================================================================== */
.section {
  padding: var(--section-pad) 0;
}
@media (min-width: 900px) {
  .section { padding: 96px 0; }
}
.section--tint { background: var(--surface-tint); }
.section--navy { background: var(--grad-navy); }

.section-head {
  max-width: 620px;
  margin-bottom: 36px;
}
.section-head--center {
  margin-left: auto;
  margin-right: auto;
  text-align: center;
}
.section-head--center .wave-bar--underline { margin-left: auto; margin-right: auto; }
.section-head__eyebrow {
  font-family: var(--font-body);
  font-weight: 700;
  font-size: 14px;
  letter-spacing: var(--tracking-caps);
  text-transform: uppercase;
  color: var(--blue-500);
}
.section-head--on-dark .section-head__eyebrow { color: var(--blue-300); }
.section-head__title {
  font-size: var(--text-3xl);
  font-weight: 800;
  color: var(--text-heading);
  margin-top: 8px;
}
.section-head--on-dark .section-head__title { color: #fff; }
.section-head__sub {
  font-size: var(--text-lg);
  color: var(--text-muted);
  margin-top: 14px;
  margin-bottom: 0;
}
.section-head--on-dark .section-head__sub { color: var(--text-on-dark-muted); }

/* ==========================================================================
   Components — Button
   ========================================================================== */
.btn {
  display: inline-flex;
  align-items: center;
  justify-content: center;
  gap: 8px;
  font-family: var(--font-display);
  font-weight: 700;
  border: 1.5px solid transparent;
  cursor: pointer;
  border-radius: var(--radius-md);
  transition: background var(--dur) var(--ease-out), border-color var(--dur) var(--ease-out),
    box-shadow var(--dur) var(--ease-out), color var(--dur) var(--ease-out),
    transform var(--dur-fast) var(--ease-out), filter var(--dur) var(--ease-out);
  text-decoration: none;
  white-space: nowrap;
  line-height: 1;
  min-height: var(--tap-target);
}
.btn:active { transform: translateY(1px); }
.btn[disabled], .btn--disabled { opacity: .5; pointer-events: none; }
.btn svg { width: 18px; height: 18px; }

.btn--sm { height: 40px; padding: 0 16px; font-size: 15px; }
.btn--md { height: 48px; padding: 0 22px; font-size: 16px; }
.btn--lg { height: 56px; padding: 0 28px; font-size: 18px; }
.btn--lg svg { width: 20px; height: 20px; }
.btn--sm svg { width: 16px; height: 16px; }

.btn--pill { border-radius: var(--radius-pill); }
.btn--full { width: 100%; }

.btn--primary { background: var(--grad-cta); color: #fff; box-shadow: var(--shadow-cta); }
/* Explicit darker gradient, not filter:brightness() — filter promotes the
   button to its own GPU compositing layer, and on repaint some browsers
   (WebKit especially) fail to paint the bold webfont text on that layer for
   a frame or two, reading as the phone number "disappearing" on hover. Every
   Call-now button site-wide is .btn--primary, so the bug showed up on all
   of them. A plain background swap never touches compositing. */
.btn--primary:hover { background: linear-gradient(180deg, #159adf, #0674b8); box-shadow: 0 6px 18px -2px rgba(8, 149, 228, .5); }

.btn--navy { background: var(--blue-900); color: #fff; }
.btn--navy:hover { background: var(--blue-800); }

.btn--emergency { background: var(--red-600); color: #fff; box-shadow: var(--shadow-emergency); }
.btn--emergency:hover { background: var(--red-700); }

.btn--outline { background: #fff; color: var(--blue-700); border-color: var(--gray-300); }
.btn--outline:hover { border-color: var(--blue-500); color: var(--blue-600); background: var(--blue-50); }

.btn--ghost { background: transparent; color: var(--blue-600); }
.btn--ghost:hover { background: var(--blue-50); }

.btn--inverse { background: rgba(255, 255, 255, .10); color: #fff; border-color: rgba(255, 255, 255, .28); }
.btn--inverse:hover { background: rgba(255, 255, 255, .18); }

/* ---------- Icon button ---------- */
.icon-btn {
  display: inline-flex;
  align-items: center;
  justify-content: center;
  border: 1.5px solid transparent;
  cursor: pointer;
  border-radius: var(--radius-md);
  transition: background var(--dur) var(--ease-out), border-color var(--dur) var(--ease-out),
    color var(--dur) var(--ease-out), transform var(--dur-fast) var(--ease-out);
  background: transparent;
  width: 44px;
  height: 44px;
}
.icon-btn:active { transform: translateY(1px); }
.icon-btn svg { width: 20px; height: 20px; }
.icon-btn--ghost { color: var(--blue-900); }
.icon-btn--ghost:hover { background: var(--blue-50); color: var(--blue-600); }
.icon-btn--outline { color: var(--blue-700); border-color: var(--gray-300); background: #fff; }
.icon-btn--outline:hover { border-color: var(--blue-500); color: var(--blue-600); }
.icon-btn--navy { color: #fff; background: var(--blue-900); }
.icon-btn--navy:hover { background: var(--blue-800); }
.icon-btn--inverse { color: #fff; }
.icon-btn--inverse:hover { background: rgba(255, 255, 255, .14); }

/* ==========================================================================
   Components — Badge
   ========================================================================== */
.badge {
  display: inline-flex;
  align-items: center;
  gap: 6px;
  font-family: var(--font-body);
  font-weight: 600;
  border-radius: var(--radius-pill);
  border: 1px solid transparent;
  line-height: 1;
  white-space: nowrap;
}
.badge svg { width: 15px; height: 15px; }
.badge--md { font-size: 14px; height: 30px; padding: 0 12px; }
.badge--sm { font-size: 13px; height: 24px; padding: 0 10px; }
.badge--sm svg { width: 13px; height: 13px; }
.badge--trust { background: var(--blue-50); color: var(--blue-800); border-color: var(--blue-100); }
.badge--success { background: var(--green-50); color: var(--green-700); border-color: rgba(23, 122, 70, .18); }
.badge--emergency { background: var(--red-50); color: var(--red-700); border-color: rgba(196, 57, 43, .2); }
.badge--neutral { background: var(--gray-100); color: var(--gray-700); border-color: var(--gray-200); }
.badge--on-dark { background: rgba(255, 255, 255, .10); color: #fff; border-color: rgba(255, 255, 255, .18); }

/* ==========================================================================
   Components — Card
   ========================================================================== */
.card {
  background: var(--surface-card);
  border: 1px solid var(--border-default);
  border-radius: var(--radius-lg);
  box-shadow: var(--shadow-sm);
  display: block;
  color: inherit;
  text-decoration: none;
}
.card--pad-md { padding: var(--space-5); }
.card--pad-lg { padding: var(--space-8); }
.card--interactive {
  transition: box-shadow var(--dur) var(--ease-out), transform var(--dur) var(--ease-out),
    border-color var(--dur) var(--ease-out);
  cursor: pointer;
}
.card--interactive:hover { box-shadow: var(--shadow-md); transform: translateY(-2px); border-color: var(--blue-100); }
.card--accent { position: relative; overflow: hidden; }
.card--accent::before {
  content: "";
  position: absolute;
  top: 0; left: 0; right: 0;
  height: 4px;
  background: var(--grad-wave);
}

/* ==========================================================================
   Components — Forms
   ========================================================================== */
.field {
  display: flex;
  flex-direction: column;
  gap: 6px;
  font-family: var(--font-body);
}
.field__label { font-size: 15px; font-weight: 600; color: var(--gray-900); }
.field__req { color: var(--red-600); }
.field__hint { font-size: 14px; color: var(--text-muted); }
.field__error { font-size: 14px; font-weight: 600; color: var(--red-600); }

.input-wrap, .select-wrap { position: relative; display: flex; align-items: center; }
.input, .select, .textarea {
  width: 100%;
  box-sizing: border-box;
  font-family: var(--font-body);
  font-size: 17px;
  color: var(--gray-900);
  background: #fff;
  border: 1.5px solid var(--gray-300);
  border-radius: var(--radius-sm);
  transition: border-color var(--dur) var(--ease-out), box-shadow var(--dur) var(--ease-out);
  outline: none;
}
.input, .select { height: 48px; padding: 0 14px; }
.textarea { min-height: 120px; padding: 12px 14px; line-height: 1.5; resize: vertical; }
.input::placeholder, .textarea::placeholder { color: var(--gray-400); }
.input:hover, .select:hover, .textarea:hover { border-color: var(--gray-400); }
.input:focus, .select:focus, .textarea:focus { border-color: var(--blue-500); box-shadow: var(--ring); }
.input--error, .select--error, .textarea--error { border-color: var(--red-600); }
.input--error:focus { border-color: var(--red-600); box-shadow: 0 0 0 3px rgba(196, 57, 43, .2); }
.input--lg { height: 54px; }
.input--with-icon { padding-left: 42px; }
.input-wrap .input-icon {
  position: absolute; left: 13px; color: var(--gray-400); pointer-events: none;
  display: flex;
}
.input-wrap .input-icon svg { width: 18px; height: 18px; }
.input:focus + .input-icon, .input-wrap:focus-within .input-icon { color: var(--blue-500); }

.select { padding-right: 40px; appearance: none; cursor: pointer; }
.select--placeholder { color: var(--gray-400); }
.select-chev {
  position: absolute; right: 12px; color: var(--gray-500); pointer-events: none;
  display: flex;
}
.select-chev svg { width: 18px; height: 18px; }

.radio-row, .checkbox-row {
  display: flex;
  flex-direction: column;
  gap: 8px;
}
.radio, .checkbox {
  display: inline-flex;
  align-items: center;
  gap: 10px;
  cursor: pointer;
  font-family: var(--font-body);
  font-size: 16px;
  color: var(--gray-900);
  min-height: var(--tap-target);
  user-select: none;
}
.radio input, .checkbox input { position: absolute; opacity: 0; width: 1px; height: 1px; }
.radio__dot {
  width: 22px; height: 22px; box-sizing: border-box;
  border: 1.5px solid var(--gray-300); border-radius: 50%;
  background: #fff; display: inline-flex; align-items: center; justify-content: center;
  transition: border-color var(--dur-fast) var(--ease-out); flex-shrink: 0;
}
.radio:hover .radio__dot { border-color: var(--blue-500); }
.radio input:checked + .radio__dot { border-color: var(--blue-600); border-width: 2px; }
.radio input:focus-visible + .radio__dot { box-shadow: var(--ring); }
.radio__inner {
  width: 11px; height: 11px; border-radius: 50%; background: var(--blue-600);
  transform: scale(0); transition: transform var(--dur-fast) var(--ease-out);
}
.radio input:checked + .radio__dot .radio__inner { transform: scale(1); }

.checkbox__box {
  width: 22px; height: 22px; box-sizing: border-box;
  border: 1.5px solid var(--gray-300); border-radius: 6px;
  background: #fff; display: inline-flex; align-items: center; justify-content: center;
  color: #fff; transition: background var(--dur-fast) var(--ease-out), border-color var(--dur-fast) var(--ease-out);
  flex-shrink: 0;
}
.checkbox:hover .checkbox__box { border-color: var(--blue-500); }
.checkbox input:checked + .checkbox__box { background: var(--blue-600); border-color: var(--blue-600); }
.checkbox input:focus-visible + .checkbox__box { box-shadow: var(--ring); }
.checkbox__mark { opacity: 0; transition: opacity var(--dur-fast) var(--ease-out); display: flex; }
.checkbox__mark svg { width: 15px; height: 15px; }
.checkbox input:checked + .checkbox__box .checkbox__mark { opacity: 1; }

/* ==========================================================================
   Components — Alert
   ========================================================================== */
.alert {
  display: flex;
  gap: 12px;
  align-items: flex-start;
  padding: 14px 16px;
  border-radius: var(--radius-md);
  border: 1px solid;
  font-family: var(--font-body);
  font-size: 15px;
  line-height: 1.5;
}
.alert__icon { flex-shrink: 0; margin-top: 1px; display: flex; }
.alert__icon svg { width: 20px; height: 20px; }
.alert__title { font-weight: 700; font-size: 16px; margin: 0 0 2px; }
.alert--info { background: var(--blue-50); border-color: var(--blue-100); color: var(--blue-800); }
.alert--emergency { background: var(--red-50); border-color: rgba(196, 57, 43, .25); color: var(--red-700); }
.alert--success { background: var(--green-50); border-color: rgba(23, 122, 70, .22); color: var(--green-700); }
.alert__body { flex: 1; }
.alert__action { margin-top: 8px; }

/* ==========================================================================
   Page-level grids (home, service, breadcrumb)
   ========================================================================== */
.hero-grid { display: grid; grid-template-columns: 1.15fr .85fr; gap: 48px; align-items: center; }
.services-grid { display: grid; grid-template-columns: repeat(3, 1fr); gap: 16px; }
.chapters-grid { display: grid; grid-template-columns: repeat(3, 1fr); gap: 20px; }
.steps-grid { display: grid; grid-template-columns: repeat(3, 1fr); gap: 16px; }
.reviews-grid { display: grid; grid-template-columns: repeat(3, 1fr); gap: 16px; }
.service-grid { display: grid; grid-template-columns: 1fr 380px; gap: 40px; align-items: start; }
.contact-grid { display: grid; grid-template-columns: 1fr 400px; gap: 40px; align-items: start; }

.breadcrumb {
  background: var(--surface-tint);
  border-bottom: 1px solid var(--gray-200);
}
.breadcrumb__row {
  padding: 14px var(--gutter);
  display: flex;
  align-items: center;
  gap: 8px;
  font-size: 14.5px;
  font-family: var(--font-body);
}
.breadcrumb__row svg { width: 14px; height: 14px; color: var(--gray-400); }
.breadcrumb__current { color: var(--text-muted); }

.service-icon-tile {
  width: 46px; height: 46px; border-radius: 14px;
  background: var(--blue-50); color: var(--blue-600);
  display: flex; align-items: center; justify-content: center;
}
.service-icon-tile svg { width: 23px; height: 23px; }
.service-icon-tile--lg { width: 56px; height: 56px; border-radius: 16px; }
.service-icon-tile--lg svg { width: 28px; height: 28px; }

.chapter-card__list { display: flex; flex-direction: column; gap: 8px; margin: 14px 0 0; padding: 0; list-style: none; }
.chapter-card__list li { font-size: 15px; color: var(--text-body); padding-left: 0; }
.chapter-card__see-all {
  display: inline-flex; align-items: center; gap: 6px;
  color: var(--blue-600); font-weight: 700; font-size: 14.5px; font-family: var(--font-body);
  margin-top: 16px; text-decoration: none;
}
.chapter-card__see-all svg { width: 15px; height: 15px; }
.chapter-card__see-all:hover { color: var(--blue-500); }
.chapter-card__kicker {
  font-family: var(--font-body); font-weight: 700; font-size: 12.5px;
  letter-spacing: var(--tracking-caps); text-transform: uppercase; color: var(--blue-500);
}
.chapter-card__title {
  font-family: var(--font-display); font-weight: 800; font-size: 20px; color: var(--text-heading);
  margin-top: 6px;
}

/* Phone pill used in CTA strips */
.phone-pill {
  display: inline-flex;
  align-items: center;
  gap: 12px;
  font-family: var(--font-display);
  font-weight: 800;
  font-size: 34px;
  color: #fff;
  text-decoration: none;
}
.phone-pill__icon {
  width: 52px; height: 52px; border-radius: 99px;
  background: rgba(255, 255, 255, .12);
  display: flex; align-items: center; justify-content: center;
}
.phone-pill__icon svg { width: 24px; height: 24px; color: var(--blue-300); }

/* Stub page placeholder note */
.stub-note {
  font-size: var(--text-lg);
  color: var(--text-muted);
  margin: 18px 0 28px;
  max-width: 560px;
}

/* Phase B placeholder banner (dev-only visual marker, harmless in production) */
[data-phase-b] {
  position: relative;
}

/* ==========================================================================
   Responsive
   ========================================================================== */
@media (max-width: 980px) {
  .hero-grid, .service-grid, .contact-grid { grid-template-columns: 1fr; gap: 32px; }
  .services-grid, .reviews-grid, .steps-grid, .chapters-grid { grid-template-columns: repeat(2, 1fr); }
  .footer-grid { grid-template-columns: 1fr 1fr; }
  .desktop-nav { display: none; }
  .site-header .mobile-menu-btn { display: inline-flex; }
}

@media (max-width: 620px) {
  .services-grid, .reviews-grid, .steps-grid, .chapters-grid { grid-template-columns: 1fr; }
  .footer-grid { grid-template-columns: 1fr; }
  .header-cta-label { display: none; }
  .phone-pill { font-size: 26px; }
  /* keep the brand lockup clear of the call pill on narrow phones */
  .site-header__row { gap: 10px; }
  .site-header__brand { gap: 8px; }
  .site-header__mark { height: 38px; }
  .site-header__lockup { font-size: 17px; }
  .site-header__lockup-sub { font-size: 8px; letter-spacing: 0.12em; }
}

@media (min-width: 768px) {
  .sticky-call { display: none !important; }
}
