/* ==========================================================================
   PLOTEX.US — the one stylesheet for the US site.
   Ported from the approved Claude design (_plotex-us/design/*.dc.html), whose
   markup was authored as inline styles. Repeated patterns live here as classes
   so pages stay readable and the HTML stays light; genuinely one-off decorative
   geometry (glow blobs, board lot positions) stays inline in the page.

   NOTE: this is NOT public/styles.css. That file is the plotex.in design and is
   untouched — the two sites deliberately share a brand, not a stylesheet.

   Served from a FIXED URL, so it must never be long-cached: public/_headers
   pins it to max-age=0,must-revalidate and every <link> carries ?v=YYYYMMDD.
   If you edit this file, bump the ?v= in src/layouts/UsLayout.astro.
   ========================================================================== */

/* ---------------------------------------------------------------- theming
   LIGHT is the default (`:root`); dark is opt-in via `<html data-theme="dark">`.
   Everything below is expressed in tokens, so a theme is a value swap and no
   component markup changes. Three rules keep it honest:

     1. Never hard-code a colour in a component — add a token here instead.
     2. Text tokens are chosen for CONTRAST against their own theme's ground,
        not for brand fidelity. That is why the accent green is #2E7D32 on white
        (5.6:1) but #7BC043 on black (9.6:1) — same brand, different ink.
     3. `--grad` (fills) and `--grad-text` (gradient headings) are separate.
        The bright logo gradient is unreadable as text on white, so light mode
        swaps in a deeper one while buttons and icon tiles keep the bright fill.
   ------------------------------------------------------------------------ */

:root {
  color-scheme: light;

  /* Ground */
  --bg: #ffffff;
  --bg-1: #f4f6f2;
  --bg-2: #f7f8f5;
  --bg-3: #edf1ec;
  --card: #f7f8f5;
  --card-hover: #f0f2ee;

  /* Type. --text-3 is #6E736E — 4.9:1 on white, so it clears WCAG AA for body
     text. Do not lighten it for looks. */
  --text: #14181a;
  --text-2: #575d57;
  --text-3: #6e736e;
  --text-strong: #3d423d;
  --placeholder: #8a8f8a;

  /* Brand, tuned for a light ground. The hues are the logo's; the values are
     darkened until they pass AA against white. */
  --green: #2e7d32;
  --green-l: #357a1c;
  --green-d: #1b5e20;
  --green-hover: #1b5e20;
  --blue: #1565c0;
  --blue-l: #0d47a1;
  --blue-d: #0d47a1;
  --blue-soft: #0d5ba8;
  --amber: #946f00;
  --slate: #6e736e;
  --slate-l: #575d57;
  --danger: #b3261e;

  /* Ink on gradient fills. White on #4CAF50 is only 2.8:1, so every gradient
     button and icon tile takes this near-black label in BOTH themes. */
  --ink: #04120b;
  --ink-blue: #04101c;

  /* Fills keep the bright logo gradient in both themes… */
  --grad: linear-gradient(135deg, #7bc043 0%, #4caf50 50%, #2196f3 100%);
  --grad-ai: linear-gradient(135deg, #42a5f5 0%, #2196f3 60%, #4caf50 100%);
  /* …gradient TEXT gets a deeper ramp on white so it stays legible. */
  --grad-text: linear-gradient(135deg, #357a1c 0%, #2e7d32 50%, #0d47a1 100%);
  --grad-logo: linear-gradient(135deg, #357a1c 0%, #2e7d32 35%, #1565c0 65%, #0d47a1 100%);
  --grad-ai-text: linear-gradient(135deg, #0d47a1 0%, #1565c0 50%, #2e7d32 100%);

  --border: rgba(0, 0, 0, 0.08);
  --border-2: rgba(0, 0, 0, 0.12);
  --border-3: rgba(0, 0, 0, 0.14);
  --border-hover: rgba(76, 175, 80, 0.45);
  --rule: rgba(0, 0, 0, 0.06);

  --shadow-sm: 0 8px 30px rgba(23, 32, 23, 0.1);
  --shadow-lg: 0 20px 60px rgba(23, 32, 23, 0.13);
  --glow-green: 0 0 40px rgba(76, 175, 80, 0.18);

  /* Surfaces that are not simply "background": the 3D board, the overlays and
     the two particle inks. Tokenised so the map re-skins with the theme. */
  --board-ground: #e6e9e0;
  --board-grid: rgba(0, 0, 0, 0.035);
  /* Asphalt, not plastic. #cfd5d9 was a pale blue-grey that read as a toy road. */
  --board-road: #b4b8b4;
  --board-kerb: rgba(0, 0, 0, 0.13);
  --board-centreline: rgba(255, 255, 255, 0.62);
  --board-edge: rgba(0, 0, 0, 0.07);
  --board-parcel-edge: rgba(24, 34, 26, 0.26);
  --board-parcel-ink: rgba(22, 32, 24, 0.66);
  --board-wall: rgba(34, 46, 36, 0.42);

  /* Status chips — deeper shades of the board fills. See .st-* below. */
  --st-av-ink: #43703c;
  --st-av-bg: rgba(67, 112, 60, 0.12);
  --st-av-line: rgba(67, 112, 60, 0.4);
  --st-rs-ink: #7c6023;
  --st-rs-bg: rgba(124, 96, 35, 0.12);
  --st-rs-line: rgba(124, 96, 35, 0.4);
  --st-uc-ink: #3f6883;
  --st-uc-bg: rgba(63, 104, 131, 0.12);
  --st-uc-line: rgba(63, 104, 131, 0.4);
  --st-sd-ink: #5f605a;
  --st-sd-bg: rgba(95, 96, 90, 0.11);
  --st-sd-line: rgba(95, 96, 90, 0.38);
  --stage: #f0f2ee;
  --overlay: rgba(255, 255, 255, 0.94);
  --overlay-strong: rgba(255, 255, 255, 0.97);
  --scrim: rgba(20, 24, 26, 0.55);
  --header-bg: rgba(255, 255, 255, 0.85);
  --menu-bg: rgba(255, 255, 255, 0.97);
  --particle-a: rgba(46, 125, 50, 0.35);
  --particle-b: rgba(21, 101, 192, 0.3);

  --r-sm: 8px;
  --r-md: 12px;
  --r-lg: 16px;
  --r-xl: 20px;
  --pill: 999px;

  --ease: cubic-bezier(0.4, 0, 0.2, 1);
  --t-fast: 0.15s var(--ease);
  --t-med: 0.3s var(--ease);

  --font: 'Inter', -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, sans-serif;
  --font-display: 'Space Grotesk', var(--font);
  --mono: ui-monospace, Menlo, Consolas, monospace;

  --shell: 1180px;
  --shell-narrow: 880px;
}

/* Dark theme — the original plotex.us palette, now opt-in. Only the values that
   actually differ are restated; radii, easings, fonts and shells are shared. */
:root[data-theme='dark'] {
  color-scheme: dark;

  --bg: #000000;
  --bg-1: #050505;
  --bg-2: #0a0a0a;
  --bg-3: #070707;
  --card: #0d0d0d;
  --card-hover: #111111;

  /* #8A8A8A is 5.3:1 on black. Never drop to the #666 used on plotex.in — that
     is 3.66:1 and fails AA. */
  --text: #ffffff;
  --text-2: #a0a0a0;
  --text-3: #8a8a8a;
  --text-strong: #d0d0d0;
  --placeholder: #757575;

  --green: #4caf50;
  --green-l: #7bc043;
  --green-d: #2e7d32;
  --green-hover: #9ccc65;
  --blue: #2196f3;
  --blue-l: #42a5f5;
  --blue-d: #1565c0;
  --blue-soft: #8fc7f7;
  --amber: #ffc107;
  --slate: #9aa0a6;
  --slate-l: #c9cdd1;
  --danger: #ff9b9b;

  --grad-text: linear-gradient(135deg, #7bc043 0%, #4caf50 50%, #2196f3 100%);
  --grad-logo: linear-gradient(135deg, #7bc043 0%, #4caf50 35%, #2196f3 65%, #1565c0 100%);
  --grad-ai-text: linear-gradient(135deg, #42a5f5 0%, #2196f3 50%, #4caf50 100%);

  --border: rgba(255, 255, 255, 0.08);
  --border-2: rgba(255, 255, 255, 0.12);
  --border-3: rgba(255, 255, 255, 0.14);
  --border-hover: rgba(76, 175, 80, 0.3);
  --rule: rgba(255, 255, 255, 0.06);

  --shadow-sm: 0 8px 30px rgba(0, 0, 0, 0.4);
  --shadow-lg: 0 20px 60px rgba(0, 0, 0, 0.5);
  --glow-green: 0 0 40px rgba(76, 175, 80, 0.2);

  --board-ground: #101410;
  --board-grid: rgba(255, 255, 255, 0.035);
  --board-road: #232623;
  --board-kerb: rgba(255, 255, 255, 0.09);
  --board-centreline: rgba(255, 255, 255, 0.3);
  --board-edge: rgba(255, 255, 255, 0.07);
  --board-parcel-edge: rgba(0, 0, 0, 0.34);
  /* Parcel fills stay mid-tone in dark mode, so the lettering stays dark. */
  --board-parcel-ink: rgba(16, 24, 18, 0.72);
  --board-wall: rgba(0, 0, 0, 0.5);

  /* Same hues, lifted — these sit on near-black and must clear AA there. */
  --st-av-ink: #9ec295;
  --st-av-bg: rgba(158, 194, 149, 0.13);
  --st-av-line: rgba(158, 194, 149, 0.4);
  --st-rs-ink: #d9bd85;
  --st-rs-bg: rgba(217, 189, 133, 0.13);
  --st-rs-line: rgba(217, 189, 133, 0.4);
  --st-uc-ink: #9db9cd;
  --st-uc-bg: rgba(157, 185, 205, 0.13);
  --st-uc-line: rgba(157, 185, 205, 0.4);
  --st-sd-ink: #b0b1ab;
  --st-sd-bg: rgba(176, 177, 171, 0.11);
  --st-sd-line: rgba(176, 177, 171, 0.35);
  --stage: #070907;
  --overlay: rgba(9, 10, 9, 0.94);
  --overlay-strong: rgba(10, 10, 10, 0.97);
  --scrim: rgba(0, 0, 0, 0.82);
  --header-bg: rgba(0, 0, 0, 0.72);
  --menu-bg: rgba(0, 0, 0, 0.95);
  --particle-a: rgba(123, 192, 67, 0.42);
  --particle-b: rgba(66, 165, 245, 0.42);
}

/* ------------------------------------------------------------------ base */
*,
*::before,
*::after { box-sizing: border-box; }

html {
  scroll-behavior: smooth;
  scroll-padding-top: 84px;
}

body {
  margin: 0;
  background: var(--bg);
  color: var(--text);
  font-family: var(--font);
  line-height: 1.6;
  -webkit-font-smoothing: antialiased;
  -moz-osx-font-smoothing: grayscale;
  text-rendering: optimizeLegibility;
  overflow-x: hidden;
}

a { color: var(--green-l); text-decoration: none; }
a:hover { color: var(--green-hover); }

/* Any class carrying a `display` outranks the hidden attribute's UA style, which
   silently rendered the lead form's success panel alongside the live form. Make
   `hidden` authoritative for everything, once. */
[hidden] { display: none !important; }

img { max-width: 100%; }

/* Themed focus ring on every interactive element — never the browser default. */
*:focus-visible {
  outline: 2px solid var(--green);
  outline-offset: 2px;
  border-radius: 4px;
}

::selection { background: rgba(76, 175, 80, 0.35); color: #fff; }
input::placeholder,
textarea::placeholder { color: var(--placeholder); }

.skip-link {
  position: fixed;
  left: 16px;
  top: -80px;
  z-index: 200;
  background: var(--card);
  border: 1px solid var(--border-3);
  color: var(--text);
  padding: 10px 16px;
  border-radius: 10px;
  font-size: 14px;
  font-weight: 600;
  transition: top var(--t-fast);
}
.skip-link:focus { top: 16px; color: var(--text); }

.sr-only {
  position: absolute;
  width: 1px;
  height: 1px;
  padding: 0;
  margin: -1px;
  overflow: hidden;
  clip: rect(0 0 0 0);
  white-space: nowrap;
  border: 0;
}

@keyframes pxPulse {
  0% { box-shadow: 0 0 0 0 rgba(123, 192, 67, 0.55); }
  70% { box-shadow: 0 0 0 12px rgba(123, 192, 67, 0); }
  100% { box-shadow: 0 0 0 0 rgba(123, 192, 67, 0); }
}
@keyframes pxFloat {
  0%, 100% { transform: translateY(0); }
  50% { transform: translateY(-9px); }
}
@keyframes pxBlink {
  0%, 100% { opacity: 1; }
  50% { opacity: 0.35; }
}

/* Every animation in the design is decorative — kill them all on request. */
@media (prefers-reduced-motion: reduce) {
  *,
  *::before,
  *::after {
    animation-duration: 0.01ms !important;
    animation-iteration-count: 1 !important;
    transition-duration: 0.01ms !important;
  }
  html { scroll-behavior: auto; }
}

/* --------------------------------------------------------------- layout */
.wrap { max-width: var(--shell); margin: 0 auto; padding: 0 24px; }
.wrap-narrow { max-width: var(--shell-narrow); margin: 0 auto; padding: 0 24px; }

.section { padding-block: clamp(64px, 8vw, 100px); }
.section-sm { padding-block: clamp(56px, 7vw, 88px); }
.section-xs { padding-block: clamp(40px, 5vw, 64px); }

.bg-0 { background: var(--bg); }
.bg-1 { background: var(--bg-1); }
.ruled { border-top: 1px solid var(--rule); }
.relative { position: relative; }
.clipped { position: relative; overflow: hidden; }

/* auto-fit grids — the design's only layout primitive */
.grid { display: grid; gap: 20px; }
.grid-2 { grid-template-columns: repeat(auto-fit, minmax(min(100%, 340px), 1fr)); }
.grid-3 { grid-template-columns: repeat(auto-fit, minmax(min(100%, 300px), 1fr)); }
.grid-4 { grid-template-columns: repeat(auto-fit, minmax(min(100%, 260px), 1fr)); }
.grid-split { grid-template-columns: repeat(auto-fit, minmax(min(100%, 400px), 1fr)); gap: clamp(32px, 4vw, 56px); }
.grid-hero { grid-template-columns: repeat(auto-fit, minmax(min(100%, 440px), 1fr)); gap: clamp(36px, 4vw, 56px); align-items: center; }
.grid-stats { grid-template-columns: repeat(auto-fit, minmax(130px, 1fr)); gap: 12px; }

.stack { display: flex; flex-direction: column; }
.row { display: flex; flex-wrap: wrap; align-items: center; }
.gap-8 { gap: 8px; }
.gap-10 { gap: 10px; }
.gap-14 { gap: 14px; }

/* Decorative radial glows behind hero/CTA sections. */
.glow {
  position: absolute;
  pointer-events: none;
  border-radius: 50%;
}
.glow-green { background: radial-gradient(circle, rgba(76, 175, 80, 0.14), transparent 68%); filter: blur(46px); }
.glow-blue { background: radial-gradient(circle, rgba(33, 150, 243, 0.13), transparent 68%); filter: blur(50px); }

/* The perspective grid floor under the hero. */
.grid-floor {
  position: absolute;
  left: 50%;
  bottom: -12%;
  width: 160%;
  height: 70%;
  transform: translateX(-50%) perspective(620px) rotateX(62deg);
  transform-origin: center bottom;
  background-image:
    linear-gradient(rgba(76, 175, 80, 0.09) 1px, transparent 1px),
    linear-gradient(90deg, rgba(33, 150, 243, 0.08) 1px, transparent 1px);
  background-size: 56px 56px;
  mask-image: radial-gradient(ellipse 62% 78% at 50% 88%, #000 30%, transparent 78%);
  -webkit-mask-image: radial-gradient(ellipse 62% 78% at 50% 88%, #000 30%, transparent 78%);
  pointer-events: none;
}

/* ----------------------------------------------------------------- type */
.kicker {
  margin: 0;
  font-size: 12px;
  font-weight: 700;
  letter-spacing: 0.18em;
  color: var(--green-l);
}
.kicker-ai { color: var(--blue-soft); }

h1, h2, h3, .h1, .h2, .h3 {
  font-family: var(--font-display);
  font-weight: 700;
  letter-spacing: -0.02em;
  line-height: 1.12;
  margin: 0;
}
.h1 {
  font-size: clamp(2.45rem, 5.1vw, 3.9rem);
  line-height: 1.07;
  letter-spacing: -0.022em;
  text-wrap: balance;
}
.h1-sub { font-size: clamp(2.1rem, 4.4vw, 3.3rem); line-height: 1.08; }
.h2 { font-size: clamp(1.85rem, 3.4vw, 2.6rem); }
.h2-sm { font-size: clamp(1.7rem, 3vw, 2.3rem); }
.h2-xs { font-size: clamp(1.6rem, 3vw, 2.1rem); }
.h3 { font-size: 19px; font-weight: 600; }
.h3-sm { font-size: 18px; font-weight: 600; }

/* The signature gradient word inside a heading. */
.grad-text {
  background: var(--grad-text);
  -webkit-background-clip: text;
  background-clip: text;
  color: transparent;
}
.grad-text-ai { background: var(--grad-ai-text); -webkit-background-clip: text; background-clip: text; color: transparent; }

.lede {
  margin: 14px 0 0;
  font-size: 16px;
  color: var(--text-2);
  text-wrap: pretty;
}
.lede-lg { font-size: clamp(1rem, 1.4vw, 1.09rem); max-width: 540px; }
.body { font-size: 14.5px; color: var(--text-2); text-wrap: pretty; margin: 8px 0 0; }
.muted { color: var(--text-3); }
.small { font-size: 12.5px; color: var(--text-3); }
.tiny { font-size: 11.5px; color: var(--text-3); }
.strong-2 { color: var(--text-strong); }

.section-head { max-width: 680px; }
.section-head .h2, .section-head .h2-sm { margin-top: 12px; }

/* -------------------------------------------------------------- buttons */
.btn {
  display: inline-flex;
  align-items: center;
  justify-content: center;
  gap: 9px;
  font-family: inherit;
  font-size: 15.5px;
  font-weight: 700;
  padding: 14px 26px;
  border-radius: var(--r-md);
  border: none;
  cursor: pointer;
  text-decoration: none;
  transition: transform var(--t-fast), box-shadow var(--t-fast), border-color var(--t-fast), background var(--t-fast);
}
.btn svg { flex: none; }

/* These are written `.btn.btn-x` (specificity 0-2-0), NOT `.btn-x` (0-1-0), and
   must stay that way. A button is an <a>, so any container rule that styles bare
   links outranks a single-class button rule and silently repaints it: `.nav a`
   and `.mobile-menu a` are both 0-1-1, and they were painting the header's
   "Book a demo" label `--text-2` gray (#575d57) on the green gradient — about
   2:1 contrast, and unreadable. The a11y gate checks names and labels, not
   contrast, so nothing caught it. Adding a new container that styles `a` must
   not be able to reintroduce this. */
.btn.btn-primary { background: var(--grad); color: var(--ink); }
.btn.btn-primary:hover {
  transform: translateY(-2px);
  box-shadow: 0 8px 30px rgba(76, 175, 80, 0.4);
  color: var(--ink);
}

.btn.btn-ghost {
  background: var(--card);
  border: 1px solid var(--border);
  color: var(--text);
  font-weight: 600;
  padding: 13px 24px;
}
.btn.btn-ghost:hover { border-color: var(--border-hover); background: var(--card-hover); color: var(--text); }

.btn-sm { font-size: 14px; padding: 9px 18px; border-radius: 10px; }
.btn-sm.btn-ghost { padding: 10px 18px; font-size: 13.5px; }
.btn-block { width: 100%; }

/* Inline text link with an arrow — used to close every card. */
.link-arrow {
  font-size: 13.5px;
  font-weight: 700;
  color: var(--green-l);
  background: none;
  border: none;
  padding: 0;
  cursor: pointer;
  font-family: inherit;
  display: inline-flex;
  align-items: center;
  gap: 7px;
}
.link-arrow:hover { color: var(--green-hover); }
.link-arrow-blue { color: var(--blue-soft); }

/* ---------------------------------------------------------------- cards */
.card {
  background: var(--card);
  border: 1px solid var(--border);
  border-radius: var(--r-xl);
  padding: 26px;
  transition: border-color var(--t-med), transform var(--t-med), background var(--t-med);
}
.card:hover { border-color: var(--border-hover); transform: translateY(-4px); background: var(--card-hover); }
.card-flat:hover { transform: none; background: var(--card); }
.card-lg { padding: 28px; }
.card-tall { display: flex; flex-direction: column; }
.card-ai { border-color: rgba(66, 165, 245, 0.25); }
.card-ai:hover { border-color: rgba(66, 165, 245, 0.55); }

/* Gradient icon tile at the top of a card. */
.icon-tile {
  display: inline-flex;
  align-items: center;
  justify-content: center;
  width: 44px;
  height: 44px;
  border-radius: var(--r-md);
  background: var(--grad);
  flex: none;
}
.icon-tile-lg { width: 46px; height: 46px; border-radius: 13px; box-shadow: var(--glow-green); }
.icon-tile-ai { background: var(--grad-ai); }
.icon-tile-soft { background: rgba(76, 175, 80, 0.15); }
.icon-tile-soft-blue { background: rgba(33, 150, 243, 0.14); }

.card h3 { margin-top: 16px; }
.step-num {
  position: absolute;
  top: 22px;
  right: 24px;
  font-family: var(--font-display);
  font-size: 44px;
  font-weight: 700;
  color: transparent;
  -webkit-text-stroke: 1px var(--border-3);
}

/* Dashed "your community here" placeholder card. */
.card-dashed {
  display: flex;
  flex-direction: column;
  align-items: center;
  justify-content: center;
  text-align: center;
  gap: 12px;
  border: 1.5px dashed var(--border-3);
  border-radius: var(--r-xl);
  padding: 36px 28px;
  min-height: 300px;
  transition: border-color var(--t-med);
}
.card-dashed:hover { border-color: rgba(76, 175, 80, 0.4); }

/* Bulleted list inside cards / feature columns. */
.ticks { margin: 14px 0 0; padding: 0; list-style: none; display: flex; flex-direction: column; gap: 8px; }
.ticks li { display: flex; gap: 9px; align-items: baseline; font-size: 13.5px; color: var(--text-strong); }
.ticks li::before { content: '·'; color: var(--green-l); font-weight: 700; }
.ticks-check li { align-items: center; gap: 11px; font-size: 14.5px; }
.ticks-check li::before {
  content: '✓';
  display: inline-flex;
  align-items: center;
  justify-content: center;
  width: 22px;
  height: 22px;
  flex: none;
  border-radius: 50%;
  background: rgba(76, 175, 80, 0.14);
  color: var(--green-l);
  font-size: 12px;
  font-weight: 700;
}

/* A definition row list (CRM module columns). */
.deflist > div { padding: 15px 0; border-top: 1px solid var(--border); }
.deflist h3 { font-family: var(--font); font-size: 15.5px; font-weight: 600; color: var(--text); margin: 0; }
.deflist p { margin: 5px 0 0; font-size: 13.5px; color: var(--text-2); text-wrap: pretty; }

/* --------------------------------------------------------- pills & tags */
.pill {
  display: inline-flex;
  align-items: center;
  gap: 9px;
  border: 1px solid var(--border-2);
  background: var(--overlay);
  border-radius: var(--pill);
  padding: 7px 15px;
  font-size: 12.5px;
  font-weight: 600;
  color: var(--text-strong);
  letter-spacing: 0.02em;
}
.pill-blue { border-color: rgba(66, 165, 245, 0.35); background: rgba(33, 150, 243, 0.1); color: var(--blue-soft); }
.pill-green { border-color: rgba(76, 175, 80, 0.3); background: rgba(76, 175, 80, 0.12); color: var(--green-l); }

/* Keyword chips under a money-page hero. */
.tag {
  border: 1px solid var(--border-2);
  border-radius: var(--pill);
  padding: 4px 12px;
  font-size: 11.5px;
  color: var(--text-2);
}
.tag-link { font-weight: 600; padding: 7px 15px; font-size: 12.5px; color: var(--text-strong); transition: border-color var(--t-fast); }
.tag-link:hover { border-color: rgba(76, 175, 80, 0.4); color: var(--text); }
.tag-link-ai { border-color: rgba(66, 165, 245, 0.4); background: rgba(33, 150, 243, 0.08); color: var(--blue-soft); font-weight: 700; }
.tag-link-ai:hover { border-color: rgba(66, 165, 245, 0.7); color: var(--blue-soft); }

/* "SAMPLE DATA" / "DRAFT" markers — honesty labels, used a lot. */
.label-sample {
  border: 1px solid var(--border-3);
  border-radius: var(--pill);
  padding: 2.5px 9px;
  font-size: 10px;
  font-weight: 700;
  letter-spacing: 0.07em;
  color: var(--text-3);
  white-space: nowrap;
}

.blink { animation: pxBlink 2.4s var(--ease) infinite; }
.dot {
  width: 7px;
  height: 7px;
  border-radius: 50%;
  background: var(--green-l);
  flex: none;
}

/* ------------------------------------------------- lot status semantics */
/* Status is carried by colour AND shape AND text — never colour alone
   (WCAG 1.4.1). The shape is a clip-path on .status-mark. */
.status-chip {
  display: inline-flex;
  align-items: center;
  gap: 6px;
  border-radius: var(--pill);
  padding: 3px 10px;
  font-size: 11px;
  font-weight: 700;
  letter-spacing: 0.03em;
  border: 1px solid;
  white-space: nowrap;
}
.status-mark { width: 8px; height: 8px; flex: none; background: currentColor; }

/* Chip inks are TIED TO THE BOARD FILLS in src/data/us/lots.ts — a buyer reads
   the legend and then matches it to a parcel, so the two must agree. They are a
   deeper shade of the same hue rather than the same value: an 8px mark needs
   more chroma than a 150px parcel to register at all, and the deeper tone is
   what carries AA contrast for the chip's own label. If you restyle the board
   fills, move these with them. */
.st-av { color: var(--st-av-ink); background: var(--st-av-bg); border-color: var(--st-av-line); }
.st-av .status-mark { border-radius: 50%; }
.st-rs { color: var(--st-rs-ink); background: var(--st-rs-bg); border-color: var(--st-rs-line); }
.st-rs .status-mark { clip-path: polygon(50% 0, 100% 50%, 50% 100%, 0 50%); }
.st-uc { color: var(--st-uc-ink); background: var(--st-uc-bg); border-color: var(--st-uc-line); }
.st-uc .status-mark { clip-path: polygon(50% 0, 100% 100%, 0 100%); }
.st-sd { color: var(--st-sd-ink); background: var(--st-sd-bg); border-color: var(--st-sd-line); }

/* Legend row under a map. */
.legend { display: flex; flex-wrap: wrap; gap: 8px; justify-content: center; }
.legend span {
  display: inline-flex;
  align-items: center;
  gap: 6px;
  border: 1px solid var(--border-2);
  border-radius: var(--pill);
  padding: 4px 11px;
  font-size: 11.5px;
  color: var(--text-2);
}
.legend i { width: 8px; height: 8px; display: block; flex: none; }
.legend .m-av { background: var(--green); border-radius: 50%; }
.legend .m-rs { background: var(--amber); clip-path: polygon(50% 0, 100% 50%, 50% 100%, 0 50%); }
.legend .m-uc { width: 9px; background: var(--blue-l); clip-path: polygon(50% 0, 100% 100%, 0 100%); }
.legend .m-sd { background: var(--slate); }
.legend .m-future { border: 1.5px dashed var(--text-2); border-radius: 50%; background: none; box-sizing: border-box; }

/* Legend pinned under a hero visual. Lives here, not in a page's scoped <style>,
   because Astro scoped styles cannot reach the root element of a child
   component — <Legend class="hero-legend"> would silently do nothing. */
.hero-legend { position: absolute; left: 0; right: 0; bottom: -6px; }
.demo-aside .legend { justify-content: flex-start; }

/* ------------------------------------------------------ the 3D lot board */
/* The hero's centrepiece: a CSS-3D "board" of extruded lots. Lot geometry
   (x/y/w/h) is data, so it stays inline per lot; everything shared is here. */
.scene { position: relative; }
.board-stage { position: absolute; inset: 0; perspective: 1150px; }
.board {
  position: absolute;
  left: 50%;
  top: 53%;
  width: min(520px, 92%);
  aspect-ratio: 1.28;
  transform: translate(-50%, -50%) rotateX(57deg) rotateZ(-38deg);
  transform-style: preserve-3d;
  transition: transform 0.5s var(--ease);
}
.board-ground {
  position: absolute;
  inset: 0;
  background: var(--board-ground);
  border: 1px solid var(--border-2);
  border-radius: var(--r-lg);
  background-image:
    linear-gradient(var(--board-grid) 1px, transparent 1px),
    linear-gradient(90deg, var(--board-grid) 1px, transparent 1px);
  background-size: 34px 34px;
  box-shadow: var(--shadow-lg);
}
/* Roads carry a centre line and a soft shoulder. Without them a road is just a
   pale band and the board reads as a game board rather than a plan. */
.board-road-h,
.board-road-v {
  position: absolute;
  background: var(--board-road);
}
.board-road-h {
  left: 0;
  top: 45%;
  width: 100%;
  height: 12%;
  border-top: 1px solid var(--board-kerb);
  border-bottom: 1px solid var(--board-kerb);
  background-image: repeating-linear-gradient(
    to right, var(--board-centreline) 0 2.2%, transparent 2.2% 4.6%);
  background-size: 100% 1.5px;
  background-position: 0 50%;
  background-repeat: no-repeat;
}
.board-road-v {
  top: 0;
  width: 10%;
  height: 100%;
  border-left: 1px solid var(--board-kerb);
  border-right: 1px solid var(--board-kerb);
  background-image: repeating-linear-gradient(
    to bottom, var(--board-centreline) 0 1.6%, transparent 1.6% 3.4%);
  background-size: 1.5px 100%;
  background-position: 50% 0;
  background-repeat: no-repeat;
}

.board-lot { position: absolute; transform-style: preserve-3d; }
/* Contact shadow on the ground. Was rgba(0,0,0,0.55) offset 4%/7% — a hard
   sticker shadow, which is what made the parcels look pasted on rather than
   cut from the land. Softer, tighter, and tinted to the ground. */
.board-lot::before {
  content: '';
  position: absolute;
  inset: 0;
  border-radius: 3px;
  background: rgba(24, 34, 26, 0.26);
  filter: blur(5px);
  transform: translate(1.5%, 3%);
}
.board-face {
  position: absolute;
  inset: 0;
  transform: translateZ(11px);
  border: none;
  padding: 0;
  border-radius: 2.5px;
  /* The solid, un-blurred offset is the parcel's SIDE WALL. A face with only a
     blurred shadow floats; a hard offset in a darker tone reads as an extruded
     volume sitting in the ground, which is the whole point of "actually 3D". */
  box-shadow:
    inset 0 0 0 1px var(--board-parcel-edge),
    inset 0 -6px 12px rgba(20, 28, 22, 0.16),
    2px 3px 0 0 var(--board-wall);
  transition: box-shadow var(--t-fast), filter var(--t-fast);
}
/* Painted in-plane on the parcel, like lettering on a plat. */
.board-face-no {
  position: absolute;
  inset: 0;
  display: flex;
  align-items: center;
  justify-content: center;
  font-family: var(--font-display);
  font-size: clamp(8px, 1.5vw, 12px);
  font-weight: 700;
  letter-spacing: 0.04em;
  color: var(--board-parcel-ink);
  pointer-events: none;
  user-select: none;
}
button.board-face { cursor: pointer; }
/* brightness() washed the fill out to near-white. Lifting the wall and adding a
   ring keeps the land tone intact while still reading as hover. */
button.board-face:hover {
  box-shadow:
    inset 0 0 0 1px var(--green-d),
    inset 0 -6px 12px rgba(20, 28, 22, 0.1),
    3px 4px 0 0 var(--board-wall);
  filter: saturate(1.15);
}
button.board-face.is-selected { outline: 2px solid var(--green-d); outline-offset: 2px; }
.board-face-flat {
  transform: translateZ(8px);
  border-radius: 2.5px;
  box-shadow: inset 0 0 0 1px var(--board-parcel-edge), 1.5px 2px 0 0 var(--board-wall);
}
.board-ring {
  position: absolute;
  width: 15%;
  aspect-ratio: 1;
  transform: translate(-50%, -50%) translateZ(13px);
  border: 2px solid var(--green-l);
  border-radius: 50%;
  animation: pxPulse 2.2s var(--ease) infinite;
  transition: left 0.6s var(--ease), top 0.6s var(--ease);
}
/* The floating lot detail card that rides above the board. */
.board-card {
  position: absolute;
  width: 206px;
  transform: translate(-50%, -50%) translateZ(30px) rotateZ(38deg) rotateX(-57deg) translateY(-86px);
  transform-origin: center;
  background: var(--overlay);
  border: 1px solid var(--border-3);
  border-radius: var(--r-md);
  padding: 13px 14px;
  box-shadow: var(--shadow-lg), 0 0 40px rgba(76, 175, 80, 0.14);
  transition: left 0.6s var(--ease), top 0.6s var(--ease);
}
.board-card-row {
  display: flex;
  align-items: center;
  justify-content: space-between;
  gap: 8px;
}
.board-card-foot {
  margin-top: 9px;
  padding-top: 9px;
  border-top: 1px solid var(--border);
  display: flex;
  align-items: center;
  justify-content: space-between;
  gap: 8px;
}
/* Floating "new lead" toast beside the board. */
.board-toast {
  position: absolute;
  z-index: 6;
  background: var(--overlay);
  border: 1px solid var(--border-3);
  border-radius: var(--r-md);
  padding: 10px 13px;
  box-shadow: var(--shadow-sm);
  display: flex;
  gap: 10px;
  align-items: center;
}

/* ------------------------------------------------ before/after (the switch) */
.switch-frame {
  position: relative;
  max-width: 960px;
  margin: 0 auto;
  aspect-ratio: 16 / 9.4;
  border: 1px solid var(--border);
  border-radius: var(--r-xl);
  overflow: hidden;
  background: var(--bg-3);
  box-shadow: var(--shadow-sm);
}
/* The paper plat that gets wiped away. Deliberately light — it is a photocopy. */
.paper { position: absolute; inset: 0; background: #edeae3; }
.paper-inner { position: absolute; inset: 4.5%; border: 2px solid #2f2f2d; }
.paper-lot {
  position: absolute;
  border: 1.5px solid #3a3a37;
  display: flex;
  align-items: center;
  justify-content: center;
  font-size: clamp(6px, 1vw, 10px);
  color: #55534d;
  font-weight: 600;
}
.paper-tag {
  position: absolute;
  top: 14px;
  left: 14px;
  background: #1d1f20;
  color: #edeae3;
  border-radius: var(--pill);
  padding: 5px 13px;
  font-size: 11.5px;
  font-weight: 700;
  letter-spacing: 0.05em;
}
.map-tag {
  position: absolute;
  top: 14px;
  right: 14px;
  background: var(--overlay);
  border: 1px solid rgba(76, 175, 80, 0.35);
  color: var(--green-l);
  border-radius: var(--pill);
  padding: 5px 13px;
  font-size: 11.5px;
  font-weight: 700;
  letter-spacing: 0.05em;
}
.switch-line {
  position: absolute;
  top: 0;
  bottom: 0;
  width: 2px;
  background: linear-gradient(180deg, var(--green-l), var(--blue));
  box-shadow: 0 0 18px rgba(76, 175, 80, 0.5);
  pointer-events: none;
}
.switch-knob {
  position: absolute;
  top: 50%;
  transform: translate(-50%, -50%);
  width: 44px;
  height: 44px;
  border-radius: 50%;
  background: var(--card);
  border: 1px solid var(--border-3);
  box-shadow: var(--shadow-lg);
  display: flex;
  align-items: center;
  justify-content: center;
  pointer-events: none;
}
/* The real control: a full-bleed transparent range input, so it is keyboard-
   operable and announced properly. */
.switch-range {
  position: absolute;
  inset: 0;
  width: 100%;
  height: 100%;
  opacity: 0.001;
  cursor: ew-resize;
  margin: 0;
}
.switch-range:focus-visible ~ .switch-knob { outline: 2px solid var(--green); outline-offset: 3px; }

/* --------------------------------------------------------------- panels */
/* An admin-panel mock: darker than a card, hairline header, big shadow. */
.panel {
  background: var(--bg-2);
  border: 1px solid var(--border-2);
  border-radius: var(--r-xl);
  overflow: hidden;
  box-shadow: var(--shadow-lg);
}
.panel-head {
  display: flex;
  align-items: center;
  justify-content: space-between;
  gap: 10px;
  padding: 14px 18px;
  border-bottom: 1px solid var(--border);
  font-size: 12.5px;
  font-weight: 700;
  color: var(--text-strong);
}
.panel-foot {
  display: flex;
  align-items: center;
  gap: 11px;
  background: linear-gradient(90deg, rgba(76, 175, 80, 0.1), rgba(33, 150, 243, 0.06));
  border-top: 1px solid rgba(76, 175, 80, 0.25);
  padding: 11px 18px;
  font-size: 11.5px;
  color: var(--text-2);
}
.panel-sticky { position: sticky; top: 84px; }

.stat {
  background: var(--card);
  border: 1px solid var(--border);
  border-radius: var(--r-md);
  padding: 12px 14px;
}
.stat-label { margin: 0; font-size: 9.5px; font-weight: 700; letter-spacing: 0.09em; color: var(--text-3); }
.stat-value { margin: 4px 0 0; font-family: var(--font-display); font-size: 21px; font-weight: 700; color: var(--text); line-height: 1.1; }
.stat-delta { margin: 3px 0 0; font-size: 10.5px; font-weight: 600; }
.stat-lg { border-radius: var(--r-lg); padding: 20px 22px; }
.stat-lg .stat-label { font-size: 10px; }
.stat-lg .stat-value { font-size: 24px; margin-top: 6px; }
.stat-lg .stat-delta { font-size: 12px; margin-top: 4px; }

/* Kanban column + card */
.kan { background: var(--card); border: 1px solid var(--border); border-radius: var(--r-md); padding: 11px 11px 12px; min-height: 150px; }
.kan-head { display: flex; align-items: center; justify-content: space-between; padding: 0 3px 9px; }
.kan-head b { font-size: 11.5px; font-weight: 700; color: var(--text-strong); }
.kan-count { background: var(--border); border-radius: var(--pill); padding: 1px 8px; font-size: 10px; font-weight: 700; color: var(--text-2); }
.kan-card { background: var(--card-hover); border: 1px solid var(--border-2); border-radius: 9px; padding: 9px 10px; }
.kan-card p { margin: 0; font-size: 11.5px; font-weight: 600; color: var(--text); }
.kan-card .lot { margin-top: 3px; font-size: 10.5px; color: var(--green-l); font-weight: 600; }
.kan-card .src { margin-top: 3px; font-size: 10px; color: var(--text-3); font-weight: 400; }

/* The "Automation: …" strip that appears under several panels. */
.automation {
  display: flex;
  align-items: center;
  gap: 11px;
  background: linear-gradient(90deg, rgba(76, 175, 80, 0.1), rgba(33, 150, 243, 0.06));
  border: 1px solid rgba(76, 175, 80, 0.25);
  border-radius: 11px;
  padding: 10px 14px;
  font-size: 11.5px;
  color: var(--text-2);
}
.callout {
  display: flex;
  flex-wrap: wrap;
  align-items: center;
  gap: 16px;
  background: linear-gradient(90deg, rgba(76, 175, 80, 0.1), rgba(33, 150, 243, 0.07));
  border: 1px solid rgba(76, 175, 80, 0.25);
  border-radius: var(--r-lg);
  padding: 18px 24px;
}
.callout-blue { background: linear-gradient(90deg, rgba(33, 150, 243, 0.09), rgba(76, 175, 80, 0.08)); border-color: rgba(66, 165, 245, 0.28); }

/* Horizontal bar meters (funnel, channel mix). */
.meter { display: flex; align-items: center; gap: 12px; padding: 5px 0; }
.meter-label { width: 110px; flex: none; font-size: 11.5px; color: var(--text-2); }
.meter-track { flex: 1; height: 22px; border-radius: 6px; background: var(--rule); overflow: hidden; display: block; }
.meter-fill { display: block; height: 100%; border-radius: 6px; }
.meter-num { width: 44px; flex: none; text-align: right; font-family: var(--font-display); font-size: 13.5px; font-weight: 700; color: var(--text); }

/* Toggle switch (automations control panel). */
.toggle {
  width: 34px;
  height: 19px;
  border-radius: var(--pill);
  position: relative;
  flex: none;
  border: none;
  cursor: pointer;
  padding: 0;
  background: var(--border-3);
  transition: background 0.2s var(--ease);
}
.toggle[aria-checked='true'] { background: var(--green-d); }
.toggle::after {
  content: '';
  position: absolute;
  top: 2.5px;
  left: 2.5px;
  width: 14px;
  height: 14px;
  border-radius: 50%;
  background: #fff;
  transition: left 0.2s var(--ease);
}
.toggle[aria-checked='true']::after { left: 17.5px; }

/* --------------------------------------------------------------- tables */
.tbl { width: 100%; border-collapse: collapse; font-size: 13px; }
.tbl th,
.tbl td { text-align: left; padding: 10px 16px; border-bottom: 1px solid var(--rule); }
.tbl thead th {
  font-size: 10.5px;
  letter-spacing: 0.09em;
  color: var(--text-3);
  font-weight: 700;
  border-bottom: 1px solid var(--border-2);
}
.tbl tbody th { font-weight: 600; color: var(--text); }
.tbl td { color: var(--text-strong); }
.tbl .num { text-align: right; font-weight: 600; color: var(--text); }
.scroll-x { overflow-x: auto; }

/* The 3-way comparison table (Plotex / 2D overlay / PDF). */
.cmp { width: 100%; min-width: 640px; border-collapse: separate; border-spacing: 0; font-size: 14px; }
.cmp th,
.cmp td { padding: 13px 16px; border-bottom: 1px solid var(--rule); }
.cmp thead th { padding: 14px 16px; font-size: 12px; font-weight: 600; letter-spacing: 0.08em; color: var(--text-3); border-bottom: 1px solid var(--border-2); text-align: center; }
.cmp thead th:first-child { text-align: left; }
.cmp thead .own {
  border-bottom: 1px solid rgba(76, 175, 80, 0.4);
  background: linear-gradient(180deg, rgba(76, 175, 80, 0.13), rgba(33, 150, 243, 0.06));
  border-radius: 14px 14px 0 0;
  letter-spacing: normal;
}
.cmp thead .own span { font-family: var(--font-display); font-size: 15px; font-weight: 700; color: var(--text); }
.cmp tbody th { text-align: left; font-weight: 500; color: var(--text-strong); }
.cmp tbody td { text-align: center; }
.cmp tbody td.own { background: rgba(76, 175, 80, 0.05); }
.verdict { display: inline-flex; align-items: center; gap: 7px; font-size: 12.5px; font-weight: 600; }
.verdict i {
  display: inline-flex;
  align-items: center;
  justify-content: center;
  width: 20px;
  height: 20px;
  border-radius: 50%;
  font-size: 12px;
  font-style: normal;
}
.v-yes { color: var(--green-l); }
.v-yes i { background: rgba(76, 175, 80, 0.16); }
.v-no { color: var(--text-3); }
.v-no i { background: var(--border); }
.v-part { color: var(--amber); }
.v-part i { background: rgba(255, 193, 7, 0.13); }

/* ------------------------------------------------------------------ FAQ */
.faq { display: flex; flex-direction: column; gap: 12px; }
.faq details { background: var(--card); border: 1px solid var(--border); border-radius: var(--r-lg); overflow: hidden; }
.faq summary {
  display: flex;
  align-items: center;
  justify-content: space-between;
  gap: 16px;
  list-style: none;
  cursor: pointer;
  padding: 18px 22px;
  font-size: 15.5px;
  font-weight: 600;
  color: var(--text);
}
.faq summary::-webkit-details-marker { display: none; }
.faq summary .chev {
  flex: none;
  display: inline-flex;
  align-items: center;
  justify-content: center;
  width: 26px;
  height: 26px;
  border-radius: 50%;
  border: 1px solid var(--border-3);
  transition: transform var(--t-med);
}
.faq details[open] summary .chev { transform: rotate(180deg); }
.faq p { margin: 0; padding: 0 22px 20px; font-size: 14.5px; color: var(--text-2); max-width: 720px; text-wrap: pretty; }

/* ---------------------------------------------------------------- forms */
.form {
  background: var(--card);
  border: 1px solid var(--border-2);
  border-radius: var(--r-xl);
  padding: clamp(24px, 3vw, 34px);
  box-shadow: var(--shadow-lg);
}
.field-grid { display: grid; grid-template-columns: repeat(auto-fit, minmax(min(100%, 200px), 1fr)); gap: 16px; }
.field { margin-top: 16px; }
.field:first-child { margin-top: 0; }
.field label,
.field-grid label {
  display: block;
  font-size: 13px;
  font-weight: 600;
  color: var(--text-strong);
  margin-bottom: 6px;
}
.req { color: var(--green-l); }
.opt { color: var(--text-3); font-weight: 500; }
.input {
  width: 100%;
  background: var(--bg-2);
  border: 1px solid var(--border-2);
  border-radius: 10px;
  padding: 12px 14px;
  color: var(--text);
  font-size: 15px;
  font-family: inherit;
}
.input:hover { border-color: var(--border-3); }

/* Dropzone label — the visible half of a visually-hidden file input. */
.dropzone {
  display: flex;
  flex-direction: column;
  align-items: center;
  gap: 8px;
  border: 1.5px dashed var(--border-3);
  border-radius: var(--r-md);
  padding: 22px;
  text-align: center;
  cursor: pointer;
  font-size: 13.5px;
  color: var(--text-2);
  transition: border-color 0.2s var(--ease);
}
.dropzone:hover { border-color: rgba(76, 175, 80, 0.4); }

/* TCPA consent — a first-class block, never fine print. */
.consent {
  margin-top: 16px;
  background: var(--bg-2);
  border: 1px solid var(--border-2);
  border-radius: var(--r-md);
  padding: 14px 16px;
  display: flex;
  gap: 11px;
  align-items: flex-start;
}
.consent input { width: 18px; height: 18px; margin: 2px 0 0; accent-color: var(--green); flex: none; }
.consent label { font-size: 12.5px; line-height: 1.55; color: var(--text-2); margin: 0; font-weight: 400; }
.consent a { text-decoration: underline; }

.form-done { display: flex; flex-direction: column; align-items: center; text-align: center; gap: 12px; padding: 36px 8px; }
.form-done .tick {
  display: inline-flex;
  align-items: center;
  justify-content: center;
  width: 56px;
  height: 56px;
  border-radius: 50%;
  background: var(--grad);
  box-shadow: 0 0 40px rgba(76, 175, 80, 0.3);
}

/* --------------------------------------------------------- code window */
.code-window { background: var(--card); border: 1px solid var(--border); border-radius: var(--r-xl); overflow: hidden; }
.code-bar { display: flex; align-items: center; gap: 7px; padding: 13px 18px; border-bottom: 1px solid var(--border); }
.code-bar i { width: 10px; height: 10px; border-radius: 50%; background: var(--border-3); display: block; }
.code-bar span { margin-left: 8px; font-size: 12px; color: var(--text-3); font-family: var(--mono); }
.code-window pre { margin: 0; padding: 22px; font-family: var(--mono); font-size: 13px; line-height: 1.7; color: var(--text-strong); overflow-x: auto; }
.tok-tag { color: var(--blue-l); }
.tok-attr { color: var(--green-l); }
.tok-str { color: var(--amber); }

/* ------------------------------------------------------- header + footer */
.site-header {
  position: sticky;
  top: 0;
  z-index: 100;
  background: var(--header-bg);
  backdrop-filter: blur(14px);
  -webkit-backdrop-filter: blur(14px);
  border-bottom: 1px solid var(--border);
}
.site-header .bar {
  max-width: var(--shell);
  margin: 0 auto;
  padding: 0 24px;
  height: 68px;
  display: flex;
  align-items: center;
  justify-content: space-between;
  gap: 24px;
}
.brand { display: flex; align-items: center; gap: 11px; color: var(--text); }
.brand:hover { color: var(--text); }
.brand img { width: 34px; height: auto; display: block; }
.brand-text { display: flex; flex-direction: column; line-height: 1.05; }
.brand-name { font-family: var(--font-display); font-size: 21px; font-weight: 700; letter-spacing: -0.01em; }
.brand-name .ex { background: var(--grad-logo); -webkit-background-clip: text; background-clip: text; color: transparent; }
/* The tagline is ~35 characters — about three times the width of the wordmark it
   sits under. Tracking is tightened from 0.22em and the line is kept on one line,
   so the lockup stays a lockup instead of wrapping into a paragraph. */
.brand-tag {
  font-size: 9.5px;
  letter-spacing: 0.14em;
  font-weight: 600;
  color: var(--text-3);
  white-space: nowrap;
}
/* Measured, not guessed: the tagline makes the header brand 291px wide, and the
   full nav is 676px. That needs 967px of bar, but the bar is capped at 1180px with
   24px padding either side — so a 1000px viewport offers only 952px and the two
   would collide. The nav itself only collapses to a burger at 999px, which leaves
   a band at 1000-1099px where both are shown and there is not room for both.
   Hiding the tagline below 1100px closes that band with one rule. The full brand
   name is still announced by the link's aria-label, so assistive tech loses nothing. */
@media (max-width: 1099px) {
  .site-header .brand-tag { display: none; }
}

.nav { display: flex; align-items: center; gap: 28px; }
.nav a { color: var(--text-2); font-size: 14px; font-weight: 500; transition: color var(--t-fast); }
.nav a:hover { color: var(--text); }
.nav a[aria-current='page'] { color: var(--text); font-weight: 600; }

.menu-btn {
  display: none;
  background: var(--card);
  border: 1px solid var(--border-2);
  border-radius: 10px;
  width: 42px;
  height: 42px;
  align-items: center;
  justify-content: center;
  cursor: pointer;
  color: var(--text);
}
.mobile-menu {
  position: fixed;
  top: 68px;
  left: 0;
  right: 0;
  bottom: 0;
  z-index: 99;
  background: var(--menu-bg);
  backdrop-filter: blur(16px);
  padding: 28px 24px;
  display: none;
  flex-direction: column;
  gap: 6px;
  overflow-y: auto;
}
.mobile-menu.open { display: flex; }
.mobile-menu a {
  color: var(--text);
  font-size: 19px;
  font-weight: 600;
  padding: 13px 6px;
  border-bottom: 1px solid var(--border);
}
.mobile-menu .btn { margin-top: 18px; font-size: 16px; }

@media (max-width: 999px) {
  .nav { display: none; }
  .menu-btn { display: flex; }
}
@media (min-width: 1000px) {
  .mobile-menu { display: none !important; }
}

.site-footer { background: var(--bg-1); border-top: 1px solid var(--border); }
.site-footer .cols {
  display: grid;
  grid-template-columns: repeat(auto-fit, minmax(min(100%, 190px), 1fr));
  gap: 36px;
}
.site-footer h2 { margin: 0 0 14px; font-family: var(--font); font-size: 12px; font-weight: 700; letter-spacing: 0.14em; color: var(--text-3); }
.site-footer ul { margin: 0; padding: 0; list-style: none; display: flex; flex-direction: column; gap: 10px; }
.site-footer ul a { font-size: 13.5px; color: var(--text-2); }
.site-footer ul a:hover { color: var(--text); }
.social { display: flex; gap: 10px; margin-top: 18px; }
.social a {
  display: inline-flex;
  align-items: center;
  justify-content: center;
  width: 36px;
  height: 36px;
  border-radius: 50%;
  border: 1px solid var(--border-2);
  color: var(--text-2);
  transition: border-color var(--t-fast), color var(--t-fast);
}
.social a:hover { border-color: rgba(76, 175, 80, 0.4); color: var(--text); }
.phone-soon {
  display: inline-flex;
  align-items: center;
  gap: 8px;
  font-size: 13px;
  color: var(--text-3);
  border: 1px dashed var(--border-3);
  border-radius: var(--pill);
  padding: 6px 13px;
  width: fit-content;
}
.footer-bottom {
  margin-top: 48px;
  border-top: 1px solid var(--border);
  padding: 22px 0 28px;
  display: flex;
  flex-wrap: wrap;
  align-items: center;
  gap: 14px 22px;
  justify-content: space-between;
}
.legal-nav { display: flex; flex-wrap: wrap; gap: 8px 18px; align-items: center; }
.legal-nav a { font-size: 12.5px; color: var(--text-3); }
.legal-nav a:hover { color: var(--text); }
.eho { display: inline-flex; align-items: center; gap: 9px; color: var(--text-3); }
.eho span { font-size: 10.5px; letter-spacing: 0.1em; font-weight: 600; line-height: 1.3; }

.breadcrumb { font-size: 12.5px; color: var(--text-3); }
.breadcrumb a { color: var(--text-3); }
.breadcrumb a:hover { color: var(--text); }

/* ------------------------------------------------------- floating chrome */
.chat-launcher {
  position: fixed;
  right: 22px;
  bottom: 22px;
  z-index: 120;
  width: 56px;
  height: 56px;
  border-radius: 50%;
  border: none;
  cursor: pointer;
  background: var(--grad);
  box-shadow: var(--shadow-sm), 0 0 40px rgba(76, 175, 80, 0.25);
  display: flex;
  align-items: center;
  justify-content: center;
  transition: transform var(--t-fast);
}
.chat-launcher:hover { transform: translateY(-2px) scale(1.04); }

.chat-panel {
  position: fixed;
  right: 22px;
  bottom: 92px;
  z-index: 120;
  width: min(300px, calc(100vw - 44px));
  background: var(--card);
  border: 1px solid var(--border-2);
  border-radius: 18px;
  box-shadow: var(--shadow-lg);
  overflow: hidden;
}
.chat-panel[hidden] { display: none; }
.chat-head {
  display: flex;
  align-items: center;
  gap: 10px;
  padding: 14px 16px;
  border-bottom: 1px solid var(--border);
  background: linear-gradient(90deg, rgba(76, 175, 80, 0.12), rgba(33, 150, 243, 0.08));
}
.chat-body { padding: 16px; display: flex; flex-direction: column; gap: 8px; max-height: 280px; overflow-y: auto; }
.chat-msg { max-width: 88%; border-radius: var(--r-md); padding: 8px 12px; font-size: 12.5px; line-height: 1.5; }
.chat-msg-you { align-self: flex-end; background: rgba(76, 175, 80, 0.15); border: 1px solid rgba(76, 175, 80, 0.35); color: var(--text); }
.chat-msg-bot { align-self: flex-start; background: var(--card-hover); border: 1px solid var(--border-2); color: var(--text-strong); }
.chat-chip {
  border: 1px solid var(--border-2);
  background: none;
  border-radius: var(--pill);
  padding: 6px 13px;
  font-size: 12.5px;
  color: var(--text-strong);
  cursor: pointer;
  font-family: inherit;
  transition: border-color var(--t-fast);
}
.chat-chip:hover { border-color: rgba(76, 175, 80, 0.4); }

.cookie-bar {
  position: fixed;
  left: 50%;
  bottom: 18px;
  transform: translateX(-50%);
  z-index: 130;
  width: min(680px, calc(100vw - 32px));
  background: var(--overlay-strong);
  border: 1px solid var(--border-3);
  border-radius: var(--r-lg);
  padding: 16px 20px;
  box-shadow: var(--shadow-lg);
  display: flex;
  flex-wrap: wrap;
  align-items: center;
  gap: 12px 18px;
}
.cookie-bar[hidden] { display: none; }
.cookie-bar p { margin: 0; flex: 1; min-width: 240px; font-size: 13px; color: var(--text-2); }
.cookie-bar a { text-decoration: underline; }

/* ---------------------------------------------------------------- modal */
.modal { position: fixed; inset: 0; z-index: 150; display: flex; align-items: center; justify-content: center; padding: 18px; }
.modal[hidden] { display: none; }
.modal-scrim { position: absolute; inset: 0; background: var(--scrim); backdrop-filter: blur(6px); border: none; cursor: pointer; }
.modal-body {
  position: relative;
  width: min(960px, 100%);
  max-height: 92vh;
  overflow: auto;
  background: var(--bg-2);
  border: 1px solid var(--border-3);
  border-radius: var(--r-xl);
  box-shadow: var(--shadow-lg);
}
.modal-head {
  position: sticky;
  top: 0;
  z-index: 2;
  display: flex;
  align-items: center;
  justify-content: space-between;
  gap: 12px;
  padding: 16px 20px;
  background: var(--overlay-strong);
  border-bottom: 1px solid var(--border);
}
.icon-btn {
  flex: none;
  width: 34px;
  height: 34px;
  border-radius: 50%;
  background: var(--card);
  border: 1px solid var(--border-3);
  color: var(--text);
  cursor: pointer;
  display: inline-flex;
  align-items: center;
  justify-content: center;
}
.icon-btn:hover { border-color: rgba(76, 175, 80, 0.4); }

/* --------------------------------------------------------- reveal on scroll */
/* JS adds .reveal-armed only to elements below the fold, then .in when they
   enter. No JS (or reduced motion) => content is visible by default. */
.reveal-armed { opacity: 0; transform: translateY(26px); transition: opacity 0.65s var(--ease), transform 0.65s var(--ease); }
.reveal-armed.in { opacity: 1; transform: none; }

/* ------------------------------------------------------------ blog cards */
.post-card { display: flex; flex-direction: column; background: var(--card); border: 1px solid var(--border); border-radius: var(--r-xl); overflow: hidden; color: var(--text); transition: border-color var(--t-med), transform var(--t-med); }
.post-card:hover { border-color: var(--border-hover); transform: translateY(-4px); color: var(--text); }
.post-thumb {
  position: relative;
  aspect-ratio: 16 / 8;
  background-image:
    repeating-linear-gradient(45deg, var(--rule) 0 1px, transparent 1px 18px),
    linear-gradient(135deg, rgba(123, 192, 67, 0.16), rgba(33, 150, 243, 0.13));
  display: flex;
  align-items: center;
  justify-content: center;
}
.post-thumb span { font-family: var(--font-display); font-size: 42px; font-weight: 700; color: transparent; -webkit-text-stroke: 1px var(--border-3); }

/* A card carrying a real banner drops the gradient and the diagonal hatch —
   they were the placeholder, and leaving them behind the image tints it. The
   banner is 1200x630 and the card slot is 16/8, so object-fit crops a few pixels
   off the top and bottom rather than distorting the type on the banner. */
.post-thumb-img { background: none; overflow: hidden; }
.post-thumb-img picture,
.post-thumb-img img {
  display: block;
  width: 100%;
  height: 100%;
  object-fit: cover;
}
.post-body { padding: 20px 22px 22px; display: flex; flex-direction: column; gap: 8px; }
.post-body h3 { font-size: 17px; line-height: 1.3; text-wrap: balance; }

/* ------------------------------------------------------------- prose */
/* Legal pages and blog posts. */
.prose { max-width: 760px; }
.prose h2 { font-size: 1.5rem; margin: 40px 0 0; }
.prose h3 { font-size: 1.15rem; margin: 28px 0 0; font-family: var(--font-display); }
.prose p,
.prose li { font-size: 15.5px; color: var(--text-2); text-wrap: pretty; }
.prose p { margin: 14px 0 0; }
.prose ul,
.prose ol { margin: 14px 0 0; padding-left: 22px; display: flex; flex-direction: column; gap: 8px; }
.prose a { text-decoration: underline; }
.prose strong { color: var(--text-strong); }
.prose table { width: 100%; margin-top: 20px; }

/* ---- long-form article furniture -------------------------------------------
   The blog house style (docs/BLOG-STYLE-SPEC.md) expects three things a plain
   prose block does not give you: a takeaway callout near the top, a real data
   table, and a CTA card that reads as one of the article's own callouts rather
   than an advert. Tokens only — no hex — so both themes re-skin correctly. */

.callout {
  margin: 26px 0 0;
  padding: 18px 20px;
  border-radius: 12px;
  border: 1px solid var(--line);
  border-left: 3px solid var(--green-l);
  background: var(--surface-1, var(--bg-1));
}
.callout p { margin: 0; font-size: 15.5px; }
.callout .callout-label {
  display: block;
  font-size: 11px;
  font-weight: 700;
  letter-spacing: 0.16em;
  color: var(--green);
  margin-bottom: 7px;
}

/* Data table. A comparison table is a strong signal that real work went in, so it
   has to survive a phone — hence the horizontal scroll container rather than
   letting the columns crush. */
.prose .data-table { overflow-x: auto; margin-top: 22px; }
.prose .data-table table { border-collapse: collapse; min-width: 480px; }
.prose .data-table th,
.prose .data-table td {
  text-align: left;
  padding: 10px 14px;
  border-bottom: 1px solid var(--line);
  font-size: 14.5px;
  vertical-align: top;
}
.prose .data-table th {
  color: var(--text-strong);
  font-weight: 700;
  font-size: 12.5px;
  letter-spacing: 0.06em;
  text-transform: uppercase;
  border-bottom-width: 2px;
}
.prose .data-table td { color: var(--text-2); }

/* Article disclaimer. Small and quiet by design — it has to be readable and
   present without competing with the article, matching the sister site's
   .disclaimer-box treatment. */
.disclaimer-box {
  display: block;
  margin: 34px 0 0;
  padding: 14px 16px;
  border: 1px solid var(--line);
  border-radius: 10px;
  background: var(--surface-1, var(--bg-1));
}
.disclaimer-box p {
  margin: 0;
  font-size: 12.5px;
  line-height: 1.55;
  color: var(--text-3);
}
.disclaimer-box strong { color: var(--text-2); }
.disclaimer-box a { text-decoration: underline; }

/* In-article CTA card. Styled as an article callout, never as a banner ad. */
.post-cta {
  margin: 32px 0 0;
  padding: 22px;
  border-radius: 14px;
  border: 1px solid var(--line);
  background: var(--surface-1, var(--bg-1));
}
.post-cta .post-cta-label {
  font-size: 11px;
  font-weight: 700;
  letter-spacing: 0.16em;
  color: var(--green);
}
.post-cta h3 { margin: 8px 0 0; font-size: 1.15rem; font-family: var(--font-display); }
.post-cta p { margin: 8px 0 0; font-size: 14.5px; }
.post-cta .post-cta-row {
  display: flex;
  flex-wrap: wrap;
  gap: 12px;
  align-items: center;
  margin-top: 16px;
}
.post-cta .post-cta-sub { font-size: 12.5px; color: var(--text-3); }

@media (max-width: 560px) {
  .btn { width: 100%; }
  .row-cta .btn { width: auto; }
}

/* ------------------------------------------------- viewer showcase (hero) */
/* The hero's product surface. Replaced a CSS-3D "board" of twelve identical
   rectangles that no visitor could map onto anything real. Structure and intent
   live in src/components/us/ViewerShowcase.astro. */
.vshow { margin: 0; }
.vshow-frame {
  border: 1px solid var(--border-2);
  border-radius: var(--r-lg);
  background: var(--card);
  box-shadow: var(--shadow-lg);
  overflow: hidden;
}
.vshow-bar {
  display: flex;
  align-items: center;
  justify-content: space-between;
  gap: 12px;
  padding: 10px 14px;
  border-bottom: 1px solid var(--border);
  background: var(--bg-2);
  font-size: 12.5px;
}
.vshow-name { font-family: var(--font-display); font-weight: 700; color: var(--text); }
.vshow-phase {
  margin-left: 7px;
  padding: 2px 7px;
  border-radius: var(--pill);
  border: 1px solid var(--border-3);
  font-family: var(--font-body);
  font-size: 10.5px;
  font-weight: 600;
  color: var(--text-2);
  letter-spacing: 0.04em;
}
.vshow-count { display: inline-flex; align-items: center; gap: 6px; color: var(--text-2); font-weight: 600; }

.vshow-media { position: relative; overflow: hidden; }
.vshow-img { display: block; width: 100%; height: 100%; object-fit: cover; }

/* The plat is inline SVG so its lots can be real controls. It fills the media
   box; the SVG's own viewBox handles scaling. */
.vshow-plat { position: absolute; inset: 0; }
.vshow-plat svg { display: block; width: 100%; height: 100%; }

.plat-lot { cursor: pointer; }
.plat-lot .plat-fill { transition: filter 0.16s var(--ease), stroke 0.16s var(--ease); }
/* Lifting the parcel rather than recolouring it: the fill IS the status, so
   brightening it toward another status colour would say the wrong thing. */
.plat-lot:hover .plat-fill,
.plat-lot:focus-visible .plat-fill,
.plat-lot.is-selected .plat-fill {
  filter: brightness(1.1) saturate(1.15);
  stroke: #ffffff;
  stroke-width: 2.4;
}
.plat-lot:focus { outline: none; }
.plat-lot:focus-visible .plat-fill { stroke: #12331a; stroke-width: 3; }

/* PINNED top-left, deliberately not floating above the selected parcel. Anchored
   to the lot it described it covered that lot's neighbours; pinned bottom-left it
   sat on the amenity center. Top-left is the one corner of this plan carrying
   only greenbelt, so nothing informative is lost. Fixed also means the card never
   jumps around as the selection moves. */
.vshow-card {
  position: absolute;
  left: 12px;
  top: 12px;
  width: 196px;
  padding: 10px 12px;
  border-radius: 12px;
  background: var(--overlay-strong);
  border: 1px solid var(--border-2);
  box-shadow: var(--shadow-sm);
  pointer-events: none;
}
.vshow-card-top { display: flex; align-items: center; justify-content: space-between; gap: 8px; }
.vshow-card-top strong { font-family: var(--font-display); font-size: 14px; }
.vshow-card-size { margin: 6px 0 0; font-size: 11.5px; color: var(--text-2); }
.vshow-card-note { margin: 2px 0 0; font-size: 11px; color: var(--text-3); }

.vshow-compass {
  position: absolute;
  top: 10px;
  right: 12px;
  width: 26px;
  height: 26px;
  display: grid;
  place-items: center;
  border-radius: 50%;
  background: rgba(14, 22, 16, 0.55);
  border: 1px solid rgba(255, 255, 255, 0.35);
  color: #fff;
  font-size: 11px;
  font-weight: 700;
}
.vshow-scale {
  position: absolute;
  bottom: 10px;
  right: 12px;
  display: inline-flex;
  align-items: center;
  gap: 7px;
  padding: 4px 8px;
  border-radius: var(--pill);
  background: rgba(14, 22, 16, 0.55);
  color: #fff;
  font-size: 10px;
  font-weight: 600;
  letter-spacing: 0.04em;
}
.vshow-scale-bar {
  display: block;
  height: 3px;
  min-width: 34px;
  border-left: 2px solid #fff;
  border-right: 2px solid #fff;
  border-bottom: 2px solid #fff;
}

.vshow-legend {
  display: flex;
  flex-wrap: wrap;
  gap: 7px;
  padding: 10px 14px;
  border-top: 1px solid var(--border);
  background: var(--bg-2);
}

/* One row per STATUS, listing its lot numbers — see the note in
   ViewerShowcase.astro. A row per lot was taller than the map. */
.vshow-list {
  display: flex;
  flex-direction: column;
  gap: 5px;
  margin: 12px 0 0;
  padding: 0;
  list-style: none;
}
.vshow-list li { display: flex; align-items: baseline; gap: 9px; font-size: 12px; }
.vshow-list li .status-chip { flex: none; }
.vshow-list-n { color: var(--text-2); letter-spacing: 0.02em; }

.vshow-cap { margin: 10px 0 0; font-size: 11.5px; line-height: 1.5; color: var(--text-3); }

@media (max-width: 720px) {
  /* The card covers too much of a narrow frame; the text list below carries the
     same information, so drop it rather than shrink it to illegibility. */
  .vshow-card { display: none; }
  .vshow-pin { width: 19px; height: 19px; font-size: 9px; }
  .vshow-bar { font-size: 11.5px; }
}
