
/* ============================================================
   FOUNDATION TOKENS — restrained black/white/charcoal.
   Neutrals warm-tinted (hue ~80). Accent is theme-scoped.
   ============================================================ */
:root {
  /* neutral scale */
  --ink-900: oklch(0.21 0.005 80); --ink-700: oklch(0.34 0.005 80);
  --ink-500: oklch(0.51 0.005 80); --ink-300: oklch(0.72 0.005 80);
  --ink-150: oklch(0.88 0.004 85); --ink-075: oklch(0.94 0.004 85);
  --paper-50: oklch(0.97 0.004 90); --paper-0: oklch(0.988 0.003 90);
  --white: #ffffff;

  /* accent (base: steel blue) */
  --accent-l: 0.45; --accent-c: 0.05; --accent-h: 250;
  --accent: oklch(0.45 0.05 250);
  --accent-soft: oklch(0.45 0.05 250 / 0.09);
  --accent-on-dark: oklch(0.75 0.07 250);
  --accent-on: #ffffff;
  /* accent when used as TEXT on the light page. Defaults to the accent; a per-site
     brand colour overrides it with an AA-clamped value (accentVars → accentText). */
  --accent-text: var(--accent);

  /* semantic surfaces */
  --surface-page: var(--paper-0); --surface-card: var(--white);
  --surface-tint: var(--paper-50);
  /* The ONE site dark/secondary colour. Every dark area points here, so a single
     knob recolours hero + cta + footer + dark navbar + Dark sections together.
     Overridden per-site by inlining --site-dark on <body> (from the editor's dark
     colour / the community Dark Surface Color §135). */
  --site-dark: var(--ink-900);
  --site-dark-ink: var(--text-on-dark);
  --surface-band: var(--site-dark);
  --cs-dark-surface: var(--site-dark);
  /* collapsed-nav dropdown fill — light by default; a dark navbar overrides it.
     --nav-pop-muted: the §197 group-header colour inside that dropdown. */
  --nav-pop-bg: var(--surface-card);
  --nav-pop-muted: var(--text-faint);

  /* semantic text */
  --text-heading: var(--ink-900); --text-body: var(--ink-700);
  --text-muted: var(--ink-500); --text-faint: var(--ink-300);
  --text-on-dark: oklch(0.975 0.004 90);
  --text-on-dark-muted: oklch(0.975 0.004 90 / 0.62);

  /* borders */
  --border: var(--ink-150); --border-soft: var(--ink-075); --border-strong: var(--ink-900);

  /* scrim — protects text on imagery */
  --scrim: linear-gradient(to top, oklch(0.21 0.005 80 / 0.82), oklch(0.21 0.005 80 / 0));
  /* review stars — the one warm exception to the neutral palette */
  --star: oklch(0.65 0.12 80);

  /* type families (base default) */
  --font-display: 'Archivo', 'Helvetica Neue', sans-serif;
  --font-body: 'Public Sans', 'Helvetica Neue', sans-serif;
  --display-weight: 600; --display-tracking: -0.015em;
  --display-transform: none; --display-line: 1.08;

  /* type scale */
  --text-display: 56px; --text-h1: 40px; --text-h2: 30px; --text-h3: 21px;
  --text-md: 16px; --text-sm: 14px; --text-xs: 12.5px;
  --line-body: 1.6; --line-tight: 1.25;

  /* eyebrow */
  --eyebrow-size: 12px; --eyebrow-tracking: 0.16em;
  --eyebrow-weight: 600; --eyebrow-color: var(--text-muted);

  /* controls */
  --control-font: var(--font-body); --control-weight: 600;
  --control-tracking: 0.01em; --control-transform: none; --control-size: 14px;

  /* spacing (4px base) */
  --space-1: 4px; --space-2: 8px; --space-3: 12px; --space-4: 16px;
  --space-5: 24px; --space-6: 32px; --space-7: 40px; --space-8: 48px;
  --space-10: 64px; --space-12: 96px;

  /* layout — section/hero rhythm scales with viewport so mobile doesn't inherit
     desktop's editorial gaps (adjacent sections stack 2× this value of whitespace) */
  --container: 1160px; --section-pad-y: clamp(56px, 10vw, 96px); --grid-gap: var(--space-5);
  --hero-pad-y: clamp(56px, 10vw, 96px);
  /* sticky-header height (36px logo + 2×space-3 padding + 1px border) — used to
     offset other sticky elements so they don't slide under the navbar */
  --header-h: 61px;

  /* radii */
  --radius-card: 8px; --radius-control: 6px; --radius-chip: 999px; --radius-media: 6px;

  /* elevation — warm, never blue */
  --shadow-card: 0 1px 2px oklch(0.21 0.005 80 / 0.05), 0 6px 20px oklch(0.21 0.005 80 / 0.06);
  --shadow-pop: 0 2px 6px oklch(0.21 0.005 80 / 0.08), 0 16px 40px oklch(0.21 0.005 80 / 0.12);
  --shadow-band: inset 0 1px 0 oklch(1 0 0 / 0.06);

  /* motion — calm, no bounce */
  --ease: cubic-bezier(0.25, 0.1, 0.25, 1);
  --speed-fast: 140ms; --speed-base: 220ms; --speed-slow: 400ms;
}

/* BASE preset — the default look (redeclares the :root defaults explicitly so
   named presets below have a clear sibling to diff against). */
[data-theme="base"] {
  --font-display: 'Archivo', 'Helvetica Neue', sans-serif;
  --font-body: 'Public Sans', 'Helvetica Neue', sans-serif;
  --display-weight: 600; --display-tracking: -0.015em; --display-transform: none;
  --text-display: 56px;
  --accent: oklch(0.45 0.05 250); --accent-soft: oklch(0.45 0.05 250 / 0.09);
  --accent-on-dark: oklch(0.75 0.07 250);
  --radius-card: 8px; --radius-control: 6px; --radius-media: 6px;
  --control-tracking: 0.01em; --control-transform: none; --control-size: 14px; --control-weight: 600;
}

/* LUXURY preset — narrow high-contrast serif display (Cormorant) over an airy
   geometric sans (Jost); warm ivory paper, espresso darks, antique-gold accent;
   sharp 0-radius edges, flat cards, and generous spacing for an editorial feel.
   Tokens only — block markup is untouched. */
[data-theme="luxury"] {
  --font-display: 'Cormorant', 'Georgia', 'Times New Roman', serif;
  --font-body: 'Jost', 'Helvetica Neue', 'Segoe UI', sans-serif;
  --display-weight: 600; --display-tracking: 0em; --display-transform: none; --display-line: 1.12;
  --text-display: 80px; --text-h1: 52px; --text-h2: 40px; --text-h3: 26px;
  --text-md: 15px; --line-body: 1.7;
  --eyebrow-size: 11px; --eyebrow-tracking: 0.28em; --eyebrow-weight: 500; --eyebrow-color: var(--accent-text);
  --control-font: var(--font-body); --control-weight: 500; --control-size: 12px;
  --control-tracking: 0.18em; --control-transform: uppercase;
  --surface-page: oklch(0.972 0.008 85); --surface-tint: oklch(0.95 0.011 82);
  --site-dark: oklch(0.19 0.012 60);
  --accent: oklch(0.53 0.085 74); --accent-soft: oklch(0.53 0.085 74 / 0.10);
  --accent-on-dark: oklch(0.82 0.085 82); --accent-on-dark-ink: oklch(0.19 0.012 60);
  --radius-card: 0px; --radius-control: 0px; --radius-media: 0px; --shadow-card: none;
  --container: 1240px; --section-pad-y: clamp(64px, 10vw, 128px); --grid-gap: var(--space-6);
}
/* luxury/estate editorial nav — uppercase, letter-spaced links (CTA button excepted) */
[data-theme="luxury"] .site-nav a,
[data-theme="luxury"] .block-nav__links a:not(.block-nav__cta),
[data-theme="luxury"] .block-nav__group-btn,
[data-theme="estate"] .site-nav a,
[data-theme="estate"] .block-nav__links a:not(.block-nav__cta),
[data-theme="estate"] .block-nav__group-btn {
  text-transform: uppercase; letter-spacing: 0.16em; font-size: var(--text-xs);
}
/* luxury/estate feature-card heading — a touch more breathing room top & bottom */
[data-theme="luxury"] .feature-card h3,
[data-theme="estate"] .feature-card h3 { padding-top: var(--space-2); padding-bottom: var(--space-1); }

/* ── luxury LISTING CARDS — the "framed placard": a matted, keyline-framed photo,
   a centred body, the location as a gold eyebrow above the title, specs flanked by
   short gold rules, and the price sitting on a full-bleed tinted footer band. Reads
   like a printed brochure. Purely token-/class-scoped to luxury — base & classic
   keep the flush, left-aligned card. Both card renderers (editor preview in
   blocks.ts + the live directory JS) and the SSR /listings detail share these
   classes, so this one block restyles every surface. */
[data-theme="luxury"] .listing-card { border-color: var(--border-soft); }
[data-theme="luxury"] .listing-card:hover { transform: translateY(-2px); box-shadow: none; border-color: var(--accent-text); }
/* mat: inset the photo so the ivory card frames it, plus a hairline keyline */
[data-theme="luxury"] .listing-card__photo { margin: var(--space-3) var(--space-3) 0; border: 1px solid var(--border-soft); }
/* badge: small, quiet, translucent — a whisper over the photo, not a black slab */
[data-theme="luxury"] .listing-card__badge { top: 8px; left: 8px; border-radius: 0; padding: 3px 7px; font-size: 9px; font-weight: 500; letter-spacing: 0.18em; text-transform: uppercase; background: color-mix(in srgb, var(--ink-900) 38%, transparent); color: var(--text-on-dark); backdrop-filter: blur(2px); -webkit-backdrop-filter: blur(2px); }
/* centred body, ordered as eyebrow → title → specs → price footer */
[data-theme="luxury"] .listing-card__body { display: flex; flex-direction: column; align-items: center; text-align: center; padding: var(--space-5) var(--space-5) 0; }
/* location becomes the gold placard eyebrow, lifted above the title */
[data-theme="luxury"] .listing-card__loc { order: -1; margin-bottom: var(--space-2); text-transform: uppercase; letter-spacing: 0.2em; font-size: var(--eyebrow-size); font-weight: var(--eyebrow-weight); color: var(--accent-text); }
/* title: tighter, centred, capped at two lines so cards align */
[data-theme="luxury"] .listing-card__title { align-self: stretch; margin-bottom: var(--space-3); font-size: calc(var(--text-h3) * 0.86); display: -webkit-box; -webkit-line-clamp: 2; -webkit-box-orient: vertical; overflow: hidden; }
/* specs: centred on one line, letter-spaced, flanked by short gold rules.
   Smaller type + a min-width floor on the rules means they stay visible even on
   a narrow single-column card, while white-space:nowrap keeps "SQFT" on the line */
[data-theme="luxury"] .listing-card__specs { display: flex; align-items: center; justify-content: center; gap: var(--space-2); margin-top: 0; text-transform: uppercase; letter-spacing: 0.06em; font-size: 11px; white-space: nowrap; }
[data-theme="luxury"] .listing-card__specs::before,
[data-theme="luxury"] .listing-card__specs::after { content: ''; flex: 0 1 22px; min-width: 12px; height: 1px; background: color-mix(in srgb, var(--accent-text) 55%, transparent); }
/* price on a tinted footer band that bleeds to the card edges */
[data-theme="luxury"] .listing-card__price { align-self: stretch; margin: var(--space-5) calc(-1 * var(--space-5)) 0; padding: var(--space-4); background: var(--surface-tint); border-top: 1px solid var(--border-soft); font-family: var(--font-display); font-weight: var(--display-weight); font-size: calc(var(--text-h3) * 0.85); color: var(--accent-text); }
/* section header gets a thin placard rule above the eyebrow + heading */
[data-theme="luxury"] .listings__head { border-top: 1px solid color-mix(in srgb, var(--text-heading) 22%, transparent); padding-top: var(--space-4); }

/* CLASSIC preset — a traditional broker look: Libre Baskerville serif display over
   Source Sans 3 body, deep-green accent, softly-rounded corners. Warm-neutral
   foundation + spacing shared with base. Tokens only — block markup is untouched. */
[data-theme="classic"] {
  --font-display: 'Libre Baskerville', 'Georgia', 'Times New Roman', serif;
  --font-body: 'Source Sans 3', 'Helvetica Neue', 'Segoe UI', sans-serif;
  --display-weight: 700; --display-tracking: 0em; --display-transform: none; --display-line: 1.18;
  --text-display: 46px; --text-h2: 28px;
  --accent: oklch(0.45 0.05 155); --accent-soft: oklch(0.45 0.05 155 / 0.09);
  --accent-on-dark: oklch(0.75 0.07 155);
  --eyebrow-tracking: 0.14em;
  --radius-card: 10px; --radius-control: 8px; --radius-media: 8px;
  --control-tracking: 0.02em; --control-transform: none; --control-size: 15px; --control-weight: 600;
}

/* ESTATE preset — the "dark-luxury real-estate" look. Same high-contrast Cormorant
   serif + Jost sans as LUXURY, but UPPERCASE display headings, a cool near-black
   navy dark surface, a soft antique-gold accent, pill buttons and generously
   rounded photos/cards. Built to pair with dark hero + section surfaces (§135) for
   the immersive, edge-to-edge estate-agent feel. Tokens only — markup untouched.
   (Card titles are <p>, not h1–3, so the uppercase display transform hits section
   & hero headings without shouting on listing/agent cards.) */
[data-theme="estate"] {
  --font-display: 'Cormorant', 'Georgia', 'Times New Roman', serif;
  --font-body: 'Jost', 'Helvetica Neue', 'Segoe UI', sans-serif;
  --display-weight: 600; --display-tracking: 0.01em;
  --display-transform: uppercase; --display-line: 1.05;
  --text-display: 82px; --text-h1: 54px; --text-h2: 40px; --text-h3: 26px;
  --text-md: 15px; --line-body: 1.7;
  --eyebrow-size: 11px; --eyebrow-tracking: 0.3em; --eyebrow-weight: 500; --eyebrow-color: var(--accent-text);
  --control-font: var(--font-body); --control-weight: 500; --control-size: 12px;
  --control-tracking: 0.2em; --control-transform: uppercase;
  /* cool near-black navy dark; a barely-cool paper so light cards/testimonials pop */
  --surface-page: oklch(0.986 0.003 255); --surface-tint: oklch(0.955 0.006 255);
  --site-dark: oklch(0.17 0.02 264);
  /* soft antique gold — luminous variant for gold-on-dark eyebrows/stars */
  --accent: oklch(0.58 0.072 72); --accent-soft: oklch(0.58 0.072 72 / 0.1);
  --accent-on-dark: oklch(0.83 0.08 82); --accent-on-dark-ink: oklch(0.17 0.02 264);
  /* rounded cards + pill controls; keeps the root's soft warm shadow (unlike luxury) */
  --radius-card: 18px; --radius-control: 999px; --radius-media: 18px;
  --container: 1240px; --section-pad-y: clamp(64px, 10vw, 128px); --grid-gap: var(--space-6);
}

/* PLATFORM preset — the CommunitySync marketing look: DARK-NATIVE everywhere
   (the whole page is near-black, not just per-section dark bands), a transitional
   Newsreader serif display with a warm-orange accent, and an italic-serif heading
   highlight. Unlike estate (light paper + dark section bands), this preset flips
   the FOUNDATION surface + text tokens to a dark palette, so every unwrapped
   section inherits the dark page and reads light. cs-surface--dark bands still
   work — they just sit on an already-dark page. Tokens only; block markup is
   untouched. Built for the platform site, but any community can select it. */
[data-theme="platform"] {
  --font-display: 'Newsreader', 'Georgia', 'Times New Roman', serif;
  --font-body: 'Public Sans', 'Helvetica Neue', 'Segoe UI', sans-serif;
  --display-weight: 500; --display-tracking: -0.01em; --display-transform: none; --display-line: 1.04;
  --text-display: 76px; --text-h1: 50px; --text-h2: 38px; --text-h3: 23px;
  --text-md: 16px; --line-body: 1.65;
  --eyebrow-size: 12px; --eyebrow-tracking: 0.22em; --eyebrow-weight: 700; --eyebrow-color: var(--accent-on-dark);
  --control-weight: 600; --control-tracking: 0.01em; --control-transform: none; --control-size: 14px;
  --container: 1200px; --section-pad-y: clamp(64px, 9vw, 120px); --hero-pad-y: clamp(72px, 11vw, 150px);
  --radius-card: 14px; --radius-control: 10px; --radius-media: 12px;

  /* warm-orange accent — a rich orange for fills/buttons, a brighter one for text
     and eyebrows sitting on the dark page. */
  --accent: oklch(0.70 0.16 55); --accent-soft: oklch(0.70 0.16 55 / 0.14);
  --accent-on-dark: oklch(0.80 0.14 62); --accent-on-dark-ink: oklch(0.18 0.03 60);
  --accent-on: #12100e;
  /* the page is DARK, so accent-as-text must be the bright on-dark orange (the
     light-page --accent would be an unreadable dark orange on near-black). */
  --accent-text: var(--accent-on-dark);

  /* DARK foundation — near-black warm page, light cards, off-white text. */
  --surface-page: oklch(0.17 0.006 60); --surface-card: oklch(0.22 0.008 60);
  --surface-tint: oklch(0.20 0.007 60);
  --site-dark: oklch(0.145 0.006 60); --site-dark-ink: oklch(0.97 0.004 90);
  --text-heading: oklch(0.98 0.004 90); --text-body: oklch(0.84 0.006 85);
  --text-muted: oklch(0.68 0.008 80); --text-faint: oklch(0.52 0.008 80);
  --border: oklch(0.32 0.008 70); --border-soft: oklch(0.26 0.008 65); --border-strong: oklch(0.46 0.01 70);
  --nav-pop-bg: var(--surface-card); --nav-pop-muted: var(--text-faint);
  --shadow-card: 0 1px 2px oklch(0 0 0 / 0.3), 0 12px 32px oklch(0 0 0 / 0.35);
  --shadow-pop: 0 2px 8px oklch(0 0 0 / 0.4), 0 24px 60px oklch(0 0 0 / 0.5);
}
/* platform nav/eyebrows — uppercase, letter-spaced links; the orange eyebrow. */
[data-theme="platform"] .eyebrow { color: var(--accent-on-dark); }
[data-theme="platform"] .block-nav__links a:not(.block-nav__cta),
[data-theme="platform"] .block-nav__group-btn { color: var(--text-body); }
/* platform display headings lean lighter-weight serif; the italic highlight uses
   a serif italic in the accent — matches "Build your tribe" / "everything your
   agents do". */
[data-theme="platform"] .cs-hl { font-style: italic; font-weight: 500; }

/* ARENA preset — the dark athletic/entertainment look: DARK-NATIVE like platform
   (the whole page is near-black), but a NEUTRAL cold black (no warm tint), bold
   Montserrat for display AND body, a signal-red accent, uppercase letter-spaced
   controls/nav and tight radii. Built for sports & entertainment brands (broker
   groups, arenas, media) — any community can select it. Tokens only; block
   markup is untouched. */
[data-theme="arena"] {
  --font-display: 'Montserrat', 'Helvetica Neue', 'Segoe UI', sans-serif;
  --font-body: 'Montserrat', 'Helvetica Neue', 'Segoe UI', sans-serif;
  --display-weight: 300; --display-tracking: 0; --display-transform: none; --display-line: 1.12;
  --text-display: 58px; --text-h1: 42px; --text-h2: 32px; --text-h3: 21px;
  --text-md: 15.5px; --line-body: 1.7;
  --eyebrow-size: 12px; --eyebrow-tracking: 0.24em; --eyebrow-weight: 700; --eyebrow-color: var(--accent-text);
  --control-weight: 600; --control-tracking: 0.08em; --control-transform: uppercase; --control-size: 13px;
  --container: 1200px; --section-pad-y: clamp(64px, 9vw, 120px); --hero-pad-y: clamp(72px, 11vw, 150px);
  --radius-card: 8px; --radius-control: 6px; --radius-media: 6px;

  /* signal-red accent — a saturated stadium red for fills/buttons, a brighter
     variant for text and eyebrows sitting on the near-black page. */
  --accent: oklch(0.55 0.19 22); --accent-soft: oklch(0.55 0.19 22 / 0.14);
  --accent-on-dark: oklch(0.66 0.2 24); --accent-on-dark-ink: #ffffff;
  --accent-on: #ffffff;
  /* the page is DARK, so accent-as-text must be the bright on-dark red. */
  --accent-text: var(--accent-on-dark);

  /* DARK foundation — neutral cold near-black page, charcoal cards, white text. */
  --surface-page: oklch(0.16 0 0); --surface-card: oklch(0.21 0 0);
  --surface-tint: oklch(0.19 0 0);
  --site-dark: oklch(0.13 0 0); --site-dark-ink: oklch(0.97 0 0);
  --text-heading: oklch(0.98 0 0); --text-body: oklch(0.85 0 0);
  --text-muted: oklch(0.68 0 0); --text-faint: oklch(0.52 0 0);
  --border: oklch(0.32 0 0); --border-soft: oklch(0.26 0 0); --border-strong: oklch(0.46 0 0);
  --nav-pop-bg: var(--surface-card); --nav-pop-muted: var(--text-faint);
  --shadow-card: 0 1px 2px oklch(0 0 0 / 0.3), 0 12px 32px oklch(0 0 0 / 0.35);
  --shadow-pop: 0 2px 8px oklch(0 0 0 / 0.4), 0 24px 60px oklch(0 0 0 / 0.5);
}
/* arena nav — uppercase, letter-spaced links, the athletic wordmark register. */
[data-theme="arena"] .site-nav a,
[data-theme="arena"] .block-nav__links a:not(.block-nav__cta),
[data-theme="arena"] .block-nav__group-btn {
  color: var(--text-body); text-transform: uppercase; letter-spacing: 0.12em; font-size: var(--text-xs);
}
[data-theme="arena"] .eyebrow { color: var(--accent-text); text-transform: uppercase; }

/* NOIR preset — the minimal black-and-white luxury look (KW Elevate register):
   a LIGHT near-white page with true-black section bands (like luxury/estate, NOT
   dark-native), thin uppercase Jost display on wide tracking, and — the defining
   trait — a MONOCHROME palette: no accent hue at all. The "accent" is near-black
   ink on the light page (flips to near-white on dark bands), so links/eyebrows/
   rules read as black, never a colour. Sharp 0-radius edges, flat cards, airy
   spacing. Per-site brand colours still layer on via accentVars if a community
   sets them; left unset (the intended look) the site stays pure monochrome.
   Tokens only — block markup untouched. Card titles are <p>, so the uppercase
   display transform hits section + hero headings without shouting on cards. */
[data-theme="noir"] {
  --font-display: 'Jost', 'Helvetica Neue', 'Segoe UI', sans-serif;
  --font-body: 'Jost', 'Helvetica Neue', 'Segoe UI', sans-serif;
  --display-weight: 300; --display-tracking: 0.12em; --display-transform: uppercase; --display-line: 1.18;
  --text-display: 60px; --text-h1: 40px; --text-h2: 29px; --text-h3: 20px;
  --text-md: 16px; --line-body: 1.75;
  --eyebrow-size: 12px; --eyebrow-tracking: 0.3em; --eyebrow-weight: 400; --eyebrow-color: var(--text-muted);
  --control-font: var(--font-body); --control-weight: 500; --control-size: 12px;
  --control-tracking: 0.22em; --control-transform: uppercase;

  /* MONOCHROME — near-black ink as the "accent" (no hue); on a dark band it flips
     to near-white via --accent-on-dark. --accent-soft is a faint ink wash. */
  --accent: oklch(0.26 0.004 80); --accent-soft: oklch(0.26 0.004 80 / 0.07);
  --accent-on-dark: oklch(0.97 0.004 90); --accent-on-dark-ink: oklch(0.17 0.004 80);
  --accent-on: #ffffff;
  --accent-text: var(--accent);

  /* light near-white paper + a barely-grey tint; true-black dark bands so the
     black featured/CTA sections read as ink, not charcoal. */
  --surface-page: oklch(0.992 0.001 90); --surface-tint: oklch(0.966 0.002 90);
  --site-dark: oklch(0.155 0.002 80); --site-dark-ink: oklch(0.98 0.003 90);

  /* sharp, flat, airy, wide — the editorial minimal geometry. */
  --radius-card: 0px; --radius-control: 0px; --radius-media: 0px; --shadow-card: none;
  --container: 1280px; --section-pad-y: clamp(64px, 11vw, 136px); --grid-gap: var(--space-6);
}
/* noir nav + eyebrow — uppercase, widely letter-spaced (matches luxury/estate). */
[data-theme="noir"] .site-nav a,
[data-theme="noir"] .block-nav__links a:not(.block-nav__cta),
[data-theme="noir"] .block-nav__group-btn {
  text-transform: uppercase; letter-spacing: 0.18em; font-size: var(--text-xs);
}
[data-theme="noir"] .eyebrow { text-transform: uppercase; }

/* ────────────────────────────────────────────────────────────────────────────
   NOIR STRUCTURAL LAYER — layout, not paint.
   This is the "a theme can restructure the whole page" layer (design decision
   2026-07-24): unlike the token block above (colour/type/spacing), these rules
   change WHERE things sit — full-bleed breakout, text-on-image overlays,
   gutterless tiles, seam-to-seam bands. Same mechanism Luxury uses to reshape
   listing cards, applied comprehensively so selecting Noir transforms every
   section at once. POLICY: theme wins page-wide (author per-section choices are
   overridden — the whole page adopts the full-bleed minimal language).

   Built SECTION BY SECTION against real references; the running ruleset lives in
   memory 'website-noir-structural-theme'. Each section's rules are grouped under
   a "── <section> ──" header below. Shared conventions:
     • FULL-BLEED: neutralize a block's inner .container so it spans the viewport
       — '.<block> .container { max-width: none; padding-inline: 0; }'. Applied
       only to image/tile/band blocks; text blocks (richText/article) stay
       contained for readable measure.
     • GUTTERLESS: tile grids drop --grid-gap + radius to 0 so images touch.
     • Every new rule must be reusable — if two sections need it, promote it to a
       shared selector list here rather than repeating it. ── end conventions ── */

/* ── Hero (section 1) — 85vh lead hero + transparent nav overlaying it ──
   Reference: kwelevate.com home. The nav floats over the hero photo (logo left,
   links right, all light), the hero fills ~85vh with the display title + search
   centred. Uses the theme-neutral lead-hero markers renderSections emits
   (cs-hero-lead / cs-nav-overlay) so INTERIOR pages (no leading hero) keep a
   normal solid nav — the overlay only happens where a hero opens the page. */
/* 85svh via the SAME --hero-tall-h var the built-in tall hero uses, so the editor
   canvas's px pin (:root{--hero-tall-h:600px} in SiteEditor) applies here too —
   a raw svh balloons the auto-sizing canvas iframe (editor-embed-vh-balloon). */
/* :not(.hero--fit) — a "Match image" hero sizes itself to its photo; forcing the
   85svh lead-hero band on it would re-crop the very image it exists to show. */
[data-theme="noir"] .cs-hero-lead:not(.hero--fit) { display: grid; place-items: center; min-height: var(--hero-tall-h, 85svh); }
/* nav floats transparently over the hero (absolute = out of flow, so the hero
   image bleeds to the very top under it). Scrolls away with the hero — a
   sticky-solid-on-scroll variant would need a small scroll script (flagged). */
[data-theme="noir"] .cs-nav-overlay {
  position: absolute; top: 0; left: 0; right: 0; z-index: 20;
  background: transparent; border-bottom: none;
  /* The bar is transparent over the hero, BUT the collapsed (mobile) hamburger
     dropdown must be a SOLID DARK panel — it inherits the light --nav-pop-bg
     otherwise, giving light-links-on-white / a see-through menu over the hero.
     Point the dropdown fill + its group-header muted colour at the dark scheme so
     the opened menu matches the overlay's light-on-dark ink. */
  --nav-pop-bg: var(--site-dark);
  --nav-pop-muted: var(--text-on-dark-muted);
}
/* light nav ink over the dark hero scrim. Covers BOTH nav variants: the chrome
   siteNav block (.block-nav__*) and the auto-header (.site-header__* / .site-nav). */
[data-theme="noir"] .cs-nav-overlay .block-nav__links a:not(.block-nav__cta),
[data-theme="noir"] .cs-nav-overlay .block-nav__group-btn,
[data-theme="noir"] .cs-nav-overlay .block-nav__brandtext,
[data-theme="noir"] .cs-nav-overlay .block-nav__tagline,
[data-theme="noir"] .cs-nav-overlay .site-header__home,
[data-theme="noir"] .cs-nav-overlay .site-nav a { color: var(--text-on-dark); }
[data-theme="noir"] .cs-nav-overlay .block-nav__tagline { border-left-color: color-mix(in srgb, var(--text-on-dark) 34%, transparent); }
/* .nav-toggle is shared by both navs (ghost hamburger over the hero). */
[data-theme="noir"] .cs-nav-overlay .nav-toggle {
  color: var(--text-on-dark); background: transparent;
  border-color: color-mix(in srgb, var(--text-on-dark) 40%, transparent);
}

/* ── Feature grid → immersive image-overlay tiles (KW Elevate "4 tiles") ──
   Reference: kwelevate.com HOME SEARCH / FEATURED PROPERTIES / STAGING / CONTACT.
   The card-with-body-below becomes a full-photo tile: the image fills the tile,
   the label + copy sit BOTTOM-LEFT over a gradient scrim in white. CONTAINED (not
   full-bleed) with a small gap — matches KW's 4-tile band; the full-bleed
   gutterless treatment is reserved for the neighborhoods/gallery sections. Copy
   is KEPT (muted white) so authored descriptions aren't lost. */
[data-theme="noir"] .features__grid { gap: var(--space-2); margin-top: var(--space-8); }
[data-theme="noir"] .feature-card {
  position: relative; display: flex; flex-direction: column; justify-content: flex-end;
  min-height: 420px; padding: var(--space-6) var(--space-5); border: none; background: none; overflow: hidden;
}
/* image becomes the full-tile background layer */
[data-theme="noir"] .feature-card__media {
  position: absolute; inset: 0; margin: 0; aspect-ratio: auto; border: none; z-index: 0; background: var(--site-dark);
}
[data-theme="noir"] .feature-card__media img { transition: transform var(--speed-slow) var(--ease); }
[data-theme="noir"] .feature-card:hover .feature-card__media img { transform: scale(1.045); }
/* legibility scrim over the photo, under the text */
[data-theme="noir"] .feature-card::after {
  content: ''; position: absolute; inset: 0; z-index: 1;
  background: linear-gradient(to top, oklch(0 0 0 / 0.74), oklch(0 0 0 / 0.14) 48%, transparent 74%);
}
/* copy above the scrim, bottom-left, white */
[data-theme="noir"] .feature-card h3,
[data-theme="noir"] .feature-card p,
[data-theme="noir"] .feature-card__chips,
[data-theme="noir"] .feature-card__icon,
[data-theme="noir"] .feature-card__link { position: relative; z-index: 2; }
[data-theme="noir"] .feature-card h3 { color: var(--text-on-dark); margin-bottom: var(--space-2); }
[data-theme="noir"] .feature-card p { color: var(--text-on-dark-muted); }
[data-theme="noir"] .feature-card__link { color: var(--text-on-dark); margin-top: var(--space-3); }
[data-theme="noir"] .feature-card__icon { color: var(--text-on-dark); border-color: color-mix(in srgb, var(--text-on-dark) 40%, transparent); margin-bottom: var(--space-3); }
/* HOVER affects the text too (KW Elevate): the copy lifts, an accent underline
   grows under the label, and the scrim deepens — not just the photo zoom. */
[data-theme="noir"] .feature-card h3,
[data-theme="noir"] .feature-card p,
[data-theme="noir"] .feature-card__link { transition: transform var(--speed-base) var(--ease); }
[data-theme="noir"] .feature-card h3::after {
  content: ''; display: block; height: 1px; width: 0; margin-top: var(--space-3);
  background: var(--text-on-dark); transition: width var(--speed-slow) var(--ease);
}
[data-theme="noir"] .feature-card:hover h3,
[data-theme="noir"] .feature-card:hover p,
[data-theme="noir"] .feature-card:hover .feature-card__link { transform: translateY(-6px); }
[data-theme="noir"] .feature-card:hover h3::after { width: 46px; }
[data-theme="noir"] .feature-card:hover::after {
  background: linear-gradient(to top, oklch(0 0 0 / 0.82), oklch(0 0 0 / 0.2) 50%, transparent 78%);
}

/* ── Featured properties / listings (section 3) — CONTAINED, sharp, Zillow-safe ──
   Our best Zillow photo is 1536×1152 (uncropped_scaled_within_1536; the -p_f
   fallback is only 1024). So listings deliberately DO NOT go full-bleed like the
   hero/neighborhoods — a full-width blow-up on a wide monitor would upscale a
   Zillow pic and pixelate (KW Elevate's giant featured carousel does exactly
   that). The contained grid keeps each photo ≲ container/cols (~400px at 3-col,
   ≤ container at 1-col) — always ≤ the 1536 source, always crisp. The 1536 cap on
   the grid is a backstop if the content width is ever widened. Cards read sharp,
   flat, monochrome; hover is a keyline highlight, not a lift. */
/* The cap must NOT catch the carousel track (.listings__grid.lcar__track):
   the track is the scroll container and its slide-centering padding is computed
   from 100vw, so capping the box hides the neighbor-card peeks (next card sat
   almost entirely past the 1536px edge — "no cards on the sides"). Peeks need
   the full-vw box; sharpness is already guaranteed per-slide (--lcar-slide
   caps at 1100px + the img 1536 cap), not by the container. */
[data-theme="noir"] .listings__grid:not(.lcar__track) { max-width: 1536px; }
[data-theme="noir"] .listing-card { box-shadow: none; border-color: var(--border); }
[data-theme="noir"] .listing-card:hover { transform: none; box-shadow: none; border-color: var(--text-heading); }
[data-theme="noir"] .listing-card__badge { border-radius: 0; text-transform: uppercase; letter-spacing: 0.12em; font-size: 10px; font-weight: 500; }
[data-theme="noir"] .listing-card__photo img { max-width: 1536px; }
/* Featured carousel (listingsCarousel): near-solid black info panel, sharp arrows
   — the big-slide showcase. Slides still cap at 1536 so Zillow pics stay sharp. */
[data-theme="noir"] .lcar .listing-card__body { background: color-mix(in srgb, var(--ink-900) 90%, transparent); padding: var(--space-5) var(--space-6); }
[data-theme="noir"] .lcar .listing-card:hover { box-shadow: none; }

/* ============================================================
   FOUNDATION ELEMENTS + block CSS rebased onto the tokens.
   (Block markup is unchanged; full per-block restyle is a follow-up.)
   ============================================================ */
* { box-sizing: border-box; margin: 0; padding: 0; }
body {
  font-family: var(--font-body);
  font-size: var(--text-md);
  color: var(--text-body);
  background: var(--surface-page);
  line-height: var(--line-body);
  -webkit-font-smoothing: antialiased;
}
h1, h2, h3 {
  font-family: var(--font-display);
  font-weight: var(--display-weight);
  letter-spacing: var(--display-tracking);
  text-transform: var(--display-transform);
  line-height: var(--display-line);
  color: var(--text-heading);
}
img { max-width: 100%; display: block; }
a { color: var(--accent-text); text-decoration: none; }

.container { max-width: var(--container); margin: 0 auto; padding: 0 var(--space-5); }

/* skip-to-content — off-screen until focused (keyboard users) */
.cs-skip { position: absolute; left: -9999px; top: 0; z-index: 100; background: var(--surface-card); color: var(--text-heading); padding: var(--space-3) var(--space-5); border-radius: var(--radius-control); box-shadow: var(--shadow-pop); }
.cs-skip:focus { left: var(--space-3); top: var(--space-3); }

/* header */
.site-header { position: sticky; top: 0; background: var(--surface-card); border-bottom: 1px solid var(--border); z-index: 10; }
.site-header__inner { max-width: var(--container); margin: 0 auto; padding: var(--space-3) var(--space-5); display: flex; align-items: center; gap: var(--space-5); }
.site-header__home { display: flex; align-items: center; gap: var(--space-3); min-width: 0; color: var(--text-heading); font-family: var(--font-display); font-weight: var(--display-weight); font-size: var(--text-h3); letter-spacing: var(--display-tracking); }
.site-header__logo { height: 36px; width: auto; max-width: 60vw; object-fit: contain; }
.site-nav { margin-left: auto; display: flex; gap: var(--space-5); }
.site-nav a { color: var(--text-muted); font-weight: 500; font-size: var(--text-sm); transition: color var(--speed-fast) var(--ease); }
.site-nav a:hover, .site-nav a.active { color: var(--accent-text); }

/* buttons */
.btn {
  display: inline-flex; align-items: center; justify-content: center;
  padding: 11px 24px;
  font-family: var(--control-font); font-size: var(--control-size);
  font-weight: var(--control-weight); letter-spacing: var(--control-tracking);
  text-transform: var(--control-transform); line-height: 1.2;
  border-radius: var(--radius-button, var(--radius-control)); border: 1px solid transparent; cursor: pointer;
  transition: opacity var(--speed-fast) var(--ease), background var(--speed-fast) var(--ease);
}
.btn--brand { background: var(--btn-bg, var(--ink-900)); color: var(--btn-on, var(--text-on-dark)); }
.btn--brand:hover { opacity: 0.88; }
/* "inverse" button = the surface's ink as the fill, the surface colour as the text
   (a light button on a dark band, a dark button on a light band). --on/--on-inverse
   are set by the section surface; fallbacks keep it a light button off-surface. */
.btn--inverse { background: var(--on, var(--text-on-dark)); color: var(--on-inverse, var(--ink-900)); }
.btn--inverse:hover { opacity: 0.88; }
/* Explicit button tokens — a discrete colour (--bc fill / --bf text) × a style
   (solid fill or outline). Literal colours, no tints; the author picks one that
   suits the section. */
.btn--c-brand { --bc: var(--accent); --bf: var(--accent-ink, var(--text-on-dark)); }
.btn--c-black { --bc: var(--ink-900); --bf: var(--text-on-dark); }
.btn--c-white { --bc: #ffffff; --bf: var(--ink-900); }
.btn--c-dark  { --bc: var(--site-dark); --bf: var(--site-dark-ink, var(--text-on-dark)); }
.btn--solid   { background: var(--bc); color: var(--bf); border-color: var(--bc); }
.btn--outline { background: transparent; color: var(--bc); border-color: var(--bc); }
.btn--solid:hover, .btn--outline:hover { opacity: 0.88; }

/* hero — background comes from the section surface (defaults to Dark); a media
   layer (image/slideshow/video) + scrim sits on top when set. Text uses the scoped
   tokens, so the hero flips correctly on any surface. */
.hero { background: transparent; color: var(--text-heading); padding: var(--hero-pad-y) 0; text-align: center; position: relative; overflow: hidden; }
.hero__bg { position: absolute; inset: 0; z-index: 0; background-size: cover; background-position: center; }
img.hero__bg, video.hero__bg { width: 100%; height: 100%; object-fit: cover; }
/* Phone-image <picture> wrapper: display:contents keeps the <img> a direct
   layout child of the section (absolute layer / grid item), the wrapper only
   carries the ≤760px <source>. */
.hero__pic { display: contents; }
/* Vertical crop anchor for the cover-fit media (config.focalPoint) — default is
   centre-cropped; top/bottom keep that edge in view. Selectors include the
   slideshow slide (extra .hero__slides ancestor) so they out-specify its rule. */
.hero--focal-top img.hero__bg, .hero--focal-top video.hero__bg, .hero--focal-top .hero__slides .hero__slide { object-position: center top; }
.hero--focal-bottom img.hero__bg, .hero--focal-bottom video.hero__bg, .hero--focal-bottom .hero__slides .hero__slide { object-position: center bottom; }
/* Tint over background media — strength from the editor slider (--hero-tint,
   0–100; unset = the legacy 52), colour from the section's surface choice:
   dark (default) / light (the page colour) / brand (the accent). */
.hero--media::before { content: ''; position: absolute; inset: 0; z-index: 1; background: color-mix(in srgb, var(--site-dark) calc(var(--hero-tint, 52) * 1%), transparent); }
.hero--media.hero--tint-light::before { background: color-mix(in srgb, var(--surface-page) calc(var(--hero-tint, 52) * 1%), transparent); }
/* --accent-fixed, not --accent: the hero sits inside a dark surface wrapper whose
   remap turns a dark brand accent into WHITE — correct for links, a white-out for
   a brand WASH (§205 bugfix; the fallback keeps no-accent sites unchanged). */
.hero--media.hero--tint-brand::before { background: color-mix(in srgb, var(--accent-fixed, var(--accent)) calc(var(--hero-tint, 52) * 1%), transparent); }
/* §204 — gradient section surface: the scrim IS the author's gradient (tint baked
   into the stops as alpha, set inline as --hero-scrim-grad). */
.hero--media.hero--tint-gradient::before { background: var(--hero-scrim-grad, color-mix(in srgb, var(--site-dark) calc(var(--hero-tint, 52) * 1%), transparent)); }
/* §205 — v2 explicit overlay (Fill + Overlay model): the scrim comes fully baked
   from the overlay keys (--hero-scrim-grad, strength already in the stops), and a
   custom overlay colour can carry its own readable ink (--hero-ink; unset = the
   forced-light over-media default). 'None' removes the scrim layer entirely.
   hero--ink-dark (mediaInk resolved dark ink — author override, light solid or
   light gradient overlay) reads the same tokens WITHOUT a scrim class, so a
   "Light bg" call on an overlay-free photo still flips the text. */
.hero--media.hero--tint-custom::before { background: var(--hero-scrim-grad); }
.hero--media.hero--tint-custom, .hero--media.hero--ink-dark {
  --text-heading: var(--hero-ink, var(--site-dark-ink, #fff));
  --text-body: color-mix(in srgb, var(--hero-ink, var(--site-dark-ink, #fff)) 82%, transparent);
  --text-muted: color-mix(in srgb, var(--hero-ink, var(--site-dark-ink, #fff)) 70%, transparent);
}
.hero--media.hero--tint-none::before { content: none; }
/* §205 — LIGHT overlay (dark ink) heroes. The text tokens flip via --hero-ink, but
   the WRAPPING dark surface also remapped buttons + accents to their on-dark
   variants (--accent-on-dark = pure white for a dark brand) — white-on-white on a
   light overlay. Re-derive from the TRUE brand (--accent-fixed, never remapped)
   and the overlay ink. Covers the v2 custom overlay (hero--ink-dark, worker-
   emitted when the overlay computes dark ink) and the legacy light scrim. */
.hero--media.hero--ink-dark .cs-hl,
.hero--media.hero--tint-light .cs-hl { color: var(--accent-fixed, var(--accent-text)); }
.hero--media.hero--ink-dark .btn--brand,
.hero--media.hero--tint-light .btn--brand { background: var(--accent-fixed, var(--ink-900)); color: var(--accent-ink, var(--text-on-dark)); }
.hero--media.hero--ink-dark .btn--outline,
.hero--media.hero--tint-light .btn--outline { color: var(--text-heading); border-color: color-mix(in srgb, var(--text-heading) 40%, transparent); }
.hero--media.hero--ink-dark .btn--inverse,
.hero--media.hero--tint-light .btn--inverse { background: var(--text-heading); color: #ffffff; }
/* Over a photo the text is always light regardless of the section surface. */
.hero--media { --text-heading: var(--site-dark-ink, #fff); --text-body: color-mix(in srgb, var(--site-dark-ink, #fff) 82%, transparent); --text-muted: color-mix(in srgb, var(--site-dark-ink, #fff) 70%, transparent); }
/* Light / brand tints flip the over-media text to that surface's ink. */
.hero--media.hero--tint-light { --text-heading: var(--ink-900); --text-body: var(--ink-700); --text-muted: var(--ink-500); }
.hero--media.hero--tint-brand { --text-heading: var(--accent-ink, #0c0c10); --text-body: color-mix(in srgb, var(--accent-ink, #0c0c10) 84%, transparent); --text-muted: color-mix(in srgb, var(--accent-ink, #0c0c10) 66%, transparent); }
/* The copy box IS the page container — the same max-width, centring and side
   padding as every other block's .container — so left-aligned copy lines up
   with the blocks below at ANY viewport, and the box sits in the same place
   under every banner height. (It used to be a 760px / --container box with
   margin:0 for left alignment: it hugged the section's 24px edge, which only
   coincided with the container below ~1160px, and Tall's place-items:center
   then shrink-wrapped + centred it — left copy jumped to the middle.) How wide
   the TEXT runs is a separate thing, applied to the children: see
   .hero.measure-* below. */
.hero__inner { position: relative; z-index: 2; width: 100%; max-width: var(--container); margin: 0 auto; padding: 0 var(--space-5); display: grid; gap: var(--space-5); justify-items: center; }
.hero__inner > * { max-width: 760px; }
/* Optional taller banners (hero "height" field). svh — not vh — so the mobile
   URL bar collapsing doesn't jump the height. The bg stays full-bleed (absolute
   inset:0, unaffected by grid); align-items centres .hero__inner vertically —
   NOT place-items: justify-centring a box that must stay container-wide
   shrink-wraps it and drags left-aligned copy to the middle. */
/* §209 — one "tall" height (≈80% of the screen; content grows past it via
   min-height). Read from --hero-tall-h so the editor canvas can pin it to a px
   value (the auto-sized iframe would otherwise feedback-loop on svh). */
.hero--tall { display: grid; align-items: center; min-height: var(--hero-tall-h, 80svh); }
/* "Match image" banner height (config.height = 'image'; the renderer gates it to
   a single-image CENTER hero — see hero() in blocks.ts). The band takes the
   photo's own aspect ratio: the <img> becomes an IN-FLOW grid item whose rendered
   height (row width ÷ intrinsic ratio) sizes the one auto row, so a designed
   banner (event promo, poster with baked-in text) is never cropped on a wide
   screen. The copy overlays it in the same row and still grows the row when it
   is taller than the photo (the img then stretches + cover-crops via the focal
   rules). Purely width-driven — no viewport units, so the auto-sized editor
   canvas can't feedback-loop (editor-embed-vh-balloon). One column: the photo
   and the copy box share it, and the box brings its own container padding. */
.hero--fit { display: grid; grid-template-columns: minmax(0, 1fr); padding: 0; }
/* align-self must be explicit: normal behaves as start for a replaced item
   with an aspect ratio (the photo would sit at its natural height and the copy
   overflow it). height:auto beats the cover-fit 100% above; a %-min-height is
   the obvious alternative but re-resolves unreliably on WebKit grid items. */
.hero--fit img.hero__bg { grid-area: 1 / 1; position: static; width: 100%; height: auto; align-self: stretch; object-fit: cover; display: block; }
.hero--fit .hero__inner { grid-area: 1 / 1; align-self: center; padding: var(--hero-pad-y) var(--space-5); }
.hero .eyebrow { color: var(--text-muted); margin-bottom: 0; }
/* Optional logo / graphic above the eyebrow (config.logoUrl) — for landing
   pages that hide the site nav and need the hero to carry the mark. Both axes
   are auto and the block sets an inline max-height, so the mark renders at
   whichever cap binds first — always at its own ratio, never letterboxed.
   Alignment is inherited from the copy stack (centred, or start on
   hero--left / split).

   The max-width is stated at a specificity the .measure-* rules below cannot
   reach, and deliberately so: that knob caps every child of the copy stack to
   the TEXT measure, and on phones RELEASES half/third to none. Right for
   text, wrong for artwork — an uncapped 1024px wordmark ran straight off a
   430px screen on KWRI's /live-walkthrough (shipped 2026-09-01). The mark's
   width is bounded by the COLUMN, whatever the text measure is doing. */
.hero .hero__inner > .hero__logo.hero__logo,
.hero .hero-split__col > .hero__logo.hero__logo { display: block; width: auto; height: auto; max-width: 100%; }
.hero h1, .hero h2 { font-size: clamp(34px, 5vw, var(--text-display)); color: var(--text-heading); text-wrap: balance; }
.hero__sub { font-size: 18px; color: var(--text-body); text-wrap: pretty; }
/* left-aligned variant (eyebrow + headline + subhead flush left) */
.hero--left { text-align: left; }
.hero--left .hero__inner { justify-items: start; }
.hero--left .hero__sub { max-width: 60ch; }
/* §210 — copy measure (config.width → measure-* on the section): how wide the
   text runs INSIDE the container-wide copy box. The centred hero uses
   .hero__inner, not .container, so the global .measure-* > .container rules
   don't reach it — these do, on the box's children. Narrow (default) = the
   760px editorial measure; Full = the whole content width; Half / Third leave
   the rest of the banner to the artwork (a poster with a portrait on the
   right). Text alignment decides which edge the copy hugs. Split layout is
   unaffected (knob gated to centre). Phones release Half/Third (below). */
.hero.measure-narrow .hero__inner > * { max-width: 760px; }
.hero.measure-full .hero__inner > * { max-width: none; }
.hero.measure-half .hero__inner > * { max-width: 50%; }
.hero.measure-third .hero__inner > * { max-width: 33.333%; }
/* slideshow crossfade layers */
.hero__slides .hero__slide { position: absolute; inset: 0; width: 100%; height: 100%; object-fit: cover; background-size: cover; background-position: center; opacity: 0; transition: opacity 1s var(--ease); }
.hero__slides .hero__slide.is-active { opacity: 1; }
@media (prefers-reduced-motion: reduce) {
  .hero__slides .hero__slide { transition: none; }
}
/* Rotating headline/subhead pairs (Advanced Hero, config.rotatingMessages). Every
   pair stacks in ONE grid cell so the hero sizes to the tallest pair; the active
   pair crossfades in (HERO_TEXTROTATE_SCRIPT toggles .is-active). Alignment is
   inherited from .hero__inner (centred, or start under .hero--left). Only the
   first pair is a real heading; alternates use .hero__rotate-h (a div styled to
   match .hero h1) so the page keeps exactly one h1. */
.hero__rotate { display: grid; justify-items: inherit; width: 100%; }
.hero__rotate-item { grid-area: 1 / 1; display: grid; gap: var(--space-5); justify-items: inherit; opacity: 0; transition: opacity 0.7s var(--ease); pointer-events: none; }
.hero__rotate-item.is-active { opacity: 1; pointer-events: auto; }
.hero__rotate-h { margin: 0; font-family: var(--font-display); font-weight: var(--display-weight); letter-spacing: var(--display-tracking); text-transform: var(--display-transform); line-height: var(--display-line); font-size: clamp(34px, 5vw, var(--text-display)); color: var(--text-heading); text-wrap: balance; }
@media (prefers-reduced-motion: reduce) { .hero__rotate-item { transition: none; } }

/* rich text — readable prose column under a display heading */
.rich-text { padding: var(--section-pad-y) 0; }
/* §210 — shared column-measure modifier (see measureCls in blocks.ts). Text-first
   blocks (Hero, Text, Section header, CTA, FAQ) emit .measure-narrow / .measure-full
   to cap or release their inner .container. The .container's own margin:0 auto keeps
   the capped column centred. Direct-child selector so only the block's own container
   is affected, never a nested one. */
.measure-narrow > .container { max-width: 760px; }
.measure-full > .container { max-width: var(--container); }

/* Universal vertical-spacing knob (content/CMS/social-proof/CTA groups): the
   renderer stamps sec--compact onto a block's root section when its config
   says spacing:'compact'. Doubled class out-specifies every per-block padding
   rule (single class) without !important, whatever the sheet order. */
.sec--compact.sec--compact { padding-top: calc(var(--section-pad-y) / 2); padding-bottom: calc(var(--section-pad-y) / 2); }
.rich-text h2 { font-size: var(--text-h2); margin-bottom: var(--space-4); }
.rich-text > .container > .eyebrow { margin-bottom: var(--space-2); }
.rich-text p { margin-bottom: var(--space-4); max-width: 70ch; color: var(--text-body); }
/* align variants — prose keeps its 70ch measure, the column shifts with the text.
   Bullet lists stay left-read inside a fit-content box so the ✓ markers don't detach. */
.rich-text--center { text-align: center; }
.rich-text--center .rich-text__body p { margin-left: auto; margin-right: auto; }
.rich-text--center .rich-text__body ul { margin-left: auto; margin-right: auto; text-align: left; width: fit-content; }
.rich-text--center .rich-text__body .md-table { margin-left: auto; margin-right: auto; text-align: left; }
.rich-text--right { text-align: right; }
.rich-text--right .rich-text__body p { margin-left: auto; }
.rich-text--right .rich-text__body ul { margin-left: auto; text-align: left; width: fit-content; }
.rich-text--right .rich-text__body .md-table { margin-left: auto; text-align: left; }

/* legal document pages (/privacy, /terms) — readable long-form prose */
.legal-doc { max-width: 820px; padding-top: var(--space-8); padding-bottom: var(--space-10); }
.legal-doc h1 { font-size: var(--text-h1); margin-bottom: var(--space-5); }
.legal-doc h2 { font-size: var(--text-h2); margin-top: var(--space-7); margin-bottom: var(--space-3); }
.legal-doc h3 { font-size: var(--text-h3); margin-top: var(--space-5); margin-bottom: var(--space-2); }
.legal-doc p { color: var(--text-body); margin-bottom: var(--space-4); line-height: var(--line-body); }
.legal-doc ul { margin: 0 0 var(--space-4) var(--space-5); display: grid; gap: var(--space-2); }
.legal-doc li { color: var(--text-body); line-height: var(--line-body); }
.legal-doc strong { color: var(--text-heading); }
.legal-doc a { color: var(--accent-text); }

/* cta — background from the section surface (defaults to Dark); text scoped so it
   flips on any surface. */
.cta { background: transparent; color: var(--text-heading); padding: var(--section-pad-y) 0; text-align: center; }
.cta h2 { font-size: var(--text-h2); margin-bottom: var(--space-3); color: var(--text-heading); }
.cta p { margin-bottom: var(--space-2); color: var(--text-muted); }
.cta .btn { margin-top: var(--space-5); }
/* button-only cta (no heading/body) — don't let the top margin push it off-center */
.cta .btn:first-child { margin-top: 0; }

/* footer */
.site-footer { border-top: 1px solid var(--border); padding: var(--space-6) var(--space-5); text-align: center; color: var(--text-muted); font-size: var(--text-xs); }

/* message pages */
.message-page { min-height: 60vh; display: grid; place-content: center; text-align: center; gap: var(--space-3); padding: var(--space-8) var(--space-5); }
.message-page h1 { font-size: var(--text-h1); }
.message-page p { color: var(--text-muted); }

/* shared eyebrow */
.eyebrow { font-size: var(--eyebrow-size); letter-spacing: var(--eyebrow-tracking); font-weight: var(--eyebrow-weight); color: var(--eyebrow-color); text-transform: var(--eyebrow-transform, uppercase); margin-bottom: var(--space-3); }

/* site nav block — an editable sticky navbar (alternative to the shell header) */
.block-nav { position: sticky; top: 0; z-index: 10; background: var(--surface-card); border-bottom: 1px solid var(--border); }
.block-nav__inner { display: flex; align-items: center; gap: var(--space-5); padding-top: var(--space-3); padding-bottom: var(--space-3); }
.block-nav__brand { display: flex; align-items: center; gap: var(--space-3); min-width: 0; }
.block-nav__home { display: inline-flex; align-items: center; min-width: 0; }
/* Logo height = the chrome's --logo-h (a desktop MAX, set by blocks.ts from the
   editor slider; default 40px). min(…, 8vw) keeps it fluid so it shrinks on
   narrow screens without a per-device setting; max-width guards a wide wordmark
   from overflowing / crowding the hamburger. */
.block-nav__logo { height: min(var(--logo-h, 40px), 8vw); width: auto; max-width: 60vw; object-fit: contain; display: block; }
.block-nav__brandtext { font-family: var(--font-display); font-weight: var(--display-weight); font-size: var(--text-h3); letter-spacing: var(--display-tracking); color: var(--text-heading); }
/* Tagline stretches to the full brand-row (logo) height so its divider line runs
   the whole height; the inner --text span is what actually aligns top/center/
   bottom. text-box-trim collapses the font's leading so the box hugs cap-height
   to the alphabetic baseline — alignment then lands on the LETTERS, not the
   descent space. Without it, flex-end aligned the line-box bottom (descent
   included), so caps floated up off the logo edge and a capital "J" made it
   worse. Unsupported browsers (e.g. Firefox) fall back to the untrimmed box. */
.block-nav__tagline { align-self: stretch; display: inline-flex; align-items: center; color: var(--text-muted); font-size: var(--text-sm); padding-left: var(--space-3); border-left: 1px solid var(--border); }
.block-nav__tagline-text { line-height: 1.1; text-box-trim: trim-both; text-box-edge: cap alphabetic; }
.block-nav__tagline--top { align-items: flex-start; }
.block-nav__tagline--bottom { align-items: flex-end; }
.block-nav__links { margin-left: auto; display: flex; flex-wrap: wrap; align-items: center; gap: var(--space-5); }
.block-nav__links a:not(.btn) { color: var(--text-muted); font-weight: 500; font-size: var(--text-sm); transition: color var(--speed-fast) var(--ease); }
.block-nav__links a:not(.btn):hover { color: var(--accent-text); }
/* nav CTA button — a pill at the end of the link row. Plain-link colour rules are
   scoped to :not(.btn) so the button keeps its own fill/text pair (.btn--brand /
   .btn--outline and their surface overrides) instead of the link colour.
   Stays inline in the hamburger dropdown (full-width there). */
.block-nav__links a.block-nav__cta { padding: 8px 16px; font-size: var(--text-sm); transition: opacity var(--speed-fast) var(--ease); }

/* §197 nav submenus — a group label with a dropdown of its member links. Opens
   on hover AND :focus-within (keyboard) via CSS; NAV_SCRIPT adds a click-toggled
   .is-open for touch. The label is a toggle, never a link. */
.block-nav__group { position: relative; }
.block-nav__group-btn { display: inline-flex; align-items: center; gap: 4px; background: none; border: 0; padding: 0; cursor: pointer; font-family: inherit; color: var(--text-muted); font-weight: 500; font-size: var(--text-sm); transition: color var(--speed-fast) var(--ease); }
.block-nav__group-btn:hover, .block-nav__group.is-active > .block-nav__group-btn { color: var(--accent-text); }
.block-nav__group-chevron { width: 14px; height: 14px; transition: transform var(--speed-fast) var(--ease); }
.block-nav__group:hover .block-nav__group-chevron, .block-nav__group.is-open .block-nav__group-chevron { transform: rotate(180deg); }
/* dropdown panel — offset below the row; the ::before strip bridges the hover
   gap between button and panel so :hover doesn't drop while crossing it. */
.block-nav__menu { position: absolute; top: calc(100% + var(--space-3)); left: calc(-1 * var(--space-4)); min-width: 220px; display: none; flex-direction: column; background: var(--nav-pop-bg); border: 1px solid var(--border); border-radius: var(--radius-card); box-shadow: var(--shadow-pop); padding: var(--space-2) 0; z-index: 20; }
.block-nav__menu::before { content: ''; position: absolute; left: 0; right: 0; top: calc(-1 * var(--space-3) - 1px); height: calc(var(--space-3) + 1px); }
.block-nav__group:hover > .block-nav__menu, .block-nav__group:focus-within > .block-nav__menu, .block-nav__group.is-open > .block-nav__menu { display: flex; }
.block-nav__menu a { padding: var(--space-2) var(--space-4); }
.block-footer__cta.btn { margin-top: var(--space-5); align-self: flex-start; }

/* auto dark navbar — set on the nav (blocks.ts) when it's pinned to the
   community's DARK (white) logo variant. Fills with the community dark surface
   color (--cs-dark-surface, else the default ink) and flips text/links/toggle to
   on-dark. --nav-pop-bg carries the same fill into the collapsed dropdown. */
.block-nav--dark { background: var(--cs-dark-surface); border-bottom-color: oklch(1 0 0 / 0.14); --nav-pop-bg: var(--cs-dark-surface); --nav-pop-muted: var(--text-on-dark-muted); }
.block-nav--dark .block-nav__brandtext { color: var(--text-on-dark); }
.block-nav--dark .block-nav__tagline { color: var(--text-on-dark-muted); border-left-color: oklch(1 0 0 / 0.2); }
.block-nav--dark .block-nav__links a:not(.btn) { color: var(--text-on-dark-muted); }
.block-nav--dark .block-nav__links a:not(.btn):hover { color: var(--text-on-dark); }
.block-nav--dark .block-nav__group-btn { color: var(--text-on-dark-muted); }
.block-nav--dark .block-nav__group-btn:hover, .block-nav--dark .block-nav__group.is-active > .block-nav__group-btn { color: var(--text-on-dark); }
.block-nav--dark .block-nav__menu { border-color: oklch(1 0 0 / 0.14); }
/* outline CTA flips to on-dark ink so it stays legible on the dark bar */
.block-nav--dark .block-nav__links a.block-nav__cta.btn--outline { color: var(--text-on-dark); border-color: var(--text-on-dark); }
.block-nav--dark .nav-toggle { background: transparent; color: var(--text-on-dark); border-color: oklch(1 0 0 / 0.28); }
.block-nav--dark .nav-toggle:hover { border-color: var(--text-on-dark); }

/* hamburger toggle — shared by both navs; hidden until a breakpoint collapses */
.nav-toggle { display: none; margin-left: auto; align-items: center; justify-content: center; width: 40px; height: 40px; padding: 0; border: 1px solid var(--border); border-radius: var(--radius-control); background: var(--surface-card); color: var(--text-heading); cursor: pointer; }
.nav-toggle:hover { border-color: var(--text-heading); }
.nav-toggle__icon { width: 22px; height: 22px; }

/* responsive collapse → hamburger dropdown, BREAKPOINT-driven (no JS measure).
   Each nav carries a --collapse-<key> class; these @media rules turn the link
   row into a dropdown at/below the chosen width. JS only toggles .is-open. */

.block-nav--collapse-always .nav-toggle, .site-header--collapse-always .nav-toggle { display: inline-flex; }
.block-nav--collapse-always .block-nav__links, .site-header--collapse-always .site-nav { position: absolute; top: 100%; left: 0; right: 0; margin-left: 0; flex-direction: column; flex-wrap: nowrap; align-items: stretch; gap: 0; background: var(--nav-pop-bg); border-bottom: 1px solid var(--border); box-shadow: var(--shadow-pop); padding: var(--space-2) 0; display: none; }
.block-nav--collapse-always.is-open .block-nav__links, .site-header--collapse-always.is-open .site-nav { display: flex; }
.block-nav--collapse-always .block-nav__links a, .site-header--collapse-always .site-nav a { padding: var(--space-3) var(--space-5); }
.block-nav--collapse-always .block-nav__group { position: static; }
.block-nav--collapse-always .block-nav__group-btn { display: block; width: 100%; text-align: left; padding: var(--space-3) var(--space-5) var(--space-1); cursor: default; color: var(--nav-pop-muted); font-size: var(--text-xs); text-transform: uppercase; letter-spacing: 0.08em; }
.block-nav--collapse-always .block-nav__group-chevron { display: none; }
.block-nav--collapse-always .block-nav__menu { display: block; position: static; min-width: 0; background: transparent; border: 0; border-radius: 0; box-shadow: none; padding: 0; }
.block-nav--collapse-always .block-nav__menu::before { display: none; }
.block-nav--collapse-always .block-nav__menu a { display: block; padding-left: calc(var(--space-5) + var(--space-3)); }
@media (max-width: 640px) {
.block-nav--collapse-phone .nav-toggle, .site-header--collapse-phone .nav-toggle { display: inline-flex; }
.block-nav--collapse-phone .block-nav__links, .site-header--collapse-phone .site-nav { position: absolute; top: 100%; left: 0; right: 0; margin-left: 0; flex-direction: column; flex-wrap: nowrap; align-items: stretch; gap: 0; background: var(--nav-pop-bg); border-bottom: 1px solid var(--border); box-shadow: var(--shadow-pop); padding: var(--space-2) 0; display: none; }
.block-nav--collapse-phone.is-open .block-nav__links, .site-header--collapse-phone.is-open .site-nav { display: flex; }
.block-nav--collapse-phone .block-nav__links a, .site-header--collapse-phone .site-nav a { padding: var(--space-3) var(--space-5); }
.block-nav--collapse-phone .block-nav__group { position: static; }
.block-nav--collapse-phone .block-nav__group-btn { display: block; width: 100%; text-align: left; padding: var(--space-3) var(--space-5) var(--space-1); cursor: default; color: var(--nav-pop-muted); font-size: var(--text-xs); text-transform: uppercase; letter-spacing: 0.08em; }
.block-nav--collapse-phone .block-nav__group-chevron { display: none; }
.block-nav--collapse-phone .block-nav__menu { display: block; position: static; min-width: 0; background: transparent; border: 0; border-radius: 0; box-shadow: none; padding: 0; }
.block-nav--collapse-phone .block-nav__menu::before { display: none; }
.block-nav--collapse-phone .block-nav__menu a { display: block; padding-left: calc(var(--space-5) + var(--space-3)); }
}
@media (max-width: 768px) {
.block-nav--collapse-tablet .nav-toggle, .site-header--collapse-tablet .nav-toggle { display: inline-flex; }
.block-nav--collapse-tablet .block-nav__links, .site-header--collapse-tablet .site-nav { position: absolute; top: 100%; left: 0; right: 0; margin-left: 0; flex-direction: column; flex-wrap: nowrap; align-items: stretch; gap: 0; background: var(--nav-pop-bg); border-bottom: 1px solid var(--border); box-shadow: var(--shadow-pop); padding: var(--space-2) 0; display: none; }
.block-nav--collapse-tablet.is-open .block-nav__links, .site-header--collapse-tablet.is-open .site-nav { display: flex; }
.block-nav--collapse-tablet .block-nav__links a, .site-header--collapse-tablet .site-nav a { padding: var(--space-3) var(--space-5); }
.block-nav--collapse-tablet .block-nav__group { position: static; }
.block-nav--collapse-tablet .block-nav__group-btn { display: block; width: 100%; text-align: left; padding: var(--space-3) var(--space-5) var(--space-1); cursor: default; color: var(--nav-pop-muted); font-size: var(--text-xs); text-transform: uppercase; letter-spacing: 0.08em; }
.block-nav--collapse-tablet .block-nav__group-chevron { display: none; }
.block-nav--collapse-tablet .block-nav__menu { display: block; position: static; min-width: 0; background: transparent; border: 0; border-radius: 0; box-shadow: none; padding: 0; }
.block-nav--collapse-tablet .block-nav__menu::before { display: none; }
.block-nav--collapse-tablet .block-nav__menu a { display: block; padding-left: calc(var(--space-5) + var(--space-3)); }
}
@media (max-width: 1024px) {
.block-nav--collapse-laptop .nav-toggle, .site-header--collapse-laptop .nav-toggle { display: inline-flex; }
.block-nav--collapse-laptop .block-nav__links, .site-header--collapse-laptop .site-nav { position: absolute; top: 100%; left: 0; right: 0; margin-left: 0; flex-direction: column; flex-wrap: nowrap; align-items: stretch; gap: 0; background: var(--nav-pop-bg); border-bottom: 1px solid var(--border); box-shadow: var(--shadow-pop); padding: var(--space-2) 0; display: none; }
.block-nav--collapse-laptop.is-open .block-nav__links, .site-header--collapse-laptop.is-open .site-nav { display: flex; }
.block-nav--collapse-laptop .block-nav__links a, .site-header--collapse-laptop .site-nav a { padding: var(--space-3) var(--space-5); }
.block-nav--collapse-laptop .block-nav__group { position: static; }
.block-nav--collapse-laptop .block-nav__group-btn { display: block; width: 100%; text-align: left; padding: var(--space-3) var(--space-5) var(--space-1); cursor: default; color: var(--nav-pop-muted); font-size: var(--text-xs); text-transform: uppercase; letter-spacing: 0.08em; }
.block-nav--collapse-laptop .block-nav__group-chevron { display: none; }
.block-nav--collapse-laptop .block-nav__menu { display: block; position: static; min-width: 0; background: transparent; border: 0; border-radius: 0; box-shadow: none; padding: 0; }
.block-nav--collapse-laptop .block-nav__menu::before { display: none; }
.block-nav--collapse-laptop .block-nav__menu a { display: block; padding-left: calc(var(--space-5) + var(--space-3)); }
}

@media (max-width: 600px) {
  .block-nav__tagline { display: none; }
  .block-nav__links { gap: var(--space-4); }
  /* .block-nav__logo shrinks fluidly via min(…, 8vw) — no stepped rule needed. */
  .site-header__logo { height: 30px; }
}

/* site footer block — background from the section surface (defaults to Dark); all
   colours scoped so the footer flips correctly on any surface. */
.block-footer { background: transparent; color: var(--text-body); }
.block-footer__inner { display: grid; grid-template-columns: 1.2fr 2fr; gap: var(--space-8); padding-top: var(--space-10); padding-bottom: var(--space-8); }
.block-footer__home { display: inline-block; }
.block-footer__logo { height: min(var(--logo-h, 40px), 10vw); width: auto; max-width: 70vw; object-fit: contain; display: block; margin-bottom: var(--space-4); }
.block-footer__brandtext { font-family: var(--font-display); font-weight: var(--display-weight); font-size: var(--text-h3); color: var(--text-heading); display: block; margin-bottom: var(--space-4); }
.block-footer__blurb { color: var(--text-muted); font-size: var(--text-sm); max-width: 40ch; }
.block-footer__social { display: flex; gap: var(--space-3); margin-top: var(--space-5); }
.block-footer__social-link { display: inline-grid; place-content: center; width: 36px; height: 36px; border: 1px solid var(--border); border-radius: var(--radius-control); color: var(--text-body); font-size: var(--text-xs); }
.block-footer__social-link:hover { color: var(--accent-text); border-color: var(--border-strong); }
.block-footer__social-icon { width: 18px; height: 18px; }
.block-footer__cols { display: grid; grid-template-columns: repeat(auto-fit, minmax(120px, 1fr)); gap: var(--space-6); }
.block-footer__col h4 { font-size: var(--text-sm); color: var(--text-heading); margin-bottom: var(--space-3); }
.block-footer__col ul { list-style: none; display: grid; gap: var(--space-2); }
.block-footer__col a { color: var(--text-muted); font-size: var(--text-sm); }
.block-footer__col a:hover { color: var(--accent-text); }
.block-footer__legal { border-top: 1px solid var(--border); }
.block-footer__legal-inner { display: flex; flex-wrap: wrap; justify-content: space-between; gap: var(--space-3); padding-top: var(--space-4); padding-bottom: var(--space-4); color: var(--text-muted); font-size: var(--text-xs); }
.block-footer__legal-links { display: flex; gap: var(--space-4); }
.block-footer__legal-links a { color: var(--text-muted); }
.block-footer__legal-links a:hover { color: var(--accent-text); }
@media (max-width: 700px) {
  .block-footer__inner { grid-template-columns: 1fr; gap: var(--space-6); }
}

/* outline button (secondary actions) */
.btn--outline { background: transparent; color: var(--text-heading); border-color: var(--border-strong); }
.btn--outline:hover { background: var(--surface-tint); opacity: 1; }

/* product hero — left-aligned marketing hero */
.phero { padding: var(--hero-pad-y) 0 var(--space-10); }
/* Hero's base column is the narrow ~760px editorial measure; the shared
   .measure-full modifier (below) releases it to the full content width. */
.phero__inner { max-width: 760px; }
.phero h1 { font-size: clamp(34px, 5vw, var(--text-display)); margin-bottom: var(--space-4); text-wrap: balance; }
.phero__sub { font-size: 18px; color: var(--text-muted); max-width: 60ch; margin-bottom: var(--space-5); text-wrap: pretty; }
.phero__actions { display: flex; gap: var(--space-3); flex-wrap: wrap; }
/* Alignment = text-align only; the column stays centred in both widths, so
   Narrow+Left is the classic centred column with left-ragged text (pre-§210
   default), and Full+Left spans the content width flush to the page gutter. */
.phero--center { text-align: center; }
.phero--center .phero__sub { margin-left: auto; margin-right: auto; }
.phero--center .phero__actions { justify-content: center; }

/* section header */
.section-header { padding: var(--section-pad-y) 0 var(--space-6); }
/* h1 and h2 look identical here — the tag is a semantic/SEO choice (headingLevel),
   not a size choice, so a page-title header doesn't change shape when promoted. */
.section-header h1, .section-header h2 { font-size: var(--text-h2); margin-bottom: var(--space-3); }
.section-header__sub { color: var(--text-muted); max-width: 70ch; }
.section-header--center { text-align: center; }
.section-header--center .section-header__sub { margin-left: auto; margin-right: auto; }

/* image + text split */
.image-text { padding: var(--section-pad-y) 0; }
.image-text__head { margin-bottom: var(--space-6); max-width: 60ch; }
.image-text__head .eyebrow { margin-bottom: var(--space-2); }
.image-text__head h2 { font-size: var(--text-h2); }
.image-text__grid { display: grid; grid-template-columns: 1fr 1fr; gap: var(--space-8); align-items: center; }
/* image-height modes: content/text stretch to the column; natural/fixed center */
.image-text__grid--content, .image-text__grid--text { align-items: stretch; }
.image-text__grid--reverse .image-text__media { order: 2; }
.image-text__media { min-height: 0; }
.image-text__media img, .image-text__placeholder { width: 100%; aspect-ratio: 4 / 3; object-fit: cover; border-radius: var(--radius-media); background: var(--surface-tint); display: block; }
/* content + text: the image must match the TEXT column height. An in-flow img
   contributes its intrinsic height to the grid track, so the row grows to the
   image (not the text). Take the image out of flow (absolute) so only the text
   column sizes the row, and the stretched media cell defines the image box. */
.image-text__grid--content .image-text__media, .image-text__grid--text .image-text__media { position: relative; }
.image-text__grid--content .image-text__media img, .image-text__grid--content .image-text__placeholder,
.image-text__grid--text .image-text__media img, .image-text__grid--text .image-text__placeholder { position: absolute; inset: 0; height: 100%; aspect-ratio: auto; }
/* full image: show the whole image at its intrinsic ratio, uncropped */
.image-text__grid--natural .image-text__media img { aspect-ratio: auto; height: auto; object-fit: contain; }
/* fixed: explicit px height comes from the inline style; just drop the ratio */
.image-text__grid--fixed .image-text__media img, .image-text__grid--fixed .image-text__placeholder { aspect-ratio: auto; }
.image-text__body h2 { font-size: var(--text-h2); margin-bottom: var(--space-3); }
.image-text__body p { color: var(--text-body); margin-bottom: var(--space-4); max-width: 60ch; }
.image-text__actions { display: flex; flex-wrap: wrap; gap: var(--space-3); margin-top: var(--space-5); }

/* §211 full-bleed side image — the image column runs to the near viewport edge and
   fills the band top-to-bottom; the copy stays aligned to the site container column
   and is vertically centred. Shared by imageText / featureRows / leadForm. The
   grid is full section width (escapes .container), so its image cell reaches the
   edge. --bleed-pad aligns the copy's OUTER edge to .container's inner edge: half
   the leftover viewport width + the normal container padding. min() clamps it to
   the container padding once the viewport is narrower than --container (which also
   makes it correct inside the editor preview iframe). Only padding uses 100vw, so
   the scrollbar overcount can't create horizontal page scroll. */
.image-text--bleed, .feature-rows--bleed, .lead-form-section--bleed { --bleed-pad: calc((100vw - min(100vw, var(--container))) / 2 + var(--space-5)); }
.image-text--bleed { padding: 0; }
.image-text__grid--bleed { display: grid; grid-template-columns: 1fr 1fr; gap: 0; align-items: stretch; }
.image-text__grid--bleed .image-text__media { position: relative; min-height: 340px; }
.image-text__grid--bleed .image-text__media img, .image-text__grid--bleed .image-text__placeholder { position: absolute; inset: 0; width: 100%; height: 100%; aspect-ratio: auto; object-fit: cover; border-radius: 0; }
.image-text__grid--bleed .image-text__body { display: flex; flex-direction: column; justify-content: center; padding: var(--section-pad-y) var(--space-8); }
.image-text__grid--bleed:not(.image-text__grid--reverse) .image-text__body { padding-right: var(--bleed-pad); }
.image-text__grid--bleed.image-text__grid--reverse .image-text__body { padding-left: var(--bleed-pad); }
/* feature rows: heading stays in .container, the row list breaks out full width */
.feature-rows--bleed { padding-bottom: 0; }
.feature-rows__list--bleed { display: grid; gap: 0; margin-top: var(--space-8); }
.frow--bleed { grid-template-columns: 1fr 1fr; gap: 0; align-items: stretch; }
.frow--bleed .frow__media { position: relative; min-height: 360px; }
.frow--bleed .frow__media img, .frow--bleed .feature-rows__placeholder { position: absolute; inset: 0; width: 100%; height: 100%; aspect-ratio: auto; object-fit: cover; border-radius: 0; }
.frow--bleed .frow__body { display: flex; flex-direction: column; justify-content: center; padding: var(--section-pad-y) var(--space-8); }
.frow--bleed:not(.frow--reverse) .frow__body { padding-right: var(--bleed-pad); }
.frow--bleed.frow--reverse .frow__body { padding-left: var(--bleed-pad); }
/* lead form: photo bleeds, the form card stays in its column (formcell centres it) */
.lead-form-section--bleed { padding: 0; }
.lead-form-section__inner--bleed { position: relative; z-index: 1; display: grid; grid-template-columns: 1fr 1fr; gap: 0; align-items: stretch; }
.lead-form-section__inner--bleed .lead-form-section__media { border-radius: 0; min-height: 100%; }
.lead-form-section__formcell { display: flex; flex-direction: column; justify-content: center; padding: var(--section-pad-y) var(--space-8); }
.lead-form-section__inner--bleed:not(.lead-form-section__inner--reverse) .lead-form-section__formcell { padding-right: var(--bleed-pad); }
.lead-form-section__inner--bleed.lead-form-section__inner--reverse .lead-form-section__formcell { padding-left: var(--bleed-pad); }
@media (max-width: 760px) {
  .image-text__grid--bleed, .frow--bleed, .lead-form-section__inner--bleed { grid-template-columns: 1fr; }
  .image-text__grid--bleed .image-text__media, .lead-form-section__inner--bleed .lead-form-section__media { min-height: 260px; }
  .frow--bleed .frow__media { min-height: 240px; }
  /* on mobile the image always sits on top, regardless of side */
  .image-text__grid--bleed.image-text__grid--reverse .image-text__media,
  .frow--bleed.frow--reverse .frow__media,
  .lead-form-section__inner--bleed.lead-form-section__inner--reverse .lead-form-section__media { order: 0; }
  .image-text__grid--bleed .image-text__body,
  .image-text__grid--bleed.image-text__grid--reverse .image-text__body,
  .frow--bleed .frow__body,
  .frow--bleed.frow--reverse .frow__body,
  .lead-form-section__formcell,
  .lead-form-section__inner--bleed.lead-form-section__inner--reverse .lead-form-section__formcell { padding: var(--space-8) var(--space-5); }
}

/* feature grid */
.features { padding: var(--section-pad-y) 0; }
/* h1 = the entryList headingLevel knob (a KB category page's only heading);
   same size as h2 so promoting the tag is invisible on the page. */
.features h1, .features h2 { font-size: var(--text-h2); }
.features__sub { color: var(--text-muted); max-width: 70ch; margin-top: var(--space-3); }
.features__grid { display: grid; grid-template-columns: repeat(var(--cols, 3), 1fr); gap: var(--grid-gap); margin-top: var(--space-6); }
.feature-card { background: var(--surface-card); border: 1px solid var(--border); border-radius: var(--radius-card); padding: var(--space-5); box-shadow: var(--shadow-card); overflow: hidden; }
.feature-card h3 { font-size: var(--text-h3); margin-bottom: var(--space-2); }
.feature-card p { color: var(--text-muted); }
/* optional per-card media — neutral box, bleeds to the card edges */
.feature-card__media { margin: calc(-1 * var(--space-5)) calc(-1 * var(--space-5)) var(--space-4); aspect-ratio: 16 / 10; background: var(--surface-tint); border-bottom: 1px solid var(--border); }
.feature-card__media img { width: 100%; height: 100%; object-fit: cover; }
/* optional per-card icon — bordered chip (uploaded img or lucide svg) */
.feature-card__icon { display: inline-grid; place-content: center; width: 44px; height: 44px; border: 1px solid var(--border); border-radius: var(--radius-control); color: var(--text-heading); margin-bottom: var(--space-3); }
.feature-card__icon svg { width: 22px; height: 22px; }
.feature-card__icon img { width: 24px; height: 24px; object-fit: contain; }
/* optional per-card link */
.feature-card__link { display: inline-block; margin-top: var(--space-3); font-weight: 600; font-size: var(--text-sm); color: var(--accent-text); }
/* Card background knobs (blocks.ts featureCardStyle → inline --fc-* vars +
   modifier classes on the grid). Same specificity as the noir tile override
   and later in source, so an explicit author fill wins there too. The ink
   classes mirror the .cs-surface--dark / --custom remaps at CARD scope: a
   solid custom fill carries its own readable text whatever band it sits on.
   Custom props set on .feature-card are visible to its own border/background
   (unlike the Brand-wrapper gotcha, nothing here wants the UN-remapped value). */
.features__grid--card-custom .feature-card { background: var(--fc-bg); }
.features__grid--card-blur .feature-card { -webkit-backdrop-filter: blur(var(--fc-blur)); backdrop-filter: blur(var(--fc-blur)); }
.features__grid--card-ink-light .feature-card { --on: #ffffff; --accent-text: var(--accent-on-dark, var(--accent)); }
/* --accent-fixed = the TRUE brand colour (never the on-dark remap a dark
   section inherits), so a link on a light card inside a dark band stays brand. */
.features__grid--card-ink-dark .feature-card { --on: var(--ink-900); --accent-text: var(--accent-fixed, var(--accent)); }
.features__grid--card-ink-light .feature-card, .features__grid--card-ink-dark .feature-card {
  color: var(--on);
  --text-heading: var(--on);
  --text-body: color-mix(in srgb, var(--on) 80%, transparent);
  --text-muted: color-mix(in srgb, var(--on) 62%, transparent);
  --text-faint: color-mix(in srgb, var(--on) 45%, transparent);
  --surface-tint: color-mix(in srgb, var(--on) 6%, transparent);
  --border: color-mix(in srgb, var(--on) 16%, transparent);
  --border-strong: color-mix(in srgb, var(--on) 34%, transparent);
  --accent-soft: color-mix(in srgb, var(--accent-text) 14%, transparent);
}

/* §195 entryList — feature-cards as whole-card links + category group bands */
/* deep-link target (anchorId): clear the sticky header so the band top isn't hidden */
.entry-list[id], .features[id] { scroll-margin-top: calc(var(--header-h) + var(--space-5)); }
a.entry-card { display: block; text-decoration: none; color: inherit; }
a.entry-card:hover { border-color: var(--accent-text); }
a.entry-card:hover .feature-card__link { text-decoration: underline; }
.entry-list__more { margin-top: var(--space-5); }
.entry-list__more a { font-weight: 600; font-size: var(--text-sm); color: var(--accent-text); }
.entry-list__more a:hover { text-decoration: underline; }
.entry-list__group { font-size: var(--text-h3); margin: var(--space-7) 0 var(--space-4); }
.entry-list__group:first-child { margin-top: 0; }
/* Blog-layout grid has no margin-top of its own (unlike .features__grid), so an
   ungrouped blog list would butt straight against the head — restore the gap. */
.entry-list__head + .blog__grid { margin-top: var(--space-6); }
/* Centered head: eyebrow, heading and intro align center above the card grid. */
.entry-list--center .entry-list__head { text-align: center; }
.entry-list--center .entry-list__head .features__sub { margin-left: auto; margin-right: auto; }
/* Category badge sits at the TOP of the card (above the title), so it needs
   bottom—not top—spacing (the base .feature-card__chips is built for chips UNDER
   body copy). And it reads as a confident, brand-tinted label instead of the
   washed-out muted amenity chip. */
.entry-card .feature-card__chips { margin-top: 0; margin-bottom: var(--space-3); }
.entry-card .chip { color: var(--accent-text); background: var(--accent-soft); border-color: transparent; font-weight: 600; padding: 4px 12px; }

/* entrySearch — search field over the site's CMS entries; ENTRY_SEARCH_SCRIPT
   hydrates the dropdown panel. Panel fill = the section's band colour when a
   surface declares one (solid), else the page surface — readable everywhere. */
.entry-search { padding: var(--section-pad-y) 0; }
.entry-search .entry-list__head { margin-bottom: var(--space-5); }
.entry-search--center .entry-list__head { text-align: center; }
.entry-search--center .entry-list__head .features__sub { margin-left: auto; margin-right: auto; }
.entry-search__box { position: relative; max-width: 560px; }
.entry-search--center .entry-search__box { margin-inline: auto; }
.entry-search__icon { position: absolute; left: 14px; top: 50%; transform: translateY(-50%); width: 18px; height: 18px; color: var(--text-faint); pointer-events: none; }
.entry-search__input { width: 100%; padding: 12px 16px 12px 42px; font: inherit; font-size: var(--text-md); color: var(--text-heading); background: var(--surface-card); border: 1px solid var(--border); border-radius: var(--radius-control); outline: none; transition: border-color var(--speed-fast) var(--ease); }
.entry-search__input::placeholder { color: var(--text-faint); }
.entry-search__input:focus { border-color: var(--accent-text); }
/* hide the native WebKit clear button — the panel has its own empty state */
.entry-search__input::-webkit-search-cancel-button { -webkit-appearance: none; }
.entry-search__panel { position: absolute; top: calc(100% + 6px); left: 0; right: 0; background: var(--surface-band, var(--surface-page)); border: 1px solid var(--border); border-radius: var(--radius-card); box-shadow: var(--shadow-pop); z-index: 30; max-height: 420px; overflow-y: auto; padding: var(--space-2) 0; }
.entry-search__item { display: block; padding: var(--space-2) var(--space-4); text-decoration: none; color: inherit; cursor: pointer; }
.entry-search__item:hover, .entry-search__item.is-active { background: var(--surface-tint); }
.entry-search__chips { display: flex; gap: 6px; margin-bottom: 2px; }
.entry-search__chip { font-size: 11px; font-weight: 600; color: var(--accent-text); background: var(--accent-soft); border-radius: var(--radius-chip, 999px); padding: 1px 8px; }
.entry-search__item-title { font-weight: 600; color: var(--text-heading); font-size: var(--text-sm); }
.entry-search__item-sum { color: var(--text-muted); font-size: var(--text-xs); white-space: nowrap; overflow: hidden; text-overflow: ellipsis; }
.entry-search__empty { padding: var(--space-3) var(--space-4); color: var(--text-muted); font-size: var(--text-sm); }

/* steps */
.steps { padding: var(--section-pad-y) 0; }
.steps h2 { font-size: var(--text-h2); margin-bottom: var(--space-6); }
.steps__list { list-style: none; display: grid; gap: var(--space-5); max-width: 760px; }
.step { display: flex; gap: var(--space-4); }
.step__num { flex-shrink: 0; width: 36px; height: 36px; border-radius: 50%; background: var(--accent-soft); color: var(--accent-text); display: grid; place-content: center; font-weight: 600; }
.step__body h3 { font-size: var(--text-h3); margin-bottom: var(--space-1); }
.step__body p { color: var(--text-muted); }

/* steps — flow variant (vertical chain joined by arrows) */
.steps--flow .flow { max-width: 460px; margin: 0 auto; display: grid; gap: var(--space-2); }
/* explicit align — heading + list/diagram move together (unset = legacy per-layout look) */
.steps--center h2 { text-align: center; }
.steps--center .steps__list { margin-inline: auto; }
.steps--left .flow { margin-inline: 0; }
/* optional side panel: an image / Markdown text column beside the steps */
.steps__grid { display: grid; grid-template-columns: 1fr 1fr; gap: var(--space-8); align-items: center; }
.steps__grid--side-right .steps__side { order: 2; }
.steps__side-img { width: 100%; border-radius: var(--radius-media); display: block; }
.steps__side-img + .steps__side-text { margin-top: var(--space-5); }
.flow__step { background: var(--surface-card); border: 1px solid var(--border); border-radius: var(--radius-card); padding: var(--space-4) var(--space-5); box-shadow: var(--shadow-card); text-align: center; }
.flow__step strong { display: block; font-family: var(--font-display); font-size: var(--text-h3); color: var(--text-heading); margin-bottom: var(--space-1); }
.flow__step span { color: var(--text-muted); font-size: var(--text-sm); }
.flow__step--accent { background: var(--accent-soft); border-color: var(--accent-text); }
.flow__step--accent strong { color: var(--accent-text); }
.flow__arrow { text-align: center; color: var(--accent-text); font-size: var(--text-h3); line-height: 1; }

/* hero — two-CTA row */
.hero__actions { display: flex; flex-wrap: wrap; gap: var(--space-3); justify-content: center; }
.hero--left .hero__actions { justify-content: flex-start; }

/* per-section surfaces — paint a full-bleed background + remap the scoped color
   tokens so the block's content flips for contrast (text/border/cards/accent).
   --on is the readable ink on the surface; muted variants are color-mixed from it. */
/* --surface-band: the section's actual band colour — what a photo fade should
   dissolve into (see .app-hero__bg::after). Declared ON the wrapper so it resolves
   BEFORE the child accent remap (on Brand, children see --accent = the ink).
   --band-glow overrides the fade's accent glow (Brand kills it: glow ≈ band). */
.cs-surface--subtle { background: var(--surface-tint); --surface-band: var(--surface-tint); }
/* Dark surface (and its 'secondary' back-compat alias) — fills the one site dark
   colour and remaps the scoped tokens to readable ink. --on = the ink; --on-inverse
   = the surface colour itself (for inverse buttons). */
.cs-surface--secondary, .cs-surface--dark {
  background: var(--site-dark); --surface-band: var(--site-dark); --on: var(--site-dark-ink, #fff); --on-inverse: var(--site-dark); color: var(--on);
  --text-heading: var(--on);
  --text-body: color-mix(in srgb, var(--on) 80%, transparent);
  --text-muted: color-mix(in srgb, var(--on) 62%, transparent);
  --text-faint: color-mix(in srgb, var(--on) 45%, transparent);
  --surface-card: color-mix(in srgb, var(--on) 7%, transparent);
  /* the same card, OPAQUE: the tint composited onto the band — what a card
     knob means by "100% opacity" (feature grid; see featureCardStyle) */
  --surface-card-solid: color-mix(in srgb, var(--on) 7%, var(--surface-band));
  --surface-tint: color-mix(in srgb, var(--on) 5%, transparent);
  --border: color-mix(in srgb, var(--on) 16%, transparent);
  --border-strong: color-mix(in srgb, var(--on) 34%, transparent);
  /* accent-coloured content (links, tags, icons) uses the on-dark accent so a
     dark brand colour stays legible on a dark band. NO ", var(--accent)" fallback
     here: a custom property that names ITSELF -- even only inside a var() fallback
     -- is a dependency CYCLE per css-variables-1 3, which makes it guaranteed-
     invalid. Firefox enforces that strictly, so --accent resolved to NOTHING on
     every dark band, and a var() that is invalid at computed-value time voids the
     WHOLE declaration reading it, not just its own layer. That is what erased the
     app-hero photo scrim on the platform site in Firefox: .app-hero__bg::after
     paints an accent glow layer OVER the black fade in one 'background'
     shorthand, so the unreadable var(--accent) in the glow took the black fade
     down with it and the headline sat on a bare photo. Chromium never evaluates
     the fallback when the primary resolves, so it never saw the cycle -- the bug
     was Firefox-only and invisible in every Chrome-based review.
     The fallback was dead code anyway: :root, every [data-theme] block and the
     per-site accentVars all define --accent-on-dark unconditionally. */
  --accent: var(--accent-on-dark);
  --accent-text: var(--accent-on-dark, var(--accent));
  --accent-soft: color-mix(in srgb, var(--accent-on-dark, var(--accent)) 18%, transparent);
}
/* §205 custom LIGHT fill — the mirror of the dark remap above: --on = near-black
   ink, everything derived from it, so text/cards/borders adapt on ANY preset.
   Without this, only the light presets happened to read correctly (their page
   tokens are already dark ink); the dark-native platform preset kept its
   off-white text on a light author-picked fill → invisible headings. The fill
   colour itself is painted inline by renderSections (background/band/tint). */
.cs-surface--custom {
  --on: var(--ink-900); --on-inverse: #ffffff; color: var(--on);
  --text-heading: var(--on);
  --text-body: color-mix(in srgb, var(--on) 80%, transparent);
  --text-muted: color-mix(in srgb, var(--on) 62%, transparent);
  --text-faint: color-mix(in srgb, var(--on) 45%, transparent);
  --surface-card: color-mix(in srgb, var(--on) 7%, transparent);
  --surface-card-solid: color-mix(in srgb, var(--on) 7%, var(--surface-band));
  --border: color-mix(in srgb, var(--on) 16%, transparent);
  --border-strong: color-mix(in srgb, var(--on) 34%, transparent);
  --border-soft: color-mix(in srgb, var(--on) 10%, transparent);
  /* accent-as-text on a light band = the true accent (not the on-dark text
     variant a dark preset inherits); eyebrows follow it. --accent itself is
     inherited untouched — it's already the real brand/preset colour. */
  --accent-text: var(--accent);
  --eyebrow-color: var(--accent);
  --accent-soft: color-mix(in srgb, var(--accent) 12%, transparent);
  --shadow-card: 0 1px 2px oklch(0 0 0 / 0.05), 0 10px 28px oklch(0 0 0 / 0.07);
}

/* Primary button on a dark section auto-adapts: the on-dark accent fill (a light
   accent as-is, a dark accent lightened) with auto-contrast ink; no accent → a
   light button (the surface ink). */
.cs-surface--secondary .btn--brand, .cs-surface--dark .btn--brand {
  background: var(--accent-on-dark, var(--on)); color: var(--accent-on-dark-ink, var(--on-inverse)); border-color: transparent;
}
.cs-surface--brand {
  background: var(--accent); --surface-band: var(--accent); --band-glow: transparent; --on: var(--accent-ink, #0c0c10); --on-inverse: var(--btn-bg, #fff); color: var(--on);
  --text-heading: var(--on);
  --text-body: color-mix(in srgb, var(--on) 84%, transparent);
  --text-muted: color-mix(in srgb, var(--on) 66%, transparent);
  --text-faint: color-mix(in srgb, var(--on) 48%, transparent);
  --surface-card: color-mix(in srgb, var(--on) 12%, transparent);
  --surface-card-solid: color-mix(in srgb, var(--on) 12%, var(--surface-band));
  --surface-tint: color-mix(in srgb, var(--on) 8%, transparent);
  --border: color-mix(in srgb, var(--on) 22%, transparent);
  --border-strong: color-mix(in srgb, var(--on) 40%, transparent);
}
/* Remap the accent for the CONTENT only. If we overrode --accent on the wrapper
   itself, its own background:var(--accent) would read the override (the ink) and
   the section would fill near-black instead of the accent — overriding on the child
   keeps the wrapper background on the real accent. */
.cs-surface--brand > * { --accent: var(--on); --accent-text: var(--on); --accent-soft: color-mix(in srgb, var(--on) 14%, transparent); --accent-on-dark: var(--on); }
/* A nav/footer on a coloured surface adopts it. The nav is position:sticky, so it
   gets its OWN solid surface colour (a transparent nav would lose its background
   once it detaches on scroll); the footer (not sticky) can go transparent. Links
   inherit the surface's remapped tokens, so text stays legible. */
.cs-surface--secondary .block-nav, .cs-surface--dark .block-nav { background: var(--site-dark); box-shadow: none; --nav-pop-bg: var(--site-dark); }
.cs-surface--brand .block-nav { background: var(--accent); box-shadow: none; --nav-pop-bg: var(--accent); }
.cs-surface--secondary .block-footer, .cs-surface--dark .block-footer, .cs-surface--brand .block-footer { background: transparent; box-shadow: none; }
.cs-surface .block-nav { border-bottom-color: var(--border); }
/* A primary button on a Brand (accent-filled) section would be accent-on-accent —
   render it as an outline button so it stays legible whatever the accent. */
.cs-surface--brand .btn--brand { background: transparent; color: var(--on); border-color: var(--on); }
/* On a saturated Brand fill, the small letter-spaced eyebrow at muted (~66%)
   opacity drops below AA. Lift it to the fuller body ink (base/classic themes
   read --text-muted here; luxury/estate already read --accent-text = the surface
   ink, so this only reinforces them). Dark surfaces sit on near-black and keep
   the subtler muted eyebrow. */
.cs-surface--brand .eyebrow,
.cs-surface--brand .listings__eyebrow { color: var(--text-body); }
/* Over a PHOTO — the universal image surface (cs-surface--media marker) or hero
   media — the eyebrow gets FULL heading ink: a busy image eats the default 62%
   muted mix entirely (KWRI /live-walkthrough eyebrows, 2026-08-29). Same move
   the Brand rule above made, one step further, because a photo has no
   calculable AA — the quietest text gets the loudest ink. Token-based, so it
   follows every ink remap (dark media → white, light-ink media → near-black,
   brand overlay → the accent ink, hero override → --hero-ink). Flat colour
   bands keep the quiet muted eyebrow; preset accent eyebrows (platform's
   orange, luxury's gold) are also overridden ON PHOTOS ONLY — deliberate, as
   with Brand. */
.cs-surface--media .eyebrow,
.cs-surface--media .listings__eyebrow,
.hero--media .eyebrow { color: var(--text-heading); }

/* rich-text — Markdown body (bullets / headings / emphasis) */
.rich-text__body p { margin-bottom: var(--space-4); max-width: 70ch; color: var(--text-body); }
.rich-text__body h2 { font-size: var(--text-h2); margin: var(--space-6) 0 var(--space-3); }
.rich-text__body h3 { font-size: var(--text-h3); margin: var(--space-5) 0 var(--space-2); }
.rich-text__body ul { list-style: none; margin: 0 0 var(--space-4); display: grid; gap: var(--space-2); max-width: 70ch; }
.rich-text__body ul > li { color: var(--text-body); line-height: var(--line-body); padding-left: var(--space-5); position: relative; }
.rich-text__body ul > li::before { content: "\2713"; position: absolute; left: 0; color: var(--accent-text); font-weight: 700; }
/* ordered list — a numbered accent counter (KB how-to steps). Counter sits in the
   left gutter so wrapped lines align under the text, not the number. */
.rich-text__body ol { list-style: none; counter-reset: cs-ol; margin: 0 0 var(--space-4); display: grid; gap: var(--space-3); max-width: 70ch; }
.rich-text__body ol > li { counter-increment: cs-ol; color: var(--text-body); line-height: var(--line-body); padding-left: var(--space-7); position: relative; }
.rich-text__body ol > li::before { content: counter(cs-ol); position: absolute; left: 0; top: 0; width: var(--space-5); height: var(--space-5); border-radius: 50%; background: var(--accent-soft); color: var(--accent-text); font-size: var(--text-xs); font-weight: 700; display: grid; place-content: center; }
.rich-text__body li { color: var(--text-body); line-height: var(--line-body); }
.rich-text__body strong { color: var(--text-heading); }
.rich-text__body a { color: var(--accent-text); }

/* cs-mdbody — Markdown rendered inside a block's BODY slot (imageText, agentBio,
   callout, cta, statCallout, faq answers, tabs / featureRows / feature / step /
   compare / guides card bodies, stats intro). Every body field now runs through
   renderMarkdownDoc, so #/##/### headings, -/1. lists and **bold**/*italic*/links
   work the same everywhere as the standalone Text block. Body headings render as
   COMPACT sub-labels (h3 / md sizes, not section h2) so an author dropping a ##
   into a tight feature card or step reads as a bold sub-head, not a blown-up title.
   Paragraph colour/size is inherited from each container's own p rules — this
   only ADDS the heading/list/emphasis treatment those bodies previously lacked.
   Doubled class = an order-independent specificity bump (0,2,1) so these beat each
   container's own .x h2/h3 rule (0,1,1) for the NESTED markdown heading, no matter
   where those rules fall in the sheet. The block's own heading is a direct child
   (outside .cs-mdbody) and is untouched. */
.cs-mdbody.cs-mdbody h2 { font-size: var(--text-h3); line-height: var(--line-tight); font-weight: 700; color: var(--text-heading); margin: var(--space-4) 0 var(--space-2); max-width: none; }
.cs-mdbody.cs-mdbody h3 { font-size: var(--text-md); line-height: var(--line-tight); font-weight: 700; color: var(--text-heading); margin: var(--space-3) 0 var(--space-1); max-width: none; }
.cs-mdbody > :first-child { margin-top: 0; }
/* Trim the body's trailing margin ONLY when the body is the last thing in its
   container (a callout / bio / faq answer that ends the column). When a sibling
   FOLLOWS the body — a button in imageText/guides, the checklist+link in
   featureRows/features, the CTAs under agentBio — keep the last element's
   margin-bottom: it's what spaces the body off that sibling (those blocks never
   gave the sibling its own margin-top; the gap was always borrowed from here). */
.cs-mdbody:last-child > :last-child { margin-bottom: 0; }
.cs-mdbody ul { list-style: none; margin: 0 0 var(--space-3); display: grid; gap: var(--space-1); max-width: none; }
.cs-mdbody ul > li { padding-left: var(--space-5); position: relative; color: inherit; line-height: var(--line-body); }
.cs-mdbody ul > li::before { content: "\2713"; position: absolute; left: 0; color: var(--accent-text); font-weight: 700; }
.cs-mdbody ol { list-style: none; counter-reset: cs-ol; margin: 0 0 var(--space-3); display: grid; gap: var(--space-2); max-width: none; }
.cs-mdbody ol > li { counter-increment: cs-ol; padding-left: var(--space-7); position: relative; color: inherit; line-height: var(--line-body); }
.cs-mdbody ol > li::before { content: counter(cs-ol); position: absolute; left: 0; top: 0; width: var(--space-5); height: var(--space-5); border-radius: 50%; background: var(--accent-soft); color: var(--accent-text); font-size: var(--text-xs); font-weight: 700; display: grid; place-content: center; }
.cs-mdbody strong { color: var(--text-heading); }
.cs-mdbody a { color: var(--accent-text); }
/* md-img — block image inside a markdown body (KB articles, rich text). Capped
   at the text column AND a max height, whichever binds first — a portrait
   screenshot auto-scales to a sane height instead of a scroll-wall. Sizes are
   semantic only (full / md ≈ 2/3 / sm ≈ 1/2), centered in the column. */
.md-img { margin: var(--space-6) auto; max-width: 70ch; text-align: center; }
.md-img img { max-width: 100%; width: auto; height: auto; max-height: min(70vh, 40rem); border-radius: var(--radius-card); }
.md-img--md img { max-width: 66%; }
.md-img--sm img { max-width: 50%; }
.md-img figcaption { margin-top: var(--space-2); font-size: var(--text-sm); color: var(--text-muted); line-height: var(--line-body); }
/* md-table — pipe table inside a markdown body (KB articles, rich text). The
   wrapper scrolls horizontally so a wide table stays inside the text column on
   a phone instead of pushing the whole page sideways. Header row is a quiet
   uppercase label band; rows divide with the soft rule; no zebra, so it sits
   calmly in long-form copy. Same 70ch measure as the paragraphs around it. Cell
   alignment from the markdown (:---:) arrives as an inline style and wins. */
.md-table { margin: 0 0 var(--space-5); max-width: 70ch; overflow-x: auto; }
.md-table table { width: 100%; border-collapse: collapse; font-size: var(--text-sm); line-height: var(--line-body); }
.md-table th, .md-table td { padding: var(--space-2) var(--space-3); text-align: left; vertical-align: top; border-bottom: 1px solid var(--border-soft); color: var(--text-body); }
.md-table th { font-size: var(--text-xs); font-weight: 700; letter-spacing: 0.06em; text-transform: uppercase; color: var(--text-muted); background: var(--surface-tint); border-bottom: 1px solid var(--border); }
.md-table td strong { color: var(--text-heading); }
.cs-mdbody .md-table { max-width: none; margin-bottom: var(--space-3); }

/* compare / column cards */
.compare { padding: var(--section-pad-y) 0; }
.compare h2 { font-size: var(--text-h2); }
.compare__sub { color: var(--text-muted); max-width: 70ch; margin-top: var(--space-3); }
.compare__grid { display: grid; grid-template-columns: repeat(var(--cols, 2), 1fr); gap: var(--grid-gap); margin-top: var(--space-6); }
@media (max-width: 860px) { .compare__grid { grid-template-columns: 1fr; } }
.compare-card { background: var(--surface-card); border: 1px solid var(--border); border-top: 3px solid var(--accent); border-radius: var(--radius-card); padding: var(--space-6); box-shadow: var(--shadow-card); display: flex; flex-direction: column; gap: var(--space-3); }
.compare-card__tag { align-self: flex-start; font-size: var(--text-xs); font-weight: 600; letter-spacing: 0.08em; text-transform: uppercase; color: var(--accent-text); background: var(--accent-soft); border: 1px solid var(--accent); border-radius: var(--radius-chip); padding: 2px 12px; }
.compare-card h3 { font-size: var(--text-h3); }
.compare-card__body { color: var(--text-muted); }
.compare-card__stats { display: flex; gap: var(--space-3); }
.compare-stat { flex: 1; background: var(--surface-tint); border: 1px solid var(--border); border-radius: var(--radius-control); padding: var(--space-3) var(--space-4); }
.compare-stat strong { display: block; font-family: var(--font-display); font-size: var(--text-h3); color: var(--accent-text); }
.compare-stat span { font-size: var(--text-xs); color: var(--text-muted); }
.compare-card__list { list-style: none; display: grid; gap: var(--space-2); margin: var(--space-1) 0 0; }
.compare-card__list li { color: var(--text-body); line-height: var(--line-body); padding-left: var(--space-5); position: relative; }
.compare-card__list li::before { content: "\2713"; position: absolute; left: 0; color: var(--accent-text); font-weight: 700; }
.compare-card__link { margin-top: auto; padding-top: var(--space-2); font-weight: 600; font-size: var(--text-sm); color: var(--accent-text); }

/* feature rows — alternating image + text "zigzag" rows */
.feature-rows { padding: var(--section-pad-y) 0; }
.feature-rows__heading { font-size: var(--text-h2); }
.feature-rows__sub { color: var(--text-muted); max-width: 70ch; margin-top: var(--space-3); }
.feature-rows__list { display: grid; gap: var(--space-10); margin-top: var(--space-8); }
.frow { display: grid; grid-template-columns: 1fr 1fr; gap: var(--space-8); align-items: center; }
.frow--reverse .frow__media { order: 2; }
.frow__media img, .feature-rows__placeholder { width: 100%; aspect-ratio: 4 / 3; object-fit: cover; border-radius: var(--radius-media); background: var(--surface-tint); display: block; }
.feature-rows__placeholder { border: 1px solid var(--border); }
.frow__body h3 { font-size: var(--text-h2); margin-bottom: var(--space-3); }
.frow__body p { color: var(--text-body); margin-bottom: var(--space-4); max-width: 60ch; }
.frow__list { list-style: none; display: grid; gap: var(--space-2); margin-bottom: var(--space-4); }
.frow__list li { color: var(--text-body); line-height: var(--line-body); padding-left: var(--space-5); position: relative; }
.frow__list li::before { content: "\2713"; position: absolute; left: 0; color: var(--accent-text); font-weight: 700; }
.frow__link { font-weight: 600; font-size: var(--text-sm); color: var(--accent-text); }
@media (max-width: 760px) {
  .frow { grid-template-columns: 1fr; gap: var(--space-5); }
  .frow--reverse .frow__media { order: 0; }
  .feature-rows__list { gap: var(--space-8); }
}

/* stat callout — a copy column beside one prominent stat card */
.stat-callout { padding: var(--section-pad-y) 0; }
.stat-callout__grid { display: grid; grid-template-columns: 1.2fr 0.8fr; gap: var(--space-8); align-items: center; }
.stat-callout__grid--reverse .stat-callout__box { order: -1; }
.stat-callout__copy .eyebrow { margin-bottom: var(--space-2); }
.stat-callout__copy h2 { font-size: var(--text-h2); margin-bottom: var(--space-3); }
.stat-callout__copy p { color: var(--text-body); margin-bottom: var(--space-3); max-width: 60ch; }
.stat-callout__box { background: var(--surface-tint); border: 1px solid var(--border); border-radius: var(--radius-card); padding: var(--space-7); box-shadow: var(--shadow-card); }
.stat-callout__num { display: block; font-family: var(--font-display); font-weight: var(--display-weight); font-size: clamp(40px, 6vw, var(--text-display)); line-height: 1; color: var(--accent-text); }
.stat-callout__box h3 { font-size: var(--text-h3); margin: var(--space-4) 0 var(--space-2); }
.stat-callout__box p { color: var(--text-muted); }
@media (max-width: 760px) {
  .stat-callout__grid { grid-template-columns: 1fr; gap: var(--space-5); }
  .stat-callout__grid--reverse .stat-callout__box { order: 0; }
}

/* case study — detailed testimonial panel (quote + challenge + results + link) */
.case-study { padding: var(--section-pad-y) 0; }
.case-study__panel { display: grid; grid-template-columns: 1.3fr 0.7fr; gap: var(--space-8); background: var(--surface-tint); border: 1px solid var(--border); border-radius: var(--radius-card); padding: var(--space-8); box-shadow: var(--shadow-card); }
.case-study__quote { font-family: var(--font-display); font-weight: var(--display-weight); font-size: var(--text-h3); line-height: var(--line-tight); color: var(--text-heading); text-wrap: pretty; }
.case-study__author { display: flex; align-items: center; gap: var(--space-3); margin-top: var(--space-5); }
.case-study__avatar { width: 44px; height: 44px; border-radius: 50%; object-fit: cover; flex-shrink: 0; }
.case-study__meta { display: grid; }
.case-study__name { font-weight: 600; color: var(--text-heading); }
.case-study__role { color: var(--text-muted); font-size: var(--text-sm); }
.case-study__challenge { color: var(--text-body); margin-top: var(--space-4); }
.case-study__challenge strong { color: var(--text-heading); }
.case-study__results-head { font-size: var(--text-xs); text-transform: uppercase; letter-spacing: 0.1em; color: var(--text-muted); margin-bottom: var(--space-3); }
.case-study__list { list-style: none; display: grid; gap: var(--space-2); margin-bottom: var(--space-5); }
.case-study__list li { color: var(--text-body); line-height: var(--line-body); padding-left: var(--space-5); position: relative; }
.case-study__list li::before { content: "\2713"; position: absolute; left: 0; color: var(--accent-text); font-weight: 700; }
.case-study__cta { margin-top: var(--space-2); }
@media (max-width: 760px) {
  .case-study__panel { grid-template-columns: 1fr; gap: var(--space-6); padding: var(--space-6); }
}

/* feature-card — chips + emoji icon */
.feature-card__chips { display: flex; flex-wrap: wrap; gap: var(--space-2); margin-top: var(--space-3); }
.chip { font-size: var(--text-xs); color: var(--text-muted); background: var(--surface-tint); border: 1px solid var(--border); border-radius: var(--radius-chip); padding: 3px 12px; }
.feature-card__icon--emoji { font-size: 22px; line-height: 1; border-color: transparent; background: var(--accent-soft); }

/* testimonial card footer (meta + read-more) */
.tcard__foot { display: flex; align-items: center; justify-content: space-between; gap: var(--space-3); margin-top: var(--space-4); padding-top: var(--space-3); border-top: 1px solid var(--border); }
.tcarousel__item .tcard__foot { max-width: 520px; margin-left: auto; margin-right: auto; }
.tcard__count { font-size: var(--text-xs); color: var(--text-muted); }
.tcard__more { font-size: var(--text-sm); font-weight: 600; color: var(--accent-text); }

/* embed — image / iframe / raw escape hatch */
.embed { padding: var(--section-pad-y) 0; }
.embed__img { width: 100%; border-radius: var(--radius-card); }
.embed__frame { width: 100%; border: 0; border-radius: var(--radius-card); display: block; }
.embed__caption { color: var(--text-muted); font-size: var(--text-sm); margin-top: var(--space-3); text-align: center; }

/* image — one picture with size / align / frame controls (the purpose-built cousin of embed's image mode).
   Width rules sit on __media (a wrapper), so they hold with or without the optional link around the <img>. */
.image-block { padding: var(--section-pad-y) 0; }
.image-block__fig { margin: 0; display: flex; flex-direction: column; align-items: center; }
.image-block--left .image-block__fig { align-items: flex-start; }
.image-block--right .image-block__fig { align-items: flex-end; }
.image-block__media { width: 100%; }
.image-block--narrow .image-block__media { max-width: 760px; }
.image-block--small .image-block__media { max-width: 480px; }
.image-block--natural .image-block__media { width: auto; max-width: 100%; }
.image-block__link { display: block; }
.image-block__img { display: block; width: 100%; height: auto; border-radius: var(--radius-card); }
.image-block--natural .image-block__img { width: auto; max-width: 100%; }
.image-block--frame-none .image-block__img { border-radius: 0; }
.image-block--frame-card .image-block__img { border: 1px solid var(--border); box-shadow: var(--shadow-card); background: var(--surface-card); }
.image-block__caption { color: var(--text-muted); font-size: var(--text-sm); margin-top: var(--space-3); text-align: center; max-width: 60ch; }
.image-block--left .image-block__caption { text-align: left; }
.image-block--right .image-block__caption { text-align: right; }

/* gallery */
.gallery { padding: var(--section-pad-y) 0; }
.gallery h2 { font-size: var(--text-h2); margin-bottom: var(--space-6); }
.gallery__grid { display: grid; grid-template-columns: repeat(3, 1fr); gap: var(--grid-gap); }
.gallery__item img { width: 100%; aspect-ratio: 4 / 3; object-fit: cover; border-radius: var(--radius-media); }
.gallery__item figcaption { color: var(--text-muted); font-size: var(--text-sm); margin-top: var(--space-2); }

/* faq */
.faq { padding: var(--section-pad-y) 0; }
.faq h2 { font-size: var(--text-h2); margin-bottom: var(--space-5); }
.faq__list { max-width: 760px; display: grid; gap: var(--space-2); }
.faq__item { border: 1px solid var(--border); border-radius: var(--radius-card); padding: var(--space-4) var(--space-5); background: var(--surface-card); }
.faq__item summary { font-weight: 600; color: var(--text-heading); cursor: pointer; }
.faq__answer { margin-top: var(--space-3); }
.faq__answer p { color: var(--text-body); margin-bottom: var(--space-2); }

/* stats */
.stats { padding: var(--section-pad-y) 0; }
.stats__head { max-width: 70ch; margin: 0 auto var(--space-6); text-align: center; }
.stats__head .eyebrow { margin-bottom: var(--space-2); }
.stats__head h2 { font-size: var(--text-h2); }
.stats__head p { color: var(--text-body); margin-top: var(--space-3); }
.stats--left .stats__head { margin-left: 0; margin-right: 0; text-align: left; }
.stats__grid { display: grid; grid-template-columns: repeat(auto-fit, minmax(140px, 1fr)); gap: var(--grid-gap); text-align: center; }
.stats--left .stats__grid { text-align: left; }
.stat__num { display: block; font-family: var(--font-display); font-size: var(--text-h1); line-height: var(--line-tight); color: var(--text-heading); font-weight: var(--display-weight); }
.stat__qual { display: block; font-family: var(--font-display); font-size: var(--text-h3); line-height: var(--line-tight); color: var(--text-heading); font-weight: var(--display-weight); margin-top: var(--space-1); }
.stat__label { color: var(--text-muted); margin-top: var(--space-2); }
@media (max-width: 560px) {
  .stats__grid { grid-template-columns: 1fr; gap: var(--space-6); }
}

/* testimonial */
.testimonial { padding: var(--section-pad-y) 0; }
.testimonial blockquote { font-family: var(--font-display); font-size: var(--text-h2); line-height: var(--line-tight); color: var(--text-heading); max-width: 900px; margin: 0 auto; text-align: center; text-wrap: balance; }
.testimonial__author { text-align: center; margin-top: var(--space-5); font-weight: 600; color: var(--text-heading); }
.testimonial__author span { display: block; color: var(--text-muted); font-weight: 400; font-size: var(--text-sm); }

/* testimonials — shared person row (avatar + name + role) */
.tcard__person { display: flex; align-items: center; gap: var(--space-3); margin-top: auto; }
.tcard__person--center { justify-content: center; }
.tcard__avatar { width: 44px; height: 44px; border-radius: 50%; object-fit: cover; flex-shrink: 0; }
.tcard__avatar--ph { background: var(--surface-tint); border: 1px solid var(--border); }
.tcard__meta { display: grid; text-align: left; }
.tcard__author { font-weight: 600; color: var(--text-heading); font-size: var(--text-sm); }
.tcard__role { color: var(--text-muted); font-size: var(--text-xs); }

/* testimonials — square cards in a static grid */
.tgrid { padding: var(--section-pad-y) 0; }
/* Section headings over card grids lead LEFT (§205 decision — matches features/
   gallery/faq/blog and the sectionHeader default). Centered COMPOSITIONS (cta,
   logos, video, carousel, testimonial) stay centered — those center their content. */
.tgrid h2 { font-size: var(--text-h2); margin-bottom: var(--space-6); }
.tgrid__grid { display: grid; grid-template-columns: repeat(auto-fit, minmax(260px, 1fr)); gap: var(--grid-gap); }
.tcard { background: var(--surface-card); border: 1px solid var(--border); border-radius: var(--radius-card); padding: var(--space-5); box-shadow: var(--shadow-card); display: flex; flex-direction: column; gap: var(--space-4); }
.tcard__quote { color: var(--text-body); line-height: var(--line-body); }

/* testimonials — one-at-a-time fading carousel */
.tcarousel { padding: var(--section-pad-y) 0; }
.tcarousel h2 { font-size: var(--text-h2); margin-bottom: var(--space-6); text-align: center; }
.tcarousel__track { display: grid; max-width: 720px; margin: 0 auto; }
.tcarousel__item { grid-area: 1 / 1; opacity: 0; transition: opacity var(--speed-slow) var(--ease); text-align: center; pointer-events: none; }
.tcarousel__item.is-active { opacity: 1; pointer-events: auto; }
.tcarousel__quote { font-family: var(--font-display); font-size: var(--text-h3); line-height: var(--line-tight); color: var(--text-heading); margin-bottom: var(--space-5); text-wrap: balance; }
.tcarousel__dots { display: flex; gap: var(--space-2); justify-content: center; margin-top: var(--space-6); }
.tcarousel__dot { width: 8px; height: 8px; border-radius: 50%; border: 0; padding: 0; background: var(--border); cursor: pointer; }
.tcarousel__dot.is-active { background: var(--text-heading); }
.tcarousel__stage { position: relative; max-width: 860px; margin: 0 auto; }
.tcarousel__arrow { position: absolute; top: 50%; transform: translateY(-50%); width: 40px; height: 40px; display: grid; place-content: center; border: 1px solid var(--border); border-radius: 50%; background: var(--surface-card); color: var(--text-heading); cursor: pointer; box-shadow: var(--shadow-card); z-index: 2; }
.tcarousel__arrow:hover { border-color: var(--text-heading); }
.tcarousel__arrow--prev { left: 0; }
.tcarousel__arrow--next { right: 0; }
.tcarousel__arrow-icon { width: 20px; height: 20px; }
@media (max-width: 760px) {
  .tcarousel__arrow--prev { left: -8px; }
  .tcarousel__arrow--next { right: -8px; }
}
@media (prefers-reduced-motion: reduce) { .tcarousel__item { transition: none; } }

/* testimonials — horizontal PHOTO-card carousel (full-bleed photo + glass panel) */
.tshowcase { padding: var(--section-pad-y) 0; }
.tshowcase__head { display: flex; align-items: flex-end; justify-content: space-between; gap: var(--space-6); margin-bottom: var(--space-6); }
.tshowcase__intro h2 { font-size: var(--text-h2); }
.tshowcase__sub { color: var(--text-muted); max-width: 60ch; margin-top: var(--space-3); }
.tshowcase__arrows { display: flex; gap: var(--space-3); flex-shrink: 0; }
.tsc__arrow { width: 46px; height: 46px; border-radius: 50%; border: 1px solid var(--border-strong); background: var(--surface-card); color: var(--text-heading); display: grid; place-content: center; cursor: pointer; }
.tsc__arrow:hover:not(:disabled) { border-color: var(--accent-text); color: var(--accent-text); }
.tsc__arrow:disabled { opacity: 0.3; cursor: default; }
.tsc__arrow-icon { width: 18px; height: 18px; }
@media (max-width: 600px) { .tshowcase__arrows { display: none; } }
.tshowcase__scroll { display: flex; gap: var(--space-4); overflow-x: auto; scrollbar-width: none; padding: var(--space-2) var(--space-1) var(--space-5); margin: 0 calc(-1 * var(--space-1)); scroll-snap-type: x mandatory; }
.tshowcase__scroll::-webkit-scrollbar { display: none; }
.tsc__card { position: relative; flex: 0 0 calc((100% - 2 * var(--space-4)) / 3.2); scroll-snap-align: start; min-height: 420px; border-radius: var(--radius-card); overflow: hidden; border: 1px solid var(--border); background: var(--surface-band); box-shadow: var(--shadow-card); display: flex; flex-direction: column; justify-content: flex-end; color: var(--text-on-dark); transition: transform var(--speed-fast) var(--ease), box-shadow var(--speed-fast) var(--ease); }
.tsc__card:hover { transform: translateY(-3px); box-shadow: var(--shadow-pop); }
@media (max-width: 980px) { .tsc__card { flex-basis: calc((100% - var(--space-4)) / 2.3); } }
@media (max-width: 600px) { .tsc__card { flex-basis: calc(100% - var(--space-6)); } }
.tsc__photo { position: absolute; inset: 0; width: 100%; height: 100%; object-fit: cover; object-position: center 20%; }
.tsc__mono { position: absolute; inset: 0; display: flex; align-items: flex-start; justify-content: center; padding-top: 14%; background: var(--accent-soft); color: var(--accent-text); font-family: var(--font-display); font-weight: var(--display-weight); font-size: 56px; }
.tsc__body { position: relative; z-index: 1; background: linear-gradient(to top, oklch(0.14 0.012 250 / 0.9) 0%, oklch(0.14 0.012 250 / 0.55) 100%); backdrop-filter: blur(3px); -webkit-backdrop-filter: blur(3px); border-top: 1px solid oklch(1 0 0 / 0.1); padding: var(--space-4) var(--space-5); }
.tsc__name { font-family: var(--font-display); font-weight: var(--display-weight); font-size: var(--text-h3); color: oklch(1 0 0); line-height: var(--line-tight); }
.tsc__org { font-size: var(--text-sm); color: var(--accent-on-dark); font-weight: 600; margin-top: 2px; }
.tsc__quote { color: oklch(1 0 0 / 0.86); font-size: var(--text-sm); line-height: var(--line-body); margin-top: var(--space-3); display: -webkit-box; -webkit-line-clamp: 3; -webkit-box-orient: vertical; overflow: hidden; }
.tsc__foot { display: flex; align-items: center; justify-content: space-between; gap: var(--space-3); margin-top: var(--space-4); padding-top: var(--space-3); border-top: 1px solid oklch(1 0 0 / 0.12); }
.tsc__count { font-size: var(--text-xs); color: oklch(1 0 0 / 0.55); }
.tsc__more { width: 30px; height: 30px; border-radius: 50%; border: 1px solid var(--accent); color: var(--accent-on-dark); display: grid; place-content: center; flex-shrink: 0; }
.tsc__dots { display: flex; justify-content: center; gap: var(--space-2); margin-top: var(--space-5); }
.tsc__dot { width: 8px; height: 8px; border-radius: 50%; border: 0; padding: 0; background: var(--border-strong); cursor: pointer; transition: width var(--speed-fast) var(--ease), background var(--speed-fast) var(--ease); }
.tsc__dot.is-active { background: var(--accent); width: 22px; border-radius: 999px; }

/* tabs — clickable tab bar + one visible panel (image + body) */
.tabs { padding: var(--section-pad-y) 0; }
.tabs h2 { font-size: var(--text-h2); margin-bottom: var(--space-6); } /* left — see .tgrid h2 note */
.tabs__bar { display: flex; flex-wrap: wrap; gap: var(--space-2); justify-content: center; border-bottom: 1px solid var(--border); margin-bottom: var(--space-6); }
.tabs__tab { appearance: none; background: transparent; border: 0; border-bottom: 2px solid transparent; margin-bottom: -1px; padding: var(--space-3) var(--space-4); font-family: var(--control-font); font-size: var(--control-size); font-weight: 600; color: var(--text-muted); cursor: pointer; }
.tabs__tab:hover { color: var(--text-heading); }
.tabs__tab.is-active { color: var(--text-heading); border-bottom-color: var(--text-heading); }
.tabs__panel { display: none; grid-template-columns: 1fr 1fr; gap: var(--space-8); align-items: center; }
.tabs__panel.is-active { display: grid; }
.tabs__panel--content.is-active, .tabs__panel--text.is-active { align-items: stretch; }
.tabs__panel-head { grid-column: 1 / -1; }
.tabs__panel-head h3 { font-size: var(--text-h2); margin: 0; }
.tabs__media { min-height: 0; }
.tabs__media img, .tabs__media--ph { width: 100%; aspect-ratio: 4 / 3; object-fit: cover; border-radius: var(--radius-media); background: var(--surface-tint); display: block; }
.tabs__media--ph { border: 1px solid var(--border); }
/* content + text: image matches the body height. Absolute-position the img so
   its intrinsic height doesn't drive the grid track (see image-text note). The
   empty placeholder is the cell itself, so it just stretches. */
.tabs__panel--content .tabs__media, .tabs__panel--text .tabs__media { position: relative; }
.tabs__panel--content .tabs__media img, .tabs__panel--text .tabs__media img { position: absolute; inset: 0; height: 100%; aspect-ratio: auto; }
.tabs__panel--content .tabs__media--ph, .tabs__panel--text .tabs__media--ph { aspect-ratio: auto; }
/* full image: whole image, intrinsic ratio */
.tabs__panel--natural .tabs__media img { aspect-ratio: auto; height: auto; object-fit: contain; }
/* fixed: explicit px height from the inline style */
.tabs__panel--fixed .tabs__media img, .tabs__panel--fixed .tabs__media--ph { aspect-ratio: auto; }
.tabs__body h3 { font-size: var(--text-h2); margin-bottom: var(--space-3); }
.tabs__body p { color: var(--text-body); margin-bottom: var(--space-4); max-width: 60ch; }
@media (max-width: 760px) { .tabs__panel.is-active { grid-template-columns: 1fr; } }

/* logo strip */
.logos { padding: var(--space-8) 0; }
.logos__head { text-align: center; color: var(--text-muted); font-size: var(--text-sm); margin-bottom: var(--space-5); }
.logos__row { display: flex; flex-wrap: wrap; gap: var(--space-8); align-items: center; justify-content: center; }
.logos__row img { height: 32px; width: auto; opacity: 0.7; }

@media (max-width: 760px) {
  .image-text__grid { grid-template-columns: 1fr; }
  .image-text__grid--reverse .image-text__media { order: 0; }
  /* single column: the stretch modes have no sibling to match, and the absolute
     image would collapse to a 0-height cell — put it back in flow with a sane
     intrinsic ratio. */
  .image-text__grid--content .image-text__media img, .image-text__grid--content .image-text__placeholder,
  .image-text__grid--text .image-text__media img, .image-text__grid--text .image-text__placeholder { position: static; height: auto; aspect-ratio: 4 / 3; }
  .tabs__panel--content .tabs__media img, .tabs__panel--text .tabs__media img { position: static; height: auto; aspect-ratio: 4 / 3; }
  .tabs__panel--content .tabs__media--ph, .tabs__panel--text .tabs__media--ph { aspect-ratio: 4 / 3; }
  .features__grid, .gallery__grid { grid-template-columns: 1fr; }
  .steps__grid { grid-template-columns: 1fr; }
  .steps__grid--side-right .steps__side { order: 0; }
}

/* ── listings directory block ── */
.listings { padding: var(--section-pad-y) 0; }
.listings__eyebrow { font-size: var(--eyebrow-size); letter-spacing: var(--eyebrow-tracking); font-weight: var(--eyebrow-weight); text-transform: uppercase; color: var(--eyebrow-color); margin-bottom: var(--space-2); }
.listings__heading { font-size: var(--text-h2); margin-bottom: var(--space-5); }
.listings__editnote { color: var(--text-muted); font-size: var(--text-sm); margin-bottom: var(--space-4); }
.listings__filters { display: flex; flex-wrap: wrap; gap: var(--space-3); align-items: center; margin-bottom: var(--space-5); }
.listings__filters input, .listings__filters select { padding: 9px 12px; border: 1px solid var(--border); border-radius: var(--radius-control); font: inherit; font-size: var(--text-sm); background: var(--surface-card); color: var(--text-body); }
.listings__search { flex: 1 1 220px; min-width: 180px; }
.listings__price { width: 130px; }
.listings__clear { background: transparent; border: 0; color: var(--accent-text); font: inherit; font-size: var(--text-sm); cursor: pointer; }
/* location toggle buttons (multi-market-center communities) — mirror agents__locbtn */
.listings__locs { display: flex; flex-wrap: wrap; gap: var(--space-2); flex-basis: 100%; }
.listings__locbtn { padding: 9px 16px; border: 1px solid var(--border-strong); border-radius: var(--radius-control); background: transparent; color: var(--text-heading); font: inherit; font-size: var(--text-sm); font-weight: 600; cursor: pointer; transition: background var(--speed-fast) var(--ease), color var(--speed-fast) var(--ease), border-color var(--speed-fast) var(--ease); }
.listings__locbtn:hover { border-color: var(--accent-text); color: var(--accent-text); }
.listings__locbtn.is-active { background: var(--accent); border-color: var(--accent); color: var(--accent-ink, var(--text-on-dark)); }
/* per-card market-center chips (shared by listing + agent cards, multi-center only) */
.loc-chips { display: flex; flex-wrap: wrap; gap: 4px; margin: 2px 0 6px; }
.loc-chip { display: inline-block; padding: 2px 8px; border: 1px solid var(--border); border-radius: 10px; font-size: 10px; font-weight: 600; letter-spacing: 0.5px; text-transform: uppercase; color: var(--text-muted); line-height: 1.5; }
.listings__sectionhead { font-size: var(--text-h3); margin: var(--space-6) 0 var(--space-4); }
.listings__grid { display: grid; grid-template-columns: repeat(var(--cols, 3), 1fr); gap: var(--grid-gap); }
.listings__status { color: var(--text-muted); padding: var(--space-6) 0; text-align: center; }
.listings__more { text-align: center; margin-top: var(--space-6); }
.listings__morebtn { display: inline-flex; align-items: center; padding: 10px 22px; border: 1px solid var(--border-strong); border-radius: var(--radius-control); background: transparent; color: var(--text-heading); font: inherit; font-weight: 600; cursor: pointer; }

.listing-card { display: block; background: var(--surface-card); border: 1px solid var(--border); border-radius: var(--radius-card); overflow: hidden; box-shadow: var(--shadow-card); color: inherit; transition: box-shadow var(--speed-fast) var(--ease), transform var(--speed-fast) var(--ease); cursor: pointer; }
.listing-card:hover { box-shadow: var(--shadow-pop); transform: translateY(-2px); }
.listing-card__photo { position: relative; aspect-ratio: 16 / 10; background: var(--surface-tint); }
.listing-card__photo img { width: 100%; height: 100%; object-fit: cover; }
.listing-card__nophoto { width: 100%; height: 100%; background: repeating-linear-gradient(45deg, var(--ink-075) 0 9px, var(--paper-50) 9px 18px); }
.listing-card__badge { position: absolute; top: 10px; left: 10px; background: var(--ink-900); color: var(--text-on-dark); font-size: var(--text-xs); font-weight: 600; padding: 3px 9px; border-radius: var(--radius-chip); }
.listing-card__tags { position: absolute; bottom: 10px; left: 10px; right: 10px; display: flex; flex-wrap: wrap; gap: 6px; }
.listing-pill { background: var(--surface-card); color: var(--text-body); font-size: var(--text-xs); padding: 2px 8px; border-radius: var(--radius-chip); border: 1px solid var(--border); }
.listing-card__body { padding: var(--space-4); }
.listing-card__title { font-family: var(--font-display); font-weight: var(--display-weight); font-size: var(--text-h3); line-height: var(--line-tight); color: var(--text-heading); margin-bottom: var(--space-1); }
.listing-card__loc, .listing-card__specs { color: var(--text-muted); font-size: var(--text-sm); }
.listing-card__specs { margin-top: var(--space-1); }
.listing-card__price { color: var(--text-heading); font-weight: 700; font-size: var(--text-h3); margin-top: var(--space-2); }

/* ── featured listings carousel (listingsCarousel) ──────────────────────────
   A horizontal scroll-snap track of BIG slides with the info panel overlaid on
   the photo. The viewport is full-width (peeking neighbours), while the head +
   controls stay in the container. Slide width is capped (min(1100px,86vw)) well
   under Zillow's 1536px source so the big image never upscales. Same
   .listing-card markup as the grid — the body is just re-positioned over the
   photo (like the feature tiles). */
.lcar { --lcar-slide: min(1080px, 82vw); }
.lcar__head { text-align: center; }
.lcar__viewport { position: relative; margin-top: var(--space-6); }
/* Centre the active slide with symmetric peeks. Padding uses 50% (of the track's
   own width, which EXCLUDES the scrollbar) rather than 100vw, so the peeks are
   even on both sides. */
.lcar__track { display: flex; gap: var(--grid-gap); overflow-x: auto; scroll-snap-type: x mandatory; -webkit-overflow-scrolling: touch; scrollbar-width: none; padding-inline: max(var(--space-5), calc(50% - var(--lcar-slide) / 2)); scroll-padding-inline: max(var(--space-5), calc(50% - var(--lcar-slide) / 2)); }
.lcar__track::-webkit-scrollbar { display: none; }
/* borderless slide — KW's slides are a clean photo, no card frame */
.lcar .listing-card { flex: 0 0 var(--lcar-slide); scroll-snap-align: center; scroll-snap-stop: always; position: relative; cursor: pointer; border: none; box-shadow: none; }
.lcar .listing-card:hover { transform: none; box-shadow: none; }
.lcar .listing-card__photo { aspect-ratio: 16 / 9; }
.lcar .listing-card__photo img { max-width: 1536px; }
/* the base card crossfades to a 2nd photo on hover ("cards start on hover") — that
   reads as a glitch on a big slide, so switch it off in the carousel. */
.lcar .listing-card__img--hover { display: none; }
/* info panel overlaid bottom-left — a solid dark card over the photo (KW register) */
.lcar .listing-card__body { position: absolute; left: 0; bottom: 0; margin: 0; max-width: min(560px, 82%); padding: var(--space-4) var(--space-5); background: color-mix(in srgb, var(--ink-900) 82%, transparent); }
.lcar .listing-card__title, .lcar .listing-card__price { color: var(--text-on-dark); }
.lcar .listing-card__loc, .lcar .listing-card__specs { color: var(--text-on-dark-muted); }
/* controls BELOW the carousel: arrows bottom-left (bordered boxes), View-all
   bottom-right — matching KW Elevate. */
.lcar__controls { display: flex; align-items: center; justify-content: space-between; gap: var(--space-4); margin-top: var(--space-6); }
.lcar__arrows { display: flex; gap: var(--space-2); }
.lcar__arrow { width: 52px; height: 52px; display: inline-grid; place-content: center; border: 1px solid var(--border-strong); background: transparent; color: var(--text-heading); cursor: pointer; border-radius: var(--radius-control); transition: color var(--speed-fast) var(--ease), border-color var(--speed-fast) var(--ease); }
.lcar__arrow:hover { border-color: var(--accent-text); color: var(--accent-text); }
.lcar__viewall { flex: 0 0 auto; }
/* MOBILE: stop overlaying the panel — on a narrow slide it covers the whole
   photo. Stack it BELOW the image as a solid dark block (KW Elevate does exactly
   this), and centre the controls in two rows. */
@media (max-width: 640px) {
  .lcar { --lcar-slide: 80vw; }
  .lcar .listing-card__body { position: static; max-width: none; background: var(--site-dark); padding: var(--space-4) var(--space-5) var(--space-5); }
  .lcar__controls { flex-direction: column; gap: var(--space-4); margin-top: var(--space-5); }
  .lcar__arrows { justify-content: center; }
  .lcar__arrow { width: 44px; height: 44px; }
  .lcar__viewall { width: 100%; }
}

/* ── featured team (teamFeatured) ────────────────────────────────────────────
   A hand-picked agent row. Portraits sit greyscale at rest and turn FULL COLOUR
   on hover, when a panel fades in over the photo with phone / email / Read bio
   (KW Elevate "Meet our team"). The profile link is a sibling overlay under that
   panel, so the panel's own links are never nested anchors; the panel is
   pointer-events:none except its links, so the rest of the photo still opens the
   profile. :focus-within mirrors :hover so keyboard users reach the contacts. */
.tfeat { padding: var(--section-pad-y) 0; }
.tfeat__heading { font-size: var(--text-h2); margin-bottom: var(--space-6); }
.tfeat__grid { display: grid; grid-template-columns: repeat(var(--cols, 4), 1fr); gap: var(--grid-gap); }
.tfeat-card { background: var(--surface-tint); }
.tfeat-card__media { position: relative; aspect-ratio: 3 / 4; overflow: hidden; background: var(--surface-tint); }
.tfeat-card__photo { width: 100%; height: 100%; object-fit: cover; display: block; filter: grayscale(1); transition: filter var(--speed-base) var(--ease), transform var(--speed-slow) var(--ease); }
.tfeat-card:hover .tfeat-card__photo, .tfeat-card:focus-within .tfeat-card__photo { filter: grayscale(0); }
.tfeat-card__photo--ph { display: grid; place-content: center; font-family: var(--font-display); font-size: var(--text-h2); color: var(--text-faint); background: var(--surface-tint); filter: none; }
.tfeat-card__link { position: absolute; inset: 0; z-index: 1; }
.tfeat-card__hover { position: absolute; inset: 0; z-index: 2; display: flex; flex-direction: column; align-items: center; justify-content: center; gap: var(--space-2); padding: var(--space-4); text-align: center; opacity: 0; pointer-events: none; background: color-mix(in srgb, var(--ink-900) 32%, transparent); transition: opacity var(--speed-base) var(--ease); }
.tfeat-card:hover .tfeat-card__hover, .tfeat-card:focus-within .tfeat-card__hover { opacity: 1; }
.tfeat-card__hover a { pointer-events: auto; }
.tfeat-card__contact { color: var(--text-on-dark); font-size: var(--text-sm); font-weight: 600; text-decoration: underline; }
.tfeat-card__bio { margin-top: var(--space-3); padding: 10px 22px; border: 1px solid var(--text-on-dark); color: var(--text-on-dark); font-family: var(--control-font); font-size: var(--control-size); font-weight: var(--control-weight); letter-spacing: var(--control-tracking); text-transform: var(--control-transform); }
.tfeat-card__bio:hover { background: var(--text-on-dark); color: var(--ink-900); }
.tfeat-card__body { padding: var(--space-4); text-align: center; }
.tfeat-card__name { font-family: var(--font-display); font-weight: var(--display-weight); font-size: var(--text-h3); line-height: var(--line-tight); color: var(--text-heading); }
.tfeat-card__role { color: var(--text-muted); font-size: var(--text-sm); margin-top: var(--space-1); }
.tfeat__foot { display: flex; justify-content: center; margin-top: var(--space-6); }
@media (max-width: 900px) { .tfeat__grid { grid-template-columns: 1fr 1fr; } }
@media (max-width: 520px) { .tfeat__grid { grid-template-columns: 1fr; } }

/* ── agents directory block ── */
.agents { padding: var(--section-pad-y) 0; scroll-margin-top: calc(var(--header-h) + var(--space-3)); }
/* h1 and h2 are styled identically: heading LEVEL is a semantics/SEO choice,
   and if changing it also resized the page nobody would set it correctly. */
h1.agents__heading, .agents__heading { font-size: var(--text-h2); margin-bottom: var(--space-5); }
.agents__editnote { color: var(--text-muted); font-size: var(--text-sm); margin-bottom: var(--space-4); }
.agents__filters { display: flex; flex-wrap: wrap; gap: var(--space-3); align-items: center; margin-bottom: var(--space-5); }
.agents__filters input { padding: 9px 12px; border: 1px solid var(--border); border-radius: var(--radius-control); font: inherit; font-size: var(--text-sm); background: var(--surface-card); color: var(--text-body); flex: 1 1 220px; min-width: 180px; }
.agents__grid { display: grid; grid-template-columns: repeat(var(--cols, 4), 1fr); gap: var(--grid-gap); }
.agents__status { color: var(--text-muted); padding: var(--space-6) 0; text-align: center; }
/* location toggle buttons (multi-market-center communities) — right of search */
.agents__segs { display: flex; flex-wrap: wrap; gap: var(--space-2); }
.agents__segbtn { padding: 9px 16px; border: 1px solid var(--border-strong); border-radius: var(--radius-control); background: transparent; color: var(--text-heading); font: inherit; font-size: var(--text-sm); font-weight: 600; cursor: pointer; transition: background var(--speed-fast) var(--ease), color var(--speed-fast) var(--ease), border-color var(--speed-fast) var(--ease); }
.agents__segbtn:hover { border-color: var(--accent-text); color: var(--accent-text); }
.agents__segbtn.is-active { background: var(--accent); border-color: var(--accent); color: var(--accent-ink, var(--text-on-dark)); }
.agents__specsel { padding: 9px 12px; border: 1px solid var(--border); border-radius: var(--radius-control); font: inherit; font-size: var(--text-sm); background: var(--surface-card); color: var(--text-body); cursor: pointer; }
.agents__locs { display: flex; flex-wrap: wrap; gap: var(--space-2); margin-left: auto; }
.agents__locbtn { padding: 9px 16px; border: 1px solid var(--border-strong); border-radius: var(--radius-control); background: transparent; color: var(--text-heading); font: inherit; font-size: var(--text-sm); font-weight: 600; cursor: pointer; transition: background var(--speed-fast) var(--ease), color var(--speed-fast) var(--ease), border-color var(--speed-fast) var(--ease); }
.agents__locbtn:hover { border-color: var(--accent-text); color: var(--accent-text); }
.agents__locbtn.is-active { background: var(--accent); border-color: var(--accent); color: var(--accent-ink, var(--text-on-dark)); }
.agents__count { color: var(--text-muted); font-size: var(--text-sm); margin-bottom: var(--space-3); }
/* numbered pager */
.agents__pager { display: flex; flex-wrap: wrap; align-items: center; justify-content: center; gap: var(--space-2); margin-top: var(--space-6); }
.agents__pagebtn { min-width: 40px; padding: 9px 12px; border: 1px solid var(--border-strong); border-radius: var(--radius-control); background: transparent; color: var(--text-heading); font: inherit; font-size: var(--text-sm); font-weight: 600; cursor: pointer; text-align: center; }
.agents__pagebtn--nav { padding: 9px 16px; }
.agents__pagebtn:hover:not(:disabled) { border-color: var(--accent-text); color: var(--accent-text); }
.agents__pagebtn.is-active { background: var(--accent); border-color: var(--accent); color: var(--accent-ink, var(--text-on-dark)); cursor: default; }
.agents__pagebtn:disabled:not(.is-active) { opacity: 0.3; cursor: default; }
a.agents__pagebtn { display: inline-flex; align-items: center; justify-content: center; text-decoration: none; }
.agents__gap { color: var(--text-muted); }

.agent-card { background: var(--surface-card); border: 1px solid var(--border); border-radius: var(--radius-card); overflow: hidden; box-shadow: var(--shadow-card); text-align: center; transition: box-shadow var(--speed-fast) var(--ease), transform var(--speed-fast) var(--ease); }
.agent-card:hover { box-shadow: var(--shadow-pop); transform: translateY(-2px); }
.agent-card__link { display: block; color: inherit; }
.agent-card__media { aspect-ratio: 1 / 1; background: var(--surface-tint); }
.agent-card__photo { width: 100%; height: 100%; object-fit: cover; display: block; }
.agent-card__photo--ph { display: flex; align-items: center; justify-content: center; font-family: var(--font-display); font-weight: var(--display-weight); font-size: var(--text-h1); color: var(--text-muted); background: repeating-linear-gradient(45deg, var(--ink-075) 0 9px, var(--paper-50) 9px 18px); }
.agent-card__name { font-family: var(--font-display); font-weight: var(--display-weight); font-size: var(--text-h3); color: var(--text-heading); padding: var(--space-4) var(--space-4) 0; }
.agent-card__link:hover .agent-card__name { color: var(--accent-text); }
.agent-card__body { padding: var(--space-2) var(--space-4) var(--space-4); }
.agent-card__role { color: var(--text-muted); font-size: var(--text-sm); }
.agent-card__contacts { display: flex; flex-direction: column; gap: 2px; margin-top: var(--space-3); }
.agent-card__contact { color: var(--accent-text); font-size: var(--text-sm); word-break: break-word; }
.agent-card__contact:hover { text-decoration: underline; }
.agent-card__segments { display: flex; flex-wrap: wrap; justify-content: center; gap: 6px; margin-top: var(--space-3); }
.agent-card__segment { font-size: var(--text-xs); color: var(--text-muted); border: 1px solid var(--border); border-radius: 999px; padding: 2px 10px; }
.agent-detail__segments { display: flex; flex-wrap: wrap; gap: 6px; margin-top: var(--space-3); }
.agent-detail__segment { font-size: var(--text-sm); color: var(--text-muted); border: 1px solid var(--border); border-radius: 999px; padding: 3px 12px; }
.agent-spec { margin-top: var(--space-7); }
.agent-spec__heading { font-family: var(--font-display); font-weight: var(--display-weight); font-size: var(--text-h2); color: var(--text-heading); margin-bottom: var(--space-5); }
.agent-spec__group + .agent-spec__group { margin-top: var(--space-6); padding-top: var(--space-6); border-top: 1px solid var(--border); }
.agent-spec__seg { font-family: var(--font-display); font-weight: var(--display-weight); font-size: var(--text-h4, var(--text-base)); color: var(--text-heading); margin-bottom: var(--space-4); }
.agent-spec__row + .agent-spec__row { margin-top: var(--space-5); }
.agent-spec__label { font-size: var(--text-xs); text-transform: uppercase; letter-spacing: .08em; color: var(--text-muted); margin-bottom: var(--space-3); }
.agent-spec__chips { display: flex; flex-wrap: wrap; gap: 8px; }
.agent-spec__chip { font-size: var(--text-sm); color: var(--text-body); background: var(--surface-tint); border: 1px solid var(--border); border-radius: 999px; padding: 4px 14px; }
.agent-spec__creds { display: grid; gap: var(--space-4); }
.agent-spec__cred { display: flex; gap: var(--space-4); align-items: baseline; }
.agent-spec__code { font-family: var(--font-display); font-weight: var(--display-weight); font-size: var(--text-base); color: var(--accent-text); flex: 0 0 auto; min-width: 4.5rem; }
.agent-spec__credtext { display: block; }
.agent-spec__credname { display: block; color: var(--text-heading); font-size: var(--text-base); }
.agent-spec__creddesc { display: block; color: var(--text-muted); font-size: var(--text-sm); margin-top: 2px; }
.agent-spec__credissuer { color: var(--text-muted); font-weight: 400; }
@media (max-width: 560px) { .agent-spec__cred { flex-direction: column; gap: 2px; } }
.agent-card__socials { display: flex; justify-content: center; gap: var(--space-3); margin-top: var(--space-3); }
.agent-card__social { color: var(--text-muted); display: inline-flex; transition: color var(--speed-fast) var(--ease); }
.agent-card__social:hover { color: var(--accent-text); }
.agent-card__social-icon { width: 18px; height: 18px; }

/* agent profile detail (SSR /agents/<slug>-<uuid> page) */
.agent-detail__crumbs { display: flex; flex-wrap: wrap; gap: var(--space-2); align-items: center; color: var(--text-muted); font-size: var(--text-sm); margin-bottom: var(--space-5); }
.agent-detail__crumbs a { color: var(--text-muted); text-decoration: underline; text-underline-offset: 3px; }
.agent-detail__crumbs a:hover { color: var(--accent-text); }
.agent-detail { padding-top: var(--space-8); padding-bottom: var(--space-10); }
.agent-detail__head { display: grid; grid-template-columns: 260px 1fr; gap: var(--space-8); align-items: start; }
.agent-detail__photo { aspect-ratio: 1 / 1; border-radius: var(--radius-media); overflow: hidden; background: var(--surface-tint); }
.agent-detail__img { width: 100%; height: 100%; object-fit: cover; display: block; }
.agent-detail__img--ph { display: flex; align-items: center; justify-content: center; font-family: var(--font-display); font-weight: var(--display-weight); font-size: var(--text-h1); color: var(--text-muted); background: repeating-linear-gradient(45deg, var(--ink-075) 0 9px, var(--paper-50) 9px 18px); }
.agent-detail__name { font-size: var(--text-h1); }
.agent-detail__role { color: var(--text-body); font-size: var(--text-md); margin-top: var(--space-1); }
.agent-detail__affiliation { color: var(--text-muted); font-size: var(--text-sm); margin-top: 2px; }
/* §289 — "Areas served: 33901, 33905". The label carries the emphasis so the
   numbers themselves stay quiet until someone is scanning for one. */
.agent-detail__zips { color: var(--text-body); font-size: var(--text-sm); margin-top: var(--space-3); }
.agent-detail__zips-label { color: var(--text-muted); font-weight: 600; margin-right: var(--space-1); }
.agent-detail__contacts { display: flex; flex-direction: column; gap: var(--space-1); margin-top: var(--space-4); }
.agent-detail__contact { color: var(--accent-text); font-size: var(--text-md); }
.agent-detail__contact:hover { text-decoration: underline; }
.agent-detail__socials { display: flex; gap: var(--space-3); margin-top: var(--space-4); }
.agent-detail__social { color: var(--text-muted); display: inline-flex; transition: color var(--speed-fast) var(--ease); }
.agent-detail__social:hover { color: var(--accent-text); }
.agent-detail__social-icon { width: 22px; height: 22px; }
.agent-detail__about { margin-top: var(--space-8); padding-top: var(--space-6); border-top: 1px solid var(--border); max-width: 70ch; }
.agent-detail__about h2 { font-size: var(--text-h3); margin-bottom: var(--space-3); }
.agent-detail__about p { color: var(--text-body); margin-bottom: var(--space-3); }
.agent-detail__posts { margin-top: var(--space-8); padding-top: var(--space-6); border-top: 1px solid var(--border); }
.agent-detail__posts h2 { font-size: var(--text-h3); margin-bottom: var(--space-4); }

/* listing detail (inline + SSR /listings/<slug>-<id> page) */
.listing-detail__crumbs { display: flex; flex-wrap: wrap; gap: var(--space-2); align-items: center; color: var(--text-muted); font-size: var(--text-sm); margin-bottom: var(--space-5); }
.listing-detail__crumbs a { color: var(--text-muted); text-decoration: underline; text-underline-offset: 3px; }
.listing-detail__crumbs a:hover { color: var(--accent-text); }
.listing-detail { padding-top: var(--space-8); padding-bottom: var(--space-10); }
.listing-detail__back { background: transparent; border: 0; color: var(--accent-text); font: inherit; cursor: pointer; padding: 0; margin-bottom: var(--space-4); }
.listing-detail__grid { display: grid; grid-template-columns: 1.4fr 1fr; gap: var(--space-8); align-items: start; }
.listing-detail__carousel { position: relative; aspect-ratio: 16 / 10; background: var(--surface-tint); border-radius: var(--radius-media); overflow: hidden; }
.listing-detail__carousel img { position: absolute; inset: 0; width: 100%; height: 100%; object-fit: cover; opacity: 0; transition: opacity var(--speed-base) var(--ease); }
.listing-detail__carousel img.is-active { opacity: 1; }
.listing-detail__nav { position: absolute; top: 50%; transform: translateY(-50%); background: var(--surface-card); border: 1px solid var(--border); width: 36px; height: 36px; border-radius: 50%; cursor: pointer; font-size: 18px; line-height: 1; }
.listing-detail__nav--prev { left: 10px; } .listing-detail__nav--next { right: 10px; }
.listing-detail__title { font-size: var(--text-h1); margin-top: var(--space-5); }
.listing-detail__loc { color: var(--text-muted); margin-top: var(--space-1); }
.listing-detail__desc { margin-top: var(--space-4); max-width: 70ch; }
.listing-detail__desc p { margin-bottom: var(--space-3); color: var(--text-body); }
.listing-detail__desc strong { display: block; font-family: var(--font-display); color: var(--text-heading); margin-top: var(--space-4); margin-bottom: var(--space-1); }
.listing-detail__stats { display: flex; flex-wrap: wrap; gap: var(--space-6); margin-top: var(--space-5); padding-top: var(--space-5); border-top: 1px solid var(--border); }
.listing-stat__value { font-family: var(--font-display); font-size: var(--text-h3); color: var(--text-heading); font-weight: var(--display-weight); }
.listing-stat__label { color: var(--text-muted); font-size: var(--text-sm); }

/* removed-listing tombstone (§175) — notice card + "more listings" grid */
.listing-removed { padding-top: var(--space-8); padding-bottom: var(--space-10); }
.listing-removed__notice { padding: var(--space-7) var(--space-6); background: var(--surface-tint); border: 1px solid var(--border); border-radius: var(--radius-card); text-align: center; }
.listing-removed__eyebrow { font-size: var(--eyebrow-size); letter-spacing: var(--eyebrow-tracking); font-weight: var(--eyebrow-weight); text-transform: uppercase; color: var(--accent-text); margin-bottom: var(--space-2); }
.listing-removed__title { font-size: var(--text-h2); }
.listing-removed__note { color: var(--text-muted); margin-top: var(--space-2); max-width: 60ch; margin-left: auto; margin-right: auto; }
.listing-removed__cta { margin-top: var(--space-5); }
.listing-removed__more { margin-top: var(--space-8); }
.listing-removed__more-heading { font-size: var(--text-h3); margin-bottom: var(--space-5); }

/* per-community value-prop block (§129) — "why work with us" card */
.listing-valueprop { margin-top: var(--space-7); padding: var(--space-6); background: var(--surface-tint); border: 1px solid var(--border); border-radius: var(--radius-card); }
.listing-valueprop__heading { display: flex; align-items: center; font-size: var(--text-h3); margin-bottom: var(--space-4); color: var(--text-heading); }
.listing-valueprop__bar { width: 6px; height: 28px; border-radius: 3px; background: var(--accent); margin-right: var(--space-3); flex-shrink: 0; }
.listing-valueprop__body { display: grid; gap: var(--space-4); color: var(--text-body); line-height: var(--line-body); max-width: 70ch; }
.listing-valueprop__body p { margin: 0; }
.listing-valueprop__body strong { color: var(--text-heading); }
.listing-valueprop__body a { color: var(--accent-text); }
.listing-valueprop__closing { color: var(--text-heading); font-weight: 500; }

/* inline lead form */
/* right column: the sticky lead form + optional agent card stacked under it */
.listing-detail__aside { position: sticky; top: calc(var(--header-h) + var(--space-5)); align-self: start; display: grid; gap: var(--space-4); }
.listing-form { background: var(--surface-band); color: var(--text-on-dark); border-radius: var(--radius-card); padding: var(--space-6); }
/* "a face for the listing" — owning-agent attribution card (§129 showAgentCard) */
.listing-agent { display: flex; align-items: center; gap: var(--space-3); padding: var(--space-4); background: var(--surface-card); border: 1px solid var(--border); border-radius: var(--radius-card); }
.listing-agent__photo { width: 56px; height: 56px; border-radius: 999px; object-fit: cover; flex-shrink: 0; }
.listing-agent__photo--ph { display: flex; align-items: center; justify-content: center; background: var(--surface-tint); color: var(--text-muted); font-weight: 600; }
.listing-agent__info { min-width: 0; }
.listing-agent__name { font-weight: 600; color: var(--text-heading); font-size: var(--text-base); overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
.listing-agent__title { color: var(--text-muted); font-size: var(--text-sm); overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
.listing-agent__company { color: var(--text-muted); font-size: var(--text-xs); overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
.listing-form h3 { color: var(--text-on-dark); font-size: var(--text-h3); }
.listing-form p { color: var(--text-on-dark-muted); font-size: var(--text-sm); margin: var(--space-2) 0 var(--space-4); }
.listing-form label { display: block; font-size: var(--text-sm); margin: var(--space-3) 0 var(--space-1); }
.listing-form input[type=text], .listing-form input[type=email], .listing-form input[type=tel] { width: 100%; padding: 10px 12px; border-radius: var(--radius-control); border: 0; font: inherit; box-sizing: border-box; }
.listing-form__intro { margin: var(--space-2) 0 var(--space-4); }
.listing-form__intro p { color: var(--text-on-dark-muted); font-size: var(--text-sm); margin-bottom: var(--space-2); }
.listing-form__check { display: flex; gap: 8px; align-items: flex-start; margin: var(--space-4) 0; font-size: var(--text-xs); color: var(--text-on-dark-muted); }
.listing-form__check a { color: var(--text-on-dark); text-decoration: underline; }
.listing-form__submit { width: 100%; padding: 12px; border: 0; border-radius: var(--radius-control); background: var(--text-on-dark); color: var(--ink-900); font: inherit; font-weight: 600; cursor: pointer; }
.listing-form__error { color: #ffb4b4; font-size: var(--text-sm); margin-bottom: var(--space-2); }
.listing-form__success { text-align: center; }
.listing-form__success h4 { color: var(--text-on-dark); }

/* ── standalone lead-form block ── */
.lead-form-section { padding: var(--section-pad-y) 0; position: relative; background: var(--surface-tint); background-size: cover; background-position: center; }
.lead-form-section--image::before { content: ''; position: absolute; inset: 0; background: oklch(0.21 0.005 80 / calc(var(--hero-tint, 50) / 100)); }
.lead-form-section__inner { position: relative; z-index: 1; display: grid; grid-template-columns: 1fr 1fr; gap: var(--space-8); align-items: stretch; }
/* photo-height modes (default --content = stretch to the form card height) */
.lead-form-section__inner--natural, .lead-form-section__inner--fixed { align-items: start; }
.lead-form-section__inner--solo { grid-template-columns: minmax(0, 560px); justify-content: center; }
.lead-form-section__inner--reverse .lead-form-section__media { order: 2; }
/* photo absolute-positioned so its intrinsic height never drives the row — the
   form card sizes the row, the photo fills whatever height results (see the
   image-text note). Natural mode puts it back in flow to show the whole photo. */
.lead-form-section__media { position: relative; border-radius: var(--radius-media); overflow: hidden; background: var(--surface-tint); min-height: 320px; }
.lead-form-section__media img { position: absolute; inset: 0; width: 100%; height: 100%; object-fit: cover; }
/* full image: show the whole photo at its intrinsic ratio */
.lead-form-section__inner--natural .lead-form-section__media { min-height: 0; }
.lead-form-section__inner--natural .lead-form-section__media img { position: static; height: auto; object-fit: contain; }
/* fixed: explicit px height comes from the inline style on the media wrapper */
.lead-form-section__inner--fixed .lead-form-section__media { min-height: 0; }
.lead-form-card { background: var(--surface-card); border: 1px solid var(--border); border-radius: var(--radius-card); padding: var(--space-7); box-shadow: var(--shadow-card); }
.lead-form-card h2 { font-size: var(--text-h2); margin-bottom: var(--space-2); }
.lead-form-card__intro { color: var(--text-muted); margin-bottom: var(--space-5); max-width: 48ch; }
.lead-form__field { display: grid; gap: var(--space-1); margin-bottom: var(--space-3); }
.lead-form__field label { font-size: var(--text-sm); font-weight: 600; color: var(--text-heading); }
.lead-form input[type=text], .lead-form input[type=email], .lead-form input[type=tel], .lead-form select, .lead-form textarea { width: 100%; padding: 10px 12px; border: 1px solid var(--border); border-radius: var(--radius-control); font: inherit; background: var(--surface-card); color: var(--text-body); }
.lead-form textarea { resize: vertical; min-height: 96px; }
/* The native select arrow follows the OS, not the page — repaint the control so a
   dropdown on the form card cannot come out dark-on-dark under a dark theme. */
.lead-form select { appearance: none; -webkit-appearance: none; padding-right: 34px; background-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='%23888' stroke-width='2' stroke-linecap='round'%3E%3Cpath d='m6 9 6 6 6-6'/%3E%3C/svg%3E"); background-repeat: no-repeat; background-position: right 11px center; background-size: 15px; }
.lead-form input:focus, .lead-form select:focus, .lead-form textarea:focus { outline: 2px solid var(--accent); outline-offset: 1px; border-color: transparent; }
.lead-form__check { display: flex; gap: 8px; align-items: flex-start; margin: var(--space-3) 0 var(--space-4); font-size: var(--text-xs); color: var(--text-muted); }
.lead-form__check a { color: var(--accent-text); text-decoration: underline; }
.lead-form__submit { width: 100%; padding: 12px; border: 0; border-radius: var(--radius-control); background: var(--ink-900); color: var(--text-on-dark); font: inherit; font-weight: 600; cursor: pointer; transition: opacity var(--speed-fast) var(--ease); }
.lead-form__submit:hover { opacity: 0.88; }
.lead-form__submit:disabled { opacity: 0.6; cursor: default; }
.lead-form__error { display: none; color: #b00020; font-size: var(--text-sm); margin-bottom: var(--space-3); }
/* Honeypot: off-screen (not display:none — some bots skip hidden fields). A human
   never sees or tabs to it; a bot that fills it flags the submission as spam. */
.lead-form__hp { position: absolute; left: -9999px; top: -9999px; width: 1px; height: 1px; overflow: hidden; }
.lead-form__success { text-align: center; padding: var(--space-6) 0; }
.lead-form__success h3 { font-size: var(--text-h3); margin-bottom: var(--space-2); }
.lead-form__success p { color: var(--text-muted); }
/* small reassurance line under the submit button (shared by leadForm + contactSplit) */
.lead-form__reassure { margin-top: var(--space-3); text-align: center; color: var(--text-muted); font-size: var(--text-xs); line-height: var(--line-body); }
@media (max-width: 760px) {
  .lead-form-section__inner { grid-template-columns: 1fr; gap: var(--space-6); }
  .lead-form-section__inner--reverse .lead-form-section__media { order: 0; }
}

/* ── contact split — pitch column + solid form card (elaborate lead capture) ── */
.contact-split { padding: var(--section-pad-y) 0; }
.contact-split__grid { display: grid; grid-template-columns: 1fr 1fr; gap: var(--space-8); align-items: center; }
.contact-split__grid--reverse .contact-split__card { order: -1; }
.contact-split__pitch h2 { font-size: var(--text-h2); margin-bottom: var(--space-3); text-wrap: balance; }
.contact-split__intro { color: var(--text-muted); max-width: 46ch; }
.contact-split__stats { display: flex; flex-wrap: wrap; gap: var(--space-6); margin-top: var(--space-6); }
.contact-split__stat strong { display: block; font-family: var(--font-display); font-weight: var(--display-weight); font-size: var(--text-h2); color: var(--text-heading); line-height: 1; }
.contact-split__stat span { font-size: var(--text-sm); color: var(--text-muted); }
.contact-split__logos { display: flex; flex-wrap: wrap; align-items: center; gap: var(--space-5); margin-top: var(--space-6); }
.contact-split__logos img { height: 26px; width: auto; opacity: 0.7; }
/* the form card stays light/solid even on a dark band — reset the scoped tokens so
   labels/inputs read on white regardless of the section surface. */
.contact-split__card { background: var(--white); border: 1px solid var(--ink-150); border-radius: var(--radius-card); padding: var(--space-7); box-shadow: var(--shadow-pop); --text-heading: var(--ink-900); --text-body: var(--ink-700); --text-muted: var(--ink-500); --border: var(--ink-150); --surface-card: var(--white); }
@media (max-width: 760px) {
  .contact-split__grid { grid-template-columns: 1fr; gap: var(--space-6); }
  .contact-split__grid--reverse .contact-split__card { order: 0; }
}

@media (max-width: 980px) {
  .agents__grid { grid-template-columns: repeat(3, 1fr); }
}
@media (max-width: 760px) {
  .listings__grid { grid-template-columns: 1fr 1fr; }
  .listing-detail__grid { grid-template-columns: 1fr; }
  .agents__grid { grid-template-columns: repeat(2, 1fr); }
  .agent-detail__head { grid-template-columns: 1fr; gap: var(--space-5); }
  .agent-detail__photo { max-width: 260px; }
}
@media (max-width: 480px) {
  .listings__grid { grid-template-columns: 1fr; }
  .agents__grid { grid-template-columns: 1fr; }
}

/* ── listing card: hover photo crossfade + rental-strategy accent pill ── */
.listing-card__img { position: absolute; inset: 0; width: 100%; height: 100%; object-fit: cover; }
.listing-card__img--hover { opacity: 0; transition: opacity var(--speed-base) var(--ease); }
.listing-card:hover .listing-card__img--hover { opacity: 1; }
.listing-pill--rental { background: var(--accent-soft); color: var(--accent-text); border-color: var(--accent); font-weight: 600; }

/* ── hero: split layout + property search bar ── */
.hero--split { padding: var(--hero-pad-y) 0; text-align: left; overflow: visible; }
.hero-split__grid { display: grid; grid-template-columns: 1fr 1fr; gap: var(--space-8); align-items: center; position: relative; z-index: 2; }
.hero-split__col { display: grid; gap: var(--space-5); justify-items: start; }
.hero--split h1, .hero--split h2 { font-size: clamp(34px, 5vw, var(--text-display)); text-wrap: balance; }
.hero--split .hero__sub { font-size: 18px; color: var(--text-body); max-width: 52ch; }
.hero-split__media { position: relative; }
.hero-split__media img, .hero-split__media video, .hero-split__media--ph { width: 100%; aspect-ratio: 4 / 3; object-fit: cover; border-radius: var(--radius-media); background: var(--surface-tint); display: block; }
/* §209 — split hero heights: the center layout's tall/full classes set
   display:grid + place-items on the SECTION, which would wreck the split
   container — override back to block and grow the GRID instead (pad subtracted
   so the visual band lands at ~72/92svh like the center layout). */
.hero--split.hero--tall { display: block; min-height: 0; }
/* grid-template-rows:1fr makes the single row EXPLICITLY fill the tall
   min-height (an auto row wouldn't reliably stretch), so a stretched/cutout side
   media reaches the full band height and the text column vertically centres in
   it. The row still grows past for taller content (1fr floors at min-content). */
.hero--split.hero--tall .hero-split__grid { min-height: calc(var(--hero-tall-h, 80svh) - var(--hero-pad-y) * 2); grid-template-rows: 1fr; }
/* §209 — cutout side image: a transparent-background portrait with no card
   chrome. It's ABSOLUTELY positioned so its own intrinsic height never inflates
   the band — the band height is driven by the TEXT column (standard height) or
   the tall min-height — and the portrait then stretches to the FULL band, top to
   bottom, standing on the band's bottom edge. height = 100% + 2*pad (cell height,
   = text height since the img is out of flow, plus both section paddings = the
   full visible band); bottom = -pad anchors it to the band's bottom edge. */
.hero-split__media--cutout { align-self: stretch; }
.hero-split__media--cutout img {
  position: absolute; bottom: calc(var(--hero-pad-y) * -1); left: 50%; transform: translateX(-50%);
  height: calc(100% + var(--hero-pad-y) * 2); width: auto; max-width: 100%;
  aspect-ratio: auto; object-fit: contain; object-position: bottom center;
  border-radius: 0; background: none;
}
/* Tall: the band is a KNOWN height (the svh var), so size the portrait to it
   DIRECTLY rather than a percentage of the grid cell — a %-height against a
   1fr+min-height grid track is not a definite height for an absolutely-positioned
   replaced child, so it was only filling to the TEXT height (a gap at a tall
   viewport that closed when the window was scaled down). Editor pins
   --hero-tall-h to px, so no iframe loop. */
.hero--split.hero--tall .hero-split__media--cutout img { height: var(--hero-tall-h, 80svh); }
.hero-split__media--ph { border: 1px solid var(--border); background: repeating-linear-gradient(45deg, var(--ink-075) 0 9px, var(--paper-50) 9px 18px); }
/* "watch the demo" pill over the side media → opens the hero modal */
.hero-split__watch { position: absolute; top: 50%; left: 50%; transform: translate(-50%, -50%); display: inline-flex; align-items: center; gap: 8px; padding: 12px 22px; border: 0; border-radius: 999px; background: rgba(255,255,255,0.92); color: var(--ink-900); font: inherit; font-size: var(--text-sm); font-weight: 600; cursor: pointer; box-shadow: 0 6px 24px rgba(0,0,0,0.28); transition: background var(--speed-fast) var(--ease); }
.hero-split__watch:hover { background: #ffffff; }
.hero-modal { position: fixed; inset: 0; z-index: 1000; display: grid; place-items: center; padding: var(--space-5); }
.hero-modal[hidden] { display: none; }
.hero-modal__scrim { position: absolute; inset: 0; background: rgba(0,0,0,0.72); }
.hero-modal__box { position: relative; z-index: 1; width: min(960px, 100%); }
.hero-modal__box video { width: 100%; aspect-ratio: 16 / 9; background: #000000; border-radius: var(--radius-media); display: block; }
.hero-modal__close { position: absolute; top: -42px; right: 0; border: 0; background: transparent; color: #ffffff; font-size: 30px; line-height: 1; cursor: pointer; padding: 4px 8px; }
/* search bar — a solid white pill regardless of surface (always legible on a photo
   or a dark band); brand button. Sits under the heading in either layout. */
.hero-search { display: flex; gap: var(--space-2); width: 100%; max-width: 520px; }
.hero-search__input { flex: 1; min-width: 0; padding: 13px 16px; border: 1px solid var(--ink-150); border-radius: var(--radius-control); font: inherit; font-size: var(--text-md); background: var(--white); color: var(--ink-900); }
.hero-search__input::placeholder { color: var(--ink-500); }
.hero-search__input:focus { outline: 2px solid var(--accent); outline-offset: 1px; border-color: transparent; }
.hero-search__btn { flex-shrink: 0; padding: 13px 24px; border: 1px solid transparent; border-radius: var(--radius-control); background: var(--btn-bg, var(--ink-900)); color: var(--btn-on, var(--text-on-dark)); font-family: var(--control-font); font-weight: var(--control-weight); font-size: var(--control-size); letter-spacing: var(--control-tracking); text-transform: var(--control-transform); cursor: pointer; transition: opacity var(--speed-fast) var(--ease); }
.hero-search__btn:hover { opacity: 0.88; }
@media (max-width: 760px) {
  .hero-split__grid { grid-template-columns: 1fr; gap: var(--space-6); }
  /* stacked: drop the single-row 1fr fill (it would balloon the first row) — let
     text + media flow into auto rows. */
  .hero--split.hero--tall .hero-split__grid { grid-template-rows: none; }
  /* §209 — stacked: the cutout can't be an absolute full-band portrait (the row
     collapses), so revert it to a normal in-flow, centred image (px cap, never a
     viewport unit — the auto-sized editor canvas would loop). */
  .hero-split__media--cutout img { position: static; transform: none; height: auto; max-height: 460px; width: auto; max-width: 78%; margin: 0 auto; display: block; }
  /* The isolated figure is meant to stand on the band's bottom edge (desktop
     anchors it there with a negative offset). In the stacked layout it's in-flow,
     so the section's bottom padding would leave dead space under its feet — drop
     it so the figure sits flush on the band's bottom edge on mobile. */
  .hero--split.hero--cutout { padding-bottom: 0; }
  /* "Match image" hero, stacked: the photo is a whole, full-width banner alone
     in row 1 (so the row IS the image height), the copy drops to row 2 on the
     section surface. Nothing sits on the photo any more, so the scrim moves
     under the COPY row — the same wash the over-media ink tokens were chosen
     against, so every overlay/ink combo stays readable. An absolutely positioned
     grid child with a placement uses that grid area as its containing block, so
     inset:0 fills exactly row 2. */
  /* Phone image (config.imageUrlMobile → hero--phone-img): a picture composed
     for the phone is always shown WHOLE with the copy beneath — the same
     stacked layout the Image height uses — whatever the desktop banner height
     says. The crop the author exported IS the band height (a wide crop = a
     short strip, a portrait = a tall block); min-height:0 releases Tall. */
  .hero--phone-img { display: grid; grid-template-columns: minmax(0, 1fr); padding: 0; min-height: 0; }
  .hero--phone-img img.hero__bg { grid-area: 1 / 1; position: static; width: 100%; height: auto; align-self: stretch; object-fit: cover; display: block; }
  .hero--phone-img .hero__inner { padding: var(--hero-pad-y) var(--space-5); }
  .hero--fit .hero__inner, .hero--phone-img .hero__inner { grid-area: 2 / 1; }
  .hero--fit.hero--media::before, .hero--phone-img.hero--media::before { grid-area: 2 / 1; }
  [data-theme="noir"] .cs-hero-lead.hero--phone-img { min-height: 0; }
  /* A half/third copy measure is a desktop composition (text beside artwork);
     stacked on a phone the text takes the full column. */
  .hero.measure-half .hero__inner > *, .hero.measure-third .hero__inner > * { max-width: none; }
}

/* ── agent bio ── */
.agent-bio { padding: var(--section-pad-y) 0; }
.agent-bio--split .agent-bio__inner { display: grid; grid-template-columns: 340px 1fr; gap: var(--space-8); align-items: center; }
.agent-bio__photo { width: 100%; aspect-ratio: 3 / 4; object-fit: cover; border-radius: var(--radius-media); background: var(--surface-tint); display: block; }
.agent-bio__photo--ph { background: repeating-linear-gradient(45deg, var(--ink-075) 0 9px, var(--paper-50) 9px 18px); }
.agent-bio__col { display: flex; flex-direction: column; gap: var(--space-4); }
.agent-bio__head .eyebrow { margin-bottom: var(--space-2); }
.agent-bio__name { font-size: var(--text-h2); }
.agent-bio__title { color: var(--text-faint); font-size: var(--text-sm); margin-top: var(--space-1); }
/* §226 — "title · company" byline, same voice as .agent-detail__role on the
   directory profile page (body color, not the faint caption gray). */
.agent-bio__role { color: var(--text-body); font-size: var(--text-md); margin-top: var(--space-1); }
.agent-bio__body p { color: var(--text-muted); margin-bottom: var(--space-3); max-width: 60ch; }
.agent-bio__stats { display: flex; flex-wrap: wrap; gap: var(--space-7); }
.agent-bio__statval { display: block; font-family: var(--font-display); font-weight: var(--display-weight); font-size: 30px; color: var(--text-heading); line-height: 1.1; }
.agent-bio__statlabel { display: block; font-size: var(--text-xs); color: var(--text-muted); margin-top: 4px; }
.agent-bio__actions { display: flex; gap: var(--space-3); flex-wrap: wrap; margin-top: var(--space-2); }
.agent-bio--centered .agent-bio__inner { max-width: 640px; margin: 0 auto; display: flex; flex-direction: column; align-items: center; text-align: center; gap: var(--space-4); }
.agent-bio--centered .agent-bio__photo { width: 120px; height: 120px; aspect-ratio: 1 / 1; border-radius: 50%; }
.agent-bio--centered .agent-bio__stats { justify-content: center; }
/* Compact — the blog byline card: small portrait left, text right, in the
   centred ~760px editorial column. */
.agent-bio--compact .agent-bio__inner { max-width: 760px; display: flex; gap: var(--space-5); align-items: flex-start; }
.agent-bio--compact .agent-bio__media { flex-shrink: 0; }
.agent-bio--compact .agent-bio__photo { width: 104px; height: 104px; aspect-ratio: 1 / 1; border-radius: var(--radius-card); }
.agent-bio--compact .agent-bio__col { gap: var(--space-2); }
.agent-bio--compact .agent-bio__name { font-size: var(--text-h3); }
.agent-bio--compact .agent-bio__body p { font-size: var(--text-sm); margin-bottom: var(--space-2); }
.agent-bio--compact .agent-bio__actions { margin-top: var(--space-1); }
/* Byline teaser: at most 6 lines of bio, then the View profile button. Block
   children (paragraphs/lists) count toward the clamp; the last visible line
   ends in an ellipsis. */
.agent-bio__body--clamp { display: -webkit-box; -webkit-box-orient: vertical; -webkit-line-clamp: 6; overflow: hidden; }
.agent-bio__body--clamp .cs-mdbody > :last-child { margin-bottom: 0; }
@media (max-width: 560px) {
  .agent-bio--compact .agent-bio__inner { flex-direction: column; }
}
@media (max-width: 760px) {
  .agent-bio--split .agent-bio__inner { grid-template-columns: 1fr; gap: var(--space-6); }
  .agent-bio--split .agent-bio__media { max-width: 300px; }
}

/* ── team grid (curated roster; hover flips to contact) ── */
.team { padding: var(--section-pad-y) 0; }
.team__heading { font-size: var(--text-h2); margin-bottom: var(--space-6); } /* left — see .tgrid h2 note */
.team__grid { display: grid; grid-template-columns: repeat(var(--cols, 3), 1fr); gap: var(--grid-gap); }
.team-card { display: block; background: var(--surface-card); border: 1px solid var(--border); border-radius: var(--radius-card); overflow: hidden; box-shadow: var(--shadow-card); color: inherit; text-decoration: none; transition: box-shadow var(--speed-base) var(--ease); }
.team-card:hover { box-shadow: var(--shadow-pop); }
.team-card__media { position: relative; aspect-ratio: 3 / 4; background: var(--surface-tint); }
.team-card__photo { width: 100%; height: 100%; object-fit: cover; display: block; }
.team-card__photo--ph { background: repeating-linear-gradient(45deg, var(--ink-075) 0 9px, var(--paper-50) 9px 18px); }
.team-card__contact { position: absolute; inset: 0; display: flex; flex-direction: column; align-items: center; justify-content: center; gap: var(--space-2); padding: var(--space-4); text-align: center; background: color-mix(in srgb, var(--ink-900) 78%, transparent); opacity: 0; transition: opacity var(--speed-base) var(--ease); }
.team-card:hover .team-card__contact, .team-card:focus-visible .team-card__contact { opacity: 1; }
.team-card__phone { font-size: var(--text-sm); font-weight: 600; color: var(--text-on-dark); }
.team-card__email { font-size: var(--text-sm); color: var(--text-on-dark-muted); word-break: break-all; }
.team-card__view { margin-top: var(--space-2); font-size: var(--control-size); font-weight: var(--control-weight); letter-spacing: var(--control-tracking); text-transform: var(--control-transform); color: var(--ink-900); background: var(--text-on-dark); padding: 8px 18px; border-radius: var(--radius-control); }
.team-card__body { padding: var(--space-4); text-align: center; }
.team-card__name { font-family: var(--font-display); font-weight: var(--display-weight); font-size: var(--text-h3); color: var(--text-heading); line-height: var(--line-tight); }
.team-card__title { font-size: var(--text-xs); color: var(--text-muted); margin-top: 4px; }
@media (max-width: 760px) { .team__grid { grid-template-columns: 1fr 1fr; } }
@media (max-width: 480px) { .team__grid { grid-template-columns: 1fr; } }

/* ── neighborhoods / areas served ── */
.neighborhoods { padding: var(--section-pad-y) 0; }
.neighborhoods__heading { font-size: var(--text-h2); margin-bottom: var(--space-6); } /* left — see .tgrid h2 note */
.neighborhoods__grid { display: grid; grid-template-columns: repeat(var(--cols, 3), 1fr); gap: var(--grid-gap); }
.area-tile { position: relative; display: block; border-radius: var(--radius-media); overflow: hidden; box-shadow: var(--shadow-card); text-decoration: none; transition: box-shadow var(--speed-base) var(--ease); }
.area-tile:hover { box-shadow: var(--shadow-pop); }
.area-tile__media { aspect-ratio: 4 / 3; background: var(--surface-tint); overflow: hidden; }
.area-tile__img { width: 100%; height: 100%; object-fit: cover; display: block; transition: transform var(--speed-slow) var(--ease); }
.area-tile__img--ph { background: repeating-linear-gradient(45deg, var(--ink-075) 0 9px, var(--paper-50) 9px 18px); }
.area-tile:hover .area-tile__img { transform: scale(1.04); }
.area-tile__cap { position: absolute; left: 0; right: 0; bottom: 0; padding: 40px var(--space-4) 14px; background: var(--scrim); text-align: center; }
.area-tile__name { display: block; font-family: var(--font-display); font-weight: var(--display-weight); font-size: var(--text-h3); letter-spacing: var(--display-tracking); color: var(--text-on-dark); }
.area-tile__count { display: block; font-size: var(--text-xs); color: var(--text-on-dark-muted); margin-top: 2px; }
@media (max-width: 760px) { .neighborhoods__grid { grid-template-columns: 1fr 1fr; } }
@media (max-width: 480px) { .neighborhoods__grid { grid-template-columns: 1fr; } }

/* ── blog / insights cards ── */
.blog { padding: var(--section-pad-y) 0; }
.blog__heading { font-size: var(--text-h2); margin-bottom: var(--space-6); }
.blog__grid { display: grid; grid-template-columns: repeat(var(--cols, 3), 1fr); gap: var(--grid-gap); }
.blog-card { display: flex; flex-direction: column; background: var(--surface-card); border: 1px solid var(--border); border-radius: var(--radius-card); overflow: hidden; box-shadow: var(--shadow-card); text-decoration: none; color: inherit; transition: box-shadow var(--speed-base) var(--ease), transform var(--speed-fast) var(--ease); }
.blog-card:hover { box-shadow: var(--shadow-pop); transform: translateY(-2px); }
.blog-card__media { aspect-ratio: 16 / 10; background: var(--surface-tint); }
.blog-card__img { width: 100%; height: 100%; object-fit: cover; display: block; }
.blog-card__img--ph { background: repeating-linear-gradient(45deg, var(--ink-075) 0 9px, var(--paper-50) 9px 18px); }
.blog-card__body { padding: var(--space-5); display: flex; flex-direction: column; gap: var(--space-2); flex: 1; }
.blog-card__chips { display: flex; flex-wrap: wrap; gap: var(--space-2); }
.blog-card__date { font-size: var(--text-xs); text-transform: uppercase; letter-spacing: 0.08em; color: var(--text-muted); }
.blog-card__title { font-family: var(--font-display); font-weight: var(--display-weight); font-size: var(--text-h3); line-height: var(--line-tight); color: var(--text-heading); }
.blog-card__excerpt { color: var(--text-muted); font-size: var(--text-sm); line-height: var(--line-body); }
.blog-card__more { margin-top: auto; padding-top: var(--space-2); font-size: var(--text-sm); font-weight: 600; color: var(--accent-text); }
@media (max-width: 860px) { .blog__grid { grid-template-columns: 1fr 1fr; } }
@media (max-width: 560px) { .blog__grid { grid-template-columns: 1fr; } }

/* ── Zillow proof (badge strip + review cards) ── */
.zillow, .zillow-badge-sec { padding: var(--section-pad-y) 0; }
.zillow__mark { width: 34px; height: 34px; flex-shrink: 0; display: inline-flex; align-items: center; justify-content: center; border: 1.5px solid var(--border-strong); border-radius: min(var(--radius-control), 6px); font-family: var(--font-display); font-weight: 700; font-size: 18px; color: var(--text-heading); }
.zillow__head { display: flex; align-items: center; gap: var(--space-3); margin-bottom: var(--space-5); }
.zillow__title { font-family: var(--font-display); font-weight: var(--display-weight); font-size: var(--text-h3); color: var(--text-heading); }
.zillow__rating { margin-left: auto; font-size: var(--text-sm); font-weight: 600; color: var(--text-heading); white-space: nowrap; }
.zillow__stars, .zillow__star { color: var(--star); letter-spacing: 1px; }
.zillow__grid { display: grid; grid-template-columns: repeat(var(--cols, 2), minmax(0, 1fr)); gap: var(--grid-gap); }
.zillow-card { margin: 0; border: 1px solid var(--border); border-radius: var(--radius-card); background: var(--surface-card); padding: var(--space-5); display: flex; flex-direction: column; gap: var(--space-3); box-shadow: var(--shadow-card); }
.zillow-card__quote { color: var(--text-body); font-size: var(--text-sm); line-height: var(--line-body); }
.zillow-card__cite { margin-top: auto; font-size: var(--text-sm); font-weight: 600; color: var(--text-heading); }
.zillow-card__cite span { font-weight: 400; color: var(--text-faint); }
.zillow__foot { margin-top: var(--space-5); text-align: center; }
.zillow__foot a { font-size: var(--text-sm); font-weight: 600; color: var(--accent-text); }
.zillow-badge { display: flex; align-items: center; gap: var(--space-4); background: var(--surface-card); border: 1px solid var(--border); border-radius: var(--radius-card); box-shadow: var(--shadow-card); padding: 14px 18px; max-width: 560px; margin: 0 auto; }
.zillow-badge .zillow__mark { width: 40px; height: 40px; font-size: 22px; }
.zillow-badge__info { flex: 1; min-width: 0; }
.zillow-badge__rating { font-size: var(--text-md); font-weight: 600; color: var(--text-heading); }
.zillow-badge__meta { font-weight: 400; color: var(--text-muted); }
.zillow-badge__btn { font-size: var(--control-size); font-weight: var(--control-weight); color: var(--text-heading); border: 1px solid var(--border-strong); border-radius: var(--radius-control); padding: 7px 16px; white-space: nowrap; }
.zillow-badge__btn:hover { border-color: var(--text-heading); }
@media (max-width: 760px) { .zillow__grid { grid-template-columns: 1fr; } }

/* ── buyer / seller guides ── */
.guides { padding: var(--section-pad-y) 0; }
.guides__grid { display: grid; grid-template-columns: 1fr 1fr; gap: var(--grid-gap); }
.guides__panel { background: var(--surface-card); border: 1px solid var(--border); border-radius: var(--radius-card); box-shadow: var(--shadow-card); padding: var(--space-8); display: flex; flex-direction: column; align-items: flex-start; gap: var(--space-4); }
.guides__panel--dark { background: var(--surface-band); border-color: transparent; box-shadow: var(--shadow-band); }
.guides__title { font-size: var(--text-h2); color: var(--text-heading); }
.guides__body { color: var(--text-muted); line-height: var(--line-body); }
.guides__panel--dark .guides__title { color: var(--text-on-dark); }
.guides__panel--dark .guides__body { color: var(--text-on-dark-muted); }
.guides__cta { margin-top: auto; }
@media (max-width: 760px) { .guides__grid { grid-template-columns: 1fr; } }

/* ── pull quote ── */
.pull-quote { padding: var(--section-pad-y) 0; }
.pull-quote .container { max-width: 900px; }
.pull-quote__text { font-family: var(--font-display); font-weight: var(--display-weight); font-size: clamp(28px, 4vw, var(--text-h1)); line-height: var(--line-tight); color: var(--text-heading); text-wrap: balance; }
.pull-quote__hl { color: var(--accent-text); }
.pull-quote__foot { margin-top: var(--space-4); display: flex; align-items: center; gap: var(--space-3); }
.pull-quote__avatar { width: 48px; height: 48px; border-radius: 50%; object-fit: cover; flex-shrink: 0; }
.pull-quote__cite { color: var(--text-muted); font-size: var(--text-sm); }

/* ── callout ── */
.callout-sec { padding: var(--section-pad-y) 0; }
.callout { background: var(--accent-soft); border-left: 3px solid var(--accent); border-radius: var(--radius-card); padding: var(--space-6); max-width: 760px; }
.callout__title { font-family: var(--font-display); font-weight: var(--display-weight); font-size: var(--text-h3); color: var(--text-heading); margin-bottom: var(--space-2); }
.callout__body p { color: var(--text-body); margin-bottom: var(--space-2); }
.callout__body p:last-child { margin-bottom: 0; }

/* ── knowledge-base article (Cloudflare-Learning-Center-style 2-column doc) ──
   Structural + fully token-driven, so it inherits whatever preset the site uses.
   The platform KB runs the dark 'platform' preset, so this reads dark by default;
   a light community help-center would get the light look for free. */
.doc { padding: var(--space-8) 0 var(--section-pad-y); }
.doc__container { max-width: 1160px; }
.doc__crumbs { display: flex; flex-wrap: wrap; align-items: center; gap: var(--space-2); font-size: var(--text-sm); color: var(--text-muted); margin-bottom: var(--space-6); }
.doc__crumbs a { color: var(--text-muted); text-decoration: underline; text-underline-offset: 3px; }
.doc__crumbs a:hover { color: var(--accent-text); }
.doc__crumbs [aria-current] { color: var(--text-body); }
.doc__grid { display: grid; gap: clamp(var(--space-6), 5vw, var(--space-10)); align-items: start; }
.doc__grid--left { grid-template-columns: 250px minmax(0, 1fr); }
.doc__grid--right { grid-template-columns: minmax(0, 1fr) 250px; }
.doc__grid--norail { grid-template-columns: minmax(0, 1fr); max-width: 760px; margin: 0 auto; }
.doc__rail { position: sticky; top: calc(var(--header-h) + var(--space-5)); align-self: start; display: grid; gap: var(--space-6); max-height: calc(100vh - var(--header-h) - var(--space-4)); overflow-y: auto; padding-bottom: var(--space-4); }
.doc__rail-h { font-size: var(--text-xs); font-weight: 700; letter-spacing: 0.09em; text-transform: uppercase; color: var(--text-faint); margin-bottom: var(--space-3); }
.doc__rail-sec + .doc__rail-sec { border-top: 1px solid var(--border-soft); padding-top: var(--space-5); }
.doc__rail ul { list-style: none; display: grid; gap: 2px; }
.doc__rail a { display: block; font-size: var(--text-sm); line-height: 1.35; color: var(--text-muted); padding: var(--space-1) 0 var(--space-1) var(--space-3); border-left: 2px solid transparent; margin-left: -2px; }
.doc__rail a:hover { color: var(--accent-text); }
.doc__rail a.is-active { color: var(--accent-text); border-left-color: var(--accent); font-weight: 600; }
.doc__toc-item--h3 a { padding-left: var(--space-5); font-size: var(--text-xs); }
.doc__main { min-width: 0; }
.doc__title { font-family: var(--font-display); font-weight: var(--display-weight); font-size: var(--text-h1); line-height: var(--display-line, 1.08); letter-spacing: var(--display-tracking, 0); color: var(--text-heading); margin-bottom: var(--space-5); }
.doc__objectives { max-width: none; margin-bottom: var(--space-7); }
.doc__preview-note { font-size: var(--text-xs); font-weight: 700; letter-spacing: 0.08em; text-transform: uppercase; color: var(--accent-text); opacity: 0.75; margin-bottom: var(--space-3); }
.doc__body { max-width: 72ch; }
.doc__body > p:first-of-type { font-size: calc(var(--text-md) * 1.1); color: var(--text-heading); }
.doc__body h2.doc-h, .doc__body h3.doc-h { scroll-margin-top: calc(var(--header-h) + var(--space-5)); }
.doc-h__anchor { opacity: 0; margin-left: var(--space-2); color: var(--accent-text); font-weight: 400; text-decoration: none; }
.doc-h:hover .doc-h__anchor, .doc-h__anchor:focus { opacity: 0.55; }
@media (max-width: 900px) {
  .doc__grid--left, .doc__grid--right { grid-template-columns: 1fr; }
  .doc__rail { position: static; max-height: none; overflow: visible; order: 2; border-top: 1px solid var(--border-soft); padding-top: var(--space-6); }
}

/* ── video reel ── */
.video-reel { padding: var(--section-pad-y) 0; }
.video-reel__heading { font-size: var(--text-h2); margin-bottom: var(--space-6); text-align: center; }
.video-reel__stage { max-width: 960px; margin: 0 auto; }
.video-reel__video { width: 100%; aspect-ratio: 16 / 9; display: block; border-radius: var(--radius-media); background: #000; }
.video-reel__frame { position: relative; aspect-ratio: 16 / 9; border-radius: var(--radius-media); overflow: hidden; background: var(--surface-tint); }
.video-reel__frame--ph { background: repeating-linear-gradient(45deg, var(--ink-075) 0 9px, var(--paper-50) 9px 18px); }
.video-reel__poster { width: 100%; height: 100%; object-fit: cover; display: block; }
.video-reel__play { position: absolute; top: 50%; left: 50%; transform: translate(-50%, -50%); width: 64px; height: 64px; border-radius: 50%; background: color-mix(in srgb, var(--ink-900) 72%, transparent); color: var(--text-on-dark); display: flex; align-items: center; justify-content: center; font-size: 22px; padding-left: 5px; box-shadow: var(--shadow-pop); }
.video-reel__caption { text-align: center; color: var(--text-muted); font-size: var(--text-sm); margin-top: var(--space-3); }

/* ── heading highlight (accent phrase inside a hero / section / app-hero heading).
   Wraps one phrase in the accent colour; the platform preset italicises it. Shared
   by hero, sectionHeader and appHero. */
.cs-hl { color: var(--accent-text); }
.hero .cs-hl, .app-hero .cs-hl { color: var(--accent-on-dark, var(--accent-text)); }

/* ── logo strip: sliding marquee variant. The track holds the logos TWICE and
   translates -50%, so the loop is seamless. Edges fade via a mask. Auto-scroll is
   paused for reduced-motion users (the row just sits, still readable). */
.logos--marquee { overflow: hidden; }
.logos--marquee .logos__viewport { overflow: hidden; -webkit-mask-image: linear-gradient(90deg, transparent, #000 8%, #000 92%, transparent); mask-image: linear-gradient(90deg, transparent, #000 8%, #000 92%, transparent); }
.logos--marquee .logos__track { display: flex; width: max-content; gap: var(--space-10); align-items: center; animation: cs-logos-marquee var(--marquee-dur, 32s) linear infinite; }
.logos--marquee .logos__track img { height: 30px; width: auto; opacity: 0.7; flex: 0 0 auto; }
@keyframes cs-logos-marquee { from { transform: translateX(0); } to { transform: translateX(-50%); } }
@media (prefers-reduced-motion: reduce) { .logos--marquee .logos__track { animation: none; flex-wrap: wrap; justify-content: center; } }

/* ── callout paired under a Column-cards block: a wider band (matches the cards
   container) that sits tight under the preceding section instead of floating on
   its own generous margin. callout--wide widens; callout-sec--tight pulls the
   band up so the two read as one unit. */
.callout--wide { max-width: none; }
.callout-sec--tight { padding-top: 0; margin-top: calc(-1 * var(--section-pad-y) + var(--space-6)); }

/* ── steps: a FLOW diagram in the side panel (numbered list beside a process/
   funnel), plus an optional accent footnote under it. */
.steps__grid--flowside { align-items: start; }
.steps__side .flow { max-width: none; margin: 0; }
.steps__side-note { margin-top: var(--space-4); color: var(--accent-text); font-size: var(--text-sm); font-weight: 600; text-align: center; }

/* ── App Hero — a product-showcase hero: a centred copy stack over a "stage" that
   holds a browser-framed screenshot with up to a few floating UI overlays. Built
   to sit on a dark band (its default surface). */
.app-hero { text-align: center; padding: var(--hero-pad-y) var(--space-5) 0; overflow: hidden; position: relative; }
.app-hero__inner { max-width: 820px; margin: 0 auto; display: grid; gap: var(--space-5); justify-items: center; position: relative; z-index: 2; }
.app-hero__eyebrow { color: var(--accent-on-dark, var(--accent-text)); }
.app-hero h1 { font-size: var(--text-display); text-wrap: balance; }
.app-hero__sub { font-size: 18px; color: var(--text-body); max-width: 56ch; text-wrap: pretty; }
.app-hero__actions { display: flex; flex-wrap: wrap; gap: var(--space-3); justify-content: center; }
.app-hero__note { color: var(--text-muted); font-size: var(--text-sm); }
.app-hero__note b, .app-hero__note strong { color: var(--accent-on-dark, var(--accent-text)); font-weight: 600; }
/* optional background photo behind the copy — a FIXED-height band (860px) anchored
   center 30% so the subject sits high, with a two-layer overlay: a soft accent glow
   at the top (suppressed on Brand via --band-glow — glow ≈ band there) + a vertical
   fade that dissolves the photo into the SECTION's band colour (--surface-band from
   the cs-surface wrapper; unwrapped = the page surface) by the time the mockup
   begins. Copy (z2) + mockup (z1) sit above. */
.app-hero__bg { position: absolute; top: 0; left: 0; width: 100%; height: 860px; z-index: 0; overflow: hidden; }
.app-hero__bg img { width: 100%; height: 100%; object-fit: cover; object-position: center 30%; display: block; }
/* §205 — optional v2 overlay between the photo and the ::after fade (the fade
   stays the primary contrast mechanism; DOM order keeps the fade on top). */
.app-hero__scrim { position: absolute; inset: 0; }
.app-hero__bg::after {
  content: ""; position: absolute; inset: 0;
  background:
    radial-gradient(900px 480px at 50% -20%, var(--band-glow, color-mix(in srgb, var(--accent) 16%, transparent)), transparent 65%),
    linear-gradient(180deg,
      color-mix(in srgb, var(--surface-band, var(--surface-page)) 74%, transparent) 0%,
      color-mix(in srgb, var(--surface-band, var(--surface-page)) 84%, transparent) 52%,
      color-mix(in srgb, var(--surface-band, var(--surface-page)) 96%, transparent) 80%,
      var(--surface-band, var(--surface-page)) 100%);
}
@media (max-width: 640px) { .app-hero__bg { height: 660px; } }
.app-hero__stage { position: relative; z-index: 1; width: 100%; max-width: 960px; margin: var(--space-8) auto 0; text-align: left; padding-bottom: var(--space-6); }
/* browser window framing the fake community site (light, theme-invariant chrome) */
.app-hero .mockup { background: #fff; border-radius: 14px; overflow: hidden; border: 1px solid rgba(255,255,255,0.12); box-shadow: 0 30px 80px rgba(0,0,0,0.55), 0 0 0 1px color-mix(in srgb, var(--accent) 8%, transparent); }
.app-hero .m-chrome { display: flex; align-items: center; gap: 7px; background: #e6e3dd; padding: 11px 16px; }
.app-hero .m-dot { width: 11px; height: 11px; border-radius: 50%; background: #cfcbc2; }
.app-hero .m-dot:first-child { background: #f0875e; }
.app-hero .m-url { flex: 1; max-width: 320px; margin-left: 12px; background: #f4f2ee; border-radius: 6px; padding: 5px 14px; font-size: 11.5px; color: #8a857b; display: flex; align-items: center; gap: 6px; }
.app-hero .m-url svg { width: 11px; height: 11px; opacity: .55; }
.app-hero .m-nav { display: flex; align-items: center; gap: 22px; padding: 14px 26px; background: #fff; border-bottom: 1px solid #ededed; }
.app-hero .m-logo { display: flex; align-items: center; gap: 9px; }
.app-hero .m-mark { width: 28px; height: 28px; border-radius: 8px; background: linear-gradient(135deg, var(--accent), #ffb24d); display: flex; align-items: center; justify-content: center; color: #fff; font-weight: 800; font-size: 15px; font-family: var(--font-body); }
.app-hero .m-name { font-size: 15px; font-weight: 700; color: #1c1b19; letter-spacing: -0.01em; }
.app-hero .m-links { display: flex; gap: 19px; margin-left: auto; }
.app-hero .m-links span { font-size: 12.5px; color: #62605a; font-weight: 500; }
.app-hero .m-links span.on { color: #1c1b19; font-weight: 600; }
.app-hero .m-cta { padding: 7px 15px; border-radius: 8px; background: var(--accent); color: var(--accent-on, #16120b); font-size: 12px; font-weight: 700; }
.app-hero .m-hero { position: relative; padding: 50px 32px 44px; text-align: center; }
.app-hero .m-eyebrow { display: inline-block; font-size: 10px; letter-spacing: .16em; text-transform: uppercase; color: #ffd9a8; margin-bottom: 11px; font-weight: 700; }
.app-hero .m-h1 { font-family: var(--font-display); font-size: 27px; line-height: 1.1; font-weight: 600; color: #fff; margin: 0 auto 9px; max-width: 470px; letter-spacing: -0.01em; }
.app-hero .m-h2 { font-size: 13.5px; color: rgba(255,255,255,.84); margin: 0 auto 22px; max-width: 390px; line-height: 1.45; }
.app-hero .m-search { display: flex; align-items: center; width: 72%; max-width: 450px; height: 46px; margin: 0 auto; background: #fff; border-radius: 99px; padding: 0 6px 0 18px; box-shadow: 0 14px 34px rgba(0,0,0,.28); }
.app-hero .m-pin { width: 14px; height: 14px; color: var(--accent); margin-right: 8px; flex: none; }
.app-hero .m-ph { flex: 1; font-size: 12.5px; color: #9a958c; text-align: left; }
.app-hero .m-go { padding: 9px 18px; border-radius: 99px; background: var(--accent); color: var(--accent-on, #16120b); font-size: 12px; font-weight: 700; }
.app-hero .m-secrow { display: flex; align-items: baseline; justify-content: space-between; padding: 20px 26px 4px; background: #fafafa; }
.app-hero .m-sectitle { font-size: 14px; font-weight: 700; color: #1c1b19; }
.app-hero .m-seclink { font-size: 11.5px; font-weight: 600; color: var(--accent); }
.app-hero .m-grid { display: grid; grid-template-columns: repeat(3, 1fr); gap: 15px; padding: 12px 26px 28px; background: #fafafa; }
.app-hero .m-card { background: #fff; border: 1px solid #ededed; border-radius: 12px; overflow: hidden; box-shadow: 0 2px 10px rgba(0,0,0,.04); }
.app-hero .m-img { height: 100px; background-size: cover; background-position: center; position: relative; }
.app-hero .m-badge { position: absolute; left: 9px; top: 9px; padding: 3px 9px; border-radius: 6px; background: rgba(255,255,255,.94); color: #1c1b19; font-size: 9px; font-weight: 700; letter-spacing: .04em; text-transform: uppercase; }
.app-hero .m-badge.hot { background: var(--accent); color: var(--accent-on, #16120b); }
.app-hero .m-cbody { padding: 11px 12px 13px; }
.app-hero .m-price { font-size: 15px; font-weight: 800; color: #1c1b19; letter-spacing: -0.01em; }
.app-hero .m-specs { font-size: 11px; color: #7a766e; margin: 3px 0 6px; }
.app-hero .m-loc { display: flex; align-items: center; gap: 4px; font-size: 11px; color: #5c5a55; }
.app-hero .m-loc svg { width: 11px; height: 11px; color: var(--accent); flex: none; }
/* floating agent-portal card — dark; adopts the section's dark surface tokens */
/* opaque elevated-dark fill (not the translucent --surface-card) so the floating
   card doesn't show the mockup through it */
.app-hero .m-portal { position: absolute; right: -30px; bottom: 18px; width: 330px; background: color-mix(in srgb, var(--text-heading) 8%, var(--site-dark)); border: 1px solid var(--border-strong); border-radius: 14px; box-shadow: 0 24px 60px rgba(0,0,0,0.6); overflow: hidden; }
.app-hero .m-portal-head { display: flex; align-items: center; gap: 8px; padding: 11px 14px; border-bottom: 1px solid var(--border); font-size: 10.5px; font-weight: 700; letter-spacing: .08em; text-transform: uppercase; color: var(--accent); }
.app-hero .m-portal-head::before { content: ""; width: 7px; height: 7px; border-radius: 50%; background: var(--accent); }
.app-hero .m-pwho { margin-left: auto; display: flex; align-items: center; gap: 6px; text-transform: none; letter-spacing: 0; color: var(--text-body); font-weight: 500; font-size: 10px; }
.app-hero .m-pwho img { width: 18px; height: 18px; border-radius: 50%; object-fit: cover; }
.app-hero .m-portal-body { display: grid; grid-template-columns: 50px 1fr; }
.app-hero .m-side { border-right: 1px solid var(--border); padding: 13px 0; display: grid; gap: 10px; justify-items: center; align-content: start; }
.app-hero .m-side i { width: 28px; height: 28px; border-radius: 8px; background: color-mix(in srgb, var(--text-heading) 7%, transparent); display: flex; align-items: center; justify-content: center; color: var(--text-muted); }
.app-hero .m-side i svg { width: 14px; height: 14px; }
.app-hero .m-side i.on { background: var(--accent-soft); border: 1px solid color-mix(in srgb, var(--accent) 34%, transparent); color: var(--accent); }
.app-hero .m-pmain { padding: 13px; display: grid; gap: 10px; }
.app-hero .m-stats { display: grid; grid-template-columns: 1fr 1fr; gap: 9px; }
.app-hero .m-stat { background: color-mix(in srgb, var(--text-heading) 7%, transparent); border: 1px solid var(--border); border-radius: 10px; padding: 9px 11px; }
.app-hero .m-stat b { display: block; font-size: 21px; font-weight: 800; color: var(--text-heading); letter-spacing: -.02em; line-height: 1.1; }
.app-hero .m-stat span { font-size: 10px; color: var(--text-muted); }
.app-hero .m-stat.accent { background: var(--accent-soft); border-color: color-mix(in srgb, var(--accent) 34%, transparent); }
.app-hero .m-stat.accent b { color: var(--accent); }
.app-hero .m-rows { display: grid; gap: 6px; }
.app-hero .m-row { display: flex; align-items: center; gap: 9px; font-size: 11.5px; color: var(--text-body); padding: 8px 10px; background: color-mix(in srgb, var(--text-heading) 7%, transparent); border: 1px solid var(--border); border-radius: 9px; }
.app-hero .m-row svg { width: 14px; height: 14px; color: var(--accent); flex: none; }
.app-hero .m-rb { margin-left: auto; font-size: 9px; font-weight: 700; color: var(--accent); background: var(--accent-soft); border: 1px solid color-mix(in srgb, var(--accent) 34%, transparent); border-radius: 99px; padding: 1px 7px; }
@media (max-width: 1060px) { .app-hero .m-portal { right: 8px; bottom: 8px; } }
@media (max-width: 860px) { .app-hero .m-grid { grid-template-columns: repeat(2, 1fr); } .app-hero .m-card:last-child { display: none; } }
@media (max-width: 768px) { .app-hero h1 { font-size: clamp(34px, 10vw, 50px); } }
@media (max-width: 640px) { .app-hero .m-portal { display: none; } }

/* ── hero custom-embed background: a raw HTML/JS snippet (particle canvas, shader,
   iframe) rendered as the backdrop LAYER behind the hero copy. pointer-events off
   so it never eats clicks; the copy sits above via the hero's own z-index. */
.hero__bg--embed, .app-hero__bg--embed { position: absolute; inset: 0; z-index: 0; overflow: hidden; pointer-events: none; }
.hero__bg--embed > *, .app-hero__bg--embed > * { width: 100%; height: 100%; }
.hero__bg--embed canvas, .app-hero__bg--embed canvas, .hero__bg--embed iframe, .app-hero__bg--embed iframe { display: block; width: 100%; height: 100%; border: 0; }
