/* ══════════════════════════════════════════════════════════════════════
   CAR DEALERSHIP LANDING — .cd-* kit
   Rebuilt 1:1 from Figma "Car Dealership Page 7/07/2026"
   desktop node 1288:4865 (1440w) · mobile node 1288:6044 (375w)

   Every value below is the Figma value. Desktop is authored at the 1440
   frame with an 80px gutter (1280 content); the mobile frame's own values
   take over at <=768 (20px gutter, 40px section padding, 32px headings).
   ══════════════════════════════════════════════════════════════════════ */

/* Self-hosted Lato Italic — the emphasis-phrase signature. */
@font-face {
  font-family: 'Lato';
  font-style: italic;
  font-weight: 400;
  font-display: swap;
  src: url('../fonts/lato-italic-latin.woff2') format('woff2');
  unicode-range: U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6, U+02DA, U+02DC, U+2000-206F, U+2122, U+2212, U+FEFF, U+FFFD;
}
@font-face {
  font-family: 'Lato';
  font-style: italic;
  font-weight: 700;
  font-display: swap;
  src: url('../fonts/lato-italic-700-latin.woff2') format('woff2');
  unicode-range: U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6, U+02DA, U+02DC, U+2000-206F, U+2122, U+2212, U+FEFF, U+FFFD;
}
/* Figma calls the hero H1's italic run "Lato:Medium_Italic" — a real weight
   500 static cut that Google Fonts builds (Lato-MediumItalic.ttf) but never
   serves through the public fonts.googleapis.com API. Without it, `font-weight:
   500` on .cd-hero-title em matched our nearest available cut (400, italic),
   which measures narrower than Figma's true weight-500 glyphs; since the line
   is centered, the narrower render pulled it inward on both edges relative to
   the reference (visible as a symmetric double-ghost in the QA overlay's diff
   mode, worse than the plain per-line antialiasing seen elsewhere on this
   page). Pulled straight from google/fonts on GitHub — same OFL license as
   the other Lato cuts here — and subset to match their unicode-range. */
@font-face {
  font-family: 'Lato';
  font-style: italic;
  font-weight: 500;
  font-display: swap;
  src: url('../fonts/lato-medium-italic-latin.woff2') format('woff2');
  unicode-range: U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6, U+02DA, U+02DC, U+2000-206F, U+2122, U+2212, U+FEFF, U+FFFD;
}

/* Self-hosted Inter (variable, weights 400–500) — the plain-Inter fallback
   used off this page. */
@font-face {
  font-family: 'Inter';
  font-style: normal;
  font-weight: 400 500;
  font-display: swap;
  src: url('../fonts/inter-latin.woff2') format('woff2');
  unicode-range: U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6, U+02DA, U+02DC, U+0304, U+0308, U+0329, U+2000-206F, U+20AC, U+2122, U+2191, U+2193, U+2212, U+2215, U+FEFF, U+FFFD;
}
@font-face {
  font-family: 'Inter';
  font-style: normal;
  font-weight: 400 500;
  font-display: swap;
  src: url('../fonts/inter-latin-ext.woff2') format('woff2');
  unicode-range: U+0100-02BA, U+02BD-02C5, U+02C7-02CC, U+02CE-02D7, U+02DD-02FF, U+0304, U+0308, U+0329, U+1D00-1DBF, U+1E00-1E9F, U+1EF2-1EFF, U+2020, U+20A0-20AB, U+20AD-20C0, U+2113, U+2C60-2C7F, U+A720-A7FF;
}

/* Self-hosted Inter Display — the family the Figma frame actually calls for
   on this page (hero lede, lever cards, pills, stat numbers). "Inter
   Display" is a genuinely distinct typeface from plain "Inter" (different
   glyph proportions/spacing, tuned for larger optical sizes), not just an
   alias or a missing-font placeholder — so falling back to "Inter" was
   never going to match. Worse, on fontconfig-based systems (Linux) an
   unmatched family name like "Inter Display" gets fuzzy-substituted to
   whatever the system's default sans is instead of the CSS engine
   advancing to the next name in the font-family list, which is *wider*
   than real Inter Display and is why wrapping drifted (fewer words fit per
   line, not more). Sourced from the official rsms.me/inter v4.1 release
   (static instances — that release folded Inter Display into an opsz axis
   on the variable font, but ships no variable InterDisplay build, so static
   per-weight files are the only self-hostable option) and subsetted to
   Latin + Latin Extended to match this page's other self-hosted fonts. Only
   400/500/700 are pulled in because those are the only weights this page's
   "Inter Display" rules ever use. */
@font-face {
  font-family: 'Inter Display';
  font-style: normal;
  font-weight: 400;
  font-display: swap;
  src: url('../fonts/interdisplay-regular.woff2') format('woff2');
  unicode-range: U+0000-02FF, U+0304, U+0308, U+0329, U+1D00-1DBF, U+1E00-1EFF, U+2000-206F, U+20A0-20C0, U+2113, U+2122, U+2191, U+2193, U+2212, U+2215, U+2C60-2C7F, U+A720-A7FF, U+FEFF, U+FFFD;
}
@font-face {
  font-family: 'Inter Display';
  font-style: normal;
  font-weight: 500;
  font-display: swap;
  src: url('../fonts/interdisplay-medium.woff2') format('woff2');
  unicode-range: U+0000-02FF, U+0304, U+0308, U+0329, U+1D00-1DBF, U+1E00-1EFF, U+2000-206F, U+20A0-20C0, U+2113, U+2122, U+2191, U+2193, U+2212, U+2215, U+2C60-2C7F, U+A720-A7FF, U+FEFF, U+FFFD;
}
@font-face {
  font-family: 'Inter Display';
  font-style: normal;
  font-weight: 700;
  font-display: swap;
  src: url('../fonts/interdisplay-bold.woff2') format('woff2');
  unicode-range: U+0000-02FF, U+0304, U+0308, U+0329, U+1D00-1DBF, U+1E00-1EFF, U+2000-206F, U+20A0-20C0, U+2113, U+2122, U+2191, U+2193, U+2212, U+2215, U+2C60-2C7F, U+A720-A7FF, U+FEFF, U+FFFD;
}

.cd-page {
  /* ── Figma colour tokens ────────────────────────────────────────── */
  --cd-ink:        #0A1720;  /* headings */
  --cd-ink-navy:   #0A1A3A;  /* lever card titles */
  --cd-muted:      #55636D;  /* body copy */
  --cd-accent:     #3EBC7A;  /* buttons, italic accent */
  --cd-accent-alt: #41B883;  /* FAQ heading italic */
  --cd-mint:       #ECF8F3;  /* pill + checkbox fill */
  /* Phase-row trio was tan/gold (#E8E1D1/#D4C299/#D5B87D) against the old
     reference (1288:5598); the 2026-08-25 "Final Design" refresh (1535:2198)
     moved these to near-white cards with the sitewide green accent —
     verified via get_design_context, not a guess. Names kept for now to
     minimize churn. */
  --cd-tan:        #FAFAFA;  /* phase rows */
  --cd-tan-num:    rgba(15,45,29,.3); /* phase ghost number */
  --cd-gold:       #059669;  /* phase kicker */
  --cd-forest:     #17402E;  /* qualifier bar */
  --cd-red:        #EE0606;  /* "~20% Reduction" */
  --cd-green-soft: #4BBE8B;  /* "Compounding ROI" */
  --cd-hairline:   #F2F2F2;  /* qualifier row rule */
  --cd-faq-mark:   #F8FAFC;  /* closed FAQ toggle — cool gray per node 1535:2371 (the 2026-08-25 refresh dropped the old #F3EEE4 warm cream, same as the channel cushions) */
  --cd-faq-open:   #11BC7A;  /* open FAQ toggle */

  /* ── Layout ─────────────────────────────────────────────────────── */
  --cd-gutter:  80px;
  --cd-content: 1280px;
  --cd-sec-y:   60px;

  /* 2026-08-25 Final Design refresh dropped the old cream page bg in favor
     of plain white for every section that doesn't explicitly tint itself
     (channels/ops #FAFAFA, hero/band/start dark) — verified against the
     Figma reference PNG, not a guess. The old --cd-paper (#F7F1E4) cream
     token is gone: its last consumer, .cd-channel-shot, is now #FAFAFA to
     match the frame (2026-08-30 — the channel screenshot .webp exports
     were re-cushioned from cream to #FAFAFA at the same time). */
  background: #FFF;
  font-family: "Geist", -apple-system, BlinkMacSystemFont, "Segoe UI", sans-serif;
}

/* ── Header ────────────────────────────────────────────────────────
   Deliberately NOT restyled here. The Figma frame (node 1288:5193) draws
   its own nav — a 37.5px logo, 16px links, a squared CTA, and only four
   items — but `.site-header` is a global component shared with every other
   page, and the site reads as broken when it changes shape on one page.
   The overlay QA tool excludes the nav from the comparison for the same
   reason (see docs/car-dealership-dev-workflow.md §4), so the Figma delta
   here is expected, not drift.

   The old override block also hid `.nav-links li:nth-child(5)` to drop
   "Blog" — a positional rule that silently began hiding "About" the moment
   the "Customers" dropdown was added to header.php. Don't reintroduce
   nth-child targeting against a nav whose length can change. */

.cd-page .cd-sec,
.cd-page .cd-hero { box-sizing: border-box; }
.cd-page .cd-sec *,
.cd-page .cd-hero * { box-sizing: border-box; }

.cd-wrap {
  width: 100%;
  max-width: calc(var(--cd-content) + var(--cd-gutter) * 2);
  margin-inline: auto;
  padding-inline: var(--cd-gutter);
}

.cd-sec { padding-block: var(--cd-sec-y); }

/* ── Shared heading ────────────────────────────────────────────────
   Geist Medium 48 / 1.3 / -2.38px, ink. Italic run = Lato Medium Italic
   in the accent green.

   Figma sets Title Case on every heading, button, stat label and card
   title (but NOT on body copy or FAQ questions) — reproduced with
   text-transform: capitalize so the rendering matches. Acronyms already
   typed uppercase in the copy ("SEO", "AI", "ROI", "BDC") are unaffected,
   since capitalize only touches the first letter of each word. */
.cd-h2 {
  margin: 0;
  font-family: "Geist", sans-serif;
  font-weight: 500;
  font-size: 48px;
  line-height: 1.3;
  /* normal, NOT -2.38px. Verified 2026-08-28 against every section heading
     node in the desktop frame (1535:1855 intro, :1933 levers, :1973 channels,
     :2200 phases, :2245 case, :2263 ops, :2311 qual, :2358 faq, :2406 start,
     :2235 band): not one carries a `tracking-*` value, on the Geist run or
     the Lato italic run. The -2.38px here (and the per-section italic values
     that used to follow) were tuned by eye against the pre-2026-08-25
     reference and made every heading on the page render measurably narrower
     than Figma — the "titles look bigger in Figma" report. `normal` is
     required rather than `0`, to beat style.css's sitewide
     `h1,h2,h3,h4 { letter-spacing: -0.025em }`. */
  letter-spacing: normal;
  color: var(--cd-ink);
  text-transform: capitalize;
}
.cd-h2 em {
  font-family: "Lato", Georgia, serif;
  font-style: italic;
  font-weight: 500;
  color: var(--cd-accent);
  /* Self-hosted Lato Italic's own ascent/descent exceed the inherited
     unitless line-height (1.3) at this size, so Chrome grows the whole
     heading's line box by ~1px wherever this run lands on the last line —
     compounding down the page since every section below sits in normal
     flow. `normal` uses Lato's own metrics directly instead of colliding
     with Geist's, which matches Figma's line box exactly (verified via
     getBoundingClientRect against the Figma frame's heading node). */
  line-height: normal;
}
.cd-h2--42 { font-size: 42px; }
.cd-h2--center { text-align: center; }
.cd-h2--on-dark { color: #FFF; }

/* The per-section italic tracking that used to live here (-2 / -4.38 /
   -2.38 / -3.38 … per section) is GONE, deliberately. It was tuned against
   the pre-2026-08-25 reference; in the current frame every heading's Lato
   run is untracked, same as its Geist run — verified node by node, see the
   note on .cd-h2 above. The em now simply inherits `normal` from .cd-h2.
   Mobile is different and keeps its own overrides further down: the mobile
   frame DOES track some headings (e.g. 1541:6621 carries tracking-[-2.38px]
   on the container and -1.38px on the italic span), so don't collapse the
   two sets into one rule. */
.cd-hero-title em     { letter-spacing: inherit; }

/* ── Buttons ───────────────────────────────────────────────────────
   Figma: radius 12, padding 13/16, Geist Medium 16/24, gap 4, icon 20.
   Radius is 12 on every button node in the desktop frame (hero
   1535:2530/2546, band 1535:2557, qual-bar, start cards) — the
   section-scoped overrides below already restate it; the hero CTAs are
   the only consumers left on the base value.

   padding-block is 15/11, not Figma's symmetric 13/13: Chrome renders
   Geist's ink high inside a centred 24px line box (it reserves descender
   room at the bottom, so a geometrically-centred line rides visually high
   — the vertical cousin of this page's documented ~1.5% horizontal Geist
   metric drift). +2px top / -2px bottom lands the visible glyphs on the
   optical centre while keeping the box at Figma's 50. This is the single
   knob for every arrow CTA on the page (hero, band, qual-bar, start card)
   — the section rules no longer re-declare any padding. Tuning history
   (2026-08-30, by eye in the local preview): 14/12 read slightly
   bottom-heavy, 16/10 too low; 15/11 is the settle. */
.cd-page .cd-btn {
  display: inline-flex;
  align-items: center;
  justify-content: center;
  gap: 4px;
  padding: 15px 16px 11px;
  border: 0;
  border-radius: 12px;
  font-family: "Geist", sans-serif;
  font-weight: 500;
  font-size: 16px;
  line-height: 24px;
  color: #FFF;
  text-decoration: none;
  white-space: nowrap;
  text-transform: capitalize;
  cursor: pointer;
  transition: filter .18s var(--ease, ease), transform .18s var(--ease, ease);
}
.cd-page .cd-btn:hover  { filter: brightness(1.06); }
.cd-page .cd-btn:active { transform: translateY(1px); }
/* 20px, not 24px. Verified against all 4 instances of this exact icon in
   the desktop Figma frame's node cache (1535:2532/2559/2568/2585,
   .preview/qa/ref/figma-desktop.nodes.json) — every one is unanimously
   20x20, none 24x24. Was flagged 2026-08-28 as a structural-audit finding
   on the qual-bar CTA (w+7.4, of which 4px traced to this rule); at the
   time it was left alone as a shared/page-wide rule pending confirmation
   it wasn't a one-off. It isn't: .cd-btn-icon has exactly one caller
   ($arrow in template-car-dealership.php), so there is no other consumer
   that might legitimately want 24px. Central fix, applies to all 6 CTA
   buttons on the page that use $arrow. */
/* translateY(-2px): the flex row centres the 20px icon on the 24px line box,
   but Chrome renders Geist's ink ~2px high inside that box (the same quirk the
   base .cd-btn padding-block compensates for), so a geometrically-centred icon
   reads ~2px low against the text's optical middle. The nudge is purely visual
   (no reflow) and lines the arrow up with the label the way the Figma frame
   renders it (nodes 1535:2531/2532 — text y13 h24, icon y15 h20, both
   centred at y25). Applies to all 6 arrow CTAs; they share this Geist quirk. */
.cd-btn-icon { width: 20px; height: 20px; flex: none; transform: translateY(-2px); }

/* The hero's primary CTA (node 1535:2530) is the SAME gradient variant as the
   three other arrow-right CTAs on the page — .cd-band / .cd-qual-bar /
   .cd-start-card--1 .cd-btn — not the flat --cd-accent fill it carried here.
   The 2026-08-25 Final Design refresh moved those three onto the gradient but
   missed this one, leaving it lighter (flat #3EBC7A vs the gradient's
   #10B981→#158A63) and 8px narrower (base gap 4 vs Figma's 12). Gradient /
   weight / tracking / inset top-light verified against node 1535:2530 via
   get_design_context and pixel-sampled from figma-desktop.png.

   Deliberately does NOT re-declare what .cd-band .cd-btn does:
   - no `border: 1px rgba(255,255,255,.12)` — Figma carries a 12%-white stroke
     on this node but it renders as a visible light-green rim in Chrome that
     the Figma frame itself doesn't show; omitted here to match the frame.
   - no `height` / symmetric `padding` — the base rule's 14/12 padding-block
     already nets 50px AND carries the Geist optical-centre nudge (see the
     base-rule comment above); forcing symmetric 12/12 here left the label
     riding ~1.5px high (measured against figma-desktop.png). */
.cd-page .cd-btn--accent {
  gap: 12px;
  background: linear-gradient(180.75deg, #10B981 1.87%, #158A63 102.3%);
  font-weight: 600;
  letter-spacing: -0.32px;
  box-shadow: inset 0 2px 2px rgba(245,255,250,.2);
}
/* 2026-08-25 Final Design refresh: the "Talk to a founder" CTA is a SOLID
   WHITE button with dark text in both refreshed frames — desktop node
   1535:1485 and mobile node 1546:2541 — not the near-black fill the
   superseded 1288:* frames had. Verified by pixel-sampling both reference
   PNGs, not by eye. Used by BOTH instances of that label on the page (hero
   secondary CTA and start-card 2); kept as its own modifier rather than
   folded into --ghost because --ghost's translucent-white fill is still
   correct for its own callers.

   Height is 48, NOT the accent variant's 50: the current desktop frame
   sizes this button (node 1535:2546) at 48 — no explicit height, py-12 +
   24px text — while the accent one (1535:2530) is pinned at 50. The old
   1288:* frames had both at 50, hence the superseded "-1px to match 50"
   note that used to live here. border-box + border 1px + 24px text →
   padding-block 13/9 nets 48 (vs a symmetric 11/11), carrying the same
   +2/-2 Geist optical-centre nudge the base rule documents. */
.cd-page .cd-btn--dark   {
  background: #FFF;
  border: 1px solid rgba(255,255,255,.2);
  padding-block: 13px 9px;
  color: var(--cd-ink);
  box-shadow: inset 0 1.2px 1.2px rgba(45,45,45,.2);
}
.cd-page .cd-btn--ghost  { background: rgba(255,255,255,.2); border: 1px solid rgba(255,255,255,.2); padding-block: 12px; }
.cd-page .cd-btn--wide   { padding-inline: 20px; padding-block: 14px; }
.cd-page .cd-btn--ghost.cd-btn--wide { padding-block: 13px; }

/* ══════════════════════ HERO — node 1288:4868 ════════════════════════
   Frame 1440×674. Radial gradient: rx 2016 / ry 606.6 centred at
   (1008, 0) — expressed here in % of the frame so it scales. */
.cd-hero {
  position: relative;
  overflow: hidden;
  min-height: 674px;
  padding: 144px var(--cd-gutter) 0;
  /* Figma's own gradient SVG, exported verbatim. preserveAspectRatio="none"
     means it stretches to any viewport, so this is exact rather than an
     approximated CSS radial-gradient. */
  background-color: #03090F;
  background-image: url('../img/car-dealership/bg-hero.svg');
  background-size: 100% 100%;
  background-repeat: no-repeat;
}

/* Blurred mint ellipses (nodes 1288:4870-72). Figma uses two distinct
   treatments, not one shared style: the side ellipses are a brighter green
   at a much heavier blur than the center one. */
.cd-hero-glow {
  position: absolute;
  border-radius: 50%;
  pointer-events: none;
}
.cd-hero-glow--l,
.cd-hero-glow--r {
  background: rgba(76,202,136,.35);
  filter: blur(275px);
}
.cd-hero-glow--c {
  background: rgba(44,184,116,.1);
  filter: blur(200px);
}
.cd-hero-glow--l { left: 2px;    top: 366px; width: 464px; height: 389px; }
.cd-hero-glow--r { right: 21px;  top: 352px; width: 464px; height: 389px; }
/* Figma's center ellipse isn't centered on the frame — it sits ~22px right
   of true center (left:322.29 of a 1440 frame, width 840.13). */
.cd-hero-glow--c { left: calc(50% + 22px); transform: translateX(-50%); top: 183px; width: 840px; height: 175px; }

/* 96px block grid, masked, 50% opacity (nodes 1288:4873-77). Figma bakes 4
   "lit" cells into this grid at fixed positions (nodes 1288:4905, 4914,
   4928, 4932 — the only 2 of ~600 blocks in the visible 3-row window that
   carry a fill) rather than leaving every cell a plain line-only square;
   reproduced here as extra no-repeat background layers so the line grid
   still draws on top of them. Column phase is 14px, not 0 — Figma's grid
   is centered on a 1920px content strip wider than the 1181px visible
   window, so the first visible column is a partial one. */
.cd-hero-grid {
  position: absolute;
  left: 50%;
  transform: translateX(-50%);
  /* Figma's 84px offset assumes its own 83px-tall header, whose nav CTA
     button bottom sits at 66.5px (17.5px breathing room before the grid).
     The real .site-header is close but not identical (measured 79.14px
     tall, button bottom 60.14px — verified via getBoundingClientRect, not
     eyeballed), so scaling the same ~17.5px breathing room off the real
     button bottom lands the grid at ~78px; rounded to 80px. (A stale prior
     value of 106px assumed an 86px button bottom from an earlier, taller
     nav — that nav has since shrunk and this offset was never re-tuned,
     leaving a visibly oversized gap under the header.) */
  top: 80px;
  width: 1181px;
  height: 254px;
  opacity: .5;
  pointer-events: none;
  background-image:
    linear-gradient(to right,  rgba(208,213,221,.32) 1px, transparent 1px),
    linear-gradient(to bottom, rgba(208,213,221,.32) 1px, transparent 1px),
    linear-gradient(rgba(242,244,247,.1), rgba(242,244,247,.1)),
    linear-gradient(rgba(242,244,247,.1), rgba(242,244,247,.1)),
    linear-gradient(rgba(242,244,247,.1), rgba(242,244,247,.1)),
    linear-gradient(rgba(242,244,247,.1), rgba(242,244,247,.1));
  background-size: 96px 96px, 96px 96px, 96px 96px, 96px 96px, 96px 96px, 96px 96px;
  background-position:
    14px 0, 14px 0,
    110px 96px,
    974px 96px,
    302px 192px,
    686px 192px;
  background-repeat: repeat, repeat, no-repeat, no-repeat, no-repeat, no-repeat;
  /* Figma's mask ellipse (752x1197, centered at content-x 960/content-y 0)
     is defined in a 1440x1440 canvas, not this 1181x254 box — expressed in
     px rather than %% so the radii don't get renormalized against the
     wrong dimensions. */
  -webkit-mask-image: radial-gradient(752px 1197px at 50% 0%, #000 0%, transparent 95%);
          mask-image: radial-gradient(752px 1197px at 50% 0%, #000 0%, transparent 95%);
}

.cd-hero-inner {
  position: relative;
  z-index: 1;
  width: 1046px;
  max-width: 100%;
  margin-inline: auto;
  display: flex;
  flex-direction: column;
  align-items: center;
  gap: 24px;
  text-align: center;
}

/* Geist Medium 70 / 1.2 / -2.38, white; italic run in accent.
   Figma's own generated leading (1.23) is the *measured* line-gap, not the
   authored value — at that ratio Chromium's mixed Geist/Lato-italic line
   layout overshoots by a near-constant ~3px/line vs. the Figma PNG (verified
   via the overlay QA tool's diff mode + getClientRects line-pitch sampling),
   so line 2 drifts down. 1.2 (84px pitch) matches the reference. */
.cd-hero-title {
  margin: 0;
  width: 1014px;
  max-width: 100%;
  font-family: "Geist", sans-serif;
  font-weight: 500;
  font-size: 70px;
  /* 1.23 and -2px are the frame's literal values (node 1535:1829:
     `leading-[1.23]`, `tracking-[-2px]`). This is the one heading on the page
     that IS tracked — but at -2px, not the -2.38px that used to be applied
     here. */
  /* 86.1px == 70 * 1.23, written in px on purpose. A unitless 1.23 is
     inherited as a FACTOR, so the Lato italic run recomputes its own line
     box from Lato's taller ascent/descent and grows the line ~1.5px — the
     h1 measured 175.2 against the frame's 172. An explicit px line-height
     gives both the Geist and the Lato inline boxes the same height, which
     is what Figma's `leading-[1.23]` on BOTH spans actually means. */
  line-height: 86.1px;
  letter-spacing: -2px;
  text-transform: capitalize; /* Figma applies this to the H1 too — see the
                                  same quirk noted on .cd-intro below */
  color: #FFF;
}
.cd-hero-title em {
  font-family: "Lato", Georgia, serif;
  font-style: italic;
  font-weight: 500;
  /* Keeps the Lato run from growing the line box. Both runs carry
     `leading-[1.23]` in Figma, but Geist and Lato have different
     ascent/descent ratios, so once their baselines are aligned the line box
     becomes the UNION of the two inline boxes, not 86.1px — measured 89.09px
     of line spacing and a 175.2px h1 against the frame's 172. Any value that
     leaves Lato's box inside the Geist strut fixes it (probed: <=80px all
     give exactly 172.19; 84px and up do not), so `1` is chosen as the stable
     way to say "small enough". This does NOT change where the glyphs sit —
     only which box wins the line-box calculation. Same failure mode as the
     note on .cd-h2 em, but `normal` is not small enough at 70px. */
  line-height: 1;
  color: var(--cd-accent);
}

/* Inter Regular 20 / 28 — the one place the frame uses Inter for body. */
.cd-hero-lede {
  margin: -4px 0 0;
  width: 872px;
  max-width: 100%;
  font-family: "Inter", "Geist", sans-serif;
  font-weight: 400;
  font-size: 20px;
  line-height: 28px;
  color: #FFF;
}
.cd-hero-lede b { font-weight: 600; }

.cd-hero-ctas { display: flex; gap: 16px; align-items: center; }

/* Hairline rule between the CTAs and the stat row. It spans the hero COLUMN,
   not the full 1280px content width: node 1535:1841 ("Line 50") is x:0 w:1046
   inside frame 1535:1826, i.e. abs x 197–1243. Confirmed against the reference
   PNG — the lit row at y=490 runs x 197→1242 and is dark either side, so this
   is the frame's own pixels, not a node-data reading. (A prior value of
   `var(--cd-content)` / 1280px, commented "measured at x 80–1360", came from
   the superseded 1288:4868 design where the rule really was full-bleed; the
   2026-08-25 refresh pulled it in and the override was never re-tuned, leaving
   it overhanging the column by 117px on each side.) 100% resolves against
   .cd-hero-inner, so mobile gets node 1541:6302's 335px for free. */
.cd-hero-rule {
  width: 100%;
  height: 1px;
  border: 0;
  margin: 0;
  background: rgba(255,255,255,.2);
}

/* Centred as a group (frame 1328:534 sits at x 201.5 inside the 1046 column,
   i.e. exactly centred), not flush-left. */
.cd-hero-stats {
  display: flex;
  gap: 40px;
  align-items: center;
  margin: 0;
  padding: 0;
  list-style: none;
}
.cd-hero-stats li {
  display: flex;
  flex-direction: column;
  gap: 8px;
  text-align: left;
}
/* The 3rd column's frame (node 1535:1849) is a FIXED 183px, wider than the
   150px text node it wraps (1535:1851) — that extra 33px is what makes the
   row 643px and therefore exactly centred in the 1046 column, so the 183 is
   load-bearing and stays. But Figma's text hugs inside it, where a flex item
   with `align-items: stretch` fills the whole 183. align-self restores the
   hug (Chrome measures the string at ~152 vs Figma's 150 — Geist metric
   drift) without moving a single glyph, since the label is left-aligned
   either way. Mobile pins this span to an explicit 83px below, so this is a
   no-op there. */
.cd-hero-stats li:nth-child(3) { width: 183px; }
.cd-hero-stats li:nth-child(3) span { align-self: flex-start; }
.cd-hero-stats b {
  font-family: "Geist", sans-serif;
  font-weight: 700;
  font-size: 24px;
  line-height: 1.3;
  color: #FFF;
}
.cd-hero-stats span {
  font-family: "Geist", sans-serif;
  font-weight: 400;
  font-size: 14px;
  line-height: 20px;
  color: #FFF;
  text-transform: capitalize;
}

/* ═════════════════════ INTRO — node 1535:1853 ═══════════════════════ */
/* Figma pads this section's own frame 80px on every side, not the sitewide
   --cd-sec-y (60px) other sections inherit — real, verified via
   get_design_context, not a rounding artifact. */
.cd-intro { --cd-sec-y: 80px; }
.cd-intro .cd-wrap {
  display: flex;
  flex-direction: column;
  align-items: center;
  gap: 40px;
}
.cd-intro .cd-h2 { width: 1059px; max-width: 100%; }
/* align-items: stretch (set explicitly so it isn't mistaken for an
   oversight) makes all 4 cards match the tallest one. Figma's cards are
   266px tall: every card's body-copy node ends in a trailing
   zero-width-space <p> that Figma renders as a real 24px blank line and
   bakes into the card height (card 4 "Brand and Owned channels" carries
   two; verified via get_design_context on node 1535:1853).

   Per the client (2026-08-30, "we want them exactly like the figma") the
   desktop cards now reproduce that extra bottom space — as real bottom
   padding (24px base + 24px standing in for the ghost line = 48px), NOT as
   empty <p> tags in the markup. With align-items: stretch every card lands
   at Figma's 266px. This reverses the earlier call (commit eed1ba8) to
   treat the 24px as a reference artifact to be ignored; the spec's
   assertEqual guard on this row still holds. Mobile keeps the plain 24px
   padding — the stacked mobile frame's phantom lines are still treated as
   stale reference whitespace (see the mobile intro block below and
   workflow doc §1).

   justify-content: flex-start (not Figma's `justify-center` on node
   1535:1857) — in Figma every card's content fills the box because the
   shorter ones carry the ghost lines, so centred and top-aligned look the
   same there. We don't bake those lines in, so card 4's real (shorter)
   content, if centred, drops its icon and title below the other three.
   flex-start pins all four icons/titles to a common top edge and lets the
   slack fall to the bottom, which is what the Figma render actually shows. */
.cd-intro-cards {
  display: flex;
  gap: 16px;
  align-items: stretch;
  width: 100%;
}
.cd-intro-card {
  display: flex;
  flex: 1 1 0;
  min-width: 0;
  flex-direction: column;
  align-items: flex-start;
  justify-content: flex-start;
  gap: 16px;
  padding: 24px 24px 48px;
  border-radius: 16px;
  background: #FAFAFA;
}
.cd-intro-card-icon {
  display: flex;
  flex: none;
  align-items: center;
  justify-content: center;
  width: 42px;
  height: 42px;
  border-radius: 8px;
  background: #FFF;
}
.cd-intro-card-icon img { display: block; width: 20px; height: 20px; }
.cd-intro-card-text {
  display: flex;
  flex-direction: column;
  gap: 16px;
  width: 100%;
}
.cd-intro-card-text h3 {
  margin: 0;
  font-family: "Geist", sans-serif;
  font-weight: 500;
  font-size: 20px;
  line-height: 24px;
  /* Node 1535:1866 sets no tracking. Without this reset the title inherits
     style.css's sitewide `h1,h2,h3,h4 { letter-spacing: -0.025em }` = -0.5px
     at 20px, which pulled a 36-character title ~18px narrower than Figma. The
     box is `w-full` either way, so the geometry audit cannot see this — it
     needs a typography check. */
  letter-spacing: normal;
  color: var(--cd-ink);
}
.cd-intro-card-text p {
  margin: 0;
  font-family: "Geist", sans-serif;
  font-weight: 400;
  font-size: 16px;
  line-height: 24px;
  color: var(--cd-muted);
}

/* ═════════════════════ LEVERS — node 1535:1932 ══════════════════════ */
.cd-levers { --cd-sec-y: 80px; } /* Figma pads this frame 80px, not the sitewide 60 */
.cd-levers .cd-wrap {
  display: flex;
  flex-direction: column;
  align-items: center;
  gap: 40px;
}
/* stretch, not flex-end. Figma's two cards are 330.2 and 326.2 tall with
   their tops 2px apart — an equal-height row. But card 1's Figma height
   includes a 24px phantom blank line (node 1535:1946 ends in a
   zero-width-space <p>, the same trick documented for the intro cards and
   for mobile's lever 01), so with correct markup card 1's real content is
   ~24px SHORTER than card 2's, not taller. flex-end then bottom-aligned it
   and dropped its top edge 24px below card 2's — visibly broken, and the
   opposite of what the flex-end was originally added to achieve (lining the
   two bottom edges up when only the 4px icon-box difference was in play;
   that part is now handled by .cd-lever-top's min-height below). */
.cd-lever-row { display: flex; gap: 32px; align-items: stretch; }

.cd-lever {
  width: 562px;
  padding: 24px;
  /* Figma's stroke is inset (doesn't grow the frame's auto-layout hug
     height) — a real `border` does grow an auto-height box regardless of
     box-sizing, since border-box only reinterprets an EXPLICIT width/height,
     not auto sizing. That silently added 2px (1px top + 1px bottom) to
     every card, compounding into every section below in normal flow.
     box-shadow paints the same 1px inside edge without affecting layout. */
  box-shadow: inset 0 0 0 1px #FFF;
  border-radius: 24px;
  background: #F8FAFC;
  display: flex;
  flex-direction: column;
  align-items: center;
  gap: 24px;
  overflow: hidden;
}
/* Lever 02 is NOT a twin of Lever 01 — Figma tints it green with a rotated
   radial at 10% opacity layered under the same 40% white wash. Exported
   verbatim so the tint and its angle match exactly. Figma's node also has
   NO separate background-color fill (unlike Card 1, which explicitly sets
   rgba(255,255,255,.4)) — it relies solely on the two image layers, so the
   page's paper colour shows straight through wherever they're transparent.
   Override .cd-lever's inherited background-color here, or that extra white
   wash stacks under the svg and makes the tint read cooler/lighter than the
   reference. */
.cd-lever--2 {
  background-color: transparent;
  background-image:
    url('../img/car-dealership/bg-lever2.svg'),
    linear-gradient(90deg, rgba(255,255,255,.4) 0%, rgba(255,255,255,.4) 100%);
  background-size: 100% 100%;
  background-repeat: no-repeat;
}
.cd-lever-title {
  margin: 0;
  font-family: "Inter Display", "Inter", "Geist", sans-serif;
  font-weight: 500;
  font-size: 24px;
  line-height: 1.4;
  /* Figma's node has no tracking, but this renders as an <h3> and would
     otherwise inherit style.css's sitewide `h1,h2,h3,h4 { letter-spacing:
     -0.025em }` reset (-0.6px here) — that compressed the title ~6%
     narrower than the reference and read as visibly smaller. */
  letter-spacing: normal;
  color: var(--cd-ink-navy);
  text-align: center;
  text-transform: capitalize;
}
.cd-lever-panel {
  width: 100%;
  /* Absorbs the height the row's stretch adds to the shorter card. In Figma
     the padding-out lives inside this white panel (the phantom line is a
     child of the panel, not of the card), so growing the panel — rather than
     leaving dead space between panel and card edge — is what reproduces the
     frame. */
  flex: 1;
  padding: 18.609px;
  border-radius: 16px;
  background: #FFF;
  display: flex;
  flex-direction: column;
  gap: 16px;
}
/* Card 2's panel sits over the green-tinted card bg, so Figma keeps it at
   70% opacity instead of card 1's solid white. */
.cd-lever--2 .cd-lever-panel { background: rgba(255,255,255,.7); }
/* min-height pins both cards' top row to the taller of the two icon boxes
   (32px, lever 1's down-arrow box — lever 2's up-arrow box is only 24px).
   Without this the row — and therefore the pill and everything below it —
   is 4px shorter on card 2 than card 1, so the two cards' pills sit 4px
   apart. Equalizing it here keeps title and pill aligned independently of
   how the cards' overall heights are reconciled (which .cd-lever-row now
   does with `stretch`; this used to lean on its `flex-end`). */
.cd-lever-top {
  display: flex;
  align-items: center;
  justify-content: space-between;
  min-height: 32px;
}
.cd-pill {
  display: inline-flex;
  align-items: center;
  padding: 4px 12px;
  border-radius: 99px;
  background: var(--cd-mint);
  font-family: "Inter Display", "Inter", "Geist", sans-serif;
  font-weight: 400;
  font-size: 14px;
  line-height: 20px;
  color: var(--cd-accent);
}
/* Figma's icon containers are square (32px / 24px) but the arrow SVGs
   themselves are non-square and have preserveAspectRatio="none" baked in —
   Figma centers each at its native aspect ratio inside the square box
   rather than stretching it to fill. Reproduce that: a centering box at
   the container size, holding an <img> sized to the SVG's own intrinsic
   width/height (27.4286×16 down, 24×14 up). Forcing width=height=box on
   the <img> directly (as this used to do) stretches the icon and is why
   it looked visibly fatter/taller than the Figma reference. */
.cd-lever-icon-box {
  display: flex;
  align-items: center;
  justify-content: center;
  flex-shrink: 0;
}
.cd-lever-icon--down { width: 27.4286px; height: 16px; }
.cd-lever-icon--up   { width: 24px; height: 14px; }
.cd-lever-body {
  margin: 0;
  /* Geist, NOT Inter Display — the rest of this card's chrome (title, pill,
     foot) is Inter Display, but the body paragraph nodes 1535:1946 / 1535:1965
     are explicitly `font-['Geist:Regular']` in the frame. Inter Display at 16px
     renders visibly smaller/tighter than Geist at 16px, which read as an
     undersized paragraph against the reference. */
  font-family: "Geist", sans-serif;
  font-weight: 400;
  font-size: 16px;
  line-height: 24px;
  color: var(--cd-muted);
}
/* Figma authors lever 2's body 24px narrower (453px) than its own container
   (477px) — lever 1's body stretches full-width instead. Match it exactly;
   otherwise the wrap point after "built" vs "built it" drifts from the
   reference (node 1288:5269 vs 1288:5250). */
.cd-lever--2 .cd-lever-body { width: 453px; }
/* Figma's foot is a hug-width auto-layout frame — nodes 1535:1947 (162 =
   20 icon + 8 gap + 134 text) and 1535:1966 (176 = 20 + 8 + 148), both
   `flex gap-[8px] items-center` with shrink-0 children and no width, per
   get_design_context. As a plain block <p> this stretched to the panel's
   full 476.8px, which is visually identical (the content is left-aligned
   either way) but 300px wider than the box it maps to — far enough out that
   figma-audit.mjs rejected it as "no counterpart" and matched the frame
   against the inner <span> instead, so the foot's real geometry was never
   being checked at all. Hugging restores the 1:1 mapping. */
.cd-lever-foot {
  margin: 0;
  /* Pin the foot to the bottom of the panel. This is what the phantom blank
     line in lever 01's body (node 1535:1946, verified via get_design_context
     — it literally ends in `<p>​</p>`) is FOR: it pads the 3-line body out to
     4 lines so the "~20% Reduction" line lands on the same baseline as lever
     02's "Compounding ROI" (Figma has them at y=435.6 and 433.6, i.e. both at
     panel-bottom minus 18.6 padding minus 27). Reproducing that with an empty
     paragraph is off the table (see .cd-intro-cards for the same call), but
     leaving the row's stretch slack UNDER the foot instead of above it is a
     real visual divergence, not a reference artefact: it renders lever 01's
     foot 24.8px high with dead white beneath. `margin-top: auto` moves the
     slack above the foot instead — foot lands at 434.8 vs Figma's 435.6.
     No-op wherever the panel has no free space (i.e. the whole stacked
     mobile layout, where each panel hugs its own content). */
  margin-top: auto;
  align-self: flex-start;
  display: flex;
  align-items: center;
  gap: 8px;
  font-family: "Inter Display", "Inter", "Geist", sans-serif;
  font-weight: 500;
  font-size: 18px;
  line-height: 1.5;
}
.cd-lever-foot img { width: 20px; height: 12px; }
.cd-lever-foot--down span { color: var(--cd-red); }
.cd-lever-foot--up   span { color: var(--cd-green-soft); }

/* ════════════════════ CHANNELS — node 1320:869 ══════════════════════ */
/* Figma's Final Design refresh moved this section's bg from the old warm
   cream (--cd-paper-warm) to a near-white gray, and pads the frame 80px
   (not the sitewide 60) — verified via get_design_context, node 1535:1970. */
.cd-channels { background: #FAFAFA; --cd-sec-y: 80px; }
.cd-channels .cd-h2 {
  width: 701px;
  max-width: 100%;
  margin-inline: auto;
  margin-bottom: 40px;
}
/* Desktop already wraps here naturally at the 701px column width — this
   break only exists to guarantee the same split on mobile (see the mobile
   block), where natural reflow is one word-width away from spilling to a
   third line at narrower phones (checked 320/360px). */
.cd-channel-break { display: none; }

.cd-channel-scroller {
  overflow-x: auto;
  overflow-y: hidden;
  scrollbar-width: none;
  -webkit-overflow-scrolling: touch;
  scroll-snap-type: x mandatory;
  /* Without this, scroll-snap-align:start on the first card (combined with
     mandatory snapping) makes the browser auto-scroll past the track's own
     leading padding-inline on load, so the left gutter never renders. */
  scroll-padding-inline-start: var(--cd-gutter);
}
/* Desktop relaxes mandatory → proximity. The Figma frame draws 4 pagination
   dots for 5 cards (node 1535:2192), so theme.js maps each dot to a
   fraction of the scroll range (0 / 33 / 66 / 100%) rather than to a card.
   At desktop widths several cards are visible at once and `scroll-snap-
   align: start` only yields ~3 rest positions, so mandatory snap would drag
   a dot-driven scroll off its fraction and onto the nearest card. Proximity
   keeps the intermediate stops while still snap-assisting a manual
   wheel/drag that ends near a card. Mobile keeps `mandatory` — there each
   card is ~full-width, giving a clean one-card-per-swipe carousel where the
   dot fractions line up with the cards anyway. */
@media (min-width: 769px) {
  .cd-channel-scroller { scroll-snap-type: x proximity; }
}
.cd-channel-scroller::-webkit-scrollbar { display: none; }

/* Cursor-only affordance for the desktop wheel/drag handling in theme.js —
   no rendered element, so it doesn't touch Figma pixel parity. Scoped to
   pointer:fine so touch devices (which get their own native scroll cursor,
   i.e. none) aren't affected. */
@media (min-width: 769px) and (pointer: fine) {
  .cd-channel-scroller { cursor: grab; user-select: none; }
  .cd-channel-scroller.is-dragging {
    cursor: grabbing;
    scroll-snap-type: none; /* let the drag land anywhere, not just a snap point */
  }
  /* Belt-and-suspenders alongside the dragstart preventDefault in theme.js —
     without this, mousedown-drag on a card image starts a native ghost-image
     drag instead of ours. */
  .cd-channel-shot img { -webkit-user-drag: none; user-drag: none; }
}
/* Not scoped to the pointer:fine media query above — JS only ever adds this
   class on desktop, but the snap-suppression it needs is unconditional. */
.cd-channel-scroller.is-auto-scrolling {
  /* Same reasoning as .is-dragging: mandatory snap reasserts itself between
     individual scrollLeft writes, so a slow rAF-driven creep never actually
     moves (each frame's fractional-px step gets reverted to the nearest
     snap point before the next one lands) — confirmed by instrumenting the
     auto-scroll step function. */
  scroll-snap-type: none;
}

/* Pagination dots — node 1535:2192. Wired to the scroller in theme.js: the
   design draws 4 dots for 5 cards, so each dot maps to a fraction of the
   scroll range rather than to one specific card. Clicking a dot scrolls
   there; the active dot follows the live scroll position. */
.cd-channel-dots {
  display: flex;
  justify-content: center;
  align-items: center;
  gap: 8px;
  width: fit-content;
  margin: 32px auto 0;
  padding: 6px 8px;
  border-radius: 32px;
  background: #FFF;
  box-shadow: inset 0 0 0 1px #FFF;
}
.cd-channel-dot {
  display: block;
  width: 12px;
  height: 6px;
  border-radius: 6px;
  background: #DEDEDE;
  cursor: pointer;
  transition: width .18s ease, height .18s ease, background .18s ease;
}
.cd-channel-dot:focus-visible {
  outline: 2px solid var(--cd-accent);
  outline-offset: 3px;
}
.cd-channel-dot.is-active {
  width: 20px;
  height: 10px;
  background: var(--cd-accent);
}

.cd-channel-track {
  display: flex;
  gap: 24px;
  /* One card in each frame is 4px taller than the rest, because its panel
     export is 4px taller (desktop card 1: a 450×311 shot vs 442×307;
     mobile card 2: a 2-line h3). Figma centres the shorter cards against
     it, in BOTH frames:
       desktop row 1535:1974 = (80,229) 1280×471; card 1 (1535:1975) y=229
         h=471, cards 2–5 (1535:2073/2080/2178/2185) y=231 h=467 → +2 top,
         −2 bottom.
       mobile row 1541:6401 = (20,189) 741×300.42; card 2 (1541:6500) y=189
         h=300.42, cards 1/3/4/5 (1541:6402/6507/6605/6612) y=191 h=296.42
         → the same ±2.
     This was read as auto-layout rounding in Aug 2026 and "corrected" to
     flex-end for a flush bottom; it is not rounding — a symmetric ±2 about
     a different card in each frame is what counter-axis CENTER produces,
     and flex-end put every short card 2px low against the reference. */
  align-items: center;
  width: max-content;
  padding-inline: var(--cd-gutter);
}

.cd-channel {
  flex: none;
  padding: 16px;
  border-radius: 16px;
  background: rgba(255,255,255,.64);
  display: flex;
  flex-direction: column;
  /* Custom property, not a literal, because .cd-channel p's negative margin
     is derived from it — see that rule. Mobile re-points it to 9.263px. */
  --cd-channel-gap: 16px;
  gap: var(--cd-channel-gap);
  scroll-snap-align: start;
}
/* Inner panel keeps the exported PNG at its authored size — 450×311 for
   card 1, 442×307 for the rest — so nothing is stretched. */
.cd-channel-shot {
  width: var(--cd-shot-w);
  height: var(--cd-shot-h);
  border-radius: 8px;
  /* #FAFAFA, not the old cream --cd-paper: the frame (node 1535:1975+)
     renders these panels on rgb(250,250,250). Only a fallback now — the
     opaque .webp covers the box edge-to-edge. The 2026-08-30 re-export
     both re-cushioned cream -> #FAFAFA AND baked the frame's card shadow
     (Figma node 1535:1978: 0 3.458px 13.833px rgba(0,104,117,.05), 1x
     panel px; mobile 1541:6405: 0 2.002px 8.008px) back into the image —
     it sits around the inner white card, so it can't live in CSS on this
     box. Regenerate both from a fresh export set with
     scripts/recolor-channel-cushions.py if these assets are ever re-cut. */
  background: #FAFAFA;
  overflow: hidden;
}
.cd-channel-shot picture {
  display: block;
  width: var(--cd-shot-w);
  height: var(--cd-shot-h);
}
.cd-channel-shot img {
  display: block;
  width: var(--cd-shot-w);
  height: var(--cd-shot-h);
}
.cd-channel h3 {
  margin: 0;
  font-family: "Geist", sans-serif;
  font-weight: 500;
  font-size: 24px;
  line-height: 32px;
  /* Figma's node has no tracking — override the sitewide h1-h4 -0.025em
     reset in style.css (see .cd-lever-title for the same fix/reasoning). */
  letter-spacing: normal;
  color: var(--cd-ink);
}
.cd-channel p {
  /* Figma's h3→paragraph gap is exactly HALF the card's own gap in both
     frames — desktop 8px inside a 16px gap (nodes 1535:2078 y=570 h=32 →
     1535:2079 y=610), mobile 4.63125px inside 9.2625px (1541:6498 y=3954.96
     h=20 → 1541:6499 y=3979.59). The card is a flex column, so the pair is
     pulled back up by half the gap rather than given its own wrapper.
     Derived from --cd-channel-gap, not hard-coded: a literal -8px was
     leaving mobile's pair 3.37px too tight, which shrank every mobile card
     to 293px against the frame's 296.42 (node 1541:6402) and dragged the
     dots + section bottom up with it. */
  margin: calc(var(--cd-channel-gap) / -2) 0 0;
  max-width: var(--cd-shot-w);
  font-family: "Geist", sans-serif;
  font-weight: 400;
  font-size: 16px;
  line-height: 24px;
  color: var(--cd-muted);
}
/* Figma narrows each card's body-text box below the full 442px shot width
   so specific words fall on specific lines (per-card node widths: card 2 =
   428px — node 1535:2079 — and cards 3–5 = 409px, nodes 1535:2177/2184/2191)
   — card 1 is the only one left at full width (1535:2072, 450px).

   min-height pins the paragraph to Figma's 3-line box. Every card's text
   block is exactly 112px tall in the frame (1535:2070/2077/2175/2182/2189 =
   32px h3 + 8px gap + 72px p), which is what keeps the row even. Cards 1 and
   3–5 fill all three lines with real copy; card 2's is short and Figma pads
   it with a trailing empty line — the reference PNG renders only two lines
   ("…and parts. Weekly / cadence. Local citations. Review velocity.") inside
   a 72px box. So the third line is whitespace, expressed here as a
   min-height rather than by inventing an empty <p> in the copy. Until
   2026-08-28 this was faked the other way round, by squeezing card 2's box
   to 348px so its real copy wrapped to three lines — that matched the height
   but not the design's line breaks, and predates the 2026-08-25 Figma
   refresh that set the box to 428px. */
@media (min-width: 769px) {
  .cd-channel p { min-height: 72px; }
  .cd-channel-track > .cd-channel:nth-child(2) p { max-width: 428px; }
  .cd-channel-track > .cd-channel:nth-child(3) p,
  .cd-channel-track > .cd-channel:nth-child(4) p,
  .cd-channel-track > .cd-channel:nth-child(5) p { max-width: 409px; }
}

/* ═════════════ ANSWER ARCHITECTURE — node 1288:5598 ═════════════════
   Rows are right-aligned and step inward: 1280 → 1230 → 1171.
   Card structure mirrors the Figma frame exactly: the outer row centers
   the [kicker+body group] against the [ghost number] as a whole
   (items-center), while inside that group the kicker top-aligns with the
   body (items-start) — it is NOT centered against the (taller) paragraph.
   See node 1288:5603/5604 metadata. */
.cd-phases { --cd-sec-y: 80px; } /* Figma pads this frame 80px, not the sitewide 60 */
.cd-phases .cd-h2 { margin-bottom: 40px; }
.cd-phase-stack {
  display: flex;
  flex-direction: column;
  align-items: flex-end;
  gap: 24px;
}
.cd-phase {
  width: var(--cd-phase-w);
  max-width: 100%;
  padding: 16px;
  border-radius: 16px;
  background: var(--cd-tan);
  display: flex;
  align-items: center;
  justify-content: space-between;
  gap: 16px;
}
.cd-phase-group {
  display: flex;
  align-items: flex-start;
  gap: 16px;
  /* Not flex-grown — Figma's kicker+paragraph group doesn't stretch to fill
     the row; .cd-phase's justify-content:space-between pins .cd-phase-num
     to the far edge instead, leaving a real gap. Shrink stays enabled
     (flex-shrink:1, not "none") purely as a safety valve for the
     769–1023px tablet range, which sits between the two Figma frames and
     so isn't pixel-verified — without it, the fixed-width kicker+body
     below would overflow a shrunk card instead of reflowing. */
  flex: 0 1 auto;
  min-width: 0;
  max-width: 100%;
  /* Unset on cards 1–2; card 3's inner row frame (1288:5622) is 120px
     tall against 92px of actual text — real extra space in the source
     file, reproduced via the --cd-phase-h custom property. */
  height: var(--cd-phase-h, auto);
}
.cd-phase-kicker {
  flex: none;
  width: 185px;
  font-family: "Geist", sans-serif;
  font-weight: 600;
  font-size: 20px;
  line-height: 28px;
  letter-spacing: 2.5px;
  text-transform: uppercase;
  color: var(--cd-gold);
}
.cd-phase-body {
  /* flex-basis pinned to Figma's hard-coded box (node 1288:5607/5616/5625)
     so it wins at full desktop width, but flex-shrink:1 + min-width:0 let
     it compress at in-between viewport widths instead of overflowing —
     see the .cd-phase-group comment above. */
  flex: 0 1 var(--cd-phase-body-w);
  min-width: 0;
  max-width: 100%;
  display: flex;
  flex-direction: column;
  gap: 12px;
}
.cd-phase-body h3 {
  margin: 0;
  font-family: "Geist", sans-serif;
  font-weight: 500;
  font-size: 24px;
  line-height: 32px;
  /* Figma's node has no tracking — see .cd-lever-title for why this needs
     an explicit override against style.css's sitewide h1-h4 reset. */
  letter-spacing: normal;
  color: var(--cd-ink);
}
.cd-phase-body p {
  margin: 0;
  font-family: "Geist", sans-serif;
  font-weight: 400;
  font-size: 16px;
  line-height: 24px;
  color: var(--cd-muted);
}
.cd-phase-num {
  flex: none;
  font-family: "Geist", sans-serif;
  font-weight: 700;
  font-size: 60px;
  line-height: 70px;
  color: var(--cd-tan-num);
}

/* ═══════════ DARK PANELS — nodes 1288:5629 / 1288:5797 ══════════════
   Radial: rx 2118 / ry 428 centred at (570, 13) of a 1280×402 card. */
.cd-dark {
  position: relative;
  overflow: hidden;
  border-radius: 16px;
  border-bottom: 1px solid rgba(42,228,156,.12);
  background-color: #02110C;
  background-size: 100% 100%;
  background-repeat: no-repeat;
  color: #FFF;
}
/* Each dark panel carries its own exported gradient — the band and the two
   start cards are authored at different viewBoxes in Figma. */
.cd-band          { background-image: url('../img/car-dealership/bg-band.svg'); }
.cd-start-card--1 { background-image: url('../img/car-dealership/bg-start-1.svg'); }
.cd-start-card--2 { background-image: url('../img/car-dealership/bg-start-2.svg'); }
.cd-dark-orb {
  position: absolute;
  width: 347px;
  height: 347px;
  border-radius: 50%;
  background: rgba(124,202,179,.30);
  filter: blur(112px);
  pointer-events: none;
}
.cd-dark-orb--l { left: -71px;  top: -26px; }
.cd-dark-orb--r { right: -71px; top: 110px; }
/* The start-card instance of this shared "AI Search Circle" component
   carries a different literal Figma position than .cd-band's copy — at
   628px card width its right orb sits almost entirely past the right
   edge (left:967 of 628), leaving the corner essentially the gradient's
   own darkest stop with no added glow. Verified against the Figma PNG
   export: bottom-right corner pixel ≈ rgb(2,17,12), i.e. no orb visible.
   Scoped here rather than changed on the shared rule since .cd-band's
   own (1280px-wide) panel is unaffected. */
.cd-start-card .cd-dark-orb--r { left: 967px; right: auto; top: 110px; }

.cd-band-sec { padding-block: 40px; }
.cd-band {
  padding: 40px;
  display: flex;
  flex-direction: column;
  align-items: center;
  gap: 24px;
  text-align: center;
}
/* 902px, not the panel's full 1200px content box: in Figma the heading and
   the body copy share one hugging auto-layout column (node 1535:2234) whose
   width is set by the copy's fixed 902px, and the heading is "fill
   container" inside it. At 601px the heading wrapped to two lines and grew
   the whole section 92px past the Figma frame. */
.cd-band .cd-h2 { width: 902px; max-width: 100%; }
/* The italic run is white here, not the accent green .cd-h2 em uses on
   light sections — Figma's span (1535:2235) sets only font/style and
   inherits the panel's white. */
.cd-band .cd-h2 em { color: inherit; }
/* Redundant since .cd-h2's base is now `normal` too (this heading was simply
   the first place the wrong -2.38px was caught, before it was understood to
   be page-wide). Kept because it also has to beat `.cd-h2--on-dark`, and as
   the record of the measurement: the inherited -2.38px pulled this line 88px
   in — 767px measured against the reference PNG's 848px — which is most of
   why it used to need a second line. */
.cd-band .cd-h2,
.cd-band .cd-h2 em { letter-spacing: normal; }
/* 912px is a deliberate 10px over Figma's literal 902px (node 1535:2237) —
   the one place on this page where copying the exact number is wrong.
   Chrome sets this string ~1.5% wider in Geist than Figma's rasterizer
   does: Figma's own first line measures 893px in the reference PNG, the
   identical substring measures 906px here. At 902px it therefore wrapped to
   three lines with an orphaned "hours.", making the panel 324px instead of
   Figma's 296px. The box is centered and has no visible edge, so the extra
   10px changes nothing but the wrap point, and restores Figma's own line
   break ("...and your competing / dealers..."). Re-measure before trusting
   this if the Geist woff2 is ever updated. */
.cd-band-copy {
  position: relative;
  margin: 0;
  width: 912px;
  max-width: 100%;
  font-family: "Geist", sans-serif;
  font-weight: 400;
  font-size: 18px;
  line-height: 28px;
  color: #FFF;
}
/* This CTA is the plain hero .cd-btn--accent — same gradient / weight /
   tracking / inset top-light, same 14/16/12 padding-block (the Geist
   optical-centre nudge that nets 50px). The only thing this section needs
   to add is `position: relative`, so the button paints above the absolutely
   -positioned .cd-dark-orb glows behind it. It used to re-declare an
   explicit `height: 50px` + symmetric `padding: 12px 16px` (label rode
   ~1.5px high) and a `border: 1px solid rgba(255,255,255,.12)` that Chrome
   renders as a visible pale-green rim the Figma frame doesn't show — the
   same stroke the hero's --accent rule documents dropping. Removed here so
   all four arrow CTAs on the page render identically to the hero. */
.cd-band .cd-btn { position: relative; }

/* ═══════════ FOUNDING PARTNER CASE — node 1535:2242 ═════════════════ */
/* 2026-08-25 Final Design refresh collapsed this from a 2-column
   copy/stats grid with a 3-paragraph narrative into a centered
   heading+subhead stack over a single row of 3 stat cards — verified via
   get_design_context, not a layout guess. */
.cd-case { --cd-sec-y: 80px; }
.cd-case-stack {
  display: flex;
  flex-direction: column;
  align-items: center;
  gap: 40px;
}
.cd-case-copy {
  display: flex;
  flex-direction: column;
  align-items: center;
  gap: 16px;
  width: 851px;
  max-width: 100%;
  text-align: center;
  text-transform: capitalize;
}
.cd-case-copy .cd-h2 { width: 735px; max-width: 100%; margin: 0; }
.cd-case-copy p {
  margin: 0;
  width: 100%;
  font-family: "Geist", sans-serif;
  font-weight: 400;
  font-size: 18px;
  line-height: 28px;
  color: var(--cd-muted);
}

.cd-case-stats {
  display: flex;
  gap: 16px;
  align-items: center;
  justify-content: center;
  width: 1085px;
  max-width: 100%;
}
.cd-stat {
  display: flex;
  flex: 1 1 0;
  min-width: 0;
  flex-direction: column;
  align-items: flex-start;
  justify-content: center;
  gap: 16px;
  padding: 17px;
  /* Inset stroke, not a layout-growing border — see .cd-lever for why. */
  box-shadow: inset 0 0 0 1px #FFF;
  border-radius: 16px;
  background: #FAFAFA;
}
.cd-stat b {
  font-family: "Geist", sans-serif;
  font-weight: 700;
  font-size: 36px;
  line-height: 1.3;
  color: var(--cd-accent);
}
.cd-stat span {
  font-family: "Geist", sans-serif;
  font-weight: 400;
  font-size: 16px;
  line-height: 24px;
  color: var(--cd-muted);
}

/* ════════════════════ OPERATORS — node 1535:2261 ════════════════════ */
/* 2026-08-25 Final Design refresh flattened the old 2-col+tall-card
   layout into one row of 3 equal cards using the same icon-box pattern
   as .cd-intro-card — verified via get_design_context, not a guess. */
/* 2026-08-28 structural-audit finding (desktop, node 1535:2265/2271/2277):
   our 3 cards measure 416px (3×416 + 2×16 gap = 1280, exactly the section's
   content box) vs Figma's 409.78px per card. This is Figma's OWN row
   under-filling its 1279.5px container, not our width being wrong — its 3rd
   card ends at x=1341.38, leaving 18.12px of unclaimed space before the
   1359.5 right edge (vs .cd-intro's 4-card row, which fills its identical
   1279.5px box exactly: 4×307.875 + 3×16 = 1279.5). Same class of auto-layout
   looseness as the two structurally-identical .cd-qual-list rows measuring
   88 vs 85.5 (see that section). Equal-fill 416px cards match the design
   intent the intro row demonstrates; do not shrink these to chase 409.78. */
.cd-ops { background: #FAFAFA; --cd-sec-y: 80px; }
.cd-ops .cd-wrap {
  display: flex;
  flex-direction: column;
  align-items: center;
  gap: 60px;
}
.cd-ops .cd-h2 { width: 690px; max-width: 100%; }
.cd-ops-grid { display: flex; gap: 16px; align-items: stretch; width: 100%; }
.cd-op {
  display: flex;
  flex: 1 1 0;
  min-width: 0;
  flex-direction: column;
  align-items: flex-start;
  /* Cards stretch to the tallest sibling (align-items:stretch on the grid);
     top-align the content so the icons/headings line up across the row.
     The Figma frame looks centred only because its short cards carry three
     trailing zero-width-space lines (documented phantom-line defect) that
     pad them to full height — our markup omits those, so centring here left
     cards 1-2 visibly dropped. */
  justify-content: flex-start;
  gap: 16px;
  padding: 24px;
  border-radius: 16px;
  background: #FFF;
}
.cd-op-icon {
  display: flex;
  flex: none;
  align-items: center;
  justify-content: center;
  width: 42px;
  height: 42px;
  border-radius: 8px;
  background: #FAFAFA;
  box-shadow: inset 0 0 0 1px #FFF;
}
.cd-op-icon img { display: block; width: 20px; height: 20px; }
.cd-op h3 {
  margin: 0;
  font-family: "Geist", sans-serif;
  font-weight: 500;
  font-size: 20px;
  line-height: 24px;
  /* Figma's node has no tracking — see .cd-lever-title for why this needs
     an explicit override against style.css's sitewide h1-h4 reset. */
  letter-spacing: normal;
  color: var(--cd-ink);
}
.cd-op p {
  margin: 0;
  font-family: "Geist", sans-serif;
  font-weight: 400;
  font-size: 16px;
  line-height: 24px;
  color: var(--cd-muted);
}

/* ═══════════════════ QUALIFIER — node 1288:5699 ═════════════════════ */
.cd-qual { padding-block: 80px; }
.cd-qual .cd-wrap {
  display: flex;
  flex-direction: column;
  align-items: center;
  gap: 32px;
}
.cd-qual .cd-h2 { width: 607px; max-width: 100%; }
/* Node 1535:2312 — the list and the CTA bar sit 24px apart, not the 32px
   the section column uses between the heading and the list. */
.cd-qual-body {
  display: flex;
  flex-direction: column;
  gap: 24px;
  width: 100%;
}

/* 2026-08-25 Final Design refresh replaced the 2-column hairline-divided
   list with a 3x2 grid of individually-rounded cards — verified via
   get_design_context, node 1535:2308. */
.cd-qual-list {
  display: grid;
  grid-template-columns: repeat(3, 1fr);
  gap: 16px;
  width: 100%;
  margin: 0;
  padding: 0;
  list-style: none;
}
.cd-qual-list li {
  display: flex;
  align-items: center;
  gap: 12px;
  padding: 20px;
  border-radius: 16px;
  background: #FAFAFA;
}
.cd-qual-list span:not(.cd-check) {
  font-family: "Geist", sans-serif;
  font-weight: 400;
  font-size: 16px;
  line-height: 24px;
  color: var(--cd-muted);
}
.cd-check {
  flex: none;
  width: 20px;
  height: 20px;
  border: 1px solid var(--cd-accent);
  border-radius: 4px;
  background: rgba(236,248,243,.5);
  color: var(--cd-accent);
  display: inline-flex;
  align-items: center;
  justify-content: center;
}
.cd-check svg { width: 12px; height: 12px; }

.cd-qual-bar {
  width: 100%;
  padding: 24px;
  border-radius: 12px;
  background: var(--cd-forest);
  display: flex;
  align-items: center;
  justify-content: space-between;
  gap: 24px;
}
.cd-qual-bar-copy { display: flex; flex-direction: column; gap: 8px; max-width: 958px; }
.cd-qual-bar-title {
  margin: 0;
  font-family: "Geist", sans-serif;
  font-weight: 500;
  font-size: 24px;
  line-height: 1.3;
  color: #FFF;
  text-transform: capitalize;
}
.cd-qual-bar-sub {
  margin: 0;
  font-family: "Geist", sans-serif;
  font-weight: 400;
  font-size: 18px;
  line-height: 28px;
  color: #D9D6D6;
}
/* The plain hero .cd-btn--accent (see .cd-band .cd-btn above for the full
   rationale). This section only needs `flex: none` so the button keeps its
   intrinsic width in the space-between row instead of being shrunk by the
   copy column. The explicit height / symmetric padding / pale-green border
   this used to re-declare are gone — they were the same divergence from the
   hero documented on .cd-band .cd-btn. */
.cd-qual-bar .cd-btn { flex: none; }

/* ═══════════════════════ FAQ — node 1535:2356 ═══════════════════════ */
/* #F8FAFC, sampled from the reference PNG's left margin at y=6000 — this is
   the only section with this tint (channels and ops use #FAFAFA, the rest
   are white). Without it .cd-faq-item's translucent white had nothing to sit
   on and every row rendered invisible; over this it lands on 252,252,253
   against Figma's 252,252,254. */
.cd-faq { --cd-sec-y: 80px; background: #F8FAFC; } /* Figma pads this frame 80px, not the sitewide 60 */
.cd-faq .cd-wrap {
  display: flex;
  flex-direction: column;
  align-items: center;
  gap: 40px;
}
.cd-faq .cd-h2 em { color: var(--cd-accent-alt); }

/* The 2026-08-25 refresh dropped the outer card this used to be (old node
   1288:5748): in node 1535:2359 the items are the full 970px at x=0 — no
   24px inset — and the reference PNG shows page background, not a card
   fill, both in the gaps between items (row y=5886 reads 248,250,252
   end to end) and at the container's own left edge, where the item box
   starts at exactly x=235. So no padding, fill, or stroke here anymore —
   this is now purely the 16px-gap column. */
.cd-faq-card {
  width: 970px;
  max-width: 100%;
  display: flex;
  flex-direction: column;
  gap: 16px;
}
.cd-faq-item {
  padding: 16px;
  border-radius: 16px;
  background: rgba(255,255,255,.6);
}
.cd-faq-item summary {
  display: flex;
  align-items: center;
  justify-content: space-between;
  gap: 24px;
  list-style: none;
  cursor: pointer;
  font-family: "Geist", sans-serif;
  font-weight: 500;
  font-size: 18px;
  line-height: 28px;
  color: var(--cd-ink);
}
.cd-faq-item summary::-webkit-details-marker { display: none; }
.cd-faq-item[open] summary {
  font-size: 19px;
  line-height: 29.45px;
  letter-spacing: -0.418px;
  margin-bottom: 16px;
}
/* Measured against the Figma reference PNG (node 1288:5748 export), not just
   the metadata dump: closed-item icon boxes sample at exactly 32×32px with an
   80px top-to-top pitch between consecutive items (64px item + 16px gap) —
   confirms the visible box is 32×32, not the 45.264 rotated bounding box.
   Figma's own auto-layout DOES size the *open* item's icon slot to that
   45.264 bounding box (a rotation side-effect), which is why the open row
   measures visibly taller than closed rows — reproduced below by animating
   .cd-faq-mark's own box only on [open], while the always-32×32
   .cd-faq-toggle-box carries the visible background/radius/rotation. */
.cd-faq-mark {
  flex: none;
  width: 32px;
  height: 32px;
  display: inline-flex;
  align-items: center;
  justify-content: center;
  transition: width .18s ease, height .18s ease;
}
.cd-faq-item[open] .cd-faq-mark {
  width: 45.264px;
  height: 45.264px;
}
/* 2026-08-28 structural-audit findings (both frames, open item only):
   Background+Border flags x-22.6, its child SVG flags x-15 y+7.3 w-7.1
   h-7.1. Both are the same rotation-bbox artifact the comment above
   already accounts for, one level further. Figma's own open-toggle node
   (1535:2364) sits at local x=915.37 inside its 938px-wide row (node
   1535:2361) — right edge 960.63, i.e. Figma's OWN rotated bbox overflows
   its row by 22.6px, because the auto-layout row was sized for the
   original unrotated 32×32 icon (right-flush at x=906..938, same as
   every closed item's "Border" node) and didn't reflow when rotation grew
   the box. Our flex row is right-anchored the opposite way — .cd-faq-mark
   growing to 45.264 pushes its left edge further INTO the row (toward the
   question text) rather than bleeding past the card's own padding — which
   is why our x sits 22.6px left of Figma's. Matching Figma's number
   exactly would mean the icon visually exits the rounded card on open;
   kept the current (contained) direction instead. The SVG glyph finding
   is the same effect one level deeper (its own 12×12 box, rotated with
   its parent, reports a rotated getBoundingClientRect — Figma's matching
   12×√2≈16.97 vs our glyph's real ink extents once the outer transform is
   applied), not an independent defect. */
.cd-faq-toggle-box {
  flex: none;
  width: 32px;
  height: 32px;
  box-sizing: border-box;
  display: inline-flex;
  align-items: center;
  justify-content: center;
  padding: 10px;
  border-radius: 8px;
  background: var(--cd-faq-mark);
  transition: background .18s ease, transform .18s ease;
}
.cd-faq-item[open] .cd-faq-toggle-box {
  background: var(--cd-faq-open);
  transform: rotate(45deg);
}
.cd-faq-toggle {
  width: 12px;
  height: 12px;
  color: #2B3A45; /* sampled from Figma's exported closed-state glyph */
  transition: color .18s ease;
}
.cd-faq-item[open] .cd-faq-toggle {
  color: #FFF;
}
.cd-faq-answer {
  max-width: 845px;
  font-family: "Geist", sans-serif;
  font-weight: 400;
  font-size: 16px;
  line-height: 24px;
  color: var(--cd-muted);
}

/* ═══════════════ TWO WAYS TO START — node 1288:5797 ═════════════════ */
/* 80px top, not the 40px carried over from the pre-2026-08-25 design: node
   1535:2404 puts its content frame at y=80, and the reference PNG's heading
   ink starts at row 6530 (box top 6518 = section 6438 + 80).

   Bottom is 120, not the 80 that node 1535:2404's own box implies (it is an
   80px-padded frame, height 580). The extra 40 stands in for the desktop
   footer frame's lead-in: Figma's footer (node 1535:2434) is a 40px
   transparent band on top of the dark block (`padding-top: 40px`), so the
   dark rectangle starts 40px below the start section. Our global
   `.site-footer` has no such lead-in and can't grow one without shifting
   every other page, so this section absorbs the 40 instead. Net
   section height 620; the desktop.json `.cd-start` h entry is bumped to
   match and explains the same thing. Mobile keeps 40/40 (its own frame,
   node 1541:6825, really is flat 40 — set in the @media block below). */
.cd-start { padding-top: 80px; padding-bottom: 120px; }
.cd-start .cd-h2 { margin-bottom: 40px; }
.cd-start-grid { display: flex; gap: 24px; align-items: stretch; }
.cd-start-card {
  flex: 1 1 0;
  min-width: 0;
  padding: 32px;
  display: flex;
  flex-direction: column;
  align-items: center;
  gap: 24px;
  text-align: center;
}
.cd-start-card h3 {
  position: relative;
  margin: 0;
  font-family: "Geist", sans-serif;
  font-weight: 500;
  font-size: 36px;
  line-height: 1.3;
  /* Node 1535:2413 sets no tracking (mobile 1541:6832 does — see the mobile
     block, which keeps -2.38px there). */
  letter-spacing: normal;
  color: #FFF;
  text-transform: capitalize;
}
.cd-start-card p {
  position: relative;
  margin: 0;
  font-family: "Geist", sans-serif;
  font-weight: 400;
  font-size: 20px;
  line-height: 28px;
  color: #FFF;
}
/* Both start-card CTAs only need `position: relative` (paint above the
   .cd-dark-orb glows) + the 8px top margin. Card 1's button is the plain
   hero .cd-btn--accent; card 2's is the plain hero .cd-btn--dark (solid
   white / dark text — set via the class in the template). The per-card
   overrides that used to live here re-declared the whole variant plus an
   explicit height, symmetric padding and a pale 1px rim — the same drift
   from the hero documented on .cd-band .cd-btn. Dropped so every CTA on
   the page renders identically to the hero pair. */
.cd-start-card .cd-btn { position: relative; margin-top: 8px; }
.cd-start-note {
  display: flex;
  align-items: center;
  justify-content: center;
  gap: 32px;
  margin: 24px 0 0;
  text-align: center;
  font-family: "Geist", sans-serif;
  /* Node 1535:2432 is Geist Medium (500), not the 400 the rest of the page's
     muted copy uses. */
  font-weight: 500;
  font-size: 18px;
  line-height: 28px;
  color: var(--cd-muted);
}
/* Flanking rules — Figma nodes 1535:2431 / 1535:2433: a 0-height line each
   side of the note, laid out flex-[1_0_0] with a 32px gap to the text
   (407 + 32 + 402 + 32 + 407 = 1280). Sampled straight off figma-desktop.png:
   a crisp 2px band of #D5D5D5, no feather. Desktop only — the mobile frame
   (node 1541:6851) is a bare centred text node with no rules. */
.cd-start-note::before,
.cd-start-note::after {
  content: "";
  flex: 1 1 0;
  min-width: 0;
  height: 2px;
  background: #D5D5D5;
}

/* ══════════════════════════════════════════════════════════════════════
   MOBILE — mirrors the 375px Figma frame (node 1288:6044).
   Gutter 20 · section padding 40 · h1/h2 32 · single column throughout.
   ══════════════════════════════════════════════════════════════════════ */
@media (max-width: 1023px) {
  .cd-page { --cd-gutter: 40px; --cd-sec-y: 48px; }
  .cd-h2 { font-size: 38px; letter-spacing: -1.6px; }
  .cd-h2--42 { font-size: 36px; }
  .cd-hero-title { font-size: 48px; letter-spacing: -1.6px; }

  .cd-case-stats { flex-direction: column; align-items: stretch; }
  .cd-intro-cards { flex-direction: column; align-items: stretch; }
  /* Mobile keeps the base 24/24/48 padding — same as desktop. The mobile
     frame's cards (nodes 1546:2624/2635/2647/2679 = 266/242/266/266) are each
     24px taller than their real copy because every body node carries a
     trailing zero-width-space <p> that Figma counts as an extra 24px line
     (card 4 carries two). Per the client (2026-08-30, "we want them exactly
     like the figma") that ghost line is reproduced as 24px of real bottom
     padding, not as empty <p> tags — see the base rule. This reverses the
     earlier "stale whitespace, keep 24px" call for mobile. Card 4 still lands
     ~24px under Figma's 266 (its second ghost line isn't padded for); chasing
     that one is the phantom-line rabbit hole the workflow doc warns off. */
  .cd-lever-row { flex-direction: column; align-items: stretch; }
  .cd-lever { width: 100%; }
  /* Drop .cd-lever-top's 32px min-height once the row stacks. That min-height
     exists ONLY to line the two cards' pills up while they sit side by side
     (see the base rule) — with the cards stacked there is no row to align
     across, and Figma's stacked frame hugs each card's own top row instead:
     node 1546:2742 (lever 01, 32px icon box) is 32 tall, node 1546:2758
     (lever 02, 24px icon box) is 28 — the pill's own height, confirmed via
     get_design_context as `flex items-center justify-between` with no height.
     Holding 32 on lever 02 pushed its body and foot 4px down and made the
     card 4px too tall: measured 401.8 against the frame's 398.2 (1546:2754),
     which is what put every one of its children ~20.6px out in the audit
     instead of the documented 24px phantom-line offset. */
  .cd-lever-top { min-height: 0; }
  .cd-ops-grid { flex-direction: column; }
  .cd-phase { width: 100% !important; }
  .cd-start-grid { flex-direction: column; }
  /* Mobile frame 1541:6851 has no flanking rules — drop the desktop treatment
     back to plain centred text once the cards stack. */
  .cd-start-note { display: block; }
  .cd-start-note::before,
  .cd-start-note::after { display: none; }
}

/* ═══════════════════ FOOTER — node 1288:5825 ════════════════════════
   Removed 2026-08-14: this page now uses the shared site-wide footer
   unmodified, to match /customers/med-spa/ exactly. Nothing below this
   comment restyles .site-footer for .cd-page anymore. */

/* ══════════════════════════════════════════════════════════════════════
   MOBILE — authored against the 375px Figma frame (node 1288:6044).
   Values below are that frame's values, section by section, not a
   proportional shrink of the desktop layer.

   Frame constants: 375 wide · gutter 20 · section padding 40
   · all section headings 32/1.3/-2.38 (the intro is the one exception at 26)
   ══════════════════════════════════════════════════════════════════════ */
@media (max-width: 768px) {
  .cd-page { --cd-gutter: 20px; --cd-sec-y: 40px; }
  /* Every mobile section frame in node 1541:5945 pads 40px top/bottom — the
     desktop frames use 80, and those 80s are declared on the section elements
     themselves (`.cd-intro { --cd-sec-y: 80px }` etc.), which outrank the
     `.cd-page` value above no matter how far down the file it sits. Reset
     them here or the whole page carries +80px of dead space per section. */
  .cd-intro,
  .cd-levers,
  .cd-channels,
  .cd-phases,
  .cd-case,
  .cd-faq,
  .cd-ops { --cd-sec-y: 40px; }

  /* Mobile headings carry NO tracking at all — every h1/h2 text node in node
     1541:5945 comes back from get_design_context with a bare `text-[32px]` /
     `leading-[1.3]` and no `tracking-*` class (spot-checked on the hero
     1541:6290, intro 1546:2622 and levers 1546:2736; the desktop -2.38px is a
     48px-only value). The old per-section italic tracking below was tuned
     against the superseded 1288:6044 frame; at 32px those negative values
     pull each line ~4-6% narrower than Figma's, which silently moves every
     heading's wrap point (e.g. the hero fitting "Stop" onto line 1). The
     `normal` keyword — not 0 — is required to beat style.css's sitewide
     `h1,h2,h3,h4 { letter-spacing: -0.025em }`. */
  .cd-page .cd-h2,
  .cd-page .cd-h2--42,
  .cd-page .cd-h2 em,
  .cd-page .cd-hero-title,
  .cd-page .cd-hero-title em { letter-spacing: normal; }
  /* …with a growing list of exceptions, all of which DO carry
     `tracking-[-2.38px]` in the frame: the mid-page CTA band's heading (node
     1541:6656), the "two ways to start" heading (node 1541:6827, which is
     additionally `whitespace-nowrap` — it must stay on one line), the
     channels heading ("Every channel that brings shoppers to your lot."),
     the Answer Architecture heading, and the founding-partner case-study
     heading. The blanket `normal` above was set from get_design_context
     spot-checks that only covered the hero, intro and levers headings — the
     other section headings were never checked, and the exported mobile
     reference shows them tracked the same -2.38px as desktop (e.g. channels
     "Every Channel That" measures ~244px against the frame vs ~284px
     untracked). The `.cd-phases` / `.cd-case` reference copy is stale
     (med-spa "For Medical Aesthetics"; the unresolved "~20% of/out of" edit
     — see the template header notes), but the tracking is unambiguous in the
     render. Without the band/start pair the headings pick up an extra line
     each and push the page 88px taller. */
  .cd-page .cd-h2--on-dark,
  .cd-page .cd-band .cd-h2 em,
  .cd-page .cd-start .cd-h2,
  .cd-page .cd-start .cd-h2 em,
  .cd-page .cd-channels .cd-h2,
  .cd-page .cd-channels .cd-h2 em,
  .cd-page .cd-phases .cd-h2,
  .cd-page .cd-phases .cd-h2 em { letter-spacing: -2.38px; }
  /* The founding-partner case heading is the one section confirmed against a
     non-stale node: get_design_context on 1541:6665 returns
     `tracking-[-1.38px]` (not -2.38px). At 32px the -2.38px value rendered
     ~1 word too tight per line — "the" pulled onto line 2, "one" onto line 3
     — vs the frame's "…partner cut ~20% of / the aggregator spend in / one
     year." Verified: -1.38px reproduces that wrap exactly. */
  .cd-page .cd-case .cd-h2,
  .cd-page .cd-case .cd-h2 em { letter-spacing: -1.38px; }
  /* `.cd-band .cd-h2 em` is listed because node 1541:6656 is a SINGLE
     unstyled run on mobile — "Ready to stop renting your customers?" with no
     italic span and -2.38px across the whole string — whereas desktop
     (1535:2235) splits it and italicises "your customers?". The shared markup
     carries the <em> for desktop's sake, so without this line the em would
     pick up the `normal` above and the mobile heading would render two
     different trackings inside one line. */
  /* …and, for the same reason, the em must drop the base `.cd-h2 em`
     Lato-italic-serif face on mobile: frame 1541:6656 is one uniform upright
     Geist run, so "Your Customers?" renders in the SAME font/style as the
     rest of the line here, not the condensed white italic it was inheriting
     (the "more letter-spacing in Figma" report — it's the Geist run that
     looks looser next to Lato Italic, not a tracking bug). Tracking already
     matched to the Geist run above. */
  .cd-page .cd-band .cd-h2 em {
    font-family: "Geist", sans-serif;
    font-style: normal;
    line-height: inherit;
  }
  .cd-h2,
  .cd-h2--42 { font-size: 32px; line-height: 1.3; }

  /* Header: see the note at the top of this file — the global .site-header
     is used as-is on mobile too, so node 1288:6045's nav row is not ported. */

  /* ── Hero — 375×664 ─────────────────────────────────────────────── */
  .cd-hero {
    /* Spec frame is 664, but our stack is ~55px shorter than Figma's stale
       7-line copy, and with the stack bottom-anchored (below) that entire
       surplus collected as dead space between the .site-header and the H1.
       Per the client (2026-08-31) that gap reads too large on mobile, so the
       section is pulled up ~36px here — the bottom gap stays pinned at
       Figma's 31px, the CTA/rule/stat y-positions still land where the
       structural audit wants them, only the header→title clearance tightens. */
    min-height: 628px;
    /* Figma frame 1541:5946 is a fixed 664px. Its content frame (1541:6286,
       y:57→664 below the 57px mocked nav) VERTICALLY CENTERS the content
       stack (1541:6287, h 544.168) inside itself — (607−544.168)/2 = 31.416px
       of clearance above and below the stack. So Figma's real gap under the
       stat row is 31.4px, not the 24px an older frame (1301:103) had.

       We can't just `align-items: center` the same way: our stack is ~45px
       shorter than Figma's (the frame's stale 7-line sub-headline vs the
       page's correct 4-line one — workflow doc §1), and it centres below the
       real 81px .site-header, not Figma's 57px mock. Centring that shorter
       stack in the taller gap splits the surplus onto BOTH ends and the
       bottom gap balloons to ~42px (Saad flagged it against the frame).

       Instead: bottom-anchor the stack and pin the bottom gap to Figma's
       31px with padding-bottom. min-height (now 628 — see the note above)
       keeps the section close to the spec 664 while trimming the top
       surplus; what remains of it collects silently at the top (~17px on
       top of the padding's 24px floor gap) where it reads fine.
       padding-top stays real-header (81) + a floor gap. This also pulls the
       CTA row, rule and stat row down onto Figma's own y positions — the
       structural audit for .cd-hero drops from 11 boxes off to 1 (the
       title/lede block, which legitimately can't match the stale copy). */
    padding: 105px var(--cd-gutter) 31px;
    display: flex;
    align-items: flex-end;
  }
  /* 96px blocks — same as desktop (nodes 1288:6056 etc. are all size-[96px],
     not rescaled for mobile). A prior 64px override made the grid visibly
     denser than the Figma frame. Line-layer phase measured directly off the
     exported reference PNG: vertical lines land at x 91.5/187.5/283.5 (96px
     apart, one centered on the 375px frame) and the first horizontal line
     sits flush with the box's own top edge (y offset 0). The 4 extra
     "lit cell" layers inherited from the desktop rule (node coords for a
     1181px-wide grid) don't correspond to any mobile block position, so
     they're pushed off-canvas here rather than guessed.

     top: this box's y-position was originally 65px, copied straight from
     Figma's "BG" node y-offset inside the mobile Hero Section — but that
     Figma frame has no nav mock built into it there, so 65 wasn't actually
     measured against any header. The real global .site-header's CTA button
     bottom is 62px; matching the desktop fix's approach (grid top =
     real-button-bottom + breathing room, so the gap under the nav mirrors
     the gap above it) gives 62 + 18 = 80px — coincidentally the same value
     desktop already uses. */
  .cd-hero-grid {
    top: 80px;
    width: 375px;
    height: 266px;
    background-size: 96px 96px;
    background-position: 91.5px 0, 91.5px 0, 9999px 9999px, 9999px 9999px, 9999px 9999px, 9999px 9999px;
  }
  .cd-hero-glow--l { left: 0;    top: 337px; width: 122px; height: 407px; }
  .cd-hero-glow--r { right: 0;   top: 322px; width: 122px; height: 407px; }
  /* Node 1288:6049 (Ellipse 8): x:31 w:221.2 in the 375px frame — center is
     141.6px, not 187.5 (frame center). Not centered, ~46px left of center;
     a prior comment assumed "no equivalent offset" but the node data has
     one. */
  .cd-hero-glow--c { left: 31px; top: 145px; width: 221px; height: 183px; }

  /* gap 24 + the lede's -4px top margin reproduces node 1541:6289's 20px
     title→lede gap while leaving 24px everywhere else in the stack.

     Do NOT chase the frame's vertical positions inside this hero: the mobile
     frame's sub-headline (node 1541:6291) is a DIFFERENT, longer paragraph
     than the page's — "Dealers moving 200+ cars a month are paying $30K to
     $60K every month to CarGurus, Cars.com, and Autotrader…" vs the desktop
     frame's and the page's "We help Dealers that sell 50+ cars a month…"
     (pulled via get_design_context 2026-08-28; the copy divergence is the one
     the workflow doc §1 flags). That is 7 lines against our 4, i.e. 72px of
     content the page correctly does not have, so the CTA row lands 24px above
     the frame and the stat row 21px above it once the taller real header
     (see padding-top above) and the 1px <hr> are netted in. Both are correct;
     padding the lede out to match would mean shipping the frame's stale copy. */
  .cd-hero-inner { width: 335px; gap: 24px; }
  .cd-hero-title { width: 100%; font-size: 32px; line-height: 1.23; }
  .cd-hero-lede { margin-top: -4px; font-size: 16px; line-height: 24px; }

  /* Stacked and FULL-WIDTH. Figma's layout data reads `items-start`, but the
     rendered frame measures both buttons at x 20–354 — the full 335px content
     width — so they stretch. Verified against the exported mobile frame. */
  .cd-hero-ctas {
    flex-direction: column;
    align-items: stretch;
    gap: 16px;
    align-self: stretch;
  }
  .cd-hero-ctas .cd-btn { width: 100%; }

  /* Stats stay a ROW on mobile, at their own smaller type scale. */
  .cd-hero-stats {
    align-self: stretch;
    gap: 20.84px;
    margin-top: 0;
  }
  .cd-hero-stats li { gap: 4.168px; flex-shrink: 0; }
  .cd-hero-stats b { font-size: 14px; }
  .cd-hero-stats span { font-size: 10px; line-height: 16px; }
  /* All three labels carry an explicit width in the frame (nodes 1342:641,
     1342:644, 1342:647 — 93/118/83px), and the 3rd column's own li (node
     1342:645) is 95.342px wide. Summed with the 20.84px gaps that's
     ~348px — wider than the 335px hero column above it — confirmed
     against the exported reference PNG: column left edges land at x
     21/135/273, i.e. the row deliberately bleeds a few px into the right
     gutter rather than compressing. `flex-shrink: 0` stops the browser
     from squeezing the columns back down to fit. */
  .cd-hero-stats li:first-child span { width: 93px; }
  .cd-hero-stats li:nth-child(2) span { width: 118px; }
  .cd-hero-stats li:nth-child(3) { width: 95px; }
  .cd-hero-stats li:nth-child(3) span { width: 83px; }

  /* ── Intro — node 1546:2620 (375×1444) ─────────────────────────────
     Heading is LEFT-aligned here, not centred like desktop's, at the same
     32px/1.3 as every other mobile h2 and with no tracking (the desktop
     `.cd-intro .cd-h2 { letter-spacing: normal }` already covers that).
     Cards stack full-width and otherwise keep every desktop value —
     24/24/48 padding, 42px icon box, 16px gaps, 20/24 title, 16/24 body —
     the mobile frame does NOT step the type down a size.

     The frame's cards are 266/242/266/266 (nodes 1546:2624/2635/2647/2679);
     each body node (1546:2634, 2646, 2678, 2695) ends in a zero-width-space
     <p> Figma counts as an extra 24px line (2695 carries two). Per the
     client (2026-08-30) that line is reproduced as 24px of bottom padding
     — the same call as desktop — so cards 1-3 hit the frame heights. Card 4
     (2695) carries a second ghost line; per the client (2026-08-31) that
     extra padding was pulled back so the last card's bottom padding matches
     the others (48px base) rather than the 266px frame height. */
  .cd-intro .cd-wrap { gap: 24px; align-items: stretch; }
  .cd-intro .cd-h2--42 { font-size: 32px; text-align: left; }
  .cd-intro-cards { flex-direction: column; align-items: stretch; gap: 16px; }

  /* ── Levers — node 1546:2735 (375×979.4) ────────────────────────── */
  .cd-levers .cd-wrap { gap: 24px; }
  /* The refreshed mobile frame lets the heading run the full 335px content
     width and wraps naturally at "We Deliver Both Levers / Together." (node
     1546:2736 is w-335, h-83 = 2 lines). The old 234px box came from the
     superseded 1288:6044 frame and forced a different, narrower break. */
  .cd-levers .cd-h2 { width: 100%; max-width: 100%; margin-inline: auto; }
  /* Desktop lays the two cards side by side at a fixed 562px each — on a
     375px viewport that overflowed the frame, clipping card corners/text
     against the section edge instead of stacking. Figma's mobile frame
     stacks them full-width instead. Everything *inside* the card keeps its
     desktop values (24px card padding, 24px title→panel gap, 24/1.4 title,
     18.609px panel padding, 16/24 body) — node 1546:2739 confirms the
     mobile card is not a scaled-down variant. */
  .cd-lever-row { flex-direction: column; gap: 16px; }
  .cd-lever { width: 100%; }
  /* Desktop pins lever 2's body to a fixed 453px so its wrap point matches
     the Figma desktop frame exactly (see the comment on the base rule) —
     but the mobile frame has no such constraint, so the fixed width was
     forcing lever 2's paragraph to overflow the 335px-wide mobile card. */
  .cd-lever--2 .cd-lever-body { width: auto; }
  /* Mobile frame 1546:2742 / 1546:2758 drop the top-right trend arrow from the
     pill row entirely — the pill sits alone. (The desktop frame keeps it; the
     foot's "~20% Reduction" / "Compounding ROI" spark arrow stays on both.) */
  .cd-lever-top .cd-lever-icon-box { display: none; }

  /* ── Channels — node 1301:146. Cards shrink to a 260×180 panel. ─── */
  .cd-channels .cd-h2 { margin-bottom: 24px; }   /* stays centred on mobile */
  /* Node 1546:2817 sits 24px under the track, not desktop's 32. */
  .cd-channel-dots { margin-top: 24px; }
  .cd-channel-break { display: block; }
  .cd-channel-track { gap: 8px; padding-inline: 20px; }
  .cd-channel-scroller { scroll-padding-inline-start: 20px; }
  /* --cd-channel-gap (not a plain `gap`) because .cd-channel p derives its
     negative margin from it — Figma's mobile card gap is 9.2625px and its
     h3→p gap is exactly half that, 4.63125px (nodes 1541:6402/6497/6498). */
  .cd-channel { padding: 9.263px; border-radius: 9.263px; --cd-channel-gap: 9.263px; }
  .cd-channel-shot {
    width: 260px;
    height: 180px;
    padding: 16px;
    box-sizing: border-box;
    border-radius: 4.631px;
  }
  /* The desktop PNGs bake in their own #FAFAFA cushion sized for the desktop
     box; object-fit:cover can only crop the axis where the window is
     narrower than the (rescaled) image, so it never removes cushion on the
     other axis — a plain cover fill left the mobile mockup visibly smaller
     than Figma's (which fills this 228×148 window edge-to-edge). Fixed by
     swapping to a separately-cropped `*-mobile.webp` per card via
     <picture> (template-car-dealership.php) with the cushion trimmed to a
     thin uniform margin, so cover here only has to do minor rounding, not
     compensate for a whole baked-in margin. */
  .cd-channel-shot picture { width: 100%; height: 100%; }
  .cd-channel-shot img { width: 100%; height: 100%; object-fit: cover; }
  /* Figma pins every card's text column to the 260px shot width (per node
     1301:146: card 2's h3 is w-208, but all headings sit inside a 260px-wide
     column) — without this, an unwrapped h3 like "Reviews and Reputation
     Management" renders on one line and balloons that card to 376px while
     its siblings stay at 278.5px, breaking the uniform-width card carousel
     Figma shows. */
  /* Figma's mobile card text is one size class down from desktop (h3 24/32 →
     14/20, p 16/24 → 12/16, per node 1301:146) — the earlier mobile block
     only narrowed the column, it never dropped the font size, so text was
     rendering at desktop scale inside a card sized for the mobile scale. */
  .cd-channel h3 { font-size: 14px; line-height: 20px; width: 260px; }
  .cd-channel p { font-size: 12px; line-height: 16px; max-width: 260px; }
  /* Figma also narrows individual cards' text columns below the shared
     260px (node 1301:146: card 2's h3 is w-208, card 3's p is w-228, card
     5's p is w-236.773) to land specific line breaks — these are what make
     card 2 the tallest (its heading wraps to 2 lines) and match the row's
     overall height to Figma's (300.42px vs the 293px a uniform 260px column
     produces). */
  .cd-channel-track > .cd-channel:nth-child(2) h3 { width: 208px; }
  .cd-channel-track > .cd-channel:nth-child(3) p { max-width: 228px; }
  .cd-channel-track > .cd-channel:nth-child(5) p { max-width: 236.773px; }

  /* ── Answer Architecture — node 1301:1080.
       Kicker and ghost number share one row; body sits underneath. ─── */
  .cd-phases .cd-h2 { margin-bottom: 24px; }
  .cd-phase-stack { gap: 16px; }
  .cd-phase {
    flex-direction: column;
    align-items: stretch;
    gap: 16px;
    padding: 16px;
  }
  /* Flatten the desktop-only group wrapper so .cd-phase-kicker/.cd-phase-body
     participate directly in the grid below, per their own grid-row rules. */
  .cd-phase-group { display: contents; }
  .cd-phase-kicker {
    width: auto;
    font-size: 16px;
    line-height: 24px;
    order: 1;
  }
  .cd-phase-num {
    font-size: 32px;
    line-height: 40px;
    font-weight: 600;
    letter-spacing: 2.5px;
    order: 2;
  }
  .cd-phase-body { order: 3; gap: 12px; width: auto; }
  .cd-phase-body h3 { font-size: 20px; line-height: 24px; }
  /* Kicker + number on one line, spread apart. The row is items-center in
     Figma (node 1301:1087): the 24px kicker line centres against the 40px
     number, so align-self is required — grid's default stretch would give
     the kicker a 40px box and paint its line at the top, 8px high. */
  .cd-phase { display: grid; grid-template-columns: 1fr auto; }
  .cd-phase-kicker { grid-column: 1; grid-row: 1; align-self: center; }
  .cd-phase-num    {
    grid-column: 2; grid-row: 1; text-align: right; align-self: center;
    /* Figma right-aligns the numeral's glyph; CSS letter-spacing also emits
       a trailing 2.5px after the final digit, which would push the glyph
       that far in from the padding edge. Pull it back out. */
    margin-right: -2.5px;
  }
  .cd-phase-body   { grid-column: 1 / -1; grid-row: 2; }

  /* ── Mid CTA band — node 1301:1159 ──────────────────────────────── */
  .cd-band-sec { padding-block: 20px; }
  .cd-band { padding: 24px 16px; gap: 24px; }
  .cd-band .cd-h2,
  .cd-band-copy { width: 100%; }
  .cd-band-copy { font-size: 16px; line-height: 24px; }
  /* Figma's mobile button (node 1301:1167) fills the 303px content column,
     unlike the desktop band where it hugs its label. */
  .cd-band .cd-btn { margin-top: 0; width: 100%; }
  /* Same authored position as the start cards (see .cd-start-card rule):
     at 335px card width the right orb sits entirely off-canvas, so the
     mobile band gets the top-left glow only — no second bloom. */
  .cd-band .cd-dark-orb--r { left: 967px; right: auto; }

  /* ── Founding partner case — node 1541:6662 (375×794) ───────────────
     Copy stack → 40px → stat cards, exactly as desktop; the mobile changes
     are the subhead's size + leading (18/28 → 16/24 — get_design_context on
     node 1541:6666 returns `text-[16px]` / `leading-[24px]`, and it is h-96
     for 4 lines) and the cards stacking. The stat cards themselves keep
     their desktop 17px padding / 36px numeral (node 1541:6671 is h-47 =
     36 × 1.3), so no override for those. */
  .cd-case-copy p { font-size: 16px; line-height: 24px; }
  .cd-case-stats { gap: 16px; }

  /* ── Operators — node 1546:2927 (375×1119) ──────────────────────────
     Same 60px heading→cards gap as desktop (node 1546:2930 sits 60 below
     the h2) and the same .cd-intro-card-shaped cards; they just stack.
     The heading keeps Figma's own 289px measure (node 1546:2929) so it
     breaks "Built By Operators / Who Have Done / This At Scale." rather
     than pulling a word up at the full 335px width. */
  .cd-ops .cd-h2 { width: 289px; }
  .cd-ops-grid { gap: 16px; }
  /* 2026-08-28 structural-audit finding: card titles ("Business Building",
     "Growth Operations") looked flagged y±32-40 h+24 against nodes
     1546:2935/2941. Verified this is two separate non-issues, not a wrap:
     (1) our h3 shrink-wraps to its own text (171-178px) instead of
     Figma's 287px fill-width text node, so the audit's nearest-box match
     picks our .cd-op p (which genuinely differs in height) instead of the
     correctly-positioned h3 — a tool artifact, zero visual effect since
     text stays left-aligned inside either box width; (2) card 2's real
     y-offset (-72px) exactly matches this section's documented phantom
     blank-line inflation in card 1's description (see workflow doc §1,
     node 1546:2927 +72/+72px) — our titles render a true single line
     (h=24, confirmed via getBoundingClientRect) at the CORRECT position;
     Figma's reference is pushed down by its own phantom whitespace. Do
     not pad card 1's copy to chase that 72px — see COMMON brief §7. */

  /* ── Qualifier — node 1303:124 ──────────────────────────────────── */
  .cd-qual { padding-block: 40px; }
  .cd-qual .cd-wrap { gap: 24px; }
  /* Node 1546:3047 sits 32px under the h2 (24 wrap gap + 8 here); the list
     → bar gap is the wrap's own 24. */
  .cd-qual .cd-h2 { margin-bottom: 8px; }
  /* Figma's mobile node (1303:127) has no manual break — "We Do Our Best
     Work / With A Specific Kind Of / Dealer." is natural reflow across the
     full 335px width. The forced <br> (desktop-authored) instead orphans
     "With A" onto its own line here — drop it on mobile only. */
  .cd-qual-break { display: none; }
  .cd-qual-list { grid-template-columns: 1fr; gap: 16px; }
  /* Node 1547:3193's six items measure 88 / 88 / 112 / 85.5 / 85.5 / 85.5 —
     i.e. a uniform floor of ~85.5px regardless of whether the label runs to
     one line or two, with only the three-line item (1546:3060, 112 = 72 + 20
     top + 20 bottom) growing past it. Reproduced as desktop's 20px padding
     plus that floor as a min-height, rather than transcribing Figma's six
     different vertical paddings, which are an artifact of the desktop 3×2
     grid's row heights being carried into the mobile column. */
  .cd-qual-list li { padding: 20px; gap: 12px; min-height: 85.5px; }
  .cd-qual-list li span:not(.cd-check) { flex: 1 1 0; min-width: 0; }
  /* Figma node 1546:3070 keeps this one label on a single line where a 16px
     Geist string of ~283px (Chrome's metric) would otherwise wrap in the
     263px column the other items use — Figma fits it by cutting this item's
     right inset to 2px, left inset untouched so the checkbox stays aligned
     with its siblings. We match it by dropping this card's right padding to
     0 and tightening its checkbox gap to 8px (≈4px of slack at the 375px
     design width), and pin the label to nowrap so wider phones can't reflow
     it either. */
  .cd-qual-list li:nth-child(4) { padding-right: 0; gap: 8px; }
  .cd-qual-list li:nth-child(4) span:not(.cd-check) { white-space: nowrap; }
  /* 2026-08-28 structural-audit findings, all six mobile items:
     - Items 1/2/6 ("You carry…", "You sell…", "…outdated") flag w+14..29:
       our flex:1 1 0 span fills the row (263px) while Figma's short single-
       line labels hug their own text (146-249px). Text stays left-aligned
       either way — an invisible box-width difference, no visual effect.
     - Items 3/4 ("…$20K+/month", "…SEO and AI search…") flag y-5.2: pure
       cascade from the 85.5px floor above (items 1/2 render 2.5px shorter
       than Figma's 88px each, ×2 ≈ 5.2px by item 3) — already a deliberate
       choice, see that comment. Item 3's own checkbox/icon/text carry the
       same -5.2 for the same reason.
     - Item 4 flags w-18 h+24: in the 263px column this string wraps to 2
       lines, Figma (node 1546:3070) keeps it on 1. Figma fits it by cutting
       this item's right inset to 2px; we get the same single line with the
       nth-child(4) padding-inline:8px + white-space:nowrap override above.
       Applied only to this card, so the other five keep the normal 20px
       inset. */
  /* Node 1546:3081: 24px padding, copy and button both full-width and
     centre-aligned, 20px between them, and the title drops to 20/1.3 (the
     sub keeps desktop's 18/28). */
  .cd-qual-bar { flex-direction: column; align-items: stretch; gap: 20px; padding: 24px; }
  .cd-qual-bar-copy { text-align: center; }
  .cd-qual-bar-title { font-size: 20px; }
  .cd-qual-bar .cd-btn { width: 100%; }

  /* ── FAQ — node 1546:3144 (375×1212) ────────────────────────────────
     The refreshed mobile frame drops the outer card entirely: node
     1546:3147's items are direct 335px-wide children with a 16px gap and no
     padding of their own, so only the items keep a box. Type is NOT stepped
     down here either — closed summaries stay 18/28 (h-56 = 2 lines), the
     open one stays 19/29.45 (h-89 = 3 lines) and its answer stays 16/24
     (h-216 = 9 lines), all identical to desktop. */
  .cd-faq-card { padding: 0; gap: 16px; background: none; box-shadow: none; }
  .cd-faq-item { padding: 16px; }
  /* Closed rows put the 32px toggle flush against the question column —
     node 1546:3159's Border frame starts at x-271 inside a 303px row, i.e.
     no gap at all, so the question gets the full 271px to wrap in. Desktop's
     24px gap leaves only 247px here, which pushes two of the seven
     questions onto a third line and adds 28px each. */
  .cd-faq-item summary { gap: 0; }
  .cd-faq-item summary > span:first-child { flex: 1 1 0; min-width: 0; }
  .cd-faq-answer { max-width: none; }

  /* ── Two ways to start — node 1541:6825 (375×816) ───────────────────
     Unlike desktop, the mobile frame really is a flat 40/40: the note text
     (1541:6851) ends at y-776 inside an 816-tall section. The heading is
     left-aligned and single-line here, not centred. Bottom padding increased
     to 80px to match Figma's extra spacing before the footer. */
  .cd-start { padding-top: 40px; padding-bottom: 80px; }
  .cd-start .cd-h2 { margin-bottom: 24px; text-align: left; }
  /* 2026-08-28 structural-audit finding: h2 flags w+29 (node 1541:6827,
     Figma 306px vs our rendered 335px). Our block h2 fills its 335px
     column; Figma's box hugs the shorter text ("What We Do" reused as
     this frame's generic component label) at 306px, 29px short of the
     column. Both render the same left-aligned glyphs at the same x — an
     invisible box-width difference, no visual effect. Not touching
     .cd-h2's width here since it's a shared rule (see COMMON brief §5). */
  .cd-start-grid { flex-direction: column; gap: 16px; }
  /* Reset the desktop `flex: 1 1 0` (line 1258): in a column-direction flex
     container that basis of 0 collapses the card toward its flex-basis,
     and .cd-dark's `overflow: hidden` zeroes the automatic min-height that
     would normally keep it content-sized — the card shrank to ~49px,
     clipping the paragraph and button entirely. */
  /* Card 1 is 16/24 padding, gap 16 between title/paragraph (node
     1303:231/235); card 2 is uniform 32 padding, gap 24 (node
     1303:242/246) — not shared values, unlike the desktop cards. The DOM
     here is flat (h3/p/a as siblings, no Figma's title+paragraph subgroup),
     so the container `gap` is doing double duty as the title→paragraph
     distance; the button's margin-top makes up the rest to reach Figma's
     32px paragraph→button gap on both cards. */
  .cd-start-card { flex: none; padding: 24px 16px; gap: 16px; }
  .cd-start-card--2 { padding: 32px; gap: 24px; }
  .cd-start-card h3 { font-size: 32px; line-height: 1.3; letter-spacing: -2.38px; }
  .cd-start-card p { font-size: 16px; line-height: 24px; }
  .cd-start-card .cd-btn { margin-top: 16px; width: 100%; }
  .cd-start-card--2 .cd-btn { margin-top: 8px; }
  .cd-start-card .cd-btn--wide { padding: 12px 20px; }
  .cd-start-card .cd-btn--ghost.cd-btn--wide { padding-block: 12px; }
  /* No font-size/line-height override here — node 1303:253 keeps the
     same 18px/28px as desktop, unlike most other mobile copy on this page. */
  .cd-start-note { margin-top: 16px; }
  /* 2026-08-28 structural-audit findings: .cd-start-grid flags h+4.8
     (node 1541:6828); .cd-start-note flags y+4.4 (node 1541:6851), a
     direct cascade of the grid finding since the note sits right below
     it. Traced to the actual cards: card 1 measures 260.59px vs Figma's
     258 (+2.59), card 2 measures 326.19px vs 324 (+2.19) — both already
     inside the ±3px tolerance the spec below pins for these exact cards,
     with padding confirmed byte-identical ("24px 16px" / "32px"). This is
     ordinary Geist line-height rounding, not a padding error — the two
     independently-tolerated ~2.5px drifts just sum past the structural
     audit's blanket 4px section-level tolerance. */
}

@media (prefers-reduced-motion: reduce) {
  .cd-page .cd-btn,
  .cd-channel-dot,
  .cd-faq-mark,
  .cd-faq-toggle-box,
  .cd-faq-toggle { transition: none; }
}
