/* GENERATED by scripts/build-marketing.mjs - edit marketing/css, never this file. v=m71 */
/* css/base.css */
/* marketing/css/base.css - the Inciteful marketing design system (plan section P2, made real).
 *
 * Structure:
 *   01 fonts          02 tokens         03 reset/base     04 type scale
 *   05 layout+bands   06 buttons        07 cards          08 graphic devices
 *   09 nav+announce   10 footer         11 motion         12 accessibility
 *
 * Laws this file obeys, so pages do not have to re-litigate them:
 *   - THREE weights, no more. Epilogue is a variable face and could supply nine; the site uses
 *     400 body / 500 UI-and-label / 600 display-heading-and-strong, and nothing else. The old
 *     five-step spread (100/300/400/500/600) was Alterwave's light-display cut showing through
 *     and read as thin next to a grotesk.
 *   - Display and heading tracking is -0.05em, the brand's -50 (George, 2026-08-16). It eases
 *     off below heading size only (-0.035em at h4, -0.015em on sub-hero, 0 on body): -5% on
 *     15px copy sets the words solid.
 *   - The brand blue marks CTAs, links, key stats, step numerals and chart annotations, and
 *     ONE clause of the hero line. Never a wash bigger than a chip (the sanctioned exceptions
 *     are the full-bleed CTA band and the primary button fill).
 *   - Two blues, one hue: --accent (#55A8FF) is NON-TEXT ONLY - glows, wires, rules, chart
 *     annotation, the hero's one emphasised clause. It is 2.49:1 on paper, so it fails AA at every
 *     size, including the 3:1 large-text floor: it can never sit behind white text or carry a
 *     label. --accent-ink (#1D6FC7, 5.06:1) is what TEXT and button fills use.
 *   - Flat by default. Shadows exist only on floating layers (dropdown sheets, modals).
 *   - Hovers are tints. No transforms, no scale, no shadow-on-hover, no filter.
 *   - Radius scale is five steps: 10 control / 16 card / 20 frame / 24 inset / 999 chips only.
 *   - Breakpoints are 1180 / 1024 / 768 / 480. Four. Adding one is a deliberate act.
 *   - No emoji or arrow codepoints (e2e enforces): arrows are inline SVG, 1.75px stroke.
 */

/* ====================================================================== 01 FONTS */
/* ONE FAMILY, SITE-WIDE (George, 2026-08-16: "Font - Epilogue (throughout) - thats our brand
 * font"). Epilogue is a variable text+display family, so the display line, the body and the
 * tracked-out labels are all the same file at different weights - two network requests for the
 * whole site instead of seven, and no mid-word fallback is even possible.
 *
 * Self-hosted, latin subset, straight from the OFL release (NOT the Adobe kit: a Typekit kit is
 * a third-party script + CDN font host, which is the one thing this file has never allowed -
 * same rule as the vendored chart engine). The latin subset covers U+0000-00FF plus U+2000-206F,
 * so curly quotes, en/em dash, ellipsis and the pound sign are all present - see §04 for what
 * that retires.
 *
 * This replaced Alterwave (display), Instrument Sans (body), Instrument Serif and IBM Plex Mono.
 * Their woff2 files are still in public/fonts/ but nothing references them. */
@font-face {
  font-family: 'Epilogue';
  src: url('/fonts/Epilogue-Variable.woff2') format('woff2-variations');
  font-weight: 100 900;
  font-style: normal;
  font-display: swap;
}
@font-face {
  font-family: 'Epilogue';
  src: url('/fonts/Epilogue-Italic-Variable.woff2') format('woff2-variations');
  font-weight: 100 900;
  font-style: italic;
  font-display: swap;
}

/* ====================================================================== 02 TOKENS
 * Shared names carry the SAME values as public/styles.css (the product). A screenshot of the
 * app must not clash with the page that frames it. Marketing-only tokens are additions,
 * never forks. DERIVED values are hue-matched interpolations of the brand pack's own ramp.
 */
:root {
  /* neutrals - light end is green-tinged, dark end blue-tinged (brand pack) */
  --paper: #F8F8F8;          /* page ground, site-wide. Never pure white */
  --panel: #FFFFFF;          /* card + panel surfaces, text on ink */
  --band-tint: #F2F3F2;      /* DERIVED - alternating section bands */
  --alabaster: #E6E8E6;
  --line: #E6E8E6;           /* hairlines, dividers, card borders */
  --dust: #CED0CE;
  --line-strong: #CED0CE;    /* emphasised borders, input outlines */
  /* Was #8C9194 = 3.00:1 on paper. The comment said "AA-large only" and then every actual use
     of it was 12-13px - eyebrows, captions, microcopy, bylines. Walked down the same hue until
     the sizes it is REALLY used at pass AA: 4.71:1 on paper, 5.01:1 on panel. */
  --steel: #6B7074;
  --iron: #4A525A;           /* secondary text - 7.4:1 on paper */
  --muted: #4A525A;
  --ink: #24272B;            /* primary text, dark band ground */
  --carbon: #07070A;         /* pressed states only. Not a background */

  /* the one pigment (George, 2026-08-16: blue 55a8ff, ink 24272b) */
  --accent: #55A8FF;
  --accent-hover: #3C93EE;   /* DERIVED - darken in place, never a hue swap */
  --accent-press: #2A80D8;   /* DERIVED */
  /* OPAQUE on purpose (audit A3, 2026-08-30): these used to be 10%/16% alphas of the accent,
     so any text on them computed a different contrast on every ground - the .vs-pill sat at
     4.40:1 over paper. Pre-mixed over paper #F8F8F8; visually identical, arithmetically fixed. */
  --accent-soft: #E8F0F9;
  --accent-soft-strong: #DEEBF9;
  --accent-tint-border: rgba(85, 168, 255, 0.45);
  --accent-ring: rgba(85, 168, 255, 0.40);
  /* The brand blue is a LIGHT blue: white on it is ~2.5:1 and it is ~2.5:1 on paper, so it can
     carry a headline word, a stat or a rule - anything large or non-textual - but it cannot carry
     15px body copy or an inline link and still be readable. --accent-ink is the same hue walked
     down the ramp until it passes AA on paper (5.1:1); it is what small text and inline links use.
     Two tokens, one hue, no ambiguity about which to reach for.

     NOT A BUTTON FILL. This comment used to list "a button fill" as a legitimate --accent use, and
     that is how axe caught #domGo and nav_start_free on the free report at 2.49:1: a filled button
     is only "non-textual" if you forget its LABEL. White on --accent fails even the 3:1 large-text
     threshold, so no amount of enlarging the label rescues it - the fill itself has to come down
     the ramp. Filled buttons therefore use --accent-ink; --accent stays on glows, wires, rules and
     display type, which is why the connector fan is untouched by this. */
  --accent-ink: #1D6FC7;
  /* The registered hover step (tokens.json marketingLinkHover). Chip-scale text sits on the
     accent-soft fill, and #1D6FC7 computes 4.40:1 there - this walks it to 5.9:1 (audit A3). */
  --accent-ink-hover: #175BA6;
  --accent-ink-hover: #175BA6;   /* DERIVED - 6.8:1 on white, darker than rest, never a hue swap */
  --cerulean: #3E78B2;       /* data-viz second series ONLY */

  /* on-ink surfaces */
  --on-ink-text: #FFFFFF;
  --on-ink-body: rgba(255, 255, 255, 0.62);
  --on-ink-line: rgba(255, 255, 255, 0.14);
  --on-ink-fill: rgba(255, 255, 255, 0.06);

  /* semantics - inherited from the product, one source of truth */
  --good: #52A185;
  --good-text: #386F5B;
  --bad: #DE9392;
  --danger: #B4423F;
  --warn: #7a5b1e;
  --warn-amber: #d8a13a;

  /* radii - five steps, nested elements always step down */
  --r-ctl: 10px;
  --r-card: 16px;
  --r-frame: 20px;
  --r-inset: 24px;
  --r-chip: 999px;

  /* elevation - floating layers only */
  --shadow-pop: 0 8px 24px rgba(36, 39, 43, 0.10);
  --shadow-modal: 0 24px 64px rgba(7, 7, 10, 0.18);

  /* motion */
  --dur-fast: 160ms;
  --dur: 240ms;
  --dur-reveal: 500ms;
  --ease: cubic-bezier(0.16, 1, 0.3, 1);

  /* spacing scale - nothing off-scale */
  --s1: 4px;  --s2: 8px;  --s3: 12px; --s4: 16px; --s5: 24px;
  --s6: 32px; --s7: 48px; --s8: 64px; --s9: 96px; --s10: 128px;

  /* containers */
  /* THE COLUMN, measured off George's mockup (2026-08-16): the grey rules land at ~16% and
     ~83% of the page, i.e. a column ~67% of the viewport = 965px on a 1440 artboard. --container
     is both the content measure AND where body::before draws the rules, so they cannot drift
     apart. --container-mid is the ONE band the mockup lets break out: the dashboard sits wider
     than the rules and crosses them. */
  --container: 960px;
  --container-mid: 1100px;
  --container-narrow: 820px;
  --measure-hero: 880px;
  --measure-read: 720px;
  --gutter: 32px;
  --nav-h: 64px;

  /* faces - all four names resolve to Epilogue on purpose. The role tokens stay so pages keep
     saying what they MEAN (a label is still --mono, a display line is still --display); if a
     second face is ever licensed it is re-pointed here and nowhere else. --code is the only
     genuine outlier: tabular code needs real monospace metrics, so it stays a system stack. */
  --sans: 'Epilogue', system-ui, -apple-system, 'Segoe UI', Roboto, Arial, sans-serif;
  --display: var(--sans);
  --serif: var(--sans);
  --mono: var(--sans);
  --code: ui-monospace, SFMono-Regular, Menlo, Consolas, monospace;

  /* devices */
  --dot-paper: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='13' height='13'%3E%3Crect width='1.7' height='1.7' rx='0.85' fill='%23CED0CE'/%3E%3C/svg%3E");
  /* The spotlight matrix: white dots on an 18px grid, full alpha. The LAYER's opacity sets how
     strong they read, so one token serves both the always-on base and the lit reveal. */
  --dot-spot: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='18' height='18'%3E%3Crect width='1.6' height='1.6' rx='0.8' fill='%23FFFFFF'/%3E%3C/svg%3E");
  --dot-paper-ink: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='13' height='13'%3E%3Crect width='1.7' height='1.7' rx='0.85' fill='%23FFFFFF' fill-opacity='0.08'/%3E%3C/svg%3E");
  /* the mark's four-point star counter, lifted from the lockup artwork */
  --star-steel: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='134 142 141 144'%3E%3Cpath fill='%238C9194' d='M274.3,213.97c-20.15-2.58-37.63-10.96-50.62-25.95-11.27-12.32-17.16-27.41-19.25-44.94-2.92,37.2-31.42,67-70.07,70.83,38.9,3.93,67.49,33.92,70.11,71.49,3.19-38.42,32.02-67.46,69.84-71.43Z'/%3E%3C/svg%3E");
  --star-accent: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='134 142 141 144'%3E%3Cpath fill='%2355A8FF' d='M274.3,213.97c-20.15-2.58-37.63-10.96-50.62-25.95-11.27-12.32-17.16-27.41-19.25-44.94-2.92,37.2-31.42,67-70.07,70.83,38.9,3.93,67.49,33.92,70.11,71.49,3.19-38.42,32.02-67.46,69.84-71.43Z'/%3E%3C/svg%3E");
  --star-alabaster: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='134 142 141 144'%3E%3Cpath fill='%23E6E8E6' d='M274.3,213.97c-20.15-2.58-37.63-10.96-50.62-25.95-11.27-12.32-17.16-27.41-19.25-44.94-2.92,37.2-31.42,67-70.07,70.83,38.9,3.93,67.49,33.92,70.11,71.49,3.19-38.42,32.02-67.46,69.84-71.43Z'/%3E%3C/svg%3E");
}

/* ====================================================================== 03 RESET / BASE */
*, *::before, *::after { box-sizing: border-box; }
html { -webkit-text-size-adjust: 100%; }
body {
  margin: 0;
  background: var(--paper);
  color: var(--ink);
  font-family: var(--sans);
  font-size: 17px;
  font-weight: 400;
  line-height: 1.55;
  font-feature-settings: 'kern' 1, 'liga' 1;
  -webkit-font-smoothing: antialiased;
  text-rendering: optimizeLegibility;
}
img, svg, video { max-width: 100%; }
img, video { height: auto; display: block; }
h1, h2, h3, h4, h5, p, figure, blockquote, dl, dd { margin: 0; }
/* Marketing loads Epilogue at 400/500/600 only (DESIGN_SYSTEM.md 5.1), and the UA default for a
   heading is `bold` = 700 - which the browser then SYNTHESIZES by smearing the 600 face. `strong, b`
   below was already normalised for exactly this reason; headings never were, so every heading that
   did not carry a role class rendered at a weight we do not ship. Measured 2026-08-26: /terms and
   /privacy (h2, 19px), /methodology (h2, 26px), the .sources h2 on all six comparison pages, the
   sample-report h2 on /features and /features/reports, and the undefined .h1-page on four
   comparison pages - 12 pages in total. A role class still wins; this only decides what an
   unclassed heading falls back to, and it falls back to something we actually have. */
h1, h2, h3, h4, h5, h6 { font-weight: 600; }
ul, ol { margin: 0; padding: 0; list-style: none; }
a { color: var(--accent-ink); text-decoration: none; }
a:hover { color: var(--accent-press); text-decoration: underline; text-underline-offset: 3px; }
strong, b { font-weight: 600; }
table { border-collapse: collapse; width: 100%; }
button { font: inherit; color: inherit; }
hr { border: 0; border-top: 1px solid var(--line); margin: 0; }

/* ====================================================================== 04 TYPE SCALE
 * Display tracks IN, mono tracks OUT. That contrast is the point.
 * The headline accent is Instrument Serif ITALIC at the parent size, in Ink - never cobalt.
 */
/* Scaled with the column (1280 -> 960): a 72px display line that was comfortable in the old
   measure now fills 960 edge to edge, and sat two steps above the flagship hero's 54px. */
.display-1 { font-size: 56px; font-weight: 600; letter-spacing: -0.05em; line-height: 0.98; }
.display-2 { font-size: 44px; font-weight: 600; letter-spacing: -0.05em; line-height: 1.02; }
/* The one display line at the top of a page. Epilogue is a grotesk, not a light display face,
   so it takes the opposite setting to the Alterwave it replaced: heavy, tightly tracked, tight
   leading. 600 is the ceiling this file sets and the hero is where it gets spent. */
.display-brand {
  font-family: var(--display);
  font-weight: 600;
  font-size: clamp(32px, 3.8vw, 54px);
  letter-spacing: -0.05em;
  line-height: 1.06;
  text-wrap: balance;
}
/* The one clause of the hero line that carries the pigment. */
/* --accent-ink, not --accent. This is the Home H1's accent clause - "the answer" - and it is TEXT,
   so COL-01 applies: #55A8FF measures 2.35:1 on Paper and fails even the 3:1 large-text threshold
   at every size the clamp produces (54 / 45 / 39 / 32px). docs/UI_MIGRATION_PLAN.md Wave 2 carries
   this exact correction, approved 2026-08-23: "Move the Home H1 accent clause from #55A8FF to
   Accessible brand text". Same hue, one step down; #55A8FF keeps every non-text job it has. */
.display-brand em { font-style: normal; color: var(--accent-ink); }
.display-serif { font-family: var(--serif); font-size: 56px; font-weight: 600; letter-spacing: -0.05em; line-height: 1.05; }
.h2-section { font-size: 48px; font-weight: 600; letter-spacing: -0.05em; line-height: 1.0; }
.h2-compact { font-size: 40px; font-weight: 600; letter-spacing: -0.05em; line-height: 1.08; }
.h3-block { font-size: 32px; font-weight: 600; letter-spacing: -0.045em; line-height: 1.15; }
.h4 { font-size: 24px; font-weight: 600; letter-spacing: -0.035em; line-height: 1.25; }
.sub-hero { font-size: 20px; font-weight: 400; letter-spacing: -0.015em; line-height: 1.45; color: var(--iron); }
.body { font-size: 17px; line-height: 1.55; }
.body-sm { font-size: 15px; line-height: 1.5; color: var(--iron); }
.caption { font-size: 13px; line-height: 1.45; color: var(--iron); }

/* No serif-italic accent. It was applied to the tail of headlines as "character" and read as a
   font change for its own sake; the weight and the scale carry the voice instead. Since Epilogue
   now sets everything, a "font change" is not even available as a mistake. */
/* Two-tone headline: the second clause recedes. Max one per page. */
.dim { color: var(--steel); }

.eyebrow {
  display: block;
  font-family: var(--mono);
  font-size: 12px;
  font-weight: 500;
  letter-spacing: 0.08em;
  text-transform: uppercase;
  color: var(--steel);
  margin-bottom: var(--s4);
}
.numeral { font-family: var(--mono); font-size: 13px; font-weight: 600; color: var(--accent-ink); }
/* --accent-ink: 48px is large text, but --accent is 2.49:1 on paper and so fails even the 3:1
   large-text threshold. Size never rescues this hue; only walking it down the ramp does. */
/* Links inside a caption//paragraph must not rely on colour alone (axe link-in-text-block,
   serious): the surrounding text is --iron and the link --accent-ink, which differ in hue but not
   enough in luminance to qualify on their own. Underline is the cheapest honest signal. */
.caption a, .caption.basis a { text-decoration: underline; text-underline-offset: 2px; }
/* Links inside running prose are underlined at rest (axe link-in-text-block, serious; gate
   widened 2026-08-31). Colour alone cannot carry them for colour-blind readers. Buttons,
   nav chrome and card-level CTAs keep their own treatments. */
p a:not(.btn):not(.btn-text), li a:not(.btn):not(.btn-text), td a:not(.btn):not(.btn-text), .sources a, .page-docs .doc a:not(.btn) {
  text-decoration: underline; text-underline-offset: 2px;
}
/* Chrome lists are navigation, not prose - the underline law above must not restyle them.
   (axe's link-in-text-block only concerns links sitting inside running text.) */
.footer li a, .nav-mobile a.m-item, .nav-sheet a { text-decoration: none; }
.footer li a:hover, .nav-mobile a.m-item:hover { text-decoration: underline; text-underline-offset: 3px; }
.stat-num { font-size: 48px; font-weight: 600; letter-spacing: -0.05em; line-height: 1; color: var(--accent-ink); }
.measure { max-width: var(--measure-read); }
.nowrap { white-space: nowrap; }
.measure-hero { max-width: var(--measure-hero); }
.text-iron { color: var(--iron); }
.text-steel { color: var(--steel); }

/* ====================================================================== 05 LAYOUT + BANDS
 * One deliberate width change per scroll: width variation is a hierarchy instrument.
 */
.wrap { width: 100%; max-width: var(--container); margin: 0 auto; padding: 0 var(--gutter); }
.wrap-mid { max-width: var(--container-mid); }
.wrap-narrow { max-width: var(--container-narrow); }

.band { padding: var(--s9) 0; }
.band-hero { padding: var(--s10) 0 var(--s9); }
.band-tight { padding: var(--s8) 0; }
.band-tinted { background: var(--band-tint); }
.band-paper { background: var(--paper); }
.band-panel { background: var(--panel); }
.band-ink {
  padding: 112px 0;
  background: var(--ink);
  color: var(--on-ink-text);
}
.band-ink.band-tight { padding: var(--s8) 0; }
.band-ink .sub-hero,
.band-ink .body-sm,
.band-ink .caption,
.band-ink p { color: var(--on-ink-body); }
.band-ink .eyebrow { color: rgba(255, 255, 255, 0.5); }
.band-ink a:not(.btn) { color: var(--on-ink-text); text-decoration: underline; text-underline-offset: 3px; }
.band-ink hr, .band-ink .rule { border-top-color: var(--on-ink-line); }
.band + .band-paper, .band-paper + .band-paper { border-top: 1px solid var(--line); }

.sec-head { max-width: var(--measure-hero); margin-bottom: var(--s7); }
.sec-head p { margin-top: var(--s4); }

.grid { display: grid; gap: var(--s5); }
.grid-2 { grid-template-columns: repeat(2, minmax(0, 1fr)); }
.grid-3 { grid-template-columns: repeat(3, minmax(0, 1fr)); }
.grid-4 { grid-template-columns: repeat(4, minmax(0, 1fr)); }
/* alternating feature row: text and visual swap sides down the page */
.row-split { display: grid; grid-template-columns: minmax(0, 1fr) minmax(0, 1fr); gap: var(--s8); align-items: center; }
.row-split.is-flipped > :first-child { order: 2; }
.stack > * + * { margin-top: var(--s4); }
.cta-row { display: flex; flex-wrap: wrap; gap: var(--s3); align-items: center; }
.micro-proof { font-size: 13px; color: var(--steel); margin-top: var(--s3); }

/* ====================================================================== 06 BUTTONS
 * Heights 40 nav / 44 template / 52 hero. Hover = tint, never transform.
 */
.btn {
  display: inline-flex;
  align-items: center;
  justify-content: center;
  gap: var(--s2);
  height: 44px;
  padding: 0 20px;
  border: 1px solid transparent;
  border-radius: var(--r-ctl);
  font-size: 15px;
  font-weight: 500;
  line-height: 1;
  white-space: nowrap;
  cursor: pointer;
  text-decoration: none;
  transition: background-color var(--dur-fast) var(--ease), border-color var(--dur-fast) var(--ease), color var(--dur-fast) var(--ease);
}
.btn:hover { text-decoration: none; }
/* Hierarchy guard: in a CTA row the filled primary sets the minimum width, so a longer secondary
   label can never make the outline button visually outweigh it. */
.cta-row .btn, .hero-capture ~ .cta-row .btn { min-width: 178px; justify-content: center; }
.btn-sm { height: 42px; padding: 0 16px; font-size: 14px; }
.btn-lg { height: 48px; padding: 0 22px; font-size: 15px; }

/* --accent-ink, not --accent: see the token note. White on --accent is 2.49:1 and the label is
   normal-size text, so the fill has to come down the ramp. --accent-hover/-press are lighter than
   --accent-ink (3.2:1 and 4.1:1 on white), so the interaction states walk DOWN from here, not up. */
/* `.btn.primary` is aliased deliberately: the pricing grid uses the OLDER two-class convention,
   both in renderPricingGrid() (src/routes/pages.js) and in the marker fallback baked into
   marketing/pages/home.html + pricing.html. Without this the popular plan's CTA renders as a plain
   button on the two most commercially important pages, and nothing errors to tell you. Aliasing
   here fixes the injected and fallback paths together; changing the renderer would fix only one. */
/* INK, not blue (George, 2026-08-18: "theres something about these buttons that i hate").
   Diagnosis: the saturated blue fill was the one "classic SaaS" tell left - every reference this
   site is built against runs quiet black pills, with colour on eyebrows, glows and one headline
   clause. White on --ink is 14.8:1, so the AA question disappears with the colour. */
.btn-primary, .btn.primary { background: var(--ink); border-color: var(--ink); color: #FFFFFF; }
.btn-primary:hover, .btn.primary:hover { background: var(--carbon); border-color: var(--carbon); color: #FFFFFF; }
.btn-primary:active, .btn.primary:active { background: var(--carbon); border-color: var(--carbon); }

/* Same defect, same fix: --accent on a 10%-accent tint is still ~2.5:1 against paper. */
.btn-tinted { background: var(--accent-soft); border-color: var(--accent-tint-border); color: var(--accent-ink-hover); }
.btn-tinted:hover { background: var(--accent-soft-strong); color: var(--accent-ink-hover); }

.btn-secondary { background: var(--panel); border-color: var(--dust); color: var(--ink); }
.btn-secondary:hover { background: var(--band-tint); color: var(--ink); }

/* Ink fill. The page's other solid button is the brand blue; this is for the one CTA that has to
   read as the heavier of two actions without competing with it for the same colour. */
.btn-ink { background: var(--ink); border-color: var(--ink); color: var(--on-ink-text); }
.btn-ink:hover { background: var(--carbon); border-color: var(--carbon); color: var(--on-ink-text); }
.btn-ink:active { background: var(--carbon); border-color: var(--carbon); }

.btn-on-ink { background: #FFFFFF; border-color: #FFFFFF; color: var(--ink); }
.btn-on-ink:hover { background: var(--band-tint); border-color: var(--band-tint); color: var(--ink); }

.btn-on-ink-ghost { background: transparent; border-color: rgba(255, 255, 255, 0.4); color: #FFFFFF; }
.btn-on-ink-ghost:hover { background: var(--on-ink-fill); border-color: rgba(255, 255, 255, 0.6); color: #FFFFFF; }

.btn-text {
  display: inline-flex;
  align-items: center;
  gap: var(--s2);
  height: auto;
  /* 44px tall including padding. The label alone measured 23px - half the minimum target - and
     the padding is transparent, so nothing about it reads differently. */
  padding: 11px 0;
  border: 0;
  background: none;
  /* --accent-ink, not --accent: this is a 15px label, and this file's own rule is "never --accent
     on 15px copy". At #55A8FF it was 2.35:1. */
  color: var(--accent-ink);
  font-size: 15px;
  font-weight: 500;
}
.btn-text:hover { color: var(--accent-press); text-decoration: underline; text-underline-offset: 4px; }
.band-ink .btn-text { color: #FFFFFF; }

/* the CTA arrow: inline SVG line-arrow, 1.75px stroke. Never an arrow codepoint. */
.arrow { width: 16px; height: 16px; flex: none; stroke: currentColor; stroke-width: 1.75; fill: none; stroke-linecap: round; stroke-linejoin: round; }
.btn-block { width: 100%; }

/* ====================================================================== 07 CARDS (five species) */
/* 1. panel card - the default */
.card {
  background: var(--panel);
  border: 1px solid var(--line);
  border-radius: var(--r-card);
  padding: var(--s5);
}
.card-lg { padding: var(--s6); }
.card h3 + p, .card .h4 + p { margin-top: var(--s3); }
.band-ink .card { background: var(--on-ink-fill); border-color: var(--on-ink-line); color: var(--on-ink-text); }

/* 2. (was the "plot" card - a card inside corner registration marks. Deleted 2026-08-16: the
      marks read as technical-drawing decoration rather than brand, and the class carried nothing
      else. The --tick-* tokens went with it.) */

/* 3. screenshot card - product UI never floats on naked page background */
/* The product frame. A dashboard surface never sits on the bare page and never floats in an empty
   outline: it sits INSIDE a generous panel, on photography, with real padding around it and a
   soft lift under it. That framing is what makes a screenshot read as a product rather than as a
   div, and it is the one place the flat rule yields - the card is a floating layer here. */
.shot {
  position: relative;
  isolation: isolate;
  background: var(--ink);
  border-radius: var(--r-inset);
  padding: var(--s8);
  overflow: hidden;
}
/* The photograph. `cover` on a very tall frame crops a 16:9 plate down to a flat patch of sky,
   so the image is anchored to the TOP and the frame below it carries the gradient - the picture
   reads as a horizon the card sits on, which is what it is for. A card-height frame shows most of
   the plate; a full-dashboard frame shows a band of it. Neither shows a stretched smear. */
.shot::before {
  content: '';
  position: absolute;
  inset: 0;
  z-index: -1;
  background-image: var(--shot-img, none);
  background-size: 100% auto;
  background-position: center top;
  background-repeat: no-repeat;
}
/* The wash keeps the card readable over any frame of the photograph and pulls the image toward
   the brand blue rather than leaving it a stock photo sitting behind a UI. */
.shot::after {
  content: '';
  position: absolute;
  inset: 0;
  z-index: -1;
  background:
    linear-gradient(180deg, rgba(11, 22, 40, 0.30) 0%, rgba(11, 22, 40, 0.52) 42%, rgba(9, 14, 26, 0.88) 78%, rgba(9, 14, 26, 0.96) 100%),
    linear-gradient(150deg, rgba(0, 75, 168, 0.26), rgba(0, 75, 168, 0) 60%);
}
.shot > img,
.shot > .shot-inner,
.shot > .inc-demo,
.shot .inc-demo-host {
  border-radius: var(--r-card);
  background: var(--panel);
  box-shadow: 0 24px 60px rgba(7, 10, 20, 0.30);
}
.shot > img { display: block; width: 100%; height: auto; }

/* Frames, picked per section so the page is not one photograph repeated. */
/* George's own plate (black-dunesbg.png, resized to 1800px and encoded to webp - 29KB, in line
   with the other frames). It is a WIDE band rather than a tall plate, so this one uses `cover`
   and centres: the frame trims it horizontally instead of fitting the width and leaving the
   bottom of a full-width frame unpainted. */
.shot-dunes { --shot-img: url('/img/dunes.webp'); }
.shot-dunes::before { background-size: cover; background-position: center; }
/* NO WASH TO SPEAK OF. Measured: this plate's mean luminance is 15/255, against 173 for facade,
   141 for ridges and 65 for sea - it is roughly four times darker than the darkest photograph the
   standard wash was tuned for, and that wash (30-96% ink, plus a blue cast) crushed it to a flat
   black slab. All this one does is seat the card with a whisper of shade at the bottom; the plate
   already carries white text and a white panel on its own, and it is greyscale, so there is no
   cast to correct. */
.shot-dunes::after {
  background: linear-gradient(180deg, rgba(9, 12, 18, 0) 0%, rgba(9, 12, 18, 0.18) 70%, rgba(9, 12, 18, 0.34) 100%);
}
.shot-ridges { --shot-img: url('/img/ridges.webp'); }
.shot-facade { --shot-img: url('/img/facade.webp'); }
.shot-sea    { --shot-img: url('/img/sea.webp'); }

@media (max-width: 768px) {
  .shot { padding: var(--s5); border-radius: var(--r-frame); }
}

/* 4. dark inset CTA panel - max twice per page */
.inset-cta {
  position: relative;
  overflow: hidden;
  background: var(--ink);
  color: var(--on-ink-text);
  border-radius: var(--r-inset);
  padding: var(--s8) var(--s7);
  text-align: center;
}
.inset-cta > * { position: relative; z-index: 1; }
.inset-cta::before {
  content: '';
  position: absolute;
  inset: -13px;
  background-image: var(--dot-paper-ink);
  opacity: 0.9;
  z-index: 0;
  animation: dot-drift 42s linear infinite;
}
.inset-cta p { color: var(--on-ink-body); margin: var(--s4) auto 0; max-width: 560px; }
.inset-cta .cta-row { justify-content: center; margin-top: var(--s6); }
@keyframes dot-drift { from { transform: translate3d(0, 0, 0); } to { transform: translate3d(13px, 13px, 0); } }

/* 5. proof card - demo-labelled, or an honest reserved slot. Never lorem, never a fake quote. */
.proof {
  position: relative;
  overflow: hidden;
  background: var(--band-tint);
  border: 1px solid var(--line);
  border-radius: var(--r-card);
  padding: var(--s6);
}
.proof::before {
  content: '';
  position: absolute;
  right: -40px;
  bottom: -56px;
  width: 260px;
  height: 260px;
  background: var(--star-alabaster) center / contain no-repeat;
  opacity: 0.7;
  pointer-events: none;
}
.proof > * { position: relative; z-index: 1; }
/* The reserved-slot variant. NOT dashed: the dashed 1px hairline is the reference site's single
   most recognisable non-typographic signature and is banned here for exactly that reason
   (P2 section 12 tell 4, section 9). The slot is marked in our own grammar instead - a solid
   --dust hairline, corner registration ticks, and the spec-sheet rule under the mono label that
   P2 section 8.5 actually specifies ("styled as spec-sheet"). */
.proof-loop {
  background: var(--band-tint);
  border: 1px solid var(--line);
  border-radius: var(--r-card);
  padding: var(--s7);
}
.proof-loop .eyebrow { display: block; margin-bottom: var(--s4); }
.loop-num {
  font-family: var(--display);
  font-weight: 600;
  font-size: 84px;
  line-height: 1;
  letter-spacing: -0.05em;
  /* 84px is display size, but 2.24:1 fails the 3:1 large-text bar too - a statistic is text (COL-01). */
  color: var(--accent-ink);
  display: flex;
  align-items: baseline;
  gap: 10px;
  margin-bottom: var(--s4);
}
.loop-num span { font-family: var(--sans); font-size: 17px; font-weight: 400; color: var(--iron); letter-spacing: 0; }
.proof-loop .h4 { margin-bottom: var(--s3); }

/* in-demo cards follow product styling. Currently unreferenced by any page source - kept because
   it is the documented shape for a card drawn INSIDE a demo surface, not dead weight to delete. */
.demo-card { background: var(--panel); border: 1px solid var(--line); border-radius: var(--r-ctl); font-size: 13px; }

/* --- demo mount + its pre-mount skeleton ------------------------------------------------------
 * Eleven page sources carry this same block. It used to be ~17 inline style="" attributes each,
 * with raw hexes (a forked palette by any other name), 4px and 999px radii off the five-step
 * scale, and 14/18px spacing off the four-step one. It lives here once instead.
 *
 * The host wears .shot, because P2 section 8.3 already answers "how does product UI sit on a page":
 * it never floats on naked page ground. That also removes the frame the mount was hand-rolling.
 * demo.js attaches a SHADOW ROOT to the host at mount, so everything below .demo-skel is
 * pre-mount furniture only - it stops rendering the moment the real demo arrives, and the height
 * it holds is the height the demo mounts into (CLS 0).
 */
.demo-mount { display: block; min-height: 640px; }
.demo-skel { overflow: hidden; }
.demo-skel-bar,
.demo-skel-tabs { display: flex; align-items: center; padding: var(--s3) var(--s4); border-bottom: 1px solid var(--line); }
.demo-skel-bar { gap: var(--s3); }
.demo-skel-tabs { gap: var(--s4); }
.demo-skel-bar > span,
.demo-skel-tabs > span { display: block; height: 20px; border-radius: var(--r-ctl); background: var(--band-tint); }
.demo-skel-bar > span:nth-child(1) { width: 150px; background: var(--line); }
.demo-skel-bar > span:nth-child(2) { width: 170px; }
.demo-skel-bar > span:nth-child(3) { width: 210px; margin-left: auto; }
.demo-skel-tabs > span { height: 14px; }
.demo-skel-tabs > span:nth-child(1) { width: 64px; background: var(--line); }
.demo-skel-tabs > span:nth-child(2) { width: 64px; }
.demo-skel-tabs > span:nth-child(3) { width: 96px; }
.demo-skel-tabs > span:nth-child(4) { width: 64px; }
.demo-skel-tabs > span:nth-child(5) { width: 56px; }
.demo-skel-kpis {
  display: grid;
  grid-template-columns: repeat(4, minmax(0, 1fr));
  gap: 1px;
  margin: var(--s4);
  background: var(--line);
  border: 1px solid var(--line-strong);
  border-radius: var(--r-card);
  overflow: hidden;
}
.demo-skel-kpis > span { display: block; height: 104px; background: var(--panel); }
.demo-skel-plot { margin: 0 var(--s4) var(--s4); height: 300px; border: 1px solid var(--line); border-radius: var(--r-card); }
.demo-skel-plot.is-tall { margin: var(--s4); height: 520px; }

/* ====================================================================== 08 GRAPHIC DEVICES */
/* dot-grid plot paper - LOCAL device with a job, never site-wide wallpaper */
.dot-field {
  position: absolute;
  inset: 0;
  z-index: 0;
  pointer-events: none;
  background-image: var(--dot-paper);
  /* Weighted to the text block, not the geometric centre: the device reads as paper the copy is
     set on, rather than a stray patch in the middle of a band. */
  -webkit-mask: radial-gradient(64% 82% at 30% 34%, #000 0%, transparent 74%);
  mask: radial-gradient(64% 82% at 30% 34%, #000 0%, transparent 74%);
  opacity: 0.75;
}
.has-field { position: relative; overflow: hidden; }
.has-field > .wrap { position: relative; z-index: 1; }

/* corner registration ticks, standalone (images, tables, section-defining figures) */
/* .reg-ticks (corner registration marks) retired: drafting-table decoration around a card that
   already has a frame. Kept as a no-op so page sources using the class do not need a sweep. */
.reg-ticks { padding: 0; }

/* star-counter bullets - the mark's own negative star, at list scale */
.star-list > li {
  position: relative;
  padding-left: 26px;
  margin-top: var(--s3);
}
.star-list > li::before {
  content: '';
  position: absolute;
  left: 0;
  top: 0.42em;
  width: 13px;
  height: 13px;
  background: var(--star-steel) center / contain no-repeat;
}
.star-list.is-accent > li::before { background-image: var(--star-accent); }

/* DEMO DATA chip - present on every surface showing fabricated numbers */
.chip {
  display: inline-flex;
  align-items: center;
  gap: 6px;
  height: var(--s5);
  padding: 0 10px;
  border: 1px solid var(--dust);
  border-radius: var(--r-chip);
  font-family: var(--mono);
  font-size: 10px;
  font-weight: 500;
  letter-spacing: 0.08em;
  text-transform: uppercase;
  color: var(--steel);
  /* OPAQUE, never transparent (George, 2026-08-19: "these pills without a bg shouldn't overlap the
     background lines"). A chip is an outlined pill, and the fixed column rules at the container
     edges painted straight through the hollow ones wherever a chip sat near x=240 or x=1200 - a
     hairline bisecting a label reads as a rendering fault. The fill matches the band it sits on, so
     the pill occludes the rule instead of framing it, and the border still does the work it always
     did. Every band that changes the ground re-declares this below; --paper is the default because
     that is what a plain .band sits on. */
  background: var(--paper);
}
/* the chip set inline at the head of a caption line - optical centring on a 13px line, not spacing */
.caption > .chip { margin-right: var(--s1); vertical-align: -0.35em; }
.band-tinted .chip, .band-paper .chip { background: var(--band-tint); }
.band-panel .chip, .card .chip, .panel .chip { background: var(--panel); }
.band-ink .chip { border-color: var(--on-ink-line); color: var(--on-ink-body); background: var(--ink); }
/* Text takes --accent-ink; the border and tint keep --accent, which is what a non-text graphic
   token is for. At 10px on white the light blue was 2.49:1 against AA's 4.5. */
.chip-accent { border-color: var(--accent-tint-border); color: var(--accent-ink-hover); background: var(--accent-soft); }

/* mono editorial furniture */
.sec-label {
  display: flex;
  align-items: baseline;
  gap: var(--s3);
  font-family: var(--mono);
  font-size: 12px;
  font-weight: 500;
  letter-spacing: 0.08em;
  text-transform: uppercase;
  color: var(--steel);
  padding-bottom: var(--s3);
  border-bottom: 1px solid var(--line);
  margin-bottom: var(--s5);
}
/* --accent-ink: this `i` is the section label's numeral/marker at label size, not display type. */
.sec-label i { font-style: normal; color: var(--accent-ink); }
.band-ink .sec-label { border-bottom-color: var(--on-ink-line); color: var(--on-ink-body); }
.band-ink .sec-label i { color: #FFFFFF; }

.steps { counter-reset: step; }
.steps > li { position: relative; padding-left: 52px; }
.steps > li + li { margin-top: var(--s6); }
.steps > li::before {
  counter-increment: step;
  content: '[' counter(step, decimal-leading-zero) ']';
  position: absolute;
  left: 0;
  top: 2px;
  font-family: var(--mono);
  font-size: 13px;
  font-weight: 500;
  /* 13px is label scale, and --accent is non-text below display size (2.35:1). George moved these
     to the readable blue 2026-08-30; the LARGE display numerals elsewhere keep the light accent. */
  color: var(--accent-ink);
}
.band-ink .steps > li::before { color: #FFFFFF; }

.byline { font-family: var(--mono); font-size: 12px; letter-spacing: 0.04em; color: var(--steel); }

/* spec-sheet table - hairline rules, mono labels */
.spec { font-size: 15px; }
.spec th, .spec td { text-align: left; padding: var(--s4) 0; border-bottom: 1px solid var(--line); vertical-align: top; }
.spec th {
  width: 34%;
  font-family: var(--mono);
  font-size: 12px;
  font-weight: 500;
  letter-spacing: 0.06em;
  text-transform: uppercase;
  color: var(--steel);
  padding-right: var(--s5);
}
.spec tr:last-child th, .spec tr:last-child td { border-bottom: 0; }
.band-ink .spec th, .band-ink .spec td { border-bottom-color: var(--on-ink-line); }

/* thin line icons: 1.75px stroke on a 20px grid */
.ic { width: 20px; height: 20px; flex: none; stroke: currentColor; stroke-width: 1.75; fill: none; stroke-linecap: round; stroke-linejoin: round; }
/* Deliberately unused. The home engine strip sets engine NAMES at heading scale rather than
   borrowing their marks - the honest call, and the reason no page reaches for this. */
.logo-grey { filter: grayscale(1); opacity: 0.72; transition: opacity var(--dur-fast) var(--ease), filter var(--dur-fast) var(--ease); }
a:hover .logo-grey, .is-active .logo-grey { filter: none; opacity: 1; }

/* ---------------------------------------------------------------- column rules
 * The vertical hairlines that mark the content column, full page height, running behind
 * everything. This is the Vercel/Profound device George pointed at ("i like the clean/vercel
 * style lines of profound") and it is drawn in his mockup: two rules at the container edges,
 * with the horizontal band separators crossing them.
 *
 * Fixed, not absolute, so it needs no page-height maths and cannot desync from a lazy image
 * resizing the document. z-index 0 puts it under every positioned band, which is what makes it
 * behave correctly for free: a band with a background (--band-tint, --ink, --panel) paints over
 * the rules, a transparent band lets them through. That is exactly the mockup's behaviour and
 * no band has to opt in or out.
 */
body::before {
  content: '';
  position: fixed;
  top: 0;
  bottom: 0;
  left: 50%;
  width: min(100% - (var(--gutter) * 2), var(--container));
  transform: translateX(-50%);
  border-left: 1px solid var(--line);
  border-right: 1px solid var(--line);
  pointer-events: none;
  z-index: 0;
}
.band { position: relative; z-index: 1; }
/* CONTINUITY (George, 2026-08-18: "after a full width section, the lines don't continue... lets
   get some continuity"). A painted band occludes the fixed body::before, so on a page that
   alternates grounds the rules flickered in and out with every band. LIGHT painted bands now draw
   the rules themselves - above their background, below their content - so the lines run
   unbroken down the page. DARK bands (band-ink, band-spot) stay exempt: a full-bleed dark plate
   swallowing the lines is the design, and they resume immediately after it. */
.band-tinted, .band-paper, .band-panel, .band-ink { background-clip: padding-box; }
.band-tinted::before, .band-paper::before, .band-panel::before {
  content: '';
  position: absolute;
  top: 0;
  bottom: 0;
  left: 50%;
  width: min(100% - (var(--gutter) * 2), var(--container));
  transform: translateX(-50%);
  border-left: 1px solid var(--line);
  border-right: 1px solid var(--line);
  pointer-events: none;
  z-index: 0;
}
/* Content must stack above the drawn rules (a positioned pseudo paints over static children). */
.band-tinted > .wrap, .band-paper > .wrap, .band-panel > .wrap { position: relative; z-index: 1; }
/* Horizontal separators, matching the mockup: every band boundary is a hairline. */
.band-ruled + .band-ruled { border-top: 1px solid var(--line); }

@media (max-width: 768px) {
  /* Below the container width the rules sit inside the gutter and read as page furniture rather
     than structure, so they come off. */
  body::before { display: none; }
}

/* ====================================================================== 09 NAV + ANNOUNCE
 * Flat 64px sticky bar. Dropdown elevation is the page dimming under an open sheet, not a
 * shadow on the bar itself. The lockup is ONE item - never a mark in a box beside type.
 */
/* min-height, never a fixed height: the string is ~455px of intrinsic width at 13px, so on a
   phone the anchor's text wraps to two lines. A locked 40px box with overflow:hidden cut the
   second line off on every page. It grows instead, and the trailing clause is dropped at 768. */
.announce {
  /* Above body::before, or the fixed column rules paint OVER the blue bar (George: "the lines
     should end at the menu and not continue in to the blue banner"). The nav is sticky z40 and
     already occludes; this brings the banner in line. */
  position: relative;
  z-index: 2;
  display: flex;
  align-items: center;
  justify-content: center;
  min-height: 40px;
  padding: var(--s2) var(--s4);
  /* --accent-ink, not --accent: white on the light brand blue is 2.49:1, which fails AA and
     even the 3:1 large-text floor. This bar is 13px. */
  background: var(--accent-ink);
  color: #FFFFFF;
  font-size: 13px;
  line-height: 1.35;
  text-align: center;
}
.announce a { color: #FFFFFF; text-decoration: none; display: inline-flex; align-items: center; gap: 8px; }
.announce a:hover { text-decoration: underline; text-underline-offset: 3px; color: #FFFFFF; }

.nav {
  position: sticky;
  top: 0;
  z-index: 40;
  height: var(--nav-h);
  background: var(--paper);
  border-bottom: 1px solid var(--line);
}
.nav-inner { display: flex; align-items: center; gap: var(--s6); height: var(--nav-h); }
.brand { display: inline-flex; align-items: center; color: var(--ink); padding: 4px 0; }
.brand:hover { color: var(--ink); text-decoration: none; }
.brand svg { display: block; width: 140px; height: auto; }
.nav-links { display: flex; align-items: center; gap: var(--s5); margin-left: var(--s2); }
.nav-link, .nav-trigger {
  display: inline-flex;
  align-items: center;
  gap: 6px;
  height: 40px;
  padding: 0 10px;
  border: 0;
  border-radius: var(--r-ctl);
  background: none;
  color: var(--ink);
  font-size: 14px;
  font-weight: 500;
  cursor: pointer;
  transition: background-color var(--dur-fast) var(--ease);
}
.nav-link:hover, .nav-trigger:hover, .nav-trigger[aria-expanded='true'] { background: var(--band-tint); color: var(--ink); text-decoration: none; }
.nav-trigger .caret { width: 12px; height: 12px; stroke: currentColor; stroke-width: 1.75; fill: none; stroke-linecap: round; stroke-linejoin: round; transition: transform var(--dur) var(--ease); }
.nav-trigger[aria-expanded='true'] .caret { transform: rotate(180deg); }
.nav-cta { display: flex; align-items: center; gap: var(--s2); margin-left: auto; }

/* full-width dropdown sheet */
.nav-sheet {
  position: absolute;
  left: 0;
  right: 0;
  top: 100%;
  display: none;
  background: var(--panel);
  border-bottom: 1px solid var(--line);
  box-shadow: var(--shadow-pop);
}
.nav-sheet[data-open='true'] { display: block; }
.nav-sheet .wrap { padding-top: var(--s6); padding-bottom: var(--s6); }
.sheet-grid { display: grid; grid-template-columns: repeat(2, minmax(0, 300px)) minmax(0, 380px); justify-content: space-between; gap: var(--s5) var(--s7); }
.sheet-grid.is-pair { grid-template-columns: repeat(2, minmax(0, 1fr)); max-width: 760px; }
.sheet-item { display: block; padding: var(--s3); border-radius: var(--r-ctl); color: var(--ink); }
.sheet-item:hover { background: var(--band-tint); text-decoration: none; color: var(--ink); }
/* ONLY the two solutions entries are boxed (George, 2026-08-19), each with its icon: a storefront
   for a single business, client tiles for an agency. */
.sheet-item.is-boxed { display: grid; grid-template-columns: 40px 1fr; gap: var(--s4); align-items: center;
  padding: var(--s4); border: 1px solid var(--line); border-radius: var(--r-card); background: var(--panel); }
.sheet-item.is-boxed:hover { background: var(--band-tint); border-color: var(--line-strong); }
.sheet-item.is-boxed .si-ic { display: grid; place-items: center; width: 40px; height: 40px;
  border-radius: var(--r-ctl); background: var(--accent-soft); color: var(--accent-ink-hover); }
.sheet-item.is-boxed .si-ic svg { width: 20px; height: 20px; }
.sheet-item b { display: block; font-size: 15px; font-weight: 500; }
.sheet-item span { display: block; font-size: 13px; color: var(--iron); margin-top: 2px; }
.sheet-feature { background: var(--band-tint); border: 1px solid var(--line); border-radius: var(--r-card); padding: var(--s5); }
.sheet-feature .h4 { font-size: 20px; margin-top: var(--s3); }
.sheet-feature p { margin-top: var(--s2); }
.sheet-feature .btn-text { margin-top: var(--s4); }
.sheet-foot { margin-top: var(--s5); padding-top: var(--s4); border-top: 1px solid var(--line); }
.nav-scrim {
  position: fixed;
  inset: var(--nav-h) 0 0;
  background: rgba(36, 39, 43, 0.28);
  opacity: 0;
  visibility: hidden;
  transition: opacity var(--dur) var(--ease), visibility var(--dur) var(--ease);
  z-index: 30;
}
body.sheet-open .nav-scrim { opacity: 1; visibility: visible; }

/* mobile */
.nav-burger { display: none; align-items: center; justify-content: center; width: 42px; height: 42px; margin-left: auto; border: 1px solid var(--dust); border-radius: var(--r-ctl); background: var(--panel); cursor: pointer; }
.nav-mobile {
  position: fixed;
  inset: 0;
  z-index: 60;
  display: none;
  overflow-y: auto;
  background: var(--paper);
  padding: var(--s5) 0 var(--s8);
}
.nav-mobile[data-open='true'] { display: block; }
body.menu-open { overflow: hidden; }
.nav-mobile-head { display: flex; align-items: center; justify-content: space-between; margin-bottom: var(--s6); }
.nav-mobile-head .brand svg { width: 124px; }
.nav-mobile h2 {
  font-family: var(--mono);
  font-size: 11px;
  font-weight: 500;
  letter-spacing: 0.08em;
  text-transform: uppercase;
  color: var(--steel);
  margin: var(--s6) 0 var(--s3);
}
.nav-mobile a.m-item { display: block; padding: 12px 0; border-bottom: 1px solid var(--line); color: var(--ink); font-size: 17px; font-weight: 500; }
.nav-mobile a.m-item:hover { text-decoration: none; color: var(--accent); }
.nav-mobile .cta-row { margin-top: var(--s7); flex-direction: column; align-items: stretch; }

/* ====================================================================== 10 FOOTER */
.footer { background: var(--ink); color: var(--on-ink-body); padding: var(--s9) 0 var(--s7); }
.footer a { color: var(--on-ink-body); text-decoration: none; }
.footer a:hover { color: #FFFFFF; text-decoration: underline; text-underline-offset: 3px; }
/* Brand column + four link columns. The brand column is wider because it carries a sentence and
   the social row; the four link columns share what is left evenly. */
/* The brand block takes its own row rather than a fifth column. Sharing the 960px measure with
   four link columns left it ~180px wide, which broke the sentence into a four-word ladder and
   hyphenated "cited-source" across lines; the link columns were equally cramped. Full-width brand,
   four even columns beneath, is the same information with room to read. */
.footer-grid { display: grid; grid-template-columns: repeat(4, minmax(0, 1fr)); gap: var(--s8) var(--s6); }
.footer-brand { grid-column: 1 / -1; }
.footer-brand p { max-width: 46ch; }
.footer .brand { color: #FFFFFF; }
.footer .brand svg { width: 176px; }
.footer-brand p { margin-top: var(--s5); max-width: 320px; font-size: 15px; }
.footer-social { display: flex; gap: var(--s3); margin-top: var(--s5); }
/* 40px target with the icon inset — a 24px glyph alone is under the 44px touch guidance and was
   the smallest hit area on the page. */
.footer-social a {
  display: inline-flex;
  align-items: center;
  justify-content: center;
  width: 40px;
  height: 40px;
  border: 1px solid var(--on-ink-line);
  border-radius: var(--r-ctl);
  color: var(--on-ink-body);
  transition: color var(--dur-fast) var(--ease), border-color var(--dur-fast) var(--ease), background var(--dur-fast) var(--ease);
}
.footer-social a:hover { color: #FFFFFF; border-color: rgba(255, 255, 255, 0.34); background: var(--on-ink-fill); text-decoration: none; }
.footer-social svg { width: 18px; height: 18px; fill: currentColor; }
.footer-col h2 {
  font-family: var(--mono);
  font-size: 11px;
  font-weight: 500;
  letter-spacing: 0.08em;
  text-transform: uppercase;
  color: rgba(255, 255, 255, 0.5);
  margin-bottom: var(--s4);
}
.footer-col a { display: block; padding: 5px 0; font-size: 15px; }
.footer-legal {
  display: flex;
  flex-wrap: wrap;
  gap: var(--s3) var(--s6);
  justify-content: space-between;
  /* A rule needs air on BOTH sides or the row reads as stuck to it (George, 2026-08-24: "the text
     sits against the lines"). 24px under a 64px gap above was lopsided — the eye reads the tighter
     side. Even at --s6, and the same value is used under the auth footer's rule so the two match. */
  margin-top: var(--s8);
  padding-top: var(--s6);
  border-top: 1px solid var(--on-ink-line);
  font-size: 13px;
  line-height: 1.6;
  color: rgba(255, 255, 255, 0.5);
}

/* ====================================================================== 11 MOTION
 * Register A (ambient proof) lives in the demo and the dark panels. Register B (quiet response)
 * is everything a visitor triggers. Scroll reveal is an ADDED class: without JS the page is
 * fully visible, because a blank section is worse than an unanimated one.
 */
.reveal { transition: opacity var(--dur-reveal) var(--ease), transform var(--dur-reveal) var(--ease); }
.js .reveal:not(.is-in) { opacity: 0; transform: translateY(8px); }
.js .reveal.is-in { opacity: 1; transform: none; }
/* Automation only - set by marketing/js/base.js when navigator.webdriver is true. Kills the fade
   so axe and the snapshot comparer both read a settled page rather than one mid-arrival. */
.no-motion .reveal { transition: none; }

.acc { border-top: 1px solid var(--line); }
.acc > details { border-bottom: 1px solid var(--line); }
.acc summary {
  display: flex;
  align-items: center;
  justify-content: space-between;
  gap: var(--s4);
  padding: var(--s5) 0;
  font-size: 17px;
  font-weight: 500;
  cursor: pointer;
  list-style: none;
}
.acc summary::-webkit-details-marker { display: none; }
.acc summary .ic { transition: transform var(--dur) var(--ease); color: var(--steel); }
.acc details[open] summary .ic { transform: rotate(180deg); }
.acc details > p { padding-bottom: var(--s5); color: var(--iron); max-width: var(--measure-read); }

html { scroll-behavior: smooth; }

@media (prefers-reduced-motion: reduce) {
  html { scroll-behavior: auto; }
  *, *::before, *::after {
    animation-duration: 0.001ms !important;
    animation-iteration-count: 1 !important;
    transition-duration: 0.001ms !important;
  }
  .js .reveal:not(.is-in) { opacity: 1; transform: none; }
  .inset-cta::before { animation: none; }
}

/* ====================================================================== 12 ACCESSIBILITY */
/* No border-radius here. It used to set 4px, which is off the five-step scale AND - at the same
   specificity but later in the cascade than .btn/.nav-link/.sheet-item/.nav-burger - re-cut every
   control on the site from --r-ctl to 4px the moment it took keyboard focus. Modern engines draw
   the outline following the element's own radius, so the declaration bought nothing. */
/* The ring is the READABLE blue: #55A8FF computes 2.49:1 on paper, under the 3:1 non-text
   minimum, and tokens.json names --accent-ink as the marketing focus colour (audit, 2026-08-30). */
:focus-visible { outline: 2px solid var(--accent-ink); outline-offset: 2px; }
.band-ink :focus-visible, .footer :focus-visible, .announce :focus-visible { outline-color: #FFFFFF; }
.skip-link {
  position: absolute;
  left: -9999px;
  top: 0;
  z-index: 100;
  background: var(--ink);
  color: #FFFFFF;
  padding: var(--s3) var(--s4);
  border-radius: var(--r-ctl);
}
.skip-link:focus { left: var(--s4); top: var(--s4); color: #FFFFFF; }
.vh {
  position: absolute;
  width: 1px;
  height: 1px;
  margin: -1px;
  padding: 0;
  overflow: hidden;
  clip: rect(0 0 0 0);
  clip-path: inset(50%);
  white-space: nowrap;
  border: 0;
}

/* ====================================================================== BREAKPOINTS
 * 1180 / 1024 / 768 / 480. Four, total.
 */
@media (max-width: 1180px) {
  /* No display-size steps here: display-1 is 56 to 40, display-2 stays 44, section titles stay
     on their registered sizes. The old 64px display-1 step was a leftover of the 72px era and
     made the ramp non-monotonic on nine page heroes (audit A5, approved 2026-08-30). */
  .sheet-grid { grid-template-columns: repeat(2, minmax(0, 280px)) minmax(0, 320px); gap: var(--s5); }
}

@media (max-width: 1024px) {
  :root { --gutter: 24px; }
  .display-serif { font-size: 48px; } /* Editorial display's registered medium step */
  .row-split { gap: var(--s7); }
  .grid-4 { grid-template-columns: repeat(2, minmax(0, 1fr)); }
  .nav-links, .nav-cta { display: none; }
  .nav-burger { display: inline-flex; }
  .footer-grid { grid-template-columns: repeat(2, minmax(0, 1fr)); gap: var(--s7) var(--s6); }
}

@media (max-width: 768px) {
  .display-1 { font-size: 40px; letter-spacing: -0.05em; line-height: 1.0; }
  .display-2, .h2-section, .display-serif { font-size: 34px; font-weight: 600; letter-spacing: -0.05em; line-height: 1.05; }
  /* .display-serif keeps weight 600 at every breakpoint - the registered Editorial display role.
     The 400 override that used to sit here was a defect the contract itself named. */
  .h2-compact { font-size: 30px; }
  .h3-block { font-size: 26px; }
  .h4 { font-size: 21px; }
  .stat-num { font-size: 36px; }
  .sub-hero { font-size: 17px; }
  .eyebrow, .sec-label { font-size: 11px; }
  body { font-size: 16px; }
  .body { font-size: 16px; }
  .band { padding: 80px 0; }
  .band-hero { padding: 80px 0 64px; }
  .band-ink { padding: 64px 0; }
  .band-tight { padding: 56px 0; }
  .grid-2, .grid-3, .grid-4, .row-split { grid-template-columns: minmax(0, 1fr); }
  .row-split.is-flipped > :first-child { order: 0; }
  .inset-cta { padding: var(--s7) var(--s5); }
  .footer-grid { grid-template-columns: minmax(0, 1fr); }
  .footer { padding: 64px 0 48px; }
  .proof::before { width: 180px; height: 180px; }
  /* the bar carries the offer, not the qualifier - the qualifier is on the page it links to */
  .announce-tail { display: none; }
  /* the frame must not eat the product it frames once the viewport is this narrow */
  .shot { padding: var(--s4); }
}

@media (max-width: 480px) {
  .cta-row .btn { width: 100%; }
  .card { padding: var(--s4); }
  .shot { padding: var(--s3); }
  .card-lg { padding: var(--s5); }
  .spec th { width: 100%; display: block; border-bottom: 0; padding-bottom: 0; }
  .spec td { display: block; padding-top: 4px; }
}

/* ====================================================== 13 PRODUCT SECTION MODULES
 * The shapes signed off on the 2026-08-17 contact sheet, for showing a REAL dashboard surface
 * beside a claim. Placement follows the recorded evidence in reference/searchable-marketing-
 * teardown.md §6.2: every feature and solutions page carries ONE surface, defaulted to the view
 * that page is about; the compare hub, pricing and about carry none.
 *
 * FOUR LAWS, each learned the hard way on the sheet:
 *  1. minmax(0, 1fr) on any column holding a surface. A bare `fr` floors at min-content, so an
 *     oversized child pushes the COLUMN past the rule and everything downstream is wrong.
 *  2. A surface may only overflow toward the side that FADES. Overflow into an opaque edge is a
 *     sheer cut, which is the one thing a half-visible screen may never be.
 *  3. mask-repeat: no-repeat. The default is repeat, which tiles the gradient and makes the
 *     content reappear at full opacity past the rule.
 *  4. Rounded panels never meet a rule: they clear it, and carry the double edge.
 */
.msec { padding: var(--s9) 0; }
.msec .eyb { font-family: var(--mono); font-size: 11px; letter-spacing: 0.1em; text-transform: uppercase;
  color: var(--accent-ink); display: block; margin-bottom: var(--s4); }
.msec h2 { font-size: 25px; font-weight: 500; letter-spacing: -0.03em; line-height: 1.2; margin: 0 0 var(--s4); }
.msec p { color: var(--iron); font-size: 15px; line-height: 1.55; margin: 0 0 var(--s5); max-width: 42ch; }

/* BREAKOUT (George, 2026-08-18): "i dont mind the boxes being outside the lines, but not the
   title and sub." Copy lives in .wrap (960, inside the rules); a TABLE or panel that wants the old
   wrap-mid width carries .breakout and crosses each rule by ~70px - decisively, so the rule runs
   BEHIND an opaque box rather than grazing a corner. Words never carry this class.

   THE NEGATIVE MARGIN IS GONE, because that rule never delivered either half of its own promise
   and both failures were measured on the running site (2026-08-26):

   1. It was ONE-SIDED on every consumer. All twelve are <table>, which is shrink-to-fit, so
      `margin-inline: -70px` moved the left edge and never stretched the right: every breakout
      table rendered 202->1098 instead of the intended 202->1238. Not a wrap-mid breakout at all -
      an 896px table shoved 70px off the content axis.
   2. There was no opaque box. Table AND first-cell background computed rgba(0,0,0,0) on all
      twelve, so the column rule at x=240 ran straight THROUGH the first column's words -
      "Claude" on /pricing, "Built around" on four comparison pages, "25 August 2026" on
      /methodology. marketing/css/pages/features.css:86 records George hitting exactly this in
      August ("the hairline ran straight through the first letters of 'Prompt volume'...") and
      fixing it on that ONE page with an opaque panel; the other nine were never done.

   An opaque ground cannot be added here as one rule: /features/share-of-voice's breakout sits on
   the Ink band (rgb(36,39,43)) while the other eleven sit on Paper, so a single background would
   be wrong on one of them. Holding the table on the content axis instead costs nothing - the
   rendered width does not change (896 stays 896), it just stops being 70px off-axis - and it
   satisfies the spine law directly: 32px of gutter between the words and the rule, which is what
   "no text ever sits flush against a rule" asks for.

   Kept as a class rather than stripped from twelve page sources so the CSS stays the one owner of
   where a breakout sits. If a future consumer really is an opaque box, give it a ground and its
   own symmetric width here - do not reinstate a bare negative margin. */
.wrap .breakout { margin-inline: 0; }

/* --- shape A: quiet copy column, surface dissolving into the rule ------------------------- */
.msec-split .wrap { padding: 0; }
.msec-split .msec-in { display: grid; grid-template-columns: 360px minmax(0, 1fr); min-height: 520px; align-items: center; }
.msec-split .msec-copy { padding: 0 var(--s6) 0 var(--s6); border-right: 1px dashed var(--dust); }
/* overflow: hidden is LOAD-BEARING, not tidiness. `.msec-split .surface` is deliberately 780px in a
   ~600px track so the product runs off toward the rule and dissolves - but a mask only changes what
   is PAINTED, never what is laid out, so the invisible 180px still counted toward the document
   width. Measured 2026-08-26: /features/ai-visibility, /features/content, /solutions/agencies and
   the Searchable + Profound comparisons all scrolled sideways at 1180 (doc 1282px) and 1024 (doc
   1204px) - five pages, ten FAILs in scripts/ui-audit.mjs, none of them visible at 1440 because a
   1440 viewport happens to be wide enough to swallow the overhang.

   Shape B below already had it: `.msec-frame .frame { overflow: hidden }`, which is why the framed
   variant never appeared in the audit. This is the same technique DESIGN_DIRECTION.md prescribes -
   "overflow: hidden on a box whose edge IS the rule, and the child wider than that box. Clipping at
   the viewport instead paints over the line, which is the failure."

   No visual change: mask-size is 100% 100% with no repeat, so everything past the stage's own box
   was already fully transparent. This clips a region nobody could see. */
.msec-split .msec-stage { position: relative; padding: var(--s6) 0 var(--s6) var(--s6);
  overflow: hidden;
  -webkit-mask-repeat: no-repeat; -webkit-mask-size: 100% 100%;
  -webkit-mask-image: linear-gradient(to right, #000 68%, transparent 100%);
  mask-repeat: no-repeat; mask-size: 100% 100%;
  mask-image: linear-gradient(to right, #000 68%, transparent 100%); }
.msec-split .surface { width: 780px; max-width: none; }

/* mirrored: the surface leads. Columns AND the fade both flip, and the surface anchors right so
   its overflow still runs into the gradient rather than into the opaque edge. */
.msec-split.is-mirrored .msec-in { grid-template-columns: minmax(0, 1fr) 360px; }
.msec-split.is-mirrored .msec-copy { border-right: 0; border-left: 1px dashed var(--dust); }
.msec-split.is-mirrored .msec-stage { display: flex; justify-content: flex-end;
  padding: var(--s6) var(--s6) var(--s6) 0;
  overflow: hidden;   /* same reason as the unmirrored stage above - the fade is paint, not layout */
  -webkit-mask-image: linear-gradient(to left, #000 68%, transparent 100%);
  mask-image: linear-gradient(to left, #000 68%, transparent 100%); }

/* --- shape B: framed module, surface cropped by the frame --------------------------------- */
.msec-frame .wrap { padding: 0 40px; }   /* 40, not 32: the frame is rounded AND double-edged */
.msec-frame .frame { border: 1px solid var(--line); border-radius: var(--r-frame); background: var(--panel);
  outline: 1px solid var(--line); outline-offset: 7px;
  display: grid; grid-template-columns: 1.05fr minmax(0, 1fr); min-height: 420px; overflow: hidden; }
.msec-frame .msec-copy { padding: var(--s6); display: flex; flex-direction: column; justify-content: center; }
.msec-frame .msec-stage { background: var(--band-tint); padding: var(--s5) 0 0 var(--s5);
  -webkit-mask-repeat: no-repeat; -webkit-mask-size: 100% 100%;
  -webkit-mask-image: linear-gradient(to right, #000 62%, transparent 100%);
  mask-repeat: no-repeat; mask-size: 100% 100%;
  mask-image: linear-gradient(to right, #000 62%, transparent 100%); }
.msec-frame .surface { width: 820px; max-width: none; }

/* 1024, not 1023. This was the only query in the marketing bundle off the registered breakpoint set
   (1180 / 1024 / 768 / 480 - DESIGN_SYSTEM.md 10.1, and docs/UI_MIGRATION_PLAN.md Wave 2 lists the
   correction). One pixel mattered here: at exactly 1024 the split stayed two-column, so a 780px
   surface sat in a ~600px track and the page overflowed by 180px - the worst of the five sideways
   scrolls, and the reason 1024 read worse than 1180 in the audit. */
@media (max-width: 1024px) {
  .msec-split .msec-in, .msec-split.is-mirrored .msec-in, .msec-frame .frame { grid-template-columns: 1fr; }
  .msec-split .msec-copy { border-right: 0; border-bottom: 1px dashed var(--dust); padding: 0 var(--s5) var(--s5); }
  .msec-split.is-mirrored .msec-copy { border-left: 0; }
  .msec-split .msec-stage, .msec-split.is-mirrored .msec-stage { padding: var(--s5) 0; display: block; }
  .msec .surface { width: 100%; }
}

/* ---------------- dark-band spotlight (George, 2026-08-18: every dark full-width section) -----
   The homepage's .band-spot treatment, promoted to the system. Two dot-matrix layers over the
   dark ground: .spot-base is always there; .spot-lit is the same matrix brighter, masked to a
   circle that follows the pointer (base.js writes --sx/--sy). On touch devices there is no
   pointer, so the lit layer breathes on a slow loop instead - visible without hover, sitting at
   z-index 0 UNDER the copy so it never encumbers it. */
.band-ink { position: relative; overflow: hidden; }
.band-ink .spot-base, .band-ink .spot-lit {
  content: ''; position: absolute; inset: 0; z-index: 0; pointer-events: none;
  background-image: radial-gradient(rgba(255,255,255,0.16) 1px, transparent 1px);
  background-size: 22px 22px;
}
.band-ink .spot-base { opacity: .35; }
.band-ink .spot-lit {
  opacity: 0;
  background-image: radial-gradient(rgba(255,255,255,0.55) 1px, transparent 1px);
  -webkit-mask-image: radial-gradient(220px circle at var(--sx, 50%) var(--sy, 40%), #000 0%, transparent 70%);
  mask-image: radial-gradient(220px circle at var(--sx, 50%) var(--sy, 40%), #000 0%, transparent 70%);
  transition: opacity 260ms var(--ease);
}
.band-ink.is-lit .spot-lit { opacity: 1; }
.band-ink > .wrap { position: relative; z-index: 1; }
@media (hover: none) {
  .band-ink .spot-lit { opacity: .8; animation: spot-drift 14s ease-in-out infinite alternate; }
  @keyframes spot-drift {
    from { -webkit-mask-position: 20% 30%; mask-position: 20% 30%; }
    to { -webkit-mask-position: 80% 70%; mask-position: 80% 70%; }
  }
}
@media (prefers-reduced-motion: reduce) { .band-ink .spot-lit { animation: none; } }

/* ================================================== 14 PLAN CARDS (the pricing grid)
 * Redesigned to the structure George picked from the docx (image18: header zone, dashed divider,
 * tick list, full-width button) in OUR palette. The DOM comes from renderPricingGrid() and its
 * baked fallbacks - .pcard > .ptag? .pn .pp .pb ul li* .btn - and is NOT restyled per page:
 * page css keeps only the grid. The popular card is the one INK card in the row. */
.pricing { display: grid; grid-template-columns: repeat(3, 1fr); gap: var(--s5); align-items: stretch; }
.pcard { position: relative; display: flex; flex-direction: column; background: var(--panel);
  border: 1px solid var(--line); border-radius: var(--r-frame); padding: var(--s6); }
.pcard .pn { font-family: var(--mono); font-size: 11px; letter-spacing: 0.1em; text-transform: uppercase; color: var(--steel); }
.pcard .pp { margin-top: var(--s3); font-size: 42px; font-weight: 600; letter-spacing: -0.04em; line-height: 1; }
.pcard .pp small { font-size: 15px; font-weight: 400; letter-spacing: 0; color: var(--steel); }
.pcard .pb { margin-top: var(--s3); font-size: 15px; line-height: 1.55; color: var(--iron); }
.pcard ul { list-style: none; margin: var(--s5) 0 var(--s6); padding: var(--s5) 0 0; border-top: 1px dashed var(--dust); display: grid; gap: var(--s3); }
.pcard li { position: relative; padding-left: 28px; font-size: 15px; line-height: 1.5; }
.pcard li::before { content: ''; position: absolute; left: 0; top: 0.18em; width: 17px; height: 17px;
  border-radius: 50%; background: var(--ink); }
.pcard li::after { content: ''; position: absolute; left: 5px; top: calc(0.18em + 5px); width: 7px; height: 4px;
  border: solid #fff; border-width: 0 0 1.8px 1.8px; transform: rotate(-45deg); }
.pcard .btn { width: 100%; margin-top: auto; justify-content: center;
  background: var(--panel); border-color: var(--line-strong); color: var(--ink); }
.pcard .btn:hover { background: var(--band-tint); color: var(--ink); }
.pcard .btn.primary { background: var(--ink); border-color: var(--ink); color: #fff; }
.pcard .btn.primary:hover { background: var(--carbon); border-color: var(--carbon); color: #fff; }
/* the one ink card */
.pcard.pop { background: var(--ink); border-color: var(--ink); color: #fff; }
.pcard.pop .pn { color: rgba(255,255,255,0.6); }
.pcard.pop .pp { color: #fff; }
.pcard.pop .pp small, .pcard.pop .pb, .pcard.pop li { color: var(--on-ink-body); }
.pcard.pop li { color: rgba(255,255,255,0.78); }
.pcard.pop ul { border-top-color: rgba(255,255,255,0.28); }
.pcard.pop li::before { background: #fff; }
.pcard.pop li::after { border-color: var(--ink); }
.pcard.pop .btn.primary, .pcard.pop .btn { background: #fff; border-color: #fff; color: var(--ink); }
.pcard.pop .btn.primary:hover, .pcard.pop .btn:hover { background: var(--paper); border-color: var(--paper); color: var(--ink); }
.pcard .ptag { position: absolute; top: var(--s5); right: var(--s5); display: inline-flex; align-items: center;
  height: 22px; padding: 0 10px; border-radius: var(--r-chip); font-family: var(--mono); font-size: 10px;
  font-weight: 500; letter-spacing: 0.08em; text-transform: uppercase;
  background: rgba(255,255,255,0.14); color: #fff; border: 1px solid rgba(255,255,255,0.3); }
/* THE THREE FEATURE LISTS START ON ONE LINE. The cards already share a top, a height, a price
   baseline and a CTA baseline - but the blurb between them is copy, and copy is not the same length
   three times: Solo and Pro run to four lines, Agency to two, so Agency's dashed divider and its
   whole checklist sat 47px above the other two (measured on /pricing and / at 1440, 2026-08-26).
   Three lists that do not start on the same line are three lists a buyer cannot scan across, which
   is the entire job of a plan row (DESIGN_SYSTEM.md LAY-02: siblings share the declared axis).
   Reserved in em rather than px so it tracks the type scale, and only while the cards are actually
   side by side - stacked on one column there is nothing to align to and the space would be dead. */
@media (min-width: 1025px) { .pcard .pb { min-height: calc(1.55em * 4); } }
@media (max-width: 1024px) { .pricing { grid-template-columns: 1fr; } }

/* Linked cards (the four-ways grid). Without these the base anchor rules win and the whole card
   renders as one blue underlined link - which is exactly how it shipped for a day, because the
   first attempt to append this block was chained after `grep | head` (exit 0) and never ran. */
a.card-link, a.card-link:hover { color: inherit; text-decoration: none; }
a.card-link h3, a.card-link p, a.card-link .eyebrow { color: inherit; text-decoration: none; }
a.card-link:hover { background: var(--band-tint); }

/* Comparison sources + disclosure (audit 2026-08-25, Phase 9).
   A vendor-published comparison is only as trustworthy as its working, so the block is deliberately
   plain and legible rather than styled to be skipped.

   EVERY var() HERE USED TO BE UNDEFINED. This block landed on 2026-08-25 - two days after the UI
   Constitution was adopted - written against a token vocabulary this stylesheet has never had:
   --space-7/5/4, --rule, --surface-2, --surface and --ink-3. Six names, none of them declared in
   base.css, so all six fell through to their hardcoded fallbacks and painted the newest block on
   the site from a DIFFERENT palette: #f7f9fc where Paper is #F8F8F8, #d6dce6 where Line is #E6E8E6,
   and an 18px inset that is not on the spacing scale at all. test/css-tokens.test.js passed the
   whole time, because a var() WITH a fallback always resolves. Real names below; the values move by
   a few units where the old fallback was off-scale, which is the point of having a scale. */
.sources { margin: var(--s7) 0 0; padding: var(--s5); border: 1px solid var(--line); border-radius: var(--r-card); background: var(--band-tint); max-width: var(--measure-read); }
.sources h2 { font-size: 17px; margin: 0 0 10px; }
.src-disclosure { font-size: 14px; line-height: 1.6; margin: 0 0 10px; }
.src-caveat { font-size: 14px; line-height: 1.6; margin: 0 0 10px; padding: 10px 12px; border-left: 3px solid var(--accent); background: var(--panel); border-radius: var(--r-ctl); }
.src-list { margin: 0 0 10px; padding-left: 1.1em; font-size: 14px; line-height: 1.7; }
.src-list li { margin: 0 0 6px; }
.src-note { display: block; color: var(--muted); font-size: 13px; }
.sources .unverified { color: var(--muted); font-style: italic; }
.src-meta { font-size: 13px; color: var(--muted); margin: 0; }
@media (max-width: 480px) { .sources { padding: var(--s4); } }

/* css/theme-dark.css */
/* marketing/css/theme-dark.css - the DARK marketing theme (George, 2026-09-06: "the rest of the
 * marketing pages should also be dark theme", docs/DESIGN_SYSTEM.md 1.2 A4). Loaded by
 * scripts/build-marketing.mjs after base.css and before marketing/css/pages/*.css, so a page sheet can
 * override it at equal specificity. Keyed on body.theme-dark, which the build adds to every page whose
 * bodyClass ends in -dark; light pages never match a rule in here.
 *
 * Contents: the token mirror (profiles.marketing.dark in ui-contract/tokens.json, checked by
 * test/dark-tokens-gate.test.js), the type roles, the buttons, the free-report button, the field,
 * the engine marks, the shared chrome (announce, nav, sheets, mobile menu, footer, CTA band) and the
 * Product sheet's dark composition with its two mini modules (docs/UI_PATTERN_CATALOG.md 2.16,
 * mega-menu). Values are the recipes'; no hue enters that is not a token or an alpha of one. */
/* ====================================================================== A0 ground and tokens */
/* The column IS the rules: base.css draws body::before at --container and .wrap follows it, and
   scripts/ui-audit.mjs reads the width off the ROOT to place the rules it checks text against - so
   the dark page's 1120 is declared on the root when the dark body is present, one value for all three. */
:root:has(.theme-dark) { --container: 1120px; --container-mid: 1320px; }
.theme-dark, .nav-new {
  --dk-ground: #0A0B0D;
  --dk-panel: #111317;
  --dk-glass: rgba(18, 20, 24, 0.42);
  --dk-text: #F2F3F4;
  --dk-grey: #A3A8AE;
  --dk-muted: #7B8189;
  --dk-blue: #55A8FF;
  --dk-good: #46B97F;
  --dk-good-text: #7FCBB0;
  --dk-warn: #E0B040;
  --dk-line: rgba(255, 255, 255, 0.10);
  --dk-line-soft: rgba(255, 255, 255, 0.06);
  --dk-line-strong: rgba(255, 255, 255, 0.18);
  --dk-ease: cubic-bezier(0.2, 0.7, 0.2, 1);
  --dk-shadow: 0 40px 100px -40px rgba(0, 0, 0, 0.9);
  --dk-sheet-glass: rgba(12, 13, 16, 0.86);
  --dk-sky-top: #5A5F65;
  --dk-sky-mid: #3A3E43;
  --dk-sky-low: #1C1F23;
  --dk-danger: #F0A9A8;
}
.theme-dark { background: var(--dk-ground); color: var(--dk-text); font-size: 15px; line-height: 1.6; overflow-x: hidden; }
.theme-dark::before { border-left-color: var(--dk-line-soft); border-right-color: var(--dk-line-soft); }
.theme-dark h1, .theme-dark h2, .theme-dark h3 { color: var(--dk-text); text-wrap: balance; }
.theme-dark a { color: inherit; }
.theme-dark a:hover { color: inherit; }
.theme-dark :focus-visible { outline: 2px solid var(--dk-blue); outline-offset: 3px; }
.theme-dark .skip-link { background: var(--dk-text); color: var(--dk-ground); border-radius: 0; }

/* type roles (tokens.json dark.type) */
.dh-h1 { font-size: 46px; font-weight: 500; letter-spacing: -0.03em; line-height: 1.12; color: #FFFFFF; margin: 0; }
.dh-t1 { font-size: 38px; font-weight: 500; letter-spacing: -0.03em; line-height: 1.12; margin: 0; }
.dh-t2 { font-size: 17px; font-weight: 500; letter-spacing: -0.01em; line-height: 1.35; margin: 0; }
.dh-lead { font-size: 16px; line-height: 1.6; color: var(--dk-grey); margin: 0; }
.dh-body { font-size: 14.5px; line-height: 1.6; color: var(--dk-grey); margin: 0; }
.dh-label { display: block; font-size: 13px; font-weight: 500; line-height: 1.3; color: var(--dk-muted); margin: 0; }
.dh-label.on { color: var(--dk-text); }
.dh-centre { text-align: center; }
.dh-max24 { max-width: 24ch; margin-left: auto; margin-right: auto; }
.dh-max22 { max-width: 22ch; margin-left: auto; margin-right: auto; }
.dh-lead-mid { max-width: 60ch; margin: 16px auto 0; }
.dh-cmd { font: 500 0.9em/1 var(--sans); color: var(--dk-text); background: rgba(255, 255, 255, 0.06); border: 1px solid var(--dk-line-soft); padding: 2px 7px; white-space: nowrap; }

/* buttons: square (A3), 40 tall, the ghost and the white */
.dh-btn { position: relative; display: inline-flex; align-items: center; justify-content: center; gap: 8px; height: 40px; padding: 0 18px; border: 1px solid transparent; border-radius: 2px; font: 500 14px/1 var(--sans); white-space: nowrap; cursor: pointer; overflow: hidden; text-decoration: none; transition: transform 350ms var(--dk-ease), box-shadow 350ms, background-color 300ms, border-color 300ms; }
.dh-btn:hover { transform: translateY(-1px); text-decoration: none; }
.dh-btn:active { transform: translateY(0) scale(0.985); transition-duration: 120ms; }
.dh-btn::after { content: ''; position: absolute; top: 0; bottom: 0; left: -40%; width: 35%; background: linear-gradient(100deg, transparent, rgba(255, 255, 255, 0.55), transparent); transform: skewX(-18deg) translateX(-140%); transition: transform 700ms var(--dk-ease); pointer-events: none; }
.dh-btn:hover::after { transform: skewX(-18deg) translateX(420%); }
.dh-btn .arrow { transition: transform 300ms var(--dk-ease); }
.dh-btn:hover .arrow { transform: translateX(3px); }
.dh-btn-white, .theme-dark .btn-white { background: #FFFFFF; border-color: #FFFFFF; color: var(--dk-ground); }
.dh-btn-white:hover, .theme-dark .btn-white:hover { box-shadow: 0 12px 30px -12px rgba(255, 255, 255, 0.45); color: var(--dk-ground); }
.dh-btn-ghost, .theme-dark .btn-ghost { background: rgba(255, 255, 255, 0.04); border-color: var(--dk-line-strong); color: var(--dk-text); backdrop-filter: blur(8px); }
.dh-btn-ghost:hover, .theme-dark .btn-ghost:hover { background: rgba(255, 255, 255, 0.09); border-color: rgba(255, 255, 255, 0.38); color: var(--dk-text); }
.dh-btn-ghost::after { background: linear-gradient(100deg, transparent, rgba(255, 255, 255, 0.18), transparent); }

/* the free-report button: a 1px ring carrying a white highlight round the edge; blue glow on hover */
@property --dh-hbg-a { syntax: '<angle>'; inherits: false; initial-value: 0deg; }
.dh-hbg { padding: 0; border: 0; background: transparent; overflow: visible; isolation: isolate; color: #FFFFFF; }
.dh-hbg::after { display: none; }
.dh-hbg-ring { position: absolute; inset: 0; border-radius: inherit; background: conic-gradient(from var(--dh-hbg-a, 0deg), rgba(255, 255, 255, 0) 0deg, rgba(255, 255, 255, 0) 290deg, rgba(255, 255, 255, 0.95) 338deg, rgba(255, 255, 255, 0) 360deg); animation: dh-hbg-spin 2.6s linear infinite; transition: opacity 500ms; }
@keyframes dh-hbg-spin { to { --dh-hbg-a: 360deg; } }
.dh-hbg-glow { position: absolute; inset: 0; border-radius: inherit; background: radial-gradient(75% 181% at 50% 50%, #55A8FF 0%, rgba(255, 255, 255, 0) 100%); opacity: 0; transition: opacity 500ms; }
.dh-hbg-fill { position: absolute; inset: 1px; border-radius: inherit; background: var(--dk-ground); transition: background-color 500ms; }
.dh-hbg-content { position: relative; z-index: 1; display: inline-flex; align-items: center; gap: 8px; padding: 0 18px; height: 38px; }
.dh-hbg:hover .dh-hbg-glow { opacity: 1; }
.dh-hbg:hover .dh-hbg-ring { opacity: 0; }
.dh-hbg:hover .dh-hbg-fill { background: var(--dk-panel); }
.dh-hbg:hover { box-shadow: 0 10px 30px -12px rgba(85, 168, 255, 0.45); }

/* the field (hero, report, CTA) */
.dh-field { width: 100%; max-width: 560px; display: flex; align-items: center; gap: 8px; padding: 6px 6px 6px 16px; margin: 10px 0 0; background: rgba(255, 255, 255, 0.06); border: 1px solid rgba(255, 255, 255, 0.22); border-radius: 2px; backdrop-filter: blur(12px); transition: border-color 300ms, background-color 300ms; }
.dh-field:focus-within { border-color: rgba(255, 255, 255, 0.55); background: rgba(255, 255, 255, 0.09); }
.dh-input { flex: 1; min-width: 0; border: 0; background: transparent; font: 400 16px var(--sans); color: #FFFFFF; padding: 8px 0; outline: none; }
.dh-input::placeholder { color: rgba(255, 255, 255, 0.5); }
.dh-field .dh-btn { height: 40px; }
.dh-proof { font-size: 14px; color: rgba(255, 255, 255, 0.7); margin: 0; }
.dh-proof b, .theme-dark .hero-stat b { color: #FFFFFF; font-weight: 500; }
.dh-proof a { color: #FFFFFF; text-decoration: underline; text-underline-offset: 3px; }
.dh-proof-tight { margin-top: 14px; }
.dh-proof .sep { margin: 0 10px; color: rgba(255, 255, 255, 0.3); }
/* the proof line's fallback shows only when the counted sentence is gone (dropped by the server, or hidden by home-dark.js) */
.hero-stat:not([hidden]) + .dh-proof-fallback { display: none; }
/* a ghost button inside a <p> is a button, not prose (base.css underlines p a) */
body.theme-dark p a.dh-btn, body.theme-dark p a.dh-btn:hover { text-decoration: none; }
/* a centred section title carries the mockup's 40px before its module */
.dh-sec-body > .dh-t1.dh-max24 { margin-bottom: 40px; }
.theme-dark .hero-stat { font-size: 14px; color: rgba(255, 255, 255, 0.7); margin: 0; }

/* engine marks: 16px, the OpenAI mark inverted onto the dark ground */
.theme-dark .mk { display: inline-flex; align-items: center; gap: 6px; font-style: normal; white-space: nowrap; vertical-align: -4px; color: var(--dk-text); }
.theme-dark .mk + .mk { margin-left: 4px; }
.theme-dark .mk-lg { width: 16px; height: 16px; flex: none; display: block; color: var(--dk-text); }
.theme-dark .mk-lg:has(use[href="#lg-openai"]), .theme-dark .ew-lg:has(use[href="#lg-openai"]), .theme-dark .dh-cv-lg:has(use[href="#lg-openai"]), .theme-dark .dh-ve-lg:has(use[href="#lg-openai"]), .theme-dark .dh-pf-eng svg:has(use[href="#lg-openai"]), .theme-dark .dh-ev-eng svg:has(use[href="#lg-openai"]), .theme-dark .dh-pq-pill svg:has(use[href="#lg-openai"]) { filter: brightness(0) invert(1); }
.theme-dark .dh-pq-pill svg:has(use[href="#lg-openai"]) { filter: none; }
.theme-dark .mk-li { display: flex; flex-wrap: wrap; gap: 6px 14px; }

/* ====================================================================== B1 shared chrome, dark
   THE MOCKUP'S NAV, rule for rule (public/_preview/smoke-mockup.html lines 69-176); the markup is
   marketing/partials/nav-dark.html. The bar stays sticky (the mockup's is fixed; the hero pulls up under it
   either way), the links underline on hover, the triggers carry no box, the sheets are glass. */
.nav-new .nav { position: sticky; top: 0; z-index: 40; height: auto; background: transparent; border-bottom: 1px solid transparent; transition: background-color 300ms, border-color 300ms, backdrop-filter 300ms; }
.nav-new .nav.is-scrolled { background: rgba(10, 11, 13, 0.72); -webkit-backdrop-filter: blur(18px) saturate(1.2); backdrop-filter: blur(18px) saturate(1.2); border-bottom-color: var(--dk-line-soft); }
.nav-new .col { position: relative; width: 100%; max-width: var(--container); margin: 0 auto; }
.nav-new .nav-in { display: grid; grid-template-columns: 1fr auto 1fr; align-items: center; height: 64px; padding: 0 var(--gutter); }
.nav-new .nav .brand, .nav-new .nav .brand:hover { display: inline-flex; align-items: center; color: #FFFFFF; padding: 0; }
.nav-new .nav .brand svg { width: 116px; height: auto; }
.nav-new .nav-links { display: flex; align-items: center; justify-content: center; gap: 28px; margin: 0; }
.nav-new .nav-links > a, .nav-new .nav-links .nav-trigger { all: unset; box-sizing: border-box; position: relative; display: inline-flex; align-items: center; gap: 5px; font: 500 13.5px/1 var(--sans); color: rgba(255, 255, 255, 0.85); padding: 6px 0; cursor: pointer; white-space: nowrap; transition: color 300ms; }
.nav-new .nav-links > a::after, .nav-new .nav-links .nav-trigger::after { content: ''; position: absolute; left: 0; right: 0; bottom: 0; height: 1px; background: #FFFFFF; transform: scaleX(0); transform-origin: left; transition: transform 350ms var(--dk-ease); }
.nav-new .nav-links > a:hover, .nav-new .nav-links .nav-trigger:hover, .nav-new .nav-links .nav-trigger[aria-expanded="true"] { color: #FFFFFF; }
.nav-new .nav-links > a:hover::after, .nav-new .nav-links .nav-trigger[aria-expanded="true"]::after { transform: scaleX(1); }
.nav-new .nav-trigger .caret { width: 11px; height: 11px; fill: none; stroke: currentColor; stroke-width: 1.75; stroke-linecap: round; stroke-linejoin: round; opacity: 0.7; transition: transform 300ms var(--dk-ease); }
.nav-new .nav-trigger[aria-expanded="true"] .caret { transform: rotate(180deg); opacity: 1; }
.nav-new .nav-links > a:focus-visible, .nav-new .nav-trigger:focus-visible { outline: 2px solid var(--dk-blue); outline-offset: 4px; }
.nav-new .nav-cta { display: flex; gap: 10px; justify-content: end; align-items: center; }
.nav-new .nav-cta .btn { height: 36px; padding: 0 18px; font-size: 13px; font-weight: 500; border-radius: 2px; border: 1px solid transparent; }
.nav-new .btn-ghost, .nav-new .btn-ghost:hover { color: var(--dk-text); }
.nav-new .btn-ghost { background: rgba(255, 255, 255, 0.04); border-color: var(--dk-line-strong); backdrop-filter: blur(8px); }
.nav-new .btn-ghost:hover { background: rgba(255, 255, 255, 0.09); border-color: rgba(255, 255, 255, 0.38); }
.nav-new .btn-white, .nav-new .btn-white:hover { background: #FFFFFF; border-color: #FFFFFF; color: var(--dk-ground); }
.nav-new .btn-white:hover { box-shadow: 0 12px 30px -12px rgba(255, 255, 255, 0.45); }
.nav-new .nav-burger { background: rgba(255, 255, 255, 0.04); border-color: var(--dk-line-strong); color: var(--dk-text); border-radius: 2px; justify-self: end; }
/* the sheets: the mockup's .mm - glass under the bar, hairlines, the page dims behind a scrim */
.nav-new .mm { position: absolute; left: 0; right: 0; top: 64px; z-index: 6; background: var(--dk-sheet-glass); -webkit-backdrop-filter: blur(24px) saturate(1.2); backdrop-filter: blur(24px) saturate(1.2); border-top: 1px solid var(--dk-line-soft); border-bottom: 1px solid var(--dk-line); box-shadow: 0 40px 80px -30px rgba(0, 0, 0, 0.9); opacity: 0; visibility: hidden; transform: translateY(-6px); transition: opacity 220ms ease, transform 300ms var(--dk-ease), visibility 0s linear 220ms; pointer-events: none; }
.nav-new.sheet-open .nav, .nav-new.sheet-open .nav.is-scrolled { -webkit-backdrop-filter: none; backdrop-filter: none; }
.nav-new .mm[data-open="true"] { opacity: 1; visibility: visible; transform: none; transition: opacity 220ms ease, transform 300ms var(--dk-ease), visibility 0s; pointer-events: auto; }
.nav-new .mm-scrim { position: fixed; inset: 64px 0 0; z-index: 30; background: rgba(0, 0, 0, 0.45); opacity: 0; visibility: hidden; transition: opacity 250ms, visibility 0s linear 250ms; pointer-events: none; }
.nav-new.sheet-open .mm-scrim { opacity: 1; visibility: visible; transition: opacity 250ms, visibility 0s; pointer-events: auto; }
/* the drawer (below 1024px): the light site's, skinned */
.theme-dark .nav-mobile { background: var(--dk-ground); color: var(--dk-text); }
.theme-dark .nav-mobile a.m-item { color: var(--dk-text); border-bottom-color: var(--dk-line-soft); }
.theme-dark .nav-mobile h2 { color: var(--dk-muted); }
.theme-dark .nav-mobile .brand { color: #FFFFFF; }
/* the footer: the mockup's compact footer (marketing/partials/footer-dark.html) */
.nav-new footer.foot-dark { position: relative; z-index: 1; border-top: 1px solid var(--dk-line); padding: 48px var(--gutter) 40px; background: var(--dk-ground); color: var(--dk-grey); }
.nav-new .foot { display: grid; grid-template-columns: 1.6fr repeat(4, 1fr); gap: 32px; }
.nav-new .foot ul { list-style: none; margin: 0; padding: 0; display: grid; gap: 8px; font-size: 13.5px; color: var(--dk-grey); }
body.nav-new .foot li a { color: var(--dk-grey); text-decoration: none; }
body.nav-new .foot li a:hover { color: var(--dk-text); text-decoration: none; }
.nav-new .foot .label { display: block; font: 500 13px/1.3 var(--sans); color: var(--dk-muted); margin: 0 0 12px; }
.nav-new .foot .brand { display: inline-flex; color: #FFFFFF; padding: 0; }
.nav-new .foot .brand svg { width: 100px; height: auto; }
.nav-new .foot-addr { margin: 14px 0 0; max-width: 30ch; font: 400 13px/1.6 var(--sans); color: var(--dk-muted); }
/* the CTA band: square, on a radial ground, the field's own buttons */
.theme-dark .band-tight { padding: 0; }
.theme-dark .inset-cta { background: radial-gradient(60% 60% at 50% 100%, var(--dk-sky-low) 0%, var(--dk-ground) 70%); border-radius: 0; padding: 120px 32px; color: var(--dk-text); }
.theme-dark .inset-cta::before { display: none; }
.theme-dark .inset-cta .h2-section { font-size: 46px; font-weight: 500; letter-spacing: -0.03em; line-height: 1.12; color: #FFFFFF; }
.theme-dark .inset-cta .sub-hero { color: var(--dk-grey); font-size: 16px; max-width: 46ch; }
.theme-dark .inset-cta .h2-section, .theme-dark .inset-cta .sub-hero { text-align: center; margin-left: auto; margin-right: auto; }
.theme-dark .inset-cta .btn { height: 40px; border-radius: 2px; font-size: 14px; }
.theme-dark .inset-cta .btn-on-ink { background: #FFFFFF; border-color: #FFFFFF; color: var(--dk-ground); }
.theme-dark .inset-cta .btn-on-ink:hover { background: #FFFFFF; color: var(--dk-ground); box-shadow: 0 12px 30px -12px rgba(255, 255, 255, 0.45); }
.theme-dark .inset-cta .btn-on-ink-ghost { background: rgba(255, 255, 255, 0.04); border-color: var(--dk-line-strong); color: var(--dk-text); }
.theme-dark .inset-cta .btn-on-ink-ghost:hover { background: rgba(255, 255, 255, 0.09); border-color: rgba(255, 255, 255, 0.38); }


/* ====================================================================== the sheets' structure: the mockup's .mm-* rules */
.nav-new .mm-in { display: grid; grid-template-columns: minmax(0, 1fr) minmax(0, 1fr) minmax(0, 1.1fr); gap: 32px 48px; padding: 28px var(--gutter) 30px; }
.nav-new .mm-in.mm-prod { grid-template-columns: minmax(0, 1.05fr) 1px minmax(0, 1.1fr); gap: 0 44px; padding: 30px var(--gutter) 34px; }
.nav-new .mm-links { display: grid; gap: 18px; align-content: start; }
.nav-new .mm-cols { display: grid; grid-template-columns: 1fr 1fr; gap: 6px 32px; }
.nav-new .mm-h { display: block; font: 500 11px var(--sans); letter-spacing: 0.1em; text-transform: uppercase; color: var(--dk-muted); padding: 0 10px; margin: 0 0 8px; }
.nav-new .mm-item { display: grid; grid-template-columns: 34px 1fr 16px; align-items: center; gap: 12px; padding: 9px 10px; border-radius: 2px; color: var(--dk-text); text-decoration: none; transition: background-color 250ms; }
.nav-new .mm-item:hover { background: rgba(255, 255, 255, 0.05); color: var(--dk-text); text-decoration: none; }
.nav-new .mm-prod .mm-item { grid-template-columns: 1fr; gap: 3px; padding: 12px 10px; border-radius: 0; }
.nav-new .mm-prod .mm-item b { font-size: 17px; font-weight: 500; letter-spacing: -0.015em; color: var(--dk-text); transition: color 200ms; }
.nav-new .mm-prod .mm-item span { font-size: 13px; line-height: 1.45; color: var(--dk-muted); }
.nav-new .mm-prod .mm-item:hover { background: rgba(255, 255, 255, 0.04); }
.nav-new .mm-all { display: flex; justify-content: space-between; align-items: center; margin: 8px 0 0; padding: 14px 16px; border: 1px solid var(--dk-line-soft); background: rgba(255, 255, 255, 0.03); color: var(--dk-text); text-decoration: none; font-size: 14px; font-weight: 500; transition: border-color 250ms, background-color 250ms; }
.nav-new .mm-all:hover { border-color: var(--dk-line-strong); background: rgba(255, 255, 255, 0.06); color: var(--dk-text); text-decoration: none; }
.nav-new .mm-all svg { width: 18px; height: 18px; fill: none; stroke: currentColor; stroke-width: 1.6; stroke-linecap: round; stroke-linejoin: round; transition: transform 300ms var(--dk-ease); }
.nav-new .mm-all:hover svg { transform: translateX(4px); }
.nav-new .mm-div { background: var(--dk-line-soft); }
.nav-new .mm-featured { display: grid; gap: 18px; align-content: start; }
.nav-new .mm-ic { display: grid; place-items: center; width: 34px; height: 34px; border: 1px solid var(--dk-line-strong); background: rgba(255, 255, 255, 0.03); color: var(--dk-grey); transition: border-color 300ms, color 300ms, background-color 300ms; }
.nav-new .mm-ic svg { width: 17px; height: 17px; fill: none; stroke: currentColor; stroke-width: 1.6; stroke-linecap: round; stroke-linejoin: round; }
.nav-new .mm-item:hover .mm-ic { border-color: rgba(85, 168, 255, 0.7); color: var(--dk-blue); background: rgba(85, 168, 255, 0.08); }
.nav-new .mm-t b { display: block; font-size: 14px; font-weight: 500; letter-spacing: -0.01em; color: var(--dk-text); }
.nav-new .mm-t span { display: block; font-size: 12px; line-height: 1.4; color: var(--dk-muted); margin-top: 1px; }
.nav-new .mm-arrow { width: 16px; height: 16px; fill: none; stroke: currentColor; stroke-width: 1.6; stroke-linecap: round; stroke-linejoin: round; color: var(--dk-text); opacity: 0; transform: translateX(-6px); transition: opacity 250ms, transform 300ms var(--dk-ease); }
.nav-new .mm-item:hover .mm-arrow { opacity: 1; transform: none; }
/* Featured: two mini modules, HTML never screenshots, in a clipped 16:11.5 frame on a deep ground with a
   dot grid and a soft blue glow; the white product crop bleeds off the right edge; a chip floats at its
   lower left. Product radii inside (12, 10, 7, 999): the crop IS the product. */
.mm-shots { display: grid; grid-template-columns: 1fr 1fr; gap: 20px; }
.mm-mod { position: relative; display: grid; gap: 4px; color: var(--dk-text); text-decoration: none; }
.mm-mod:hover { text-decoration: none; color: var(--dk-text); }
.mm-mod-bg { position: relative; display: block; aspect-ratio: 16 / 11.5; overflow: hidden; border: 1px solid var(--dk-line-strong); background: linear-gradient(180deg, var(--dk-panel), var(--dk-ground)); transition: border-color 300ms, transform 450ms var(--dk-ease); }
.mm-mod-bg::before { content: ''; position: absolute; inset: 0; background: radial-gradient(rgba(255, 255, 255, 0.09) 1px, transparent 1.2px) 0 0 / 14px 14px; opacity: 0.7; }
.mm-mod-bg::after { content: ''; position: absolute; inset: 0; background: radial-gradient(90% 70% at 20% 0%, rgba(85, 168, 255, 0.28), transparent 62%), radial-gradient(70% 60% at 100% 100%, rgba(85, 168, 255, 0.12), transparent 60%); }
.mm-mod:hover .mm-mod-bg { border-color: rgba(255, 255, 255, 0.45); transform: translateY(-2px); }
.mm-mini { position: absolute; left: 11%; width: 100%; top: 12%; z-index: 2; display: grid; gap: 10px; padding: 14px 14px 12px; background: #FFFFFF; border-radius: 12px; box-shadow: 0 34px 70px -24px rgba(0, 0, 0, 0.75), 0 0 0 1px rgba(0, 0, 0, 0.06); color: #24272B; transition: transform 450ms var(--dk-ease); }
.mm-mod:hover .mm-mini { transform: translateY(-4px); }
.mm-mini-q { font-size: 12.5px; line-height: 1.4; font-weight: 500; letter-spacing: -0.01em; color: #24272B; }
.mm-caret { display: inline-block; width: 1px; height: 1em; background: #24272B; vertical-align: -0.15em; margin-left: 2px; animation: mm-blink 1s steps(2) infinite; }
@keyframes mm-blink { to { opacity: 0; } }
.mm-mini-row { display: flex; justify-content: space-between; align-items: center; }
.mm-mini-chip { display: inline-flex; align-items: center; gap: 6px; height: 24px; padding: 0 8px 0 5px; border: 1px solid #E6E8E6; border-radius: 999px; font-size: 11px; font-weight: 500; color: #24272B; }
.mm-mini-chip img { width: 14px; height: 14px; border-radius: 4px; display: block; }
.mm-mini-send { display: grid; place-items: center; width: 26px; height: 26px; border-radius: 8px; background: #24272B; }
.mm-mini-send svg { width: 12px; height: 12px; fill: none; stroke: #FFFFFF; stroke-width: 2; stroke-linecap: round; stroke-linejoin: round; }
.mm-mini-k { display: grid; grid-template-columns: auto auto; align-items: baseline; gap: 0 8px; }
.mm-mini-k b { font-size: 22px; font-weight: 500; letter-spacing: -0.02em; color: #24272B; font-variant-numeric: tabular-nums; }
.mm-mini-k i { font-style: normal; font-size: 12px; font-weight: 500; color: #2F8F63; }
.mm-mini-k em { grid-column: 1 / -1; font-style: normal; font-size: 11px; color: #737A82; }
.mm-spark { display: block; width: 100%; height: 40px; overflow: visible; }
.mm-spark-fill { fill: rgba(85, 168, 255, 0.14); }
.mm-spark-line { fill: none; stroke: #55A8FF; stroke-width: 2; stroke-linecap: round; }
.mm-mini-eng { display: flex; gap: 8px; padding-top: 8px; border-top: 1px solid #E6E8E6; }
.mm-mini-eng svg { width: 14px; height: 14px; color: #24272B; }
.mm-float { position: absolute; z-index: 3; display: inline-flex; align-items: center; gap: 7px; padding: 8px 10px; background: #FFFFFF; border-radius: 10px; box-shadow: 0 20px 40px -18px rgba(0, 0, 0, 0.7), 0 0 0 1px rgba(0, 0, 0, 0.06); font-size: 11.5px; font-weight: 500; color: #24272B; white-space: nowrap; transition: transform 450ms var(--dk-ease); }
.mm-float i { width: 7px; height: 7px; border-radius: 50%; background: #2F8F63; flex: none; }
.mm-float img { width: 12px; height: 12px; border-radius: 4px; flex: none; }
.mm-mini-chip .brand-fav { width: 14px; height: 14px; border-radius: 4px; flex: none; }
.mm-float .brand-fav { width: 12px; height: 12px; flex: none; }
.mm-float.a { left: 4%; bottom: 7%; }
.mm-float.b { left: 4%; bottom: 9%; }
.mm-mod:hover .mm-float { transform: translateY(-3px); }
.mm-mod small { display: block; margin-top: 12px; font-size: 12px; color: var(--dk-muted); }
.mm-mod b { font-size: 17px; font-weight: 500; letter-spacing: -0.015em; }
/* the Solutions sheet: the mockup's two audience cards and the Compare column */
.nav-new .mm-in.is-pair { grid-template-columns: minmax(0, 1fr) minmax(0, 1fr) minmax(0, 0.9fr); }
.nav-new .mm-card { display: grid; gap: 10px; align-content: start; padding: 22px; border: 1px solid var(--dk-line-strong); background: linear-gradient(180deg, rgba(255, 255, 255, 0.06), rgba(255, 255, 255, 0.02)); box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.12); color: var(--dk-text); text-decoration: none; transition: border-color 300ms, transform 400ms var(--dk-ease); }
.nav-new .mm-card:hover { border-color: rgba(255, 255, 255, 0.45); transform: translateY(-2px); color: var(--dk-text); text-decoration: none; }
.nav-new .mm-card .mm-ic { width: 40px; height: 40px; }
.nav-new .mm-card:hover .mm-ic { border-color: rgba(85, 168, 255, 0.7); color: var(--dk-blue); }
.nav-new .mm-card b { font-size: 17px; font-weight: 500; letter-spacing: -0.015em; }
.nav-new .mm-card span { font-size: 13px; line-height: 1.5; color: var(--dk-grey); }
.nav-new .mm-card em { font-style: normal; font-size: 13px; font-weight: 500; color: var(--dk-text); margin-top: 4px; }
.nav-new .mm-col { display: grid; gap: 4px; align-content: start; }
.nav-new .mm-col.mm-plain .mm-item { grid-template-columns: 1fr 16px; }
.nav-new .mm-col.mm-plain .mm-ic { display: none; }
@media (max-width: 1024px) {
  .nav-new .nav-in { grid-template-columns: auto 1fr; }
  .nav-new .nav-links, .nav-new .nav-cta, .nav-new .mm { display: none; }
}
@media (max-width: 768px) {
  .nav-new .foot { grid-template-columns: 1fr; }
}

/* ====================================================================== shared by every dark page: the strip, the pricing anatomy, the FAQ */
/* the strip: three cells on one 48px top slot */
.dh-strip { display: grid; grid-auto-flow: column; grid-auto-columns: minmax(0, 1fr); margin-top: 112px; border-top: 1px solid var(--dk-line-soft); }
.dh-strip > div { padding: 44px var(--gutter) 8px 0; display: grid; grid-template-rows: 48px auto; align-content: start; align-items: end; gap: 20px; }
.dh-strip > div { border-left: 1px solid var(--dk-line-soft); padding-left: var(--gutter); }
/* the first VISIBLE cell has no divider: the count cell is dropped ([hidden]) below the threshold and in a preview */
.dh-strip > div:first-child, .dh-strip > div[hidden] + div { border-left: 0; padding-left: 0; }
.dh-strip > div[hidden] { display: none; }
.dh-strip b { display: flex; align-items: center; height: 48px; font-size: 40px; font-weight: 500; letter-spacing: -0.03em; line-height: 1; color: var(--dk-text); font-variant-numeric: tabular-nums; }
.dh-strip span { display: block; font-size: 13.5px; line-height: 1.55; color: var(--dk-grey); max-width: 30ch; }
.dh-strip-lg { gap: 14px; }
.dh-strip-lg .mk { margin: 0; opacity: 0; transform: translateY(6px); transition: opacity 500ms ease, transform 500ms var(--dk-ease); }
.dh-strip-lg .mk .mk-lg { width: 30px; height: 30px; }
.dh-strip.is-in .dh-strip-lg .mk { opacity: 1; transform: none; }
.dh-strip-days { display: flex; gap: 10px; }
.dh-day { display: block; width: 36px; height: 36px; font-style: normal; }
.dh-day svg { display: block; width: 36px; height: 36px; overflow: visible; }
.dh-day .ring { fill: rgba(70, 185, 127, 0); stroke: var(--dk-line-strong); stroke-width: 1; transition: fill 600ms ease; transition-delay: var(--d, 0ms); }
.dh-day .ring-on { fill: none; stroke: var(--dk-good); stroke-width: 1.25; stroke-linecap: round; stroke-dasharray: 106.8; stroke-dashoffset: 106.8; transform: rotate(-90deg); transform-origin: 50% 50%; transition: stroke-dashoffset 700ms var(--dk-ease); transition-delay: var(--d, 0ms); }
.dh-day .ltr { font: 500 12.5px var(--sans); fill: var(--dk-grey); text-anchor: middle; transition: fill 500ms ease; transition-delay: calc(var(--d, 0ms) + 220ms); }
.dh-day .badge { opacity: 0; transform: scale(0.4); transform-origin: 29.5px 29.5px; transition: opacity 300ms ease, transform 450ms cubic-bezier(0.2, 0.9, 0.3, 1.3); transition-delay: calc(var(--d, 0ms) + 460ms); }
.dh-day .badge circle { fill: var(--dk-good); stroke: var(--dk-ground); stroke-width: 2.5; }
.dh-day .badge path { fill: none; stroke: var(--dk-ground); stroke-width: 1.7; stroke-linecap: round; stroke-linejoin: round; }
.dh-strip.is-in .dh-day .ring { fill: rgba(70, 185, 127, 0.07); }
.dh-strip.is-in .dh-day .ring-on { stroke-dashoffset: 0; }
.dh-strip.is-in .dh-day .ltr { fill: var(--dk-text); }
.dh-strip.is-in .dh-day .badge { opacity: 1; transform: none; }


/* ====================================================================== B2 pricing (src/routes/pages.js dark anatomy) */
.dh-pr-head { text-align: center; display: grid; justify-items: center; gap: 14px; margin-bottom: 48px; }
.dh-pr-head .dh-t1 { max-width: 24ch; margin: 0; }
.dh-pr-head .dh-lead { max-width: 58ch; margin: 0; }
.theme-dark .plans { display: grid; grid-template-columns: repeat(3, 1fr); gap: 14px; }
.theme-dark .plan { position: relative; padding: 0; border: 0; background: transparent; isolation: isolate; transition: transform 500ms var(--dk-ease), box-shadow 500ms; }
.theme-dark .plan-ring { position: absolute; inset: 0; background: conic-gradient(from var(--dh-hbg-a, 0deg), rgba(255, 255, 255, 0) 0deg, rgba(255, 255, 255, 0) 290deg, rgba(255, 255, 255, 0.95) 338deg, rgba(255, 255, 255, 0) 360deg); opacity: 0; transition: opacity 500ms; pointer-events: none; }
.theme-dark .plan.pop .plan-ring { opacity: 1; animation: dh-hbg-spin 3.2s linear infinite; }
.theme-dark .plan-glow { position: absolute; inset: 0; background: radial-gradient(70% 90% at 50% 50%, #55A8FF 0%, rgba(255, 255, 255, 0) 100%); opacity: 0; transition: opacity 500ms; pointer-events: none; }
.theme-dark .plan-in { position: relative; z-index: 1; margin: 1px; height: calc(100% - 2px); box-sizing: border-box; background: var(--dk-panel); border: 1px solid var(--dk-line); padding: 12px 12px 22px; display: grid; gap: 14px; align-content: start; transition: border-color 400ms; }
.theme-dark .plan-head { display: grid; gap: 12px; padding: 20px 18px 18px; background: rgba(255, 255, 255, 0.035); border: 1px solid var(--dk-line-soft); }
.theme-dark .plan-name { display: flex; justify-content: space-between; align-items: center; gap: 10px; }
.theme-dark .plan .pn { font-size: 20px; font-weight: 500; letter-spacing: -0.02em; color: var(--dk-text); }
.theme-dark .plan .pb { margin: 0; font-size: 13.5px; line-height: 1.55; color: var(--dk-grey); }
.theme-dark .plan-engines { display: flex; align-items: center; gap: 8px; margin: 2px 0; }
.theme-dark .plan-engines .mk { margin: 0; }
.theme-dark .plan-engines .mk-lg { width: 20px; height: 20px; }
.theme-dark .plan-engines .mk.dim .mk-lg { filter: grayscale(1) brightness(1.6); opacity: 0.28; }
.theme-dark .plan-engines .mk.dim:hover .mk-lg { opacity: 0.7; }
.theme-dark .plan-engines .mk-sep { width: 1px; height: 16px; background: var(--dk-line-strong); margin: 0 2px; }
.theme-dark .plan .pp { margin-top: 4px; font-size: 26px; font-weight: 500; letter-spacing: -0.02em; line-height: 1; color: var(--dk-text); }
.theme-dark .plan .pp small { font: 400 13px var(--sans); color: var(--dk-muted); margin-left: 6px; }
.theme-dark .plan .btn { margin: 0 6px; height: 40px; border-radius: 2px; font-size: 14px; font-weight: 500; justify-content: center; }
.theme-dark .plan-list { list-style: none; margin: 4px 6px 0; padding: 0; display: grid; gap: 11px; font-size: 13.5px; color: var(--dk-grey); }
.theme-dark .plan-list li { display: flex; align-items: center; gap: 10px; }
.theme-dark .plan-list li svg { width: 16px; height: 16px; flex: none; fill: none; stroke: var(--dk-grey); stroke-width: 1.6; stroke-linecap: round; stroke-linejoin: round; }
.theme-dark .plan-list li.off { color: var(--dk-muted); }
.theme-dark .plan-list li.off svg { stroke: var(--dk-muted); opacity: 0.6; }
.theme-dark .plan-list li.off span::after { content: 'Pro'; white-space: nowrap; font: 500 10px var(--sans); letter-spacing: 0.06em; text-transform: uppercase; color: var(--dk-muted); border: 1px solid var(--dk-line-soft); padding: 2px 6px; margin-left: 8px; vertical-align: middle; }
.theme-dark .pop-chip { font: 500 11px var(--sans); letter-spacing: 0.08em; text-transform: uppercase; color: var(--dk-blue); border: 1px solid rgba(85, 168, 255, 0.5); padding: 3px 8px; }
.theme-dark .plan.pop .plan-in { border-color: rgba(255, 255, 255, 0.28); }
.theme-dark .plan:hover { transform: translateY(-3px); box-shadow: 0 14px 34px -14px rgba(85, 168, 255, 0.5); }
.theme-dark .plan:hover .plan-glow { opacity: 1; }
.theme-dark .plan:hover .plan-ring { opacity: 0; }
.theme-dark .plan:hover .plan-in { border-color: transparent; }
.theme-dark .pr-table { margin-top: 56px; border: 1px solid var(--dk-line-soft); overflow-x: auto; }
.theme-dark .pr-table table { width: 100%; border-collapse: collapse; font-size: 13.5px; }
.theme-dark .pr-table th { padding: 18px 16px; font-size: 14px; font-weight: 500; color: var(--dk-text); text-align: center; border-bottom: 1px solid var(--dk-line); vertical-align: top; }
.theme-dark .pr-table th.l { text-align: left; font-size: 12px; font-weight: 500; letter-spacing: 0.06em; text-transform: uppercase; color: var(--dk-muted); }
.theme-dark .pr-table th small { display: block; margin-top: 3px; font-size: 12px; font-weight: 400; color: var(--dk-muted); }
.theme-dark .pr-table td { padding: 12px 16px; border-top: 1px solid var(--dk-line-soft); text-align: center; color: var(--dk-grey); vertical-align: middle; }
.theme-dark .pr-table td.l { text-align: left; color: var(--dk-text); width: 38%; }
.theme-dark .pr-table td.l small { display: block; font-size: 12px; color: var(--dk-muted); margin-top: 2px; }
.theme-dark .pr-table .pop { background: rgba(255, 255, 255, 0.025); }
.theme-dark .pr-table tr.grp td { padding: 26px 16px 8px; border-top: 0; text-align: left; font: 500 11px var(--sans); letter-spacing: 0.1em; text-transform: uppercase; color: var(--dk-muted); }
.theme-dark .pr-table tr.grp + tr td { border-top: 1px solid var(--dk-line-soft); }
.theme-dark .pr-table .ok { display: inline-grid; place-items: center; width: 20px; height: 20px; border-radius: 50%; background: rgba(70, 185, 127, 0.14); color: var(--dk-good-text); }
.theme-dark .pr-table .ok svg { width: 12px; height: 12px; fill: none; stroke: currentColor; stroke-width: 2.2; stroke-linecap: round; stroke-linejoin: round; }
.theme-dark .pr-table .no { display: inline-block; width: 12px; height: 1px; background: rgba(255, 255, 255, 0.22); vertical-align: middle; }
.theme-dark .pr-table .mk-li { justify-content: center; gap: 8px; }
.theme-dark .pr-foot { margin: 18px auto 0; font-size: 12.5px; line-height: 1.55; color: var(--dk-muted); text-align: center; max-width: 76ch; }
.theme-dark .pr-foot a { color: var(--dk-grey); text-decoration: underline; text-underline-offset: 2px; }

/* ====================================================================== B3 the FAQ (renderFaqSection markup) */
.theme-dark #faq { padding: 0; border-top: 1px solid var(--dk-line); background: transparent; }
.theme-dark #faq .wrap { max-width: none; padding: 96px var(--gutter) 100px; display: grid; grid-template-columns: 0.8fr 1.2fr; gap: 48px; align-items: start; }
.theme-dark #faq .sec-head { margin: 0; max-width: none; }
.theme-dark #faq .eyebrow { display: none; }
.theme-dark #faq .h2 { font-size: 38px; font-weight: 500; letter-spacing: -0.03em; line-height: 1.12; color: var(--dk-text); margin: 0; }
.theme-dark #faq .h2 .dim { color: var(--dk-muted); }
.theme-dark #faq .lead { margin-top: 20px; font: 400 13px/1.6 var(--sans); color: var(--dk-muted); }
.theme-dark .faq details { border-top: 1px solid var(--dk-line-soft); }
.theme-dark .faq details:last-child { border-bottom: 1px solid var(--dk-line-soft); }
.theme-dark .faq summary { cursor: pointer; list-style: none; display: flex; justify-content: space-between; align-items: center; gap: 16px; padding: 16px 0; font-size: 15px; font-weight: 500; color: var(--dk-text); }
.theme-dark .faq summary::-webkit-details-marker { display: none; }
.theme-dark .faq summary svg { width: 18px; height: 18px; flex: none; fill: none; stroke: var(--dk-muted); stroke-width: 1.5; stroke-linecap: round; transition: transform 300ms var(--dk-ease); }
.theme-dark .faq details[open] summary svg { transform: rotate(45deg); }
.theme-dark .faq p { padding: 0 0 16px; margin: 0; max-width: 60ch; font-size: 14.5px; line-height: 1.6; color: var(--dk-grey); }


/* the shared blocks above, at the site's breakpoints */
@media (max-width: 1024px) {
  .theme-dark .plans { grid-template-columns: 1fr; }
  .theme-dark #faq .wrap { grid-template-columns: 1fr; }
  .dh-strip { grid-auto-flow: row; grid-auto-columns: auto; grid-template-columns: 1fr; }
  .dh-strip > div + div { border-left: 0; padding-left: 0; border-top: 1px solid var(--dk-line-soft); }
}
@media (max-width: 768px) {
  .theme-dark .pr-table th.l, .theme-dark .pr-table td.l { width: 44%; }
}
@media (max-width: 480px) {
  .dh-strip b { font-size: 32px; }
}
@media (prefers-reduced-motion: reduce) {
  .theme-dark .plan.pop .plan-ring { animation: none; background: rgba(255, 255, 255, 0.35); }
}

/* ====================================================================== the base vocabulary, dark
   Every page keeps base.css's markup and its copy; on a dark page these rules map that vocabulary onto
   the dark recipes: bands become sections bounded by one hairline, section heads take the type roles
   and lose their eyebrows, cards become glass modules, steps and accordions take the hairline anatomy,
   tables the hairline table. Page sheets add only their own devices. Added per family from 2026-09-06. */
.theme-dark .band { background: transparent; color: var(--dk-text); border-top: 1px solid var(--dk-line); padding: 96px 0 100px; }
.theme-dark .band-hero { border-top: 0; padding: 128px 0 24px; text-align: center; }
.theme-dark .band-hero + .band { border-top: 0; }
.theme-dark .band-tight { padding: 72px 0 80px; }
.theme-dark .band-tinted, .theme-dark .band-paper, .theme-dark .band-panel, .theme-dark .band-ink { background: transparent; color: var(--dk-text); }
.theme-dark .dot-field { display: none; }
/* Eyebrows: none over a hero or a section statement (the recipes have none); inside a card, a unit or a
   strip the eyebrow is the label that names the figure or the kicker of the unit, so it stays, small
   and muted. */
.theme-dark .band-hero .eyebrow, .theme-dark .sec-head .eyebrow, .theme-dark .band > .wrap > .eyebrow { display: none; }
.theme-dark .eyebrow { display: block; font: 500 12px/1.3 var(--sans); letter-spacing: 0.06em; text-transform: uppercase; color: var(--dk-muted); margin: 0 0 8px; }
.theme-dark .card .eyebrow, .theme-dark .unit .eyebrow { margin-bottom: 10px; }
.theme-dark .crumb { display: block; font: 500 13px/1.3 var(--sans); letter-spacing: 0; text-transform: none; color: var(--dk-muted); margin-bottom: 18px; }
.theme-dark .crumb a { color: var(--dk-grey); }
.theme-dark .crumb a:hover { color: var(--dk-text); }
.theme-dark .band-hero .wrap { display: grid; justify-items: center; gap: 18px; }
.theme-dark .band-hero .crumb { margin: 0; }
.theme-dark .band-hero h1 { font-size: 46px; font-weight: 500; letter-spacing: -0.03em; line-height: 1.12; color: #FFFFFF; margin: 0; max-width: 22ch; text-wrap: balance; }
.theme-dark .band-hero .sub-hero { font-size: 16px; line-height: 1.6; color: var(--dk-grey); margin: 0; max-width: 60ch; }
.theme-dark .band-hero .body-sm { max-width: 62ch; }
.theme-dark .band-hero .micro-proof { font-size: 14px; color: rgba(255, 255, 255, 0.7); margin: 0; }
.theme-dark .band-hero .cta-row { margin: 6px 0 0; display: flex; gap: 10px; flex-wrap: wrap; justify-content: center; }
.theme-dark .sec-head { text-align: center; display: grid; justify-items: center; gap: 14px; margin: 0 auto 48px; max-width: none; }
.theme-dark .sec-head h2, .theme-dark .h2, .theme-dark .h2-section, .theme-dark .h2-compact { font-size: 38px; font-weight: 500; letter-spacing: -0.03em; line-height: 1.12; color: var(--dk-text); margin: 0; max-width: 24ch; text-wrap: balance; }
.theme-dark .sec-head p, .theme-dark .sec-head .sub-hero, .theme-dark .sec-head .body-sm { font-size: 16px; line-height: 1.6; color: var(--dk-grey); margin: 0; max-width: 58ch; }
.theme-dark .sec-label { font: 500 13px/1.3 var(--sans); letter-spacing: 0; text-transform: none; color: var(--dk-muted); margin-bottom: 24px; }
.theme-dark .h3-block, .theme-dark .h4 { font-size: 17px; font-weight: 500; letter-spacing: -0.01em; line-height: 1.35; color: var(--dk-text); margin: 0; }
.theme-dark .body-sm, .theme-dark .caption, .theme-dark .body { color: var(--dk-grey); }
.theme-dark .caption { font-size: 12.5px; line-height: 1.55; color: var(--dk-muted); }
.theme-dark .chip { display: inline-flex; align-items: center; height: 22px; padding: 0 8px; border: 1px solid var(--dk-line-strong); border-radius: 0; background: transparent; font: 500 11px var(--sans); letter-spacing: 0.06em; text-transform: uppercase; color: var(--dk-grey); }
.theme-dark .chip-accent { border-color: rgba(85, 168, 255, 0.5); color: var(--dk-blue); }
/* buttons: the site's square 40px pair (the primary is white, the secondary a ghost) */
.theme-dark .btn { height: 40px; padding: 0 18px; border-radius: 2px; font-size: 14px; font-weight: 500; display: inline-flex; align-items: center; justify-content: center; gap: 8px; border: 1px solid transparent; transition: background-color 200ms, border-color 200ms, color 200ms, box-shadow 300ms var(--dk-ease); }
.theme-dark .btn-lg { height: 44px; padding: 0 22px; }
.theme-dark .btn-sm { height: 36px; padding: 0 14px; font-size: 13px; }
.theme-dark .btn-primary, .theme-dark .btn-on-ink { background: #FFFFFF; border-color: #FFFFFF; color: var(--dk-ground); }
.theme-dark .btn-primary:hover, .theme-dark .btn-on-ink:hover { background: #FFFFFF; color: var(--dk-ground); box-shadow: 0 12px 30px -12px rgba(255, 255, 255, 0.45); text-decoration: none; }
.theme-dark .btn-secondary, .theme-dark .btn-on-ink-ghost { background: rgba(255, 255, 255, 0.04); border-color: var(--dk-line-strong); color: var(--dk-text); }
.theme-dark .btn-secondary:hover, .theme-dark .btn-on-ink-ghost:hover { background: rgba(255, 255, 255, 0.09); border-color: rgba(255, 255, 255, 0.38); color: var(--dk-text); text-decoration: none; }
.theme-dark .btn .arrow { width: 16px; height: 16px; transition: transform 300ms var(--dk-ease); }
.theme-dark .btn:hover .arrow { transform: translateX(3px); }
.theme-dark .btn-text { display: inline-flex; align-items: center; gap: 8px; min-height: 40px; color: var(--dk-text); font-size: 14px; font-weight: 500; text-decoration: underline; text-underline-offset: 4px; text-decoration-color: var(--dk-line-strong); }
.theme-dark .btn-text:hover { text-decoration-color: var(--dk-text); color: var(--dk-text); }
.theme-dark .btn-text .arrow { width: 16px; height: 16px; transition: transform 300ms var(--dk-ease); }
.theme-dark .btn-text:hover .arrow { transform: translateX(3px); }
/* cards become glass modules; grids keep their tracks with the 14px rhythm */
.theme-dark .card { background: var(--dk-glass); -webkit-backdrop-filter: blur(20px); backdrop-filter: blur(20px); border: 1px solid var(--dk-line-strong); border-radius: 0; box-shadow: var(--dk-shadow), inset 0 1px 0 rgba(255, 255, 255, 0.14); color: var(--dk-text); }
.theme-dark .card-lg { padding: 22px 24px; }
.theme-dark .card .h3-block, .theme-dark .card .h4 { margin-top: 0; }
.theme-dark .card p { color: var(--dk-grey); }
.theme-dark .grid { gap: 14px; }
.theme-dark .star-list { list-style: none; margin: 0; padding: 0; display: grid; gap: 12px; }
.theme-dark .star-list li { position: relative; padding-left: 22px; color: var(--dk-grey); font-size: 14.5px; line-height: 1.6; }
.theme-dark .star-list li::before { content: ''; position: absolute; left: 0; top: 0.75em; width: 10px; height: 1px; background: var(--dk-line-strong); }
.theme-dark .star-list strong { color: var(--dk-text); font-weight: 500; }
/* numbered steps: a hairline grid, the numeral muted and small */
.theme-dark .steps { list-style: none; margin: 0; padding: 0; counter-reset: step; }
.theme-dark .steps > li { counter-increment: step; position: relative; padding: 22px 0 22px 44px; border-top: 1px solid var(--dk-line-soft); }
.theme-dark .steps > li::before { content: ' 0' counter(step); position: absolute; left: 0; top: 24px; font: 500 12px var(--mono, var(--sans)); letter-spacing: 0.06em; color: var(--dk-muted); }
.theme-dark .steps > li + li { margin-top: 0; }
.theme-dark .steps p { margin-top: 6px; color: var(--dk-grey); }
/* the accordion: the FAQ anatomy */
.theme-dark .acc { border-top: 1px solid var(--dk-line-soft); }
.theme-dark .acc details { border-bottom: 1px solid var(--dk-line-soft); background: transparent; }
.theme-dark .acc summary { cursor: pointer; list-style: none; display: flex; justify-content: space-between; align-items: center; gap: 16px; padding: 16px 0; font-size: 15px; font-weight: 500; color: var(--dk-text); }
.theme-dark .acc summary::-webkit-details-marker { display: none; }
.theme-dark .acc summary .ic { width: 18px; height: 18px; flex: none; color: var(--dk-muted); transition: transform 300ms var(--dk-ease); }
.theme-dark .acc details[open] summary .ic { transform: rotate(180deg); }
.theme-dark .acc p { padding: 0 0 16px; margin: 0; max-width: 60ch; font-size: 14.5px; line-height: 1.6; color: var(--dk-grey); }
/* tables: the hairline table (breakout tables stay in the column) */
.theme-dark table.breakout, .theme-dark .spec { width: 100%; border-collapse: collapse; font-size: 13.5px; color: var(--dk-grey); }
.theme-dark table.breakout thead th { padding: 14px 16px; text-align: left; font: 500 12px var(--sans); letter-spacing: 0.06em; text-transform: uppercase; color: var(--dk-muted); border-bottom: 1px solid var(--dk-line); }
.theme-dark table.breakout tbody th, .theme-dark table.breakout tbody td, .theme-dark .spec th, .theme-dark .spec td { padding: 14px 16px; text-align: left; vertical-align: top; border-top: 1px solid var(--dk-line-soft); line-height: 1.55; }
.theme-dark table.breakout tbody th, .theme-dark .spec th { font-size: 14px; font-weight: 500; color: var(--dk-text); }
.theme-dark .spec-panel { background: transparent; border: 1px solid var(--dk-line-soft); border-radius: 0; padding: 0; max-width: none; }
.theme-dark .cmp-wrap, .theme-dark .matrix-wrap, .theme-dark .table-wrap { border: 1px solid var(--dk-line-soft); overflow-x: auto; }
.theme-dark .cmp-wrap table, .theme-dark .matrix-wrap table { min-width: 0; }
/* the split section with a live surface: copy left on a hairline, the app's own card right */
.theme-dark .msec { padding: 96px 0 100px; }
.theme-dark .msec .eyb { display: none; }
.theme-dark .msec h2 { font-size: 38px; font-weight: 500; letter-spacing: -0.03em; line-height: 1.12; color: var(--dk-text); margin: 0; }
.theme-dark .msec p { color: var(--dk-grey); font-size: 15px; line-height: 1.6; margin: 14px 0 0; }
.theme-dark .msec-split .msec-copy { border-right: 1px solid var(--dk-line-soft); }
.theme-dark .msec-split.is-mirrored .msec-copy { border-left-color: var(--dk-line-soft); }
.theme-dark .msec-frame .frame { border-color: var(--dk-line-strong); }
.theme-dark .msec-frame .msec-stage { background: rgba(255, 255, 255, 0.03); }
@media (max-width: 768px) {
  .theme-dark .band { padding: 64px 0; }
  .theme-dark .band-hero { padding: 96px 0 16px; }
  .theme-dark .band-hero h1 { font-size: 34px; }
  .theme-dark .sec-head h2, .theme-dark .h2, .theme-dark .h2-section, .theme-dark .h2-compact, .theme-dark .msec h2 { font-size: 30px; }
  .theme-dark .btn-lg { height: 40px; padding: 0 18px; }
}

/* The sample client report (marketing/partials/sample-report.html, root .sample-report) is a white document: the one bright
   object on the page. Its text keeps the product's ink on every dark page rather than inheriting the
   theme's light text (the audit read 1.11:1 on its paragraphs before this). */
.theme-dark .sample-report { color: #24272B; }
.theme-dark .sample-report h1, .theme-dark .sample-report h2, .theme-dark .sample-report h3, .theme-dark .sample-report b, .theme-dark .sample-report th, .theme-dark .sample-report p, .theme-dark .sample-report .caption, .theme-dark .sample-report .body-sm { color: #24272B; }
.theme-dark .sample-report .sr-meta, .theme-dark .sample-report .sr-label, .theme-dark .sample-report .sr-kicker, .theme-dark .sample-report small { color: #6B7074; }   /* steel: 4.9:1 on paper; the product's muted is 4.4 there */

/* the embedded product demo (feature pages): the app's own light card inside a dark frame on the ground */
.theme-dark .shot { background: transparent; border: 1px solid var(--dk-line-strong); border-radius: 0; padding: 14px; box-shadow: var(--dk-shadow); }
.theme-dark .shot-ridges::before, .theme-dark .shot-ridges::after { display: none; }
.theme-dark .shot-inner { border-radius: 12px; overflow: hidden; }
.theme-dark .demo-skel { background: rgba(255, 255, 255, 0.04); }
.theme-dark .demo-skel span, .theme-dark .demo-skel-plot { background: rgba(255, 255, 255, 0.06); }
.theme-dark .demo-note { display: flex; flex-wrap: wrap; align-items: baseline; justify-content: space-between; gap: 12px 24px; margin-top: 16px; }
.theme-dark .demo-note .caption { max-width: 640px; }
/* whole-card links keep the module look and lift on hover */
.theme-dark a.card, .theme-dark .card-link { color: var(--dk-text); text-decoration: none; transition: transform 300ms var(--dk-ease), border-color 300ms; }
.theme-dark a.card:hover, .theme-dark .card-link:hover { color: var(--dk-text); text-decoration: none; transform: translateY(-2px); border-color: rgba(255, 255, 255, 0.35); }
.theme-dark .card .btn-text { margin-top: 14px; }
.theme-dark .wrap-narrow { max-width: 760px; }
/* a split row: heading column beside its content */
.theme-dark .row-split { display: grid; grid-template-columns: minmax(0, 0.85fr) minmax(0, 1.15fr); gap: 32px 48px; align-items: start; }
.theme-dark .row-split .sec-head { text-align: left; justify-items: start; margin: 0; }
.theme-dark .row-split .sec-head h2, .theme-dark .row-split .sec-head p { max-width: none; }
@media (max-width: 768px) { .theme-dark .row-split { grid-template-columns: minmax(0, 1fr); } }

/* code and commands: a glass panel in the mono voice */
.theme-dark pre.artifact, .theme-dark .mono-line { margin: 0; padding: 16px 18px; background: rgba(255, 255, 255, 0.04); border: 1px solid var(--dk-line-strong); color: var(--dk-text); font: 400 13px/1.6 var(--mono, var(--sans)); overflow-x: auto; }
.theme-dark pre.artifact code, .theme-dark .mono-line code { background: transparent; color: inherit; padding: 0; font: inherit; }
.theme-dark code { font: 400 0.92em var(--mono, var(--sans)); color: var(--dk-text); background: rgba(255, 255, 255, 0.06); padding: 1px 5px; border-radius: 2px; }
.theme-dark .stack { display: grid; gap: 14px; align-content: start; }
.theme-dark .stack > * { margin: 0; }
.theme-dark .row-split.is-flipped > :first-child { order: 2; }

/* a proof line outside the hero (the install band, the demo foot) reads grey on the ground */
.theme-dark .micro-proof { font-size: 14px; color: var(--dk-grey); }

/* the sources block the build splices onto every comparison page (src/competitor-facts.js): a hairline
   panel on the ground, the disclosure muted, the source links in the text colour */
.theme-dark .sources { background: rgba(255, 255, 255, 0.03); border: 1px solid var(--dk-line-soft); border-radius: 0; padding: 22px 24px; color: var(--dk-grey); }
.theme-dark .sources h2, .theme-dark .sources h3 { font-size: 17px; font-weight: 500; letter-spacing: -0.01em; color: var(--dk-text); margin: 0 0 12px; }
.theme-dark .sources p, .theme-dark .sources li { color: var(--dk-grey); font-size: 14px; line-height: 1.6; }
.theme-dark .sources b { color: var(--dk-text); font-weight: 500; }
.theme-dark .sources a { color: var(--dk-text); text-decoration: underline; text-underline-offset: 3px; text-decoration-color: var(--dk-line-strong); }
.theme-dark .sources a:hover { text-decoration-color: var(--dk-text); }
.theme-dark .sources .src-disclosure { color: var(--dk-muted); font-size: 13px; }
.theme-dark .src-note, .theme-dark .src-caveat, .theme-dark .sources small { color: var(--dk-grey); }
.theme-dark .src-caveat { background: rgba(255, 255, 255, 0.03); border: 1px solid var(--dk-line-soft); border-radius: 0; }   /* the caveat carries its own white note ground in the light sheet */   /* a caveat can sit outside the block (an unreachable rival price page) */

/* reading pages: bare headings and lists inside a wrap (methodology, the 404, legal prose) */
.theme-dark .wrap > h2, .theme-dark .stack > h2, .theme-dark .legal h2 { font-size: 22px; font-weight: 500; letter-spacing: -0.02em; line-height: 1.25; color: var(--dk-text); margin: 34px 0 10px; }
.theme-dark .wrap > h2:first-child, .theme-dark .stack > h2:first-child { margin-top: 0; }
.theme-dark .stack > p, .theme-dark .legal p, .theme-dark .legal li { color: var(--dk-grey); font-size: 15px; line-height: 1.7; }
.theme-dark .stack > p b, .theme-dark .legal b, .theme-dark ul.measure b { color: var(--dk-text); font-weight: 500; }
.theme-dark ul.measure { list-style: disc; padding-left: 22px; margin: 0; color: var(--dk-grey); }
.theme-dark ul.measure li { margin: 6px 0; font-size: 15px; line-height: 1.7; }
.theme-dark ul.measure a, .theme-dark .legal a, .theme-dark .stack > p a { color: var(--dk-text); text-decoration: underline; text-underline-offset: 3px; text-decoration-color: var(--dk-line-strong); font-weight: 500; }
.theme-dark .legal { max-width: 72ch; }
.theme-dark .band-legal { padding-top: 0; }
.theme-dark .legal ul { margin: 0 0 14px; padding-left: 22px; }
.theme-dark .legal .tw { overflow-x: auto; margin: 10px 0 18px; border: 1px solid var(--dk-line-soft); }
.theme-dark .legal table { width: 100%; border-collapse: collapse; font-size: 13px; }
.theme-dark .legal th { text-align: left; font: 500 11px var(--sans); letter-spacing: 0.05em; text-transform: uppercase; color: var(--dk-muted); padding: 10px 12px; border-bottom: 1px solid var(--dk-line); }
.theme-dark .legal td { padding: 10px 12px; border-top: 1px solid var(--dk-line-soft); vertical-align: top; color: var(--dk-grey); line-height: 1.55; }

/* ====================================================================== the new nav on a LIGHT page (docs)
   The mockup's structure in the light system's colours; the Featured tiles stay the dark product frames. */
.nav-new:not(.theme-dark) .nav, .nav-new:not(.theme-dark) .nav.is-scrolled { background: rgba(255, 255, 255, 0.92); border-bottom-color: var(--line); }
.nav-new:not(.theme-dark) .nav .brand, .nav-new:not(.theme-dark) .nav .brand:hover { color: var(--ink); }
.nav-new:not(.theme-dark) .nav-links > a, .nav-new:not(.theme-dark) .nav-links .nav-trigger { color: var(--iron); }
.nav-new:not(.theme-dark) .nav-links > a:hover, .nav-new:not(.theme-dark) .nav-links .nav-trigger:hover, .nav-new:not(.theme-dark) .nav-links .nav-trigger[aria-expanded="true"] { color: var(--ink); }
.nav-new:not(.theme-dark) .nav-links > a::after, .nav-new:not(.theme-dark) .nav-links .nav-trigger::after { background: var(--ink); }
.nav-new:not(.theme-dark) .btn-ghost, .nav-new:not(.theme-dark) .btn-ghost:hover { background: transparent; border-color: var(--line-strong); color: var(--ink); backdrop-filter: none; }
.nav-new:not(.theme-dark) .btn-white, .nav-new:not(.theme-dark) .btn-white:hover { background: var(--ink); border-color: var(--ink); color: #FFFFFF; box-shadow: none; }
.nav-new:not(.theme-dark) .nav-burger { background: transparent; border-color: var(--line); color: var(--ink); }
.nav-new:not(.theme-dark) .mm { background: rgba(255, 255, 255, 0.94); border-top-color: var(--line); border-bottom-color: var(--line); box-shadow: 0 30px 60px -30px rgba(36, 39, 43, 0.25); }
.nav-new:not(.theme-dark) .mm-h { color: var(--steel); }
.nav-new:not(.theme-dark) .mm-item, .nav-new:not(.theme-dark) .mm-prod .mm-item b, .nav-new:not(.theme-dark) .mm-t b, .nav-new:not(.theme-dark) .mm-card, .nav-new:not(.theme-dark) .mm-card em, .nav-new:not(.theme-dark) .mm-arrow, .nav-new:not(.theme-dark) .mm-mod { color: var(--ink); }
.nav-new:not(.theme-dark) .mm-prod .mm-item span, .nav-new:not(.theme-dark) .mm-t span, .nav-new:not(.theme-dark) .mm-card span, .nav-new:not(.theme-dark) .mm-mod small { color: var(--steel); }
.nav-new:not(.theme-dark) .mm-item:hover, .nav-new:not(.theme-dark) .mm-prod .mm-item:hover { background: var(--band-tint); }
.nav-new:not(.theme-dark) .mm-all, .nav-new:not(.theme-dark) .mm-card, .nav-new:not(.theme-dark) .mm-ic { border-color: var(--line); background: var(--paper); box-shadow: none; color: var(--ink); }
.nav-new:not(.theme-dark) .mm-all:hover, .nav-new:not(.theme-dark) .mm-card:hover { border-color: var(--line-strong); background: var(--paper); }
.nav-new:not(.theme-dark) .mm-div { background: var(--line); }
.nav-new:not(.theme-dark) .mm-scrim { background: rgba(36, 39, 43, 0.28); }
.nav-new:not(.theme-dark) footer.foot-dark { background: var(--paper); color: var(--steel); border-top-color: var(--line); }
body.nav-new:not(.theme-dark) .foot li a, .nav-new:not(.theme-dark) .foot ul, .nav-new:not(.theme-dark) .foot .label, .nav-new:not(.theme-dark) .foot-addr { color: var(--steel); }
body.nav-new:not(.theme-dark) .foot li a:hover, .nav-new:not(.theme-dark) .foot .brand { color: var(--ink); }

/* css/pages/about-dark.css */
/* marketing/css/pages/about-dark.css - /about dark, held until cutover. Numbered editorial panels on the
 * dark ground; everything else is the theme's skin of base.css. Laws kept as in the theme sheet. */
.page-about-dark .band-hero { padding-bottom: 24px; }
.page-about-dark .panel-num + .panel-num { margin-top: 72px; padding-top: 72px; border-top: 1px solid var(--dk-line-soft); }
.page-about-dark .panel-num .row-split { grid-template-columns: minmax(0, 0.9fr) minmax(0, 1.1fr); align-items: start; gap: 24px 48px; }
.page-about-dark .panel-num .h3-block { font-size: 28px; letter-spacing: -0.02em; line-height: 1.15; }
/* the mission line is the Editorial display role, in Epilogue like the rest, at the dark weight */
.page-about-dark .display-serif { font-family: var(--sans); font-size: 30px; font-weight: 500; letter-spacing: -0.03em; line-height: 1.15; color: var(--dk-text); margin: 0; }
.page-about-dark .panel-num .spec { margin-top: 18px; border: 1px solid var(--dk-line-soft); }
.page-about-dark .stack > p { margin: 0; }
@media (max-width: 768px) {
  .page-about-dark .panel-num + .panel-num { margin-top: 48px; padding-top: 48px; }
  .page-about-dark .panel-num .row-split { grid-template-columns: minmax(0, 1fr); gap: 16px; }
  .page-about-dark .display-serif { font-size: 26px; }
}

/* css/pages/about.css */
/* /about — numbered editorial panels (P1 §P-16, L-lite).
 * Only page-specific rhythm lives here; every component it uses comes from base.css. */
/* The hero carries no visual, so its full 96px foot plus the next band's 96px reads as a
   hole rather than air. 64 + 96 keeps the rhythm on-scale and closes the gap. */
.page-about .band-hero { padding-bottom: var(--s8); }
.page-about .band-hero .sub-hero { margin-top: var(--s5); }
.page-about .panel-num + .panel-num { margin-top: var(--s9); }
.page-about .panel-num .row-split { grid-template-columns: minmax(0, 0.9fr) minmax(0, 1.1fr); align-items: start; gap: var(--s7); }
.page-about .panel-num .spec { margin-top: var(--s5); }

@media (max-width: 768px) {
  .page-about .panel-num + .panel-num { margin-top: var(--s8); }
  .page-about .panel-num .row-split { grid-template-columns: minmax(0, 1fr); gap: var(--s5); }
}

/* css/pages/auth.css */
/* /login /signup /forgot /reset /accept-team - the auth family, ported off m.css onto the
 * marketing system (audit Wave 7, George-approved 2026-08-30; landed 2026-08-31).
 *
 * WHAT THIS IS. The dark split-panel design George shipped on m.css, re-implemented on the
 * marketing tokens: Epilogue (self-hosted - the Google Fonts CDN request died with the port),
 * the closed breakpoint set (1024/768/480; m.css ran its own twelve), marketing control
 * geometry (44px fields, --r-ctl corners, 48px primary), and the site's focus law (white ring
 * on dark grounds). The LOOK is deliberately the same shell: same grounds, same glow, same
 * copy stack - the system underneath changed, not the design.
 *
 * THE GLOW GRADIENTS are ported verbatim from m.css - they are the aside's existing, shipped
 * art direction, not new decoration, and this bundle is on the e2e gradient allowlist. The
 * scrim under the copy band is load-bearing: without it the pitch goes white-on-white when
 * the glow breathes (the original file documents the failed first attempt).
 *
 * GROUNDS. --carbon is the page ground (exactly the old --auth-ink #07070A). The form panel
 * sits one step lighter at #0B0B0E - a literal on purpose: no marketing token names a second
 * carbon, and inventing one for a single surface is how palettes fork. The glow triplet is
 * 85,168,255 = --accent.
 */

.page-auth { background: var(--carbon); color: #FFFFFF; }
.page-auth::before { display: none; } /* the column rules belong to paper pages */

.page-auth .auth-shell { display: grid; grid-template-columns: 1fr 1fr; min-height: 100vh; min-height: 100dvh; }

/* ---- the aside: lockup, pitch, glow ---- */
.page-auth .auth-aside { position: relative; overflow: hidden; display: flex; align-items: center; justify-content: center; padding: var(--s8) var(--s7); background: var(--carbon); }
.page-auth .auth-aside::before { content: ""; position: absolute; inset: 0; background:
  radial-gradient(86% 52% at 50% 14%, rgba(85, 168, 255, 1) 0%, rgba(85, 168, 255, .92) 26%, rgba(85, 168, 255, .52) 50%, rgba(85, 168, 255, .16) 70%, transparent 86%),
  radial-gradient(30% 18% at 50% 2%, rgba(255, 255, 255, .85) 0%, rgba(255, 255, 255, .28) 46%, transparent 76%); }
.page-auth .auth-aside::after { content: ""; position: absolute; inset: 0; background:
  linear-gradient(180deg, transparent 0%, rgba(7, 7, 10, .30) 26%, rgba(7, 7, 10, .80) 46%, rgba(7, 7, 10, .96) 60%, var(--carbon) 76%); }
.page-auth .auth-aside-in { position: relative; z-index: 1; max-width: 420px; text-align: center; }
.page-auth .auth-aside .brand { display: inline-block; color: #FFFFFF; margin-bottom: 28px; }
.page-auth .auth-aside .brand svg { width: 150px; height: auto; display: block; margin: 0 auto; }
.page-auth .auth-pitch { font-size: 38px; line-height: 1.12; letter-spacing: -0.03em; font-weight: 600; color: #FFFFFF; margin: 0 0 14px; }
.page-auth .auth-lede { font-size: 16px; line-height: 1.5; color: rgba(255, 255, 255, .80); margin: 0 0 22px; }
.page-auth .auth-claims { list-style: none; margin: 0 0 6px; padding: 0; font-size: 16px; line-height: 1.75; color: rgba(255, 255, 255, .72); }
.page-auth .auth-credit { font-size: 16px; font-weight: 600; color: var(--accent); margin: 0 0 30px; }
.page-auth .auth-engines { display: flex; gap: 18px; justify-content: center; align-items: center; }
.page-auth .auth-engines img { width: 26px; height: 26px; object-fit: contain; filter: brightness(0) invert(1); opacity: .72; }

/* ---- the form panel ---- */
.page-auth .auth-main { display: flex; align-items: center; justify-content: center; padding: var(--s8) var(--s7); background: #0B0B0E; border-left: 1px solid rgba(255, 255, 255, .08); }
.page-auth .auth-form { width: 100%; max-width: 400px; }
.page-auth .auth-form h1 { font-size: 30px; letter-spacing: -0.03em; font-weight: 600; color: #FFFFFF; margin: 0 0 8px; text-align: center; }
.page-auth .auth-form .sub { color: rgba(255, 255, 255, .62); font-size: 14.5px; line-height: 1.55; margin: 0 0 26px; text-align: center; }

.page-auth .field { margin: 0 0 14px; }
.page-auth .field label { display: block; font-size: 13px; font-weight: 500; color: rgba(255, 255, 255, .86); margin-bottom: 6px; }
.page-auth .field input { width: 100%; height: 44px; padding: 0 12px; border-radius: var(--r-ctl); background: rgba(255, 255, 255, .05); border: 1px solid rgba(255, 255, 255, .12); color: #FFFFFF; font: inherit; font-size: 16px; transition: border-color .15s, box-shadow .15s; }
.page-auth .field input::placeholder { color: rgba(255, 255, 255, .40); }
.page-auth .field input:focus-visible { outline: none; border-color: var(--accent); box-shadow: 0 0 0 3px rgba(85, 168, 255, .28); }
.page-auth .field input.code { font-size: 24px; letter-spacing: .35em; text-align: center; padding-left: calc(12px + .35em); }
.page-auth .hint { font-size: 12.5px; color: rgba(255, 255, 255, .55); margin: 7px 0 0; }

/* Password reveal - anatomy from the marketing field, masks ported from m.css. */
.page-auth .field-affix { position: relative; }
.page-auth .field-affix input { padding-right: 44px; }
.page-auth .pw-reveal { position: absolute; top: 0; right: 0; width: 44px; height: 44px; display: inline-flex; align-items: center; justify-content: center; background: none; border: 0; cursor: pointer; color: rgba(255, 255, 255, .5); }
.page-auth .pw-reveal:hover { color: #FFFFFF; }
.page-auth .pw-reveal::before { content: ""; width: 19px; height: 19px; background: currentColor;
  -webkit-mask: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='%23000' stroke-width='2' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpath d='M2 12s3.6-7 10-7 10 7 10 7-3.6 7-10 7-10-7-10-7Z'/%3E%3Ccircle cx='12' cy='12' r='3'/%3E%3C/svg%3E") center/contain no-repeat;
  mask: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='%23000' stroke-width='2' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpath d='M2 12s3.6-7 10-7 10 7 10 7-3.6 7-10 7-10-7-10-7Z'/%3E%3Ccircle cx='12' cy='12' r='3'/%3E%3C/svg%3E") center/contain no-repeat; }
.page-auth .pw-reveal[aria-pressed="true"]::before {
  -webkit-mask-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='%23000' stroke-width='2' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpath d='M17.9 17.9A9.9 9.9 0 0 1 12 19c-6.4 0-10-7-10-7a18 18 0 0 1 5.1-5.9m3.2-1A9.9 9.9 0 0 1 12 5c6.4 0 10 7 10 7a18 18 0 0 1-2.2 3.2M9.9 9.9a3 3 0 1 0 4.2 4.2'/%3E%3Cpath d='m2 2 20 20'/%3E%3C/svg%3E");
  mask-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='%23000' stroke-width='2' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpath d='M17.9 17.9A9.9 9.9 0 0 1 12 19c-6.4 0-10-7-10-7a18 18 0 0 1 5.1-5.9m3.2-1A9.9 9.9 0 0 1 12 5c6.4 0 10 7 10 7a18 18 0 0 1-2.2 3.2M9.9 9.9a3 3 0 1 0 4.2 4.2'/%3E%3Cpath d='m2 2 20 20'/%3E%3C/svg%3E"); }

/* On-ink primary: white fill on the dark panel, marketing button geometry. */
.page-auth .btn-auth { display: inline-flex; align-items: center; justify-content: center; gap: 8px; width: 100%; height: 48px; padding: 0 20px; border: 1px solid #FFFFFF; border-radius: var(--r-ctl); background: #FFFFFF; color: var(--carbon); font: inherit; font-size: 15px; font-weight: 600; cursor: pointer; transition: background .16s ease, border-color .16s ease; }
.page-auth .btn-auth:hover { background: rgba(255, 255, 255, .88); border-color: rgba(255, 255, 255, .88); }
.page-auth .btn-auth:disabled { opacity: .6; cursor: default; }
.page-auth .btn-auth-ghost { display: inline-flex; align-items: center; justify-content: center; gap: 8px; height: 44px; padding: 0 18px; border: 1px solid rgba(255, 255, 255, .22); border-radius: var(--r-ctl); background: transparent; color: #FFFFFF; font: inherit; font-size: 14.5px; font-weight: 500; cursor: pointer; text-decoration: none; }
.page-auth .btn-auth-ghost:hover { background: rgba(255, 255, 255, .08); text-decoration: none; }
.page-auth a.btn-auth { text-decoration: none; }
.page-auth .spinner { width: 15px; height: 15px; border: 2px solid currentColor; border-top-color: transparent; border-radius: 50%; animation: authspin .7s linear infinite; display: inline-block; flex: none; }
@keyframes authspin { to { transform: rotate(360deg); } }

/* Messages */
.page-auth .auth-msg { display: none; border-radius: var(--r-ctl); padding: 12px; font-size: 13px; line-height: 1.5; margin: 0 0 14px; }
.page-auth .auth-msg.show { display: block; }
.page-auth .auth-msg.err { background: rgba(180, 66, 63, .16); border: 1px solid rgba(222, 147, 146, .34); color: #F0A9A8; }
.page-auth .auth-msg.ok { background: rgba(82, 161, 133, .16); border: 1px solid rgba(82, 161, 133, .34); color: #8FD3BA; }

/* Secondary copy */
.page-auth .auth-alt { text-align: center; font-size: 14px; color: rgba(255, 255, 255, .55); margin: 16px 0 0; }
.page-auth .consent { text-align: center; font-size: 14px; color: rgba(255, 255, 255, .55); line-height: 1.55; margin: 14px 0 0; }
.page-auth .auth-alt a, .page-auth .consent a { color: #FFFFFF; font-weight: 500; }
.page-auth .auth-state { font-size: 14px; line-height: 1.6; color: rgba(255, 255, 255, .72); }
.page-auth .auth-actions { margin-top: 16px; display: flex; gap: 8px; flex-wrap: wrap; }
.page-auth .auth-actions .btn-auth { width: auto; height: 44px; }

/* The site focus law on a dark ground: the ring is white here. */
.page-auth :focus-visible { outline-color: #FFFFFF; }

/* ---- responsive: the closed set, not m.css's twelve ---- */
@media (max-width: 1024px) {
  .page-auth .auth-shell { grid-template-columns: 1fr; min-height: 100dvh; }
  .page-auth .auth-aside { padding: 44px var(--s5) 40px; }
  .page-auth .auth-aside-in { max-width: 520px; }
  .page-auth .auth-pitch { font-size: 30px; }
  .page-auth .auth-main { border-left: 0; border-top: 1px solid rgba(255, 255, 255, .08); }
}
@media (max-width: 480px) {
  .page-auth .auth-aside { padding: 36px var(--s5) 32px; }
  .page-auth .auth-pitch { font-size: 27px; }
  .page-auth .auth-main { padding: var(--s7) var(--s5) 150px; } /* banner clearance under the submit row */
}

/* css/pages/compare-dark.css */
/* marketing/css/pages/compare-dark.css - the COMPARE family, dark (the hub and the six rival pages, held
 * until the site's one cutover). Every page keeps its markup and copy; marketing/css/theme-dark.css skins
 * the base vocabulary and this sheet holds only the family's own devices: the identity pills, the byline,
 * the short-version card and the three-column comparison table with its phone stack. Keyed on the family
 * class compare-dark. Values are the recipes' (docs/UI_PATTERN_CATALOG.md 2.16). Laws kept: weights
 * 400/500 only; breakpoints 1180/1024/768/480 only; no forced overrides; radii 0 and 2 on the site. */

/* the hub: the rival cards pin their read link to the foot */
.compare-dark .cmp-card { display: flex; flex-direction: column; }
.compare-dark .cmp-card .h3-block { margin-top: 12px; font-size: 22px; letter-spacing: -0.02em; }
.compare-dark .cmp-card p { margin-top: 10px; }
.compare-dark .cmp-card .btn-text { margin-top: auto; padding-top: 18px; align-self: flex-start; }
.compare-dark .grid-3 h2 + p { margin-top: 10px; }
/* the hero pills: ours in the blue, the rival on a hairline; the separator muted */
.compare-dark .vs-pills { display: flex; align-items: center; justify-content: center; gap: 12px; margin: 0; }
.compare-dark .vs-pill { display: inline-flex; align-items: center; height: 34px; padding: 0 14px; border: 1px solid var(--dk-line-strong); border-radius: 2px; background: transparent; font: 500 12px var(--sans); letter-spacing: 0.06em; text-transform: uppercase; color: var(--dk-grey); }
.compare-dark .vs-pill.is-us { border-color: rgba(85, 168, 255, 0.5); color: var(--dk-blue); }
.compare-dark .vs-sep { font: 500 12px var(--sans); letter-spacing: 0.08em; text-transform: uppercase; color: var(--dk-muted); }
.compare-dark .byline { font-size: 13px; color: var(--dk-muted); margin: 0; }
/* the short version: three paragraphs in one glass module, the first leading */
.compare-dark .tldr { display: grid; gap: 14px; }
.compare-dark .tldr .sec-label { margin: 0; }
.compare-dark .tldr p { margin: 0; max-width: 72ch; color: var(--dk-grey); }
.compare-dark .tldr p:first-of-type { font-size: 20px; letter-spacing: -0.01em; line-height: 1.45; color: var(--dk-text); }
.compare-dark .demo-cta { margin-top: 24px; display: flex; gap: 10px; flex-wrap: wrap; justify-content: center; }
/* the three-column table: hairlines, our column carries the weight and a faint ground */
.compare-dark .cmp-wrap { overflow-x: auto; border: 1px solid var(--dk-line-soft); background: transparent; }
.compare-dark .cmp { min-width: 780px; width: 100%; border-collapse: collapse; font-size: 13.5px; }
.compare-dark .cmp thead th { padding: 14px 20px; text-align: left; font: 500 12px var(--sans); letter-spacing: 0.06em; text-transform: uppercase; color: var(--dk-muted); background: rgba(255, 255, 255, 0.03); border-bottom: 1px solid var(--dk-line); }
.compare-dark .cmp thead th.us { color: var(--dk-text); background: rgba(255, 255, 255, 0.05); }
.compare-dark .cmp tbody th, .compare-dark .cmp tbody td { padding: 16px 20px; border-top: 1px solid var(--dk-line-soft); vertical-align: top; text-align: left; line-height: 1.55; }
.compare-dark .cmp tbody th { width: 22%; font: 500 12px var(--sans); letter-spacing: 0.06em; text-transform: uppercase; color: var(--dk-muted); }
.compare-dark .cmp tbody td { width: 39%; color: var(--dk-grey); }
.compare-dark .cmp tbody td.us { color: var(--dk-text); font-weight: 500; background: rgba(255, 255, 255, 0.025); }
.compare-dark .cmp-note { margin-top: 18px; max-width: 76ch; }
@media (max-width: 768px) {
  /* the table becomes a stack of row cards, each cell labelled from data-col */
  .compare-dark .cmp-wrap { overflow-x: visible; border: 0; }
  .compare-dark .cmp { min-width: 0; display: block; }
  .compare-dark .cmp thead { display: none; }
  .compare-dark .cmp tbody { display: block; }
  .compare-dark .cmp tbody tr { display: block; border: 1px solid var(--dk-line-strong); background: var(--dk-glass); padding: 16px; }
  .compare-dark .cmp tbody tr + tr { margin-top: 12px; }
  .compare-dark .cmp tbody th, .compare-dark .cmp tbody td { display: block; width: auto; padding: 0; border-top: 0; }
  .compare-dark .cmp tbody td { margin-top: 12px; }
  .compare-dark .cmp tbody td.us { background: transparent; }
  .compare-dark .cmp tbody td::before { content: attr(data-col); display: block; margin-bottom: 2px; font: 500 10px var(--sans); letter-spacing: 0.08em; text-transform: uppercase; color: var(--dk-muted); }
  .compare-dark .tldr p:first-of-type { font-size: 17px; }
  .compare-dark .vs-pills { flex-wrap: wrap; }
}

/* css/pages/compare.css */
/* The compare group (P1 §P-12/13/14): the /compare hub (.page-compare) and BOTH comparison
 * children (.page-vs). One stylesheet because the three pages are one template family — the
 * children are identical templates with different rivals, and splitting three near-empty files
 * across them would put the shared table rules in whichever child happened to ship first.
 *
 * Every component here composes base.css. What is genuinely new: the "X vs Y" hero pills and the
 * three-column comparison table, which has no base equivalent (.spec is a two-column spec sheet).
 */

/* ------------------------------------------------------------------ /compare (hub) */
/* The hub hero carries no visual, so a full 96px foot on top of the next band's padding reads as
 * a hole rather than air — same 64 + 96 correction the about page makes. */
.page-compare .band-hero { padding-bottom: var(--s8); }
.page-compare .band-hero .sub-hero { margin-top: var(--s5); }
.page-compare .grid-3 h2 + p { margin-top: var(--s3); }

/* Rival cards: the calibration chip sits above the name, and the read link is pinned to the
 * bottom edge so two cards of unequal copy length still line their CTAs up. */
.page-compare .cmp-card { display: flex; flex-direction: column; }
.page-compare .cmp-card .h3-block { margin-top: var(--s4); }
.page-compare .cmp-card p { margin-top: var(--s3); }
.page-compare .cmp-card .btn-text { margin-top: auto; padding-top: var(--s5); align-self: flex-start; }

.page-compare .row-split { align-items: start; }

/* --------------------------------------------------- /compare/* (both child pages) */
/* Hero identity pills. Deliberately NOT rounded-full: the pill is Searchable's signature
 * geometry (P2 §5), so these take the control radius from our own scale. No rival logos —
 * we hold no licence to reproduce another company's mark, and the names carry it fine. */
.page-vs .vs-pills {
  display: flex;
  align-items: center;
  gap: var(--s3);
  margin-bottom: var(--s5);
}
.page-vs .vs-pill {
  display: inline-flex;
  align-items: center;
  height: 34px;
  padding: 0 14px;
  border: 1px solid var(--dust);
  border-radius: var(--r-ctl);
  background: var(--panel);
  font-family: var(--mono);
  font-size: 12px;
  font-weight: 500;
  letter-spacing: 0.06em;
  text-transform: uppercase;
  color: var(--iron);
}
/* Our own pill in the rival strip, on all six comparison pages: 12px in --accent was 2.35:1.
   Border and ground stay --accent; only the label moves to the accessible blue (COL-01). */
.page-vs .vs-pill.is-us { border-color: var(--accent-tint-border); background: var(--accent-soft); color: var(--accent-ink-hover); }
.page-vs .vs-sep { font-family: var(--mono); font-size: 12px; letter-spacing: 0.08em; text-transform: uppercase; color: var(--steel); }

.page-vs .band-hero .sub-hero { margin-top: var(--s5); }
.page-vs .band-hero .cta-row { margin-top: var(--s6); }
.page-vs .byline { margin-top: var(--s5); }

/* TL;DR card: three sentences, three paragraphs, first one leading. */
.page-vs .tldr p { max-width: var(--measure-read); }
.page-vs .tldr p + p { margin-top: var(--s4); }
.page-vs .tldr p:first-of-type { font-size: 20px; letter-spacing: -0.01em; line-height: 1.45; }

.page-vs .grid-3 .eyebrow { margin-bottom: var(--s3); }
.page-vs .grid-3 .h4 + p { margin-top: var(--s3); }

.page-vs .demo-cta { margin-top: var(--s5); }
.page-vs .row-split { align-items: start; }
.page-vs .cmp-note { margin-top: var(--s4); max-width: var(--measure-hero); }

/* ------------------------------------------------- the three-column comparison table */
/* Wide content scrolls inside its own container, never the page. The affordance is the native
 * scrollbar and the visibly cut column: a fade edge would be a gradient, which is banned in
 * public CSS outside the marketing shell. Below 768 the table stops being a table (see below),
 * so the scroll only ever exists on tablet-and-up. */
.page-vs .cmp-wrap {
  overflow-x: auto;
  border: 1px solid var(--line);
  border-radius: var(--r-card);
  background: var(--panel);
}
.page-vs .cmp { min-width: 780px; font-size: 15px; }
.page-vs .cmp thead th {
  background: var(--ink);
  color: var(--on-ink-text);
  font-family: var(--mono);
  font-size: 11px;
  font-weight: 500;
  letter-spacing: 0.08em;
  text-transform: uppercase;
  text-align: left;
  padding: 14px 20px;
}
.page-vs .cmp thead th:not(.us):not(:first-child) { color: var(--on-ink-body); }
.page-vs .cmp tbody th,
.page-vs .cmp tbody td {
  padding: 18px 20px;
  border-top: 1px solid var(--line);
  vertical-align: top;
  text-align: left;
}
.page-vs .cmp tbody th {
  width: 22%;
  font-family: var(--mono);
  font-size: 12px;
  font-weight: 500;
  letter-spacing: 0.06em;
  text-transform: uppercase;
  color: var(--steel);
}
.page-vs .cmp tbody td { width: 39%; color: var(--iron); }
/* Our column is the read-first one: full ink, medium weight. The rival column stays iron. No
 * colour is spent here — cobalt marks CTAs, links, key stats and numerals, not table columns. */
.page-vs .cmp tbody td.us { color: var(--ink); font-weight: 500; background: var(--band-tint); }
.page-vs .cmp thead th.us { background: var(--carbon); }

@media (max-width: 768px) {
  /* The table becomes a stack of row cards. A 3-column comparison at 375px is unreadable
     sideways, and the row label plus two labelled cells is the same information vertically. */
  .page-vs .cmp-wrap { overflow-x: visible; border: 0; border-radius: 0; background: transparent; }
  .page-vs .cmp { min-width: 0; display: block; }
  .page-vs .cmp thead { display: none; }
  .page-vs .cmp tbody { display: block; }
  .page-vs .cmp tbody tr {
    display: block;
    border: 1px solid var(--line);
    border-radius: var(--r-card);
    background: var(--panel);
    padding: var(--s4);
  }
  .page-vs .cmp tbody tr + tr { margin-top: var(--s3); }
  .page-vs .cmp tbody th,
  .page-vs .cmp tbody td { display: block; width: auto; padding: 0; border-top: 0; }
  .page-vs .cmp tbody td { margin-top: var(--s3); }
  .page-vs .cmp tbody td.us { background: transparent; }
  .page-vs .cmp tbody td::before {
    content: attr(data-col);
    display: block;
    margin-bottom: 2px;
    font-family: var(--mono);
    font-size: 10px;
    font-weight: 500;
    letter-spacing: 0.08em;
    text-transform: uppercase;
    color: var(--steel);
  }
  .page-vs .tldr p:first-of-type { font-size: 17px; }
  .page-vs .vs-pills { flex-wrap: wrap; }
}

/* css/pages/docs-new.css */
/* marketing/css/pages/docs-new.css - /docs, LIGHT in the new style (George, 2026-09-06: "docs pages stay
 * light theme but in the new style"), held until the site's one cutover. The page keeps its markup and
 * copy and the light system's colours (base.css tokens); what changes is the geometry the site now
 * uses everywhere: the 1120 column with its two rules, square corners (A3: site 0, controls 2),
 * hairlines instead of tinted fills, the statement type roles, and the new nav (navStyle: new).
 * Scoped under .page-docs-new; the light docs.css keyed on .page-docs stays for the live page until
 * cutover, when it retires. Laws kept: weights 400/500/600; breakpoints 1180/1024/768/480; no forced
 * overrides. Text blue is --accent-ink (COL-01), never --accent. */
:root:has(.page-docs-new) { --container: 1120px; }
.page-docs-new .wrap-wide { width: 100%; max-width: var(--container); margin: 0 auto; padding: 0 var(--gutter); }
/* the hero: a statement, no eyebrow */
.page-docs-new .doc-hero { padding: 96px 0 8px; }
.page-docs-new .doc-hero .eyebrow { display: none; }
.page-docs-new .doc-hero h1 { font-size: 46px; font-weight: 500; letter-spacing: -0.03em; line-height: 1.12; margin: 0 0 16px; color: var(--ink); max-width: 22ch; }
.page-docs-new .doc-hero .lead { color: var(--muted); font-size: 16px; line-height: 1.6; max-width: 60ch; margin: 0; }
/* the shell: the side nav on a hairline, the reading column capped at a measure */
.page-docs-new .shell { display: grid; grid-template-columns: 232px minmax(0, 1fr); gap: 56px; align-items: start; padding: 48px var(--gutter) 120px; }   /* the gutter stays: this rule beats .wrap-wide on the same element */
.page-docs-new .side { position: sticky; top: 88px; max-height: calc(100vh - 112px); overflow-y: auto; font-size: 14px; padding: 0 0 20px; border-left: 1px solid var(--line); }
.page-docs-new .side h6 { font: 500 12px/1.3 var(--sans); letter-spacing: 0.06em; text-transform: uppercase; color: var(--steel); margin: 22px 0 6px 14px; }
.page-docs-new .side h6:first-child { margin-top: 0; }
.page-docs-new .side a { display: block; padding: 6px 14px; margin-left: -1px; color: var(--muted); border-left: 2px solid transparent; border-radius: 0; line-height: 1.45; }
.page-docs-new .side a:hover { color: var(--ink); text-decoration: none; }
.page-docs-new .side a.on { color: var(--ink); border-left-color: var(--ink); background: transparent; font-weight: 500; }
.page-docs-new .side a.sub { padding-left: 28px; font-size: 13px; }
.page-docs-new .doc { max-width: 72ch; min-width: 0; }
.page-docs-new .doc h2 { font-size: 26px; font-weight: 500; letter-spacing: -0.022em; line-height: 1.2; margin: 72px 0 12px; padding-top: 26px; border-top: 1px solid var(--line); scroll-margin-top: 88px; color: var(--ink); }
.page-docs-new .doc section:first-child h2 { margin-top: 0; border-top: 0; padding-top: 0; }
.page-docs-new .doc h3 { font-size: 18px; font-weight: 500; margin: 36px 0 8px; scroll-margin-top: 88px; color: var(--ink); }
.page-docs-new .doc h4 { font-size: 15px; font-weight: 500; margin: 26px 0 6px; }
.page-docs-new .doc p { margin: 0 0 12px; font-size: 15px; line-height: 1.68; color: var(--muted); }
.page-docs-new .doc p b, .page-docs-new .doc li b { color: var(--ink); font-weight: 500; }
.page-docs-new .doc ul { list-style: disc; padding-left: 24px; margin: 0 0 14px; font-size: 15px; line-height: 1.68; color: var(--muted); }
.page-docs-new .doc ol:not(.pubsteps) { list-style: decimal; padding-left: 24px; margin: 0 0 14px; font-size: 15px; line-height: 1.68; color: var(--muted); }
.page-docs-new .doc li:not(.pubsteps > li) { margin: 4px 0; padding-left: 2px; }
.page-docs-new .doc .sub { color: var(--muted); }
.page-docs-new .doc a:not(.btn) { color: var(--accent-ink); font-weight: 500; }
/* code: square, hairline, on paper */
.page-docs-new .doc pre { background: var(--paper); border: 1px solid var(--line); border-radius: 0; padding: 14px 16px; overflow-x: auto; font: 12.5px/1.7 var(--code); color: var(--ink); margin: 12px 0 18px; max-width: 100%; }
.page-docs-new .doc code { font-family: var(--code); font-size: 0.9em; background: var(--paper); border: 1px solid var(--line); border-radius: 2px; padding: 1px 6px; }
.page-docs-new .doc pre code { background: none; border: 0; padding: 0; font-size: inherit; }
.page-docs-new .doc p code, .page-docs-new .doc li code, .page-docs-new .doc td code { overflow-wrap: anywhere; word-break: break-word; white-space: normal; }
/* tables: the hairline table */
.page-docs-new .doc .tw { overflow-x: auto; margin: 10px 0 18px; border: 1px solid var(--line); }
.page-docs-new .doc table { width: 100%; border-collapse: collapse; font-size: 13.5px; }
.page-docs-new .doc th { text-align: left; font: 500 11px var(--sans); letter-spacing: 0.05em; text-transform: uppercase; color: var(--steel); padding: 10px 12px; border-bottom: 1px solid var(--line-strong); white-space: nowrap; }
.page-docs-new .doc td { padding: 10px 12px; border-top: 1px solid var(--line); vertical-align: top; color: var(--muted); line-height: 1.55; }
.page-docs-new .doc td:first-child { font-family: var(--code); font-size: 12.5px; color: var(--ink); max-width: 380px; overflow-wrap: anywhere; }
/* notes and steps: hairline panels, square counters */
.page-docs-new .doc .note { background: var(--paper); border: 1px solid var(--line-strong); border-radius: 0; padding: 12px 16px; font-size: 14px; line-height: 1.6; margin: 16px 0; color: var(--muted); }
.page-docs-new .doc .note b { color: var(--ink); }
.page-docs-new .doc .note a:not(.btn) { color: var(--accent-ink); }
.page-docs-new .pubsteps { list-style: none; counter-reset: s; padding: 0; margin: 16px 0 8px; }
.page-docs-new .pubsteps > li { counter-increment: s; position: relative; padding: 2px 0 18px 46px; min-height: 30px; font-size: 15px; line-height: 1.65; color: var(--muted); }
.page-docs-new .pubsteps > li:last-child { padding-bottom: 0; }
.page-docs-new .pubsteps > li::before { content: counter(s); position: absolute; left: 0; top: -2px; width: 30px; height: 30px; border-radius: 2px; border: 1px solid var(--line-strong); background: var(--panel); color: var(--ink); font-weight: 500; display: grid; place-items: center; font-size: 14px; }
/* endpoint rows: the method as a hairline chip, the path in the mono face, the auth as a square tag */
.page-docs-new .ep { display: flex; align-items: baseline; gap: 10px; flex-wrap: wrap; margin: 30px 0 8px; scroll-margin-top: 88px; }
.page-docs-new .ep .vm { font: 600 11px/1 var(--code); letter-spacing: 0.05em; padding: 5px 8px; border-radius: 2px; border: 1px solid var(--line-strong); background: var(--panel); color: var(--ink); align-self: center; }
.page-docs-new .ep code { font: 600 14px var(--code); background: none; border: 0; padding: 0; word-break: break-all; color: var(--ink); }
.page-docs-new .ep .auth { font-size: 11.5px; color: var(--steel); border: 1px solid var(--line); padding: 3px 10px; border-radius: 2px; white-space: nowrap; align-self: center; }
.page-docs-new .dlrow { display: flex; align-items: center; gap: 12px; flex-wrap: wrap; margin: 16px 0; }
.page-docs-new .dlrow .btn { border-radius: 2px; }
.page-docs-new .muted-s { color: var(--muted); font-size: 13.5px; }
@media (max-width: 1024px) {
  .page-docs-new .shell { grid-template-columns: 1fr; gap: 26px; }
  .page-docs-new .side { position: static; max-height: none; display: flex; flex-wrap: wrap; gap: 8px; background: transparent; border: 1px solid var(--line); border-left: 1px solid var(--line); border-radius: 0; padding: 14px; }
  .page-docs-new .side h6 { display: none; }
  .page-docs-new .side a, .page-docs-new .side a.on { border: 1px solid var(--line); border-radius: 2px; padding: 6px 13px; font-size: 13px; margin: 0; }
  .page-docs-new .side a.on { border-color: var(--ink); }
  .page-docs-new .side a.sub { display: none; }
}
@media (max-width: 768px) {
  .page-docs-new .doc-hero { padding-top: 64px; }
  .page-docs-new .doc-hero h1 { font-size: 34px; }
}
@media (max-width: 620px) {
  .page-docs-new .doc table { display: block; width: 100%; max-width: 100%; overflow-x: auto; }
  .page-docs-new .doc td:first-child { max-width: none; }
}

/* css/pages/docs.css */
/* /docs — lifted out of the inline <style> in public/docs.html when the page moved onto the
 * marketing shell (George, 2026-08-24: "move them to the new nav for continuity throughout").
 *
 * Scoped under .page-docs on purpose: .shell, .side and .doc are generic names, and an unscoped
 * copy in the shared bundle would ambush the next page that reaches for one of them.
 *
 * Tokens are mapped from m.css, not copied. Two are not like-for-like:
 *   --accent  m.css #376EC1 -> marketing #55A8FF. The light one fails AA below 18px, so EVERY
 *             text use takes --accent-ink (#1D6FC7); rules, borders and tints keep --accent.
 *   --subtle  -> --steel, which is the marketing set's AA-passing secondary at caption sizes.
 *
 * That first line used to end "...so the active sidebar link (14px) takes --accent-ink", and only
 * that one selector had been moved. Four others were still painting text in --accent, which is why
 * scripts/ui-audit.mjs counted 345 contrast failures on this page alone - 200 on the .vm method
 * chips, 115 on body links, 30 on .note b - every one of them 2.35:1 against AA's 4.5. The rule was
 * right in the comment and wrong in the file. DESIGN_SYSTEM.md COL-01: #55A8FF is a NON-TEXT
 * graphic colour that fails even the 3:1 large-text threshold; textual blue is #1D6FC7.
 *
 * The same pass dropped two font-weight: 700 declarations (.vm, .pubsteps counter) to 600. Marketing
 * loads 400/500/600 only (DESIGN_SYSTEM.md 5.1), so 700 was being synthesized by the browser.
 */
/* ---- docs shell: sticky section nav + reading column ---- */
.page-docs .doc-hero {padding:64px 0 8px}
.page-docs .doc-hero h1 {font-size:clamp(32px,4.6vw,44px);letter-spacing:-.03em;margin:18px 0 12px}
.page-docs .doc-hero .lead {color:var(--muted);font-size:17px;max-width:640px;line-height:1.6}
.page-docs .shell {display:grid;grid-template-columns:216px minmax(0,1fr);gap:52px;align-items:start;padding-top:34px;padding-bottom:120px}
.page-docs .side {position:sticky;top:88px;max-height:calc(100vh - 112px);overflow-y:auto;font-size:14px;padding:2px 0 20px}
.page-docs .side h6 {font-size:11px;font-weight:600;text-transform:uppercase;letter-spacing:.07em;color:var(--steel);margin:20px 0 6px 10px}
.page-docs .side h6:first-child {margin-top:0}
.page-docs .side a {display:block;padding:5px 10px;color:var(--muted);border-left:2px solid transparent;border-radius:0 8px 8px 0;line-height:1.45}
.page-docs .side a:hover {color:var(--ink)}
.page-docs .side a.on {color:var(--accent-ink-hover);border-left-color:var(--accent);background:var(--accent-soft);font-weight:500}
.page-docs .side a.sub {padding-left:24px;font-size:13px}
.page-docs .doc {max-width:780px;min-width:0}
.page-docs .doc h2 {font-size:26px;letter-spacing:-.022em;margin:72px 0 12px;padding-top:26px;border-top:1px solid var(--line);scroll-margin-top:88px}
.page-docs .doc section:first-child h2 {margin-top:0;border-top:0;padding-top:0}
.page-docs .doc h3 {font-size:18px;margin:36px 0 8px;scroll-margin-top:88px}
.page-docs .doc h4 {font-size:15px;margin:26px 0 6px}
.page-docs .doc p {margin:0 0 12px;font-size:15px;line-height:1.68}
.page-docs .doc ul, .page-docs .doc ol:not(.pubsteps) {margin:0 0 14px;padding-left:22px;font-size:15px;line-height:1.68}
.page-docs .doc li:not(.pubsteps>li) {margin:4px 0}
.page-docs .doc .sub {color:var(--muted)}
/* :not(.btn) because a button owns its own colour. `.page-docs .doc a` is (0,2,1) and beats
   `.btn.primary` (0,2,0), so this rule was repainting the "Download the WordPress plugin" CTA -
   which sits on --ink - in a blue picked for a light ground. It has been doing that all along with
   --accent (#55A8FF, ~5.6:1 on ink, so the audit never saw it); switching to --accent-ink dropped
   it to 2.96:1 and the audit caught it immediately. A colour is accessible against a GROUND, not
   in the abstract, and a page rule must not reach inside a shared primitive (DESIGN_SYSTEM LAY-04). */
.page-docs .doc a:not(.btn) {color:var(--accent-ink);font-weight:500}
.page-docs .doc .note a:not(.btn) {color:var(--accent-ink-hover)} /* on the soft fill 1D6FC7 is 4.40:1 */
.page-docs .doc pre {background:var(--band-tint);border:1px solid var(--line);border-radius:12px;padding:14px 16px;overflow-x:auto;font:12.5px/1.7 var(--code);color:var(--ink);margin:12px 0 18px}
.page-docs .doc code {font-family:var(--code);font-size:.9em;background:var(--band-tint);border:1px solid var(--line);border-radius:6px;padding:1px 6px}
.page-docs .doc pre code {background:none;border:0;padding:0;font-size:inherit}
.page-docs .doc .tw {overflow-x:auto;margin:10px 0 18px}
.page-docs .doc table {width:100%;border-collapse:collapse;font-size:13.5px}
.page-docs .doc th {text-align:left;font-weight:600;color:var(--steel);font-size:11px;text-transform:uppercase;letter-spacing:.05em;padding:7px 10px;border-bottom:1px solid var(--line-strong);white-space:nowrap}
.page-docs .doc td {padding:8px 10px;border-bottom:1px solid var(--line);vertical-align:top;color:var(--muted);line-height:1.55}
.page-docs .doc td:first-child {font-family:var(--code);font-size:12.5px;color:var(--ink);max-width:380px;overflow-wrap:anywhere}
.page-docs .doc .note {background:var(--accent-soft);border:1px solid rgba(55,110,193,.2);border-radius:12px;padding:12px 16px;font-size:14px;line-height:1.6;margin:16px 0}
.page-docs .doc .note b {color:var(--accent-ink-hover)}
/* The generic .doc list rules above and below out-specify .pubsteps (they add an element to two classes),
   which put the native decimal marker AND the counter chip on every step, with the chip over the first
   letters at 390 (found by the Phase C docs capture, 2026-09-03). The step list is excluded from them. */
.page-docs .pubsteps {list-style:none;counter-reset:s;padding:0;margin:16px 0 8px}
.page-docs .pubsteps>li {counter-increment:s;position:relative;padding:2px 0 18px 46px;min-height:30px;font-size:15px;line-height:1.65}
.page-docs .pubsteps>li:last-child {padding-bottom:0}
.page-docs .pubsteps>li::before {content:counter(s);position:absolute;left:0;top:-2px;width:30px;height:30px;border-radius:9px;background:var(--accent-soft);color:var(--accent-ink-hover);font-weight:600;display:grid;place-items:center;font-size:14px}
/* endpoint header row: method chip + path; data-ep-* attributes are asserted against the
   live route table by test/e2e.test.js, so a documented path that stops existing fails CI */
.page-docs .ep {display:flex;align-items:baseline;gap:10px;flex-wrap:wrap;margin:30px 0 8px;scroll-margin-top:88px}
.page-docs .ep .vm {font:600 11px/1 var(--code);letter-spacing:.05em;padding:5px 8px;border-radius:7px;background:var(--accent-soft);color:var(--accent-ink-hover);align-self:center}
.page-docs .ep code {font:600 14px var(--code);background:none;border:0;padding:0;word-break:break-all}
.page-docs .ep .auth {font-size:11.5px;color:var(--steel);border:1px solid var(--line);padding:3px 10px;border-radius:999px;white-space:nowrap;align-self:center}
.page-docs .dlrow {display:flex;align-items:center;gap:12px;flex-wrap:wrap;margin:16px 0}
.page-docs .muted-s {color:var(--muted);font-size:13.5px}
@media(max-width:960px){
  .page-docs .shell {grid-template-columns:1fr;gap:26px}
  .page-docs .side {position:static;max-height:none;display:flex;flex-wrap:wrap;gap:8px;background:var(--panel);border:1px solid var(--line);border-radius:16px;padding:14px}
  .page-docs .side h6 {display:none}
  .page-docs .side a, .page-docs .side a.on {border:1px solid var(--line);border-left:1px solid var(--line);border-radius:999px;padding:6px 13px;font-size:13px}
  .page-docs .side a.on {border-color:rgba(55,110,193,.35)}
  .page-docs .side a.sub {display:none}
}
/* Inline response examples must wrap AT EVERY WIDTH. This lived inside @media(max-width:620px),
   so a long response shape widened the whole documentation page on tablet and desktop: measured
   353px of horizontal overflow at 768px and 29px at 1440px, the worst offender being a 1097px-wide
   /api/v1/site-health response shape. A page that scrolls sideways is broken at any breakpoint. */
.page-docs .doc ol:not(.pubsteps) {list-style:decimal;padding-left:24px}
.page-docs .doc ul {list-style:disc;padding-left:24px}
.page-docs .doc ol:not(.pubsteps) li, .page-docs .doc ul li {padding-left:2px;margin:4px 0}
.page-docs .doc p code, .page-docs .doc li code, .page-docs .doc td code {overflow-wrap:anywhere;word-break:break-word;white-space:normal}
@media(max-width:620px){
  /* Fenced examples and data tables scroll inside their own frame rather than widening the page. */
  .page-docs .doc pre {max-width:100%}
  .page-docs .doc table {display:block;width:100%;max-width:100%;overflow-x:auto}
  .page-docs .doc td:first-child {max-width:none}
}

/* CONTAINER. The source markup uses .wrap-wide, an m.css class with no counterpart here, so the
   hero and the shell had no measure at all and ran to the viewport edge.

   IT IS --container (960), NOT --container-mid (1100). The note this replaces argued that "docs is
   legitimately wider than 960: a 216px sidebar plus a 780px reading column does not fit in it, and
   --container-mid is the registered wider band, which is exactly this case." The premise is true
   and the conclusion is the one thing both authorities forbid:

     DESIGN_SYSTEM.md MKT-LAY-02 - "Text remains within the default or reading measure. The 1100px
       breakout is not a convenient wider page wrapper."
     DESIGN_DIRECTION.md          - "--container-mid ... is the ONE band the mockup lets break out:
       the dashboard ... wrap-mid is for the dashboard breakout and nothing else."

   What it cost, measured at 1440/1180/1024 (2026-08-26): the column rules are drawn at the edges
   of a 960 box, so an 1100 shell put every line of this page ~38px OUTSIDE them. The left rule ran
   down through the H1, the lede and all 14 sidebar links; the right rule ran through the right
   edge of every body paragraph. 250 text nodes sat on a rule, on the most text-heavy public page
   we have - and the rules did not move for it, because they never do.

   The reading column is 628px here rather than 780 (896 usable - 216 sidebar - 52 gap). Narrower
   is also better: 780 read at ~102 characters a line. Nothing width-sensitive breaks, because the
   two things that need width already carry their own scrollers - .doc pre and .doc .tw are both
   overflow-x: auto. */
.page-docs .wrap-wide {
  width: 100%;
  max-width: var(--container);
  margin: 0 auto;
  padding: 0 var(--gutter);
}
/* The eyebrow carries an inline icon here; every other eyebrow on the site is a typed label, so
   give it the alignment it needs rather than letting the glyph sit on the baseline. */
.page-docs .eyebrow { display: inline-flex; align-items: center; gap: var(--s2); }
.page-docs .eyebrow .ic { width: 15px; height: 15px; fill: none; stroke: currentColor; stroke-width: 1.8; }
/* The sidebar's first item was landing level with the lede's last line, which read as one block. */
.page-docs .shell { padding-top: var(--s7); }

/* css/pages/features-ai-visibility.css */
/* /features/ai-visibility — the flagship feature page (P1 §P-04).
 *
 * Four page-specific things live here and nothing else:
 *   1. the breadcrumb, set in the eyebrow's own mono voice so it reads as furniture, not a link row
 *   2. the engine strip — names as text, never a wall of grey third-party logos we have no licence to
 *   3. a two-up variant of the base `.steps` band, because four vertical steps on ink is a scroll
 *   4. the three-column comparison table (base.css ships `.spec`, which is label/value, not a matrix)
 * Everything else composes base.css.
 */

.page-ai-visibility .band-hero .sub-hero { margin-top: var(--s5); }
.page-ai-visibility .band-hero .cta-row { margin-top: var(--s7); }

/* 1. Breadcrumb. Steel by default so the hero's first cobalt is the CTA, not the trail. */
.page-ai-visibility .crumb { margin-bottom: var(--s5); }
.page-ai-visibility .crumb a { color: var(--steel); }
.page-ai-visibility .crumb a:hover { color: var(--accent); text-decoration: none; }

/* 2. Engine strip. The hairline is the band's own top edge — two paper bands in a row otherwise
      read as one very tall band with a gap in the middle. */
.page-ai-visibility .engines-band { border-top: 1px solid var(--line); }
.page-ai-visibility .engines { display: grid; grid-template-columns: minmax(0, 1fr) minmax(0, 1.15fr); gap: var(--s5) var(--s8); align-items: center; }
.page-ai-visibility .engines .eyebrow { margin-bottom: var(--s3); }
.page-ai-visibility .engine-row { display: flex; flex-wrap: wrap; gap: var(--s3) var(--s5); }
.page-ai-visibility .engine-row li {
  display: inline-flex;
  align-items: center;
  gap: 8px;
  font-size: 17px;
  font-weight: 500;
  letter-spacing: -0.01em;
}
.page-ai-visibility .engine-row li::before {
  content: '';
  width: 13px;
  height: 13px;
  background: var(--star-steel) center / contain no-repeat;
}
.page-ai-visibility .engines > p { max-width: var(--measure-read); margin: 0; }

/* Demo footer pair, and the reading rhythm of the thesis block. */
.page-ai-visibility .demo-foot { margin-top: var(--s6); }
.page-ai-visibility .sec-head .star-list { margin-top: var(--s5); }
.page-ai-visibility .proof-units { margin-top: var(--s2); }
.page-ai-visibility .proof-units .h3-block { margin-top: var(--s3); }
.page-ai-visibility .proof-units p { margin-top: var(--s4); }
.page-ai-visibility .proof-units .eyebrow { margin-bottom: 0; }

/* 3. Two-up steps. The base component stacks and self-numbers; this only changes the shape,
      so the `[01]`-`[04]` counter, the cobalt-on-ink numerals and the indent all still come
      from base.css. Resetting the stacked margin is the whole trick. */
.page-ai-visibility .steps-grid { display: grid; grid-template-columns: repeat(2, minmax(0, 1fr)); gap: var(--s7) var(--s8); }
.page-ai-visibility .steps-grid > li + li { margin-top: 0; }
.page-ai-visibility .steps-grid p { margin-top: var(--s2); }

/* 4. Comparison matrix. Flat, hairline-ruled, our column carries the weight — no cobalt fill,
      because a tinted "winner" column is the decorative wash the palette rules forbid. */
.page-ai-visibility .cmp-wrap { overflow-x: auto; }
.page-ai-visibility .cmp { min-width: 720px; font-size: 15px; }
.page-ai-visibility .cmp thead th {
  font-family: var(--mono);
  font-size: 11px;
  font-weight: 500;
  letter-spacing: 0.08em;
  text-transform: uppercase;
  color: var(--steel);
  text-align: left;
  padding: 0 var(--s5) var(--s3) 0;
  border-bottom: 1px solid var(--line-strong);
}
.page-ai-visibility .cmp tbody th,
.page-ai-visibility .cmp tbody td {
  text-align: left;
  vertical-align: top;
  padding: 18px var(--s5) 18px 0;
  border-bottom: 1px solid var(--line);
}
.page-ai-visibility .cmp tbody th { width: 34%; font-weight: 500; color: var(--ink); }
.page-ai-visibility .cmp tbody td { width: 26%; color: var(--iron); }
.page-ai-visibility .cmp tbody td:last-child { width: 40%; color: var(--ink); padding-right: 0; }
.page-ai-visibility .cmp thead th:last-child { padding-right: 0; }
.page-ai-visibility .cmp tbody tr:last-child th,
.page-ai-visibility .cmp tbody tr:last-child td { border-bottom: 0; }
.page-ai-visibility .cmp-note { margin-top: var(--s5); max-width: var(--measure-read); }

@media (max-width: 1024px) {
  .page-ai-visibility .engines { grid-template-columns: minmax(0, 1fr); gap: var(--s5); }
  .page-ai-visibility .steps-grid { gap: var(--s6) var(--s7); }
}

@media (max-width: 768px) {
  .page-ai-visibility .band-hero .cta-row { margin-top: var(--s6); }
  .page-ai-visibility .steps-grid { grid-template-columns: minmax(0, 1fr); gap: var(--s6); }
  .page-ai-visibility .engine-row li { font-size: 16px; }
}

/* AMENDMENT REVIEW 2026-08-18: the engine row carries REAL marks - so the decorative sparkle
   markers double the iconography and read as clutter next to actual logos. Off, logos 24px. */
.page-ai-visibility .engine-row li::before { content: none; }
.page-ai-visibility .engine-row li { display: inline-flex; align-items: center; gap: 10px; padding-left: 0; }
.page-ai-visibility .engine-row img { width: 24px; height: 24px; object-fit: contain; }
/* display:inline-block against the base img reset (img { display:block }), or each mark takes
   its own line and the sentence shatters - caught by eye, second render. */
.page-ai-visibility .engines .body-sm img { display: inline-block; width: 16px; height: 16px; object-fit: contain; vertical-align: -3px; margin-right: 3px; }

/* css/pages/features-content.css */
/* /features/content — P1 §P-06, T2 feature child, and the home of the G7 duel band.
 * Page-specific: the duel, the integrity-gate figure, the pain numerals on ink, the publish strip. */

.page-content .band-hero .sub-hero { margin-top: var(--s5); }
.page-content .band-hero .cta-row { margin-top: var(--s6); }

/* Demo caption row — the demo carries no CTA of its own (demo-embed §4). */
.page-content .demo-note {
  display: flex;
  flex-wrap: wrap;
  align-items: baseline;
  justify-content: space-between;
  gap: var(--s3) var(--s5);
  margin-top: var(--s4);
}
.page-content .demo-note .caption { max-width: 640px; }

/* Pain band: [01]-[03] read white on ink, not cobalt (cobalt on ink is unreadable and the band
   is already the emphasis). */
.page-content .pain .numeral { display: block; color: var(--on-ink-text); margin-bottom: var(--s3); }
.page-content .pain p { margin-top: var(--s3); }

/* ---------------------------------------------------------------- the duel (G7)
 * Searchable stages this as a rival chatbot losing an argument. Ours contrasts two ways of
 * producing the same page, because that is the contrast we can actually evidence. Left panel
 * recedes (band tint, steel, struck lines); right panel is the working surface. */
.page-content .duel {
  display: grid;
  grid-template-columns: repeat(2, minmax(0, 1fr));
  gap: var(--s5);
  align-items: stretch;
}
/* Equal-height columns, verdict line pinned to the foot of each: a duel where one side stops
   short reads as an incomplete panel rather than a shorter argument. */
.page-content .duel-side {
  display: flex;
  flex-direction: column;
  border: 1px solid var(--line);
  border-radius: var(--r-card);
  padding: var(--s6);
}
.page-content .duel-side.is-generic { background: var(--band-tint); }
.page-content .duel-side.is-ours { background: var(--panel); }
.page-content .duel-side .chip { align-self: flex-start; margin-bottom: var(--s5); }
.page-content .duel-side > p { margin-top: auto; padding-top: var(--s5); }

.page-content .duel-strikes > li {
  display: flex;
  align-items: flex-start;
  gap: 10px;
  margin-top: var(--s3);
  color: var(--steel);
}
.page-content .duel-strikes > li .ic { width: 16px; height: 16px; margin-top: 3px; }
/* The strike belongs to the words, not the icon — a struck cross reads as a smudge. */
.page-content .duel-strikes > li span { text-decoration: line-through; text-decoration-thickness: 1px; }

/* ------------------------------------------------------- the integrity-gate figure
 * The money moment: the publish response as the product actually returns it. Every fabricated
 * string in it wears the demo chip, and the numbers shown are the ones being REFUSED. */
.page-content .gate {
  background: var(--panel);
  border: 1px solid var(--line-strong);
  border-radius: var(--r-card);
  overflow: hidden;
}
.page-content .gate-head {
  display: flex;
  flex-wrap: wrap;
  align-items: center;
  gap: var(--s3);
  padding: 12px var(--s5);
  border-bottom: 1px solid var(--line);
  background: var(--band-tint);
}
.page-content .gate-route {
  font-family: var(--mono);
  font-size: 12px;
  letter-spacing: 0.02em;
  color: var(--iron);
}
.page-content .gate-status {
  color: var(--danger);
  border-color: rgba(180, 66, 63, 0.45);
  background: rgba(180, 66, 63, 0.07);
}
.page-content .gate-body { padding: var(--s2) var(--s5); }
.page-content .gate-row {
  display: grid;
  grid-template-columns: 160px minmax(0, 1fr);
  gap: var(--s4);
  align-items: baseline;
  padding: var(--s4) 0;
  border-bottom: 1px solid var(--line);
}
.page-content .gate-row:last-child { border-bottom: 0; }
.page-content .gate-tag {
  font-family: var(--mono);
  font-size: 11px;
  font-weight: 500;
  letter-spacing: 0.08em;
  text-transform: uppercase;
  color: var(--danger);
}
.page-content .gate-quote { font-size: 17px; }
.page-content .gate-reason { display: block; margin-top: 4px; font-size: 15px; color: var(--iron); }
.page-content .gate-foot {
  padding: 14px var(--s5);
  border-top: 1px solid var(--line);
  background: var(--band-tint);
  font-size: 15px;
  color: var(--iron);
}
.page-content .reg-ticks { margin-top: var(--s5); }

/* Proof units + how-it-works, same rhythm as the sibling feature pages. */
.page-content .unit .eyebrow { margin-bottom: var(--s3); }
.page-content .unit p { margin-top: var(--s3); }
.page-content .how { grid-template-columns: minmax(0, 0.85fr) minmax(0, 1.15fr); align-items: start; }
.page-content .how .sec-head { margin-bottom: 0; }

/* Publish strip: four routes, one line each, then the link to the full page. */
.page-content .publish p { margin-top: var(--s3); }
.page-content .publish code,
.page-content .acc code { font-family: var(--mono); font-size: 0.92em; }
.page-content .publish + p { margin-top: var(--s6); }

@media (max-width: 1024px) {
  .page-content .gate-row { grid-template-columns: 140px minmax(0, 1fr); gap: var(--s3); }
}

@media (max-width: 768px) {
  .page-content .duel { grid-template-columns: minmax(0, 1fr); }
  .page-content .how { grid-template-columns: minmax(0, 1fr); gap: var(--s6); }
  .page-content .gate-row { grid-template-columns: minmax(0, 1fr); gap: 6px; }
  .page-content .gate-quote { font-size: 16px; }
  .page-content .demo-note { gap: var(--s3); }
}

@media (max-width: 480px) {
  .page-content .duel-side { padding: var(--s5); }
  .page-content .gate-head { padding: 12px var(--s4); }
  .page-content .gate-body { padding: var(--s2) var(--s4); }
  .page-content .gate-foot { padding: 12px var(--s4); }
}

/* The gate's controls - the product's own evidence-review affordances, rendered as part of the
   figure. Spans styled as controls, deliberately: this is a facsimile, not a dead button. */
.page-content .gate-act { grid-column: 2; display: flex; align-items: center; gap: 8px; margin-top: 2px; font-size: 13px; color: var(--iron); }
.page-content .gate-check { width: 16px; height: 16px; border-radius: 5px; background: var(--ink); flex: none; position: relative; }
.page-content .gate-check::after { content: ''; position: absolute; inset: 4px 3px 5px; border: solid #fff; border-width: 0 0 2px 2px; transform: rotate(-45deg) translateY(-1px); }
.page-content .gate-act.is-fix { color: var(--danger); }

/* `grid-column: 2` above is right at desktop and wrong the moment .gate-row collapses to one
   column at 768. Asking for column 2 in a one-column grid does not clamp - it MAKES an implicit
   second column, and that column took the width: .gate-tag measured 0px wide at 480, so "UNSOURCED
   CLAIM" and "DEAD CITATION" printed straight over the claim text beside them. scripts/ui-audit.mjs
   caught it as its single text-overlap FAIL ("the words themselves overlap by 10x4px").

   This block sits AFTER the .gate-act rules on purpose: same specificity (0,2,0), so source order
   is what decides, and the @media at the top of this file loses to a later flat rule. */
@media (max-width: 768px) {
  .page-content .gate-act { grid-column: auto; }
}
.page-content .gate-actions { display: flex; gap: 10px; padding: 14px 18px; border-top: 1px solid var(--line); }

/* css/pages/features-dark.css */
/* marketing/css/pages/features-dark.css - the FEATURES family, dark (the hub and its six pages, held
 * until the site's one cutover). Every page keeps its markup and copy; marketing/css/theme-dark.css
 * skins the base vocabulary and this sheet holds only the family's own devices: the module rows and
 * their surfaces, the engine strip, the two-up steps, the reporting principles, the scope table.
 * Keyed on the family class features-dark, which every page in the family carries beside its own.
 * Values are the recipes' (docs/UI_PATTERN_CATALOG.md 2.16). Laws kept: weights 400/500 only;
 * breakpoints 1180/1024/768/480 only; no forced overrides; radii 0 and 2 on the site, the product's
 * own inside a surface. */

/* the module index: one column, six rows on hairlines; the surface is the product's own crop on a
   deep ground with the dot grid and the soft blue glow (the mega-menu's featured frame, at row width) */
.features-dark .mrows { border-top: 1px solid var(--dk-line); }
.features-dark .mrow { padding: 72px 0; border-bottom: 1px solid var(--dk-line); }
.features-dark .mrow-head { display: grid; grid-template-columns: 52px minmax(0, 1fr) auto; gap: 24px; align-items: start; }
.features-dark .mnum { font: 500 12px var(--mono, var(--sans)); letter-spacing: 0.06em; color: var(--dk-muted); padding-top: 10px; font-variant-numeric: tabular-nums; }
.features-dark .mrow-txt .h3-block { font-size: 28px; letter-spacing: -0.02em; line-height: 1.15; }
.features-dark .mrow-txt .h3-block a { color: var(--dk-text); text-decoration: none; }
.features-dark .mrow-txt .h3-block a:hover { color: var(--dk-text); text-decoration: underline; text-underline-offset: 4px; text-decoration-color: var(--dk-line-strong); }
.features-dark .mjob { margin-top: 10px; font-size: 17px; font-weight: 500; letter-spacing: -0.01em; line-height: 1.35; color: var(--dk-grey); }
.features-dark .mrow-txt .body-sm { margin-top: 14px; max-width: 60ch; font-size: 14.5px; line-height: 1.6; color: var(--dk-grey); }
.features-dark .mopen { padding-top: 4px; white-space: nowrap; }
/* The surfaces sit inside the column on the dark page: the light hub widened them to the mid container
   so a 495px card would not crop at 481; the dark column is 1120, so the 1000px crops fit without crossing
   the column rules, and their captions stay off the lines. */
.features-dark .wrap-mid { max-width: var(--container); }
.features-dark .msurf { margin: 40px 0 0; }
.features-dark .msurf-frame { position: relative; overflow: hidden; border: 1px solid var(--dk-line-strong); background: linear-gradient(180deg, var(--dk-panel), var(--dk-ground)); padding: 28px 32px 0; }
.features-dark .msurf-frame::before { content: ''; position: absolute; inset: 0; background: radial-gradient(rgba(255, 255, 255, 0.09) 1px, transparent 1.2px) 0 0 / 14px 14px; opacity: 0.7; pointer-events: none; }
.features-dark .msurf-frame::after { content: ''; position: absolute; inset: 0; background: radial-gradient(90% 70% at 20% 0%, rgba(85, 168, 255, 0.28), transparent 62%), radial-gradient(70% 60% at 100% 100%, rgba(85, 168, 255, 0.12), transparent 60%); pointer-events: none; }
.features-dark .msurf-img { position: relative; z-index: 1; display: block; width: 100%; height: auto; border-radius: 12px 12px 0 0; box-shadow: 0 34px 70px -24px rgba(0, 0, 0, 0.75), 0 0 0 1px rgba(0, 0, 0, 0.06); }
.features-dark .msurf-doc { max-width: 720px; }
.features-dark .msurf figcaption { margin-top: 16px; display: flex; flex-wrap: wrap; gap: 8px 12px; align-items: baseline; }
.features-dark .msurf-connect { border: 1px solid var(--dk-line-strong); padding: 64px 0 56px; }
.features-dark .msurf-connect .cfan-in { max-width: none; }
.features-dark .mrows-live { display: flex; flex-wrap: wrap; gap: 8px 12px; align-items: baseline; margin-top: 40px; }
.features-dark .mrows-cta { margin-top: 24px; display: flex; gap: 10px; flex-wrap: wrap; }
/* the reports row's sample document and the shopping row's generator: white paper stays white */
.features-dark .shop-qs { background: var(--dk-glass); border: 1px solid var(--dk-line-strong); padding: 22px 24px; }
.features-dark .shop-qs-h { font-size: 13px; font-weight: 500; color: var(--dk-muted); margin-bottom: 14px; }
.features-dark .shop-qs .tok { color: var(--dk-blue); }
/* the four reporting principles: two-up on hairlines */
.features-dark .rep-principles { gap: 32px 48px; }
.features-dark .rep-principles > div { padding-top: 18px; border-top: 1px solid var(--dk-line-soft); }
.features-dark .rep-principles p { margin-top: 8px; }
/* the scope table: label column, a reading measure on the answer */
.features-dark .spec-scope th { width: 28%; }
.features-dark .spec-scope td { max-width: 62ch; color: var(--dk-grey); }
/* the engine strip (feature pages): real marks, on one hairline */
.features-dark .engines-band { border-top: 1px solid var(--dk-line); }
.features-dark .engines { display: grid; grid-template-columns: minmax(0, 1fr) minmax(0, 1.15fr); gap: 24px 48px; align-items: center; }
.features-dark .engine-row { list-style: none; margin: 0; padding: 0; display: flex; flex-wrap: wrap; gap: 12px 24px; }
.features-dark .engine-row li { display: inline-flex; align-items: center; gap: 10px; font-size: 17px; font-weight: 500; letter-spacing: -0.01em; color: var(--dk-text); }
.features-dark .engine-row img { width: 24px; height: 24px; object-fit: contain; }
.features-dark .engines .body-sm img { display: inline-block; width: 16px; height: 16px; object-fit: contain; vertical-align: -3px; margin-right: 3px; }
.features-dark .engines .body-sm a { color: var(--dk-text); text-decoration: underline; text-underline-offset: 3px; }
/* two-up steps on the feature pages */
.features-dark .steps-grid { display: grid; grid-template-columns: repeat(2, minmax(0, 1fr)); gap: 0 48px; }
.features-dark .proof-units { margin-top: 24px; }
.features-dark .demo-foot { margin-top: 32px; justify-content: center; display: flex; gap: 10px; flex-wrap: wrap; }
.features-dark .cmp-note { margin-top: 18px; max-width: 76ch; }
/* share of voice: the engine coverage strip, the method table's dash, the comparison cards */
.features-dark .coverage { display: flex; flex-wrap: wrap; align-items: baseline; gap: 12px 24px; }
.features-dark .coverage .eyebrow { margin: 0; }
.features-dark .coverage-list { list-style: none; margin: 0; padding: 0; display: flex; flex-wrap: wrap; gap: 12px 24px; }
.features-dark .coverage-list li { font-size: 17px; font-weight: 500; letter-spacing: -0.01em; color: var(--dk-text); }
.features-dark .coverage .caption { flex: 1 1 320px; max-width: 480px; }
.features-dark .spec-na { font: 500 13px var(--mono, var(--sans)); color: var(--dk-text); margin-right: 6px; }
.features-dark .reg-ticks { margin-top: 32px; border: 1px solid var(--dk-line-soft); }
.features-dark .unit .h4 { margin-top: 0; }
.features-dark .unit p { margin-top: 10px; }
.features-dark .compare-card p { margin-top: 10px; }
.features-dark .how .sec-head { margin-bottom: 0; }

/* reports: the line under the demo; integrations: the route cards' marks and the closing lines */
.features-dark .demo-under { display: flex; flex-wrap: wrap; align-items: baseline; justify-content: space-between; gap: 12px 24px; margin-top: 16px; }
.features-dark .demo-under p { margin: 0; max-width: 640px; }
.features-dark .rep-mech { margin-top: 32px; }
.features-dark .int-name { display: flex; align-items: center; gap: 10px; }
.features-dark .int-mark { width: 26px; height: 26px; object-fit: contain; }
.features-dark .int-grid .chip { margin-bottom: 12px; }
.features-dark .int-grid .card p + p { margin-top: 10px; }
.features-dark .int-foot, .features-dark .int-docs { margin-top: 24px; max-width: 76ch; }
.features-dark .int-artifacts .h3-block { margin-bottom: 4px; }

/* content: the pain numerals, the duel, the integrity-gate figure, the publish strip */
.features-dark .numeral { display: block; font: 500 12px var(--mono, var(--sans)); letter-spacing: 0.06em; color: var(--dk-muted); margin-bottom: 12px; font-variant-numeric: tabular-nums; }
.features-dark .pain p, .features-dark .shop-pain .h4 + p { margin-top: 10px; }
.features-dark .duel { display: grid; grid-template-columns: repeat(2, minmax(0, 1fr)); gap: 14px; align-items: stretch; }
.features-dark .duel-side { display: flex; flex-direction: column; border: 1px solid var(--dk-line-strong); padding: 22px 24px; }
.features-dark .duel-side.is-generic { background: rgba(255, 255, 255, 0.02); }
.features-dark .duel-side.is-ours { background: var(--dk-glass); -webkit-backdrop-filter: blur(20px); backdrop-filter: blur(20px); box-shadow: var(--dk-shadow), inset 0 1px 0 rgba(255, 255, 255, 0.14); }
.features-dark .duel-side .chip { align-self: flex-start; margin-bottom: 18px; }
.features-dark .duel-side > p { margin-top: auto; padding-top: 18px; color: var(--dk-grey); }
.features-dark .duel-strikes { list-style: none; margin: 0; padding: 0; }
.features-dark .duel-strikes > li { display: flex; align-items: flex-start; gap: 10px; margin-top: 10px; color: var(--dk-muted); font-size: 14.5px; line-height: 1.6; }
.features-dark .duel-strikes > li .ic { width: 16px; height: 16px; margin-top: 4px; flex: none; }
.features-dark .duel-strikes > li span { text-decoration: line-through; text-decoration-thickness: 1px; }
.features-dark .gate { margin: 0; background: var(--dk-glass); border: 1px solid var(--dk-line-strong); overflow: hidden; }
.features-dark .gate-head { display: flex; flex-wrap: wrap; align-items: center; gap: 12px; padding: 12px 18px; border-bottom: 1px solid var(--dk-line); background: rgba(255, 255, 255, 0.03); }
.features-dark .gate-route { font: 400 12px var(--mono, var(--sans)); letter-spacing: 0.02em; color: var(--dk-grey); }
.features-dark .gate-status { color: var(--dk-danger); border-color: rgba(240, 169, 168, 0.45); }
.features-dark .gate-body { padding: 4px 18px; }
.features-dark .gate-row { display: grid; grid-template-columns: 160px minmax(0, 1fr); gap: 16px; align-items: baseline; padding: 16px 0; border-bottom: 1px solid var(--dk-line-soft); }
.features-dark .gate-row:last-child { border-bottom: 0; }
.features-dark .gate-tag { font: 500 11px var(--mono, var(--sans)); letter-spacing: 0.08em; text-transform: uppercase; color: var(--dk-danger); }
.features-dark .gate-quote { margin: 0; font-size: 17px; color: var(--dk-text); }
.features-dark .gate-reason { display: block; margin-top: 4px; font-size: 14.5px; color: var(--dk-grey); }
.features-dark .gate-act { grid-column: 2; display: flex; align-items: center; gap: 8px; margin-top: 2px; font-size: 13px; color: var(--dk-grey); }
.features-dark .gate-check { width: 16px; height: 16px; border-radius: 4px; background: var(--dk-text); flex: none; position: relative; }
.features-dark .gate-check::after { content: ''; position: absolute; inset: 4px 3px 5px; border: solid var(--dk-ground); border-width: 0 0 2px 2px; transform: rotate(-45deg) translateY(-1px); }
.features-dark .gate-act.is-fix { color: var(--dk-danger); }
.features-dark .gate-actions { display: flex; gap: 10px; padding: 14px 18px; border-top: 1px solid var(--dk-line-soft); }
.features-dark .gate-foot { margin: 0; padding: 14px 18px; border-top: 1px solid var(--dk-line); background: rgba(255, 255, 255, 0.03); font-size: 14.5px; color: var(--dk-grey); }
.features-dark .publish p { margin-top: 10px; }
.features-dark .publish + p { margin-top: 24px; }
/* shopping: the three units, the install band, the demo note */
.features-dark .shop-unit { align-items: start; }
.features-dark .shop-unit + .shop-unit { margin-top: 72px; }
.features-dark .shop-unit .spec { align-self: start; border: 1px solid var(--dk-line-soft); }
.features-dark .shop-unit .spec th { width: 30%; }
.features-dark .shop-install .cta-row { margin-top: 18px; display: flex; gap: 10px; flex-wrap: wrap; }
.features-dark .shop-steps { padding-top: 4px; }
.features-dark .shop-demo-note { margin-top: 16px; max-width: 76ch; }
.features-dark .tok { font: 400 0.9em var(--mono, var(--sans)); color: var(--dk-blue); }

@media (max-width: 1024px) {
  .features-dark .gate-row { grid-template-columns: 140px minmax(0, 1fr); gap: 12px; }
  .features-dark .mrow-head { grid-template-columns: 44px minmax(0, 1fr) auto; gap: 16px; }
  .features-dark .engines { grid-template-columns: minmax(0, 1fr); }
}
@media (max-width: 768px) {
  .features-dark .duel { grid-template-columns: minmax(0, 1fr); }
  .features-dark .gate-row { grid-template-columns: minmax(0, 1fr); gap: 6px; }
  .features-dark .gate-act { grid-column: auto; }
  .features-dark .gate-quote { font-size: 16px; }
  .features-dark .shop-unit + .shop-unit { margin-top: 48px; }
  .features-dark .mrow { padding: 48px 0; }
  .features-dark .mrow-head { grid-template-columns: 32px minmax(0, 1fr); gap: 16px; }
  .features-dark .mopen { grid-column: 2; padding-top: 8px; }
  .features-dark .mrow-txt .h3-block { font-size: 24px; }
  .features-dark .msurf-frame { padding: 16px 16px 0; }
  .features-dark .rep-principles { grid-template-columns: minmax(0, 1fr); }
  .features-dark .steps-grid { grid-template-columns: minmax(0, 1fr); }
}

/* ================================================================== the AI Visibility page, rebuilt from the
   homepage's devices (2026-09-07). Everything else it uses is .dh-* from home-dark.css; these are its own. */
.dh-hero.dh-hero-page { min-height: 0; padding: 150px var(--gutter) 96px; }
.dh-hero.dh-hero-page .dh-h1 { max-width: 20ch; }
.dh-hero.dh-hero-page .dh-lead { max-width: 60ch; }
.dh-sec-body.dh-strip-only { padding: 56px var(--gutter) 64px; }
.dh-strip-only .dh-strip { margin-top: 0; border-top: 0; }
.dh-strip-only .dh-strip > div { padding-top: 0; }
.dh-sec-body.dh-sec-tight { padding: 88px var(--gutter) 96px; }
.dh-split-text .dh-label { margin-bottom: -6px; }
/* the four rules, beside their statement */
.dh-rules { display: grid; grid-template-columns: 0.8fr 1.2fr; gap: 48px; align-items: start; }
.dh-rules-intro { margin-top: 16px; max-width: 44ch; }
.dh-rules-list { display: grid; }
.dh-rule { display: grid; gap: 6px; padding: 18px 0; border-top: 1px solid var(--dk-line-soft); }
.dh-rule:last-child { border-bottom: 1px solid var(--dk-line-soft); }
.dh-rule b { font-size: 15px; font-weight: 500; color: var(--dk-text); }
.dh-rule p { margin: 0; font-size: 14.5px; line-height: 1.6; color: var(--dk-grey); max-width: 60ch; }
/* three more views */
.dh-trio { display: grid; grid-template-columns: repeat(3, minmax(0, 1fr)); gap: 32px; }
.dh-trio h3 { margin: 0 0 8px; font-size: 17px; font-weight: 500; letter-spacing: -0.015em; color: var(--dk-text); }
.dh-trio p { margin: 0; font-size: 14.5px; line-height: 1.6; color: var(--dk-grey); }
.dh-trio a { color: var(--dk-text); text-decoration: underline; text-underline-offset: 3px; }
/* the buyer-journey module (home-dark.js MOD.stages) */
.dh-st { display: grid; gap: 14px; }
.dh-st-row { display: grid; grid-template-columns: 88px minmax(0, 1fr) 118px; align-items: center; gap: 14px; }
.dh-st-row b { font-size: 13px; font-weight: 500; color: var(--dk-text); }
.dh-st-bar { position: relative; height: 8px; background: rgba(255, 255, 255, 0.08); overflow: hidden; }
.dh-st-bar i { position: absolute; top: 0; bottom: 0; left: 0; width: var(--w, 0%); background: var(--dk-blue); transform: scaleX(0); transform-origin: left; transition: transform 900ms var(--dk-ease); transition-delay: var(--d, 0ms); }
.dh-module.is-in .dh-st-bar i { transform: none; }
.dh-st-row span { font-size: 12px; color: var(--dk-muted); text-align: right; font-variant-numeric: tabular-nums; white-space: nowrap; }
.dh-st-weak { margin: 16px 0 0; font-size: 12.5px; line-height: 1.5; color: var(--dk-grey); }
.dh-st-weak b { color: var(--dk-text); font-weight: 500; }
/* the comparison table sits in the column, centred lead above it */
.theme-dark .cmp-wrap { margin: 40px 0 0; overflow-x: auto; }
.theme-dark .cmp-wrap + .dh-bound { text-align: left; font-size: 13px; color: var(--dk-muted); }
@media (max-width: 768px) {
  .dh-rules, .dh-trio { grid-template-columns: 1fr; gap: 24px; }
  .dh-hero.dh-hero-page { padding-top: 110px; }
  .dh-st-row { grid-template-columns: 72px minmax(0, 1fr) 100px; }
}
/* the comparison table stays in the column (base.css's .breakout crosses the rules on the light site) */
.theme-dark .dh-col table.breakout { width: 100%; margin: 0; }

/* css/pages/features-integrations.css */
/* /features/integrations — the delivery routes (P1 §P-08, minimum-viable page, no demo).
 * The page-specific work here is the artifact block: real, copyable command lines set in the mono
 * face. Everything else is base.css components. */

.page-integrations .band-hero .sub-hero { margin-top: var(--s5); }
.page-integrations .band-hero .cta-row { margin-top: var(--s7); }

/* ---- the six-cell grid ---------------------------------------------------------------------
 * Six real cells, sized so the third row never looks like padding. Cards carry a species chip,
 * two short paragraphs and one deep link into the docs. */
/* align-self keeps the chip at its own intrinsic width: a flex column would otherwise stretch
   an inline-flex pill across the whole card. */
.page-integrations .int-grid .chip { align-self: flex-start; margin-bottom: var(--s4); }
.page-integrations .int-grid .card { display: flex; flex-direction: column; }
.page-integrations .int-grid p + p { margin-top: var(--s3); }
.page-integrations .int-grid .btn-text { margin-top: auto; padding-top: var(--s4); }
.page-integrations .int-foot {
  max-width: var(--measure-read);
  margin-top: var(--s6);
  padding-top: var(--s5);
  border-top: 1px solid var(--line);
}

/* ---- command-line artifacts ----------------------------------------------------------------
 * On the Ink band, so the block is a lighter panel rather than the usual dark-on-light. Wraps in
 * its own horizontal scroller: a long command must never widen the page. */
.page-integrations .int-artifacts { align-items: start; gap: var(--s7); }
/* The docs link lives here, where the docs are genuinely the next step - not in the hero pair,
   where it displaced the page's only sales exit. */
.page-integrations .int-docs { margin-top: var(--s6); }
.page-integrations .artifact {
  margin: var(--s5) 0 0;
  padding: var(--s4);
  background: var(--on-ink-fill);
  border: 1px solid var(--on-ink-line);
  border-radius: var(--r-card);
  overflow-x: auto;
}
.page-integrations .artifact code {
  display: block;
  font-family: var(--mono);
  font-size: 13px;
  line-height: 1.7;
  color: var(--on-ink-text);
  white-space: pre;
}

/* Inline code in prose and in the format table. */
.page-integrations .spec code,
.page-integrations .acc code {
  font-family: var(--mono);
  font-size: 0.92em;
  color: var(--ink);
}
.page-integrations .spec th { white-space: nowrap; font-family: var(--mono); text-transform: none; letter-spacing: 0.04em; }
.page-integrations .spec { align-self: start; }

.page-integrations .int-spine > li + li { margin-top: var(--s4); }
.page-integrations .int-spine b { font-weight: 500; }

@media (max-width: 768px) {
  .page-integrations .int-artifacts { gap: var(--s6); }
  .page-integrations .artifact code { font-size: 12px; }
}

/* Route cards: the connector's real mark beside its name (never an icon), one uniform paragraph. */
.page-integrations .int-name { display: flex; align-items: center; gap: 10px; }
.page-integrations .int-mark { width: 26px; height: 26px; object-fit: contain; }

/* css/pages/features-reports.css */
/* /features/reports — white-label + prospect reports (P1 §P-07).
 * Page-specific rhythm and the one page-specific device: the report contents sheet, which is a
 * STRUCTURAL diagram of the real artifact (section names, no numbers) rather than a screenshot
 * or a mock full of invented figures. Everything else composes base.css. */

.page-reports .band-hero .sub-hero { margin-top: var(--s5); }
.page-reports .band-hero .cta-row { margin-top: var(--s7); }

/* The line under an embedded demo: what it is, and where to go next. */
.page-reports .demo-under {
  display: flex;
  flex-wrap: wrap;
  align-items: baseline;
  justify-content: space-between;
  gap: var(--s3) var(--s5);
  margin-top: var(--s4);
}
.page-reports .demo-under p { max-width: 62ch; }

.page-reports .row-split + .grid { margin-top: var(--s9); }
.page-reports .sec-label + .row-split { align-items: start; }
.page-reports .h2-compact + .stack { margin-top: 0; }

/* ---- the report contents sheet -------------------------------------------------------------
 * A sheet of paper on the band, at the report's own proportions. No fabricated numbers appear
 * in it, so it needs no demo chip: it is a table of contents, not a data mock. */
.page-reports .rep-fig { margin: 0; }
.page-reports .rep-doc {
  background: var(--panel);
  border: 1px solid var(--line);
  border-radius: var(--r-frame);
  padding: var(--s6) var(--s6) var(--s5);
}
.page-reports .rep-bar {
  display: flex;
  align-items: center;
  justify-content: space-between;
  gap: var(--s4);
  padding-bottom: var(--s4);
  border-bottom: 1px solid var(--line);
}
.page-reports .rep-logo {
  display: inline-flex;
  align-items: center;
  height: 28px;
  padding: 0 12px;
  /* Solid, not dashed: the dashed hairline is the reference site's signature and is banned here. */
  border: 1px solid var(--line-strong);
  border-radius: var(--r-ctl);
  font-family: var(--mono);
  font-size: 11px;
  letter-spacing: 0.06em;
  text-transform: uppercase;
  color: var(--steel);
}
.page-reports .rep-kick {
  font-family: var(--mono);
  font-size: 11px;
  font-weight: 500;
  letter-spacing: 0.12em;
  text-transform: uppercase;
  color: var(--iron);
}
.page-reports .rep-title { margin-top: var(--s5); font-size: 26px; font-weight: 600; letter-spacing: -0.04em; }
.page-reports .rep-sub { margin-top: 2px; font-size: 13px; color: var(--steel); }

.page-reports .rep-toc { margin-top: var(--s5); }
.page-reports .rep-toc > li {
  display: grid;
  grid-template-columns: minmax(0, 0.8fr) minmax(0, 1.2fr);
  gap: var(--s4);
  padding: 12px 0;
  border-top: 1px solid var(--line);
}
.page-reports .rep-toc > li > b { font-size: 15px; font-weight: 500; }
.page-reports .rep-toc > li > span { font-size: 13px; line-height: 1.45; color: var(--iron); }

.page-reports .rep-foot {
  display: flex;
  align-items: center;
  justify-content: space-between;
  gap: var(--s4);
  margin-top: var(--s5);
  padding-top: var(--s4);
  border-top: 1px solid var(--line);
  font-size: 13px;
  color: var(--steel);
}
.page-reports .rep-btn {
  display: inline-flex;
  align-items: center;
  height: 30px;
  padding: 0 12px;
  border: 1px solid var(--line-strong);
  border-radius: var(--r-ctl);
  font-size: 13px;
  font-weight: 500;
  color: var(--ink);
}
.page-reports .rep-fig figcaption { margin-top: var(--s3); }

/* ---- the CLI line on the prospect band ---------------------------------------------------- */
.page-reports .mono-line {
  background: var(--panel);
  border: 1px solid var(--line-strong);
  border-radius: var(--r-ctl);
  padding: 14px 16px;
  overflow-x: auto;
}
.page-reports .mono-line code {
  font-family: var(--mono);
  font-size: 14px;
  color: var(--ink);
  white-space: nowrap;
}
.page-reports .caption code { font-family: var(--mono); }

/* Steps carry a heading + line rather than a single sentence, so they need tighter internals. */
.page-reports .rep-steps { margin-top: var(--s7); }
.page-reports .rep-steps .h4 + p { margin-top: 6px; }

@media (max-width: 768px) {
  .page-reports .row-split + .grid { margin-top: var(--s8); }
  .page-reports .rep-doc { padding: var(--s5) var(--s4) var(--s4); }
  .page-reports .rep-toc > li { grid-template-columns: minmax(0, 1fr); gap: 2px; }
  .page-reports .demo-under { display: block; }
  .page-reports .demo-under .btn-text { margin-top: var(--s3); }
}

/* ---- the sample report (first module; George 2026-08-19) ------------------------------------
   A DOCUMENT, not a card: paper-white page on the band, hairline structure, mono labels.
   UNSCOPED on purpose: /features shows the same figure as its White-label Reports row, and the
   markup is one partial, so the styling cannot be page-scoped to /features/reports any more. */
.sample-report { margin: 0; background: var(--panel); border: 1px solid var(--line); border-radius: var(--r-frame); outline: 1px solid var(--line); outline-offset: 7px; padding: var(--s7) var(--s7) var(--s5); }
.sr-head { display: flex; justify-content: space-between; align-items: center; }
/* The slot holds a REAL mark now, so it is a logo well rather than a dashed placeholder: no border,
   no pill, just the mark at the size an agency's own would sit at. */
.sr-logo { display: inline-flex; align-items: center; height: 28px; }
.sr-logo img { height: 24px; width: auto; max-width: 150px; object-fit: contain; display: block; }
/* Engine columns: the mark reads first, the name still carries the column. Inline, never stacked. */
.sr-eng { display: inline-flex; align-items: center; gap: 7px; }
.sr-eng img { width: 16px; height: 16px; object-fit: contain; flex: none; border-radius: 3px; }
.sr-kicker { font-family: var(--mono); font-size: 11px; letter-spacing: .1em; text-transform: uppercase; color: var(--steel); }
.sr-title h2 { margin: var(--s6) 0 0; font-size: 34px; letter-spacing: -0.04em; }
.sr-meta { margin-top: var(--s2); font-size: 13px; color: var(--steel); }
.sr-brief { display: grid; grid-template-columns: 120px 1fr; gap: var(--s5); margin-top: var(--s6); padding-top: var(--s5); border-top: 1px solid var(--line); }
.sr-label { font-family: var(--mono); font-size: 11px; letter-spacing: .08em; text-transform: uppercase; color: var(--steel); }
.sr-brief p { font-size: 16px; line-height: 1.6; max-width: 58ch; }
.sr-kpis { display: grid; grid-template-columns: repeat(3, 1fr); gap: var(--s5); margin-top: var(--s6); }
.sr-kpis > div { padding: var(--s5); border: 1px solid var(--line); border-radius: var(--r-card); }
.sr-kpis i { display: block; font-style: normal; font-family: var(--mono); font-size: 11px; letter-spacing: .08em; text-transform: uppercase; color: var(--steel); }
.sr-kpis b { display: block; margin-top: var(--s2); font-size: 30px; font-weight: 600; letter-spacing: -0.04em; }
.sr-kpis span { display: block; margin-top: 2px; font-size: 13px; color: var(--steel); }
.sr-matrix { width: 100%; border-collapse: collapse; margin-top: var(--s6); font-size: 14px; }
.sr-matrix th, .sr-matrix td { text-align: left; padding: 12px var(--s4) 12px 0; border-bottom: 1px solid var(--line); }
.sr-matrix thead th { font-family: var(--mono); font-size: 11px; font-weight: 500; letter-spacing: .06em; text-transform: uppercase; color: var(--steel); }
.sr-matrix tbody th { font-weight: 400; }
.sr-matrix .y { color: var(--good-text); font-weight: 500; }
.sr-matrix .p { color: var(--steel); }
.sr-matrix .n { color: var(--danger); }
.sr-foot { display: flex; justify-content: space-between; margin-top: var(--s5); padding-top: var(--s4); border-top: 1px solid var(--line); font-size: 13px; color: var(--iron); }
.sample-report .caption { margin-top: var(--s5); font-size: 12px; color: var(--steel); }

/* The four-engine matrix cannot shrink below 363px of min-content, and the phone's figure gives it
   ~292px, so it pushed the DOCUMENT to 413px in a 390px viewport - /features and /features/reports
   both scrolled sideways on a phone. scripts/ui-audit.mjs never saw it: its width list is
   1440/1180/1024/768/480 and stops one step short of the artboard, where the table still fits.
   Same remedy /docs already uses for its data tables - the table becomes its own scroller instead
   of widening the page, which is the `responsiveTableMode: scroll` this surface declares. */
@media (max-width: 480px) {
  .sr-matrix { display: block; width: 100%; max-width: 100%; overflow-x: auto;
  /* Scroll cues (audit Batch 1, 2026-08-30): the engine columns sat off-screen at 480 with no
     affordance. CSS scroll shadows - the fades ride the content, the shadows pin to the edges. */
  background:
    radial-gradient(farthest-side at 0 50%, rgba(7,7,10,.16), transparent) left / 12px 100%,
    radial-gradient(farthest-side at 100% 50%, rgba(7,7,10,.16), transparent) right / 12px 100%;
  background-repeat: no-repeat;
  background-attachment: scroll, scroll;
  }
  .sr-matrix th:first-child, .sr-matrix td:first-child { max-width: 46vw; overflow-wrap: anywhere; }
}
@media (max-width: 768px) {
  .sample-report { padding: var(--s5); }
  .sr-brief { grid-template-columns: 1fr; gap: var(--s2); }
  .sr-kpis { grid-template-columns: 1fr; }
}

/* css/pages/features-share-of-voice.css */
/* /features/share-of-voice — P1 §P-05, T2 feature child.
 * Only page-specific rhythm and the two devices this page invents (the demo caption row and the
 * engine-coverage strip) live here. Everything else composes base.css. */

/* Hero: display-1 sets its own line-height, so the sub needs its own air rather than the
   stack utility's 16px. */
.page-sov .band-hero .sub-hero { margin-top: var(--s5); }
.page-sov .band-hero .cta-row { margin-top: var(--s6); }

/* The caption + CTA line that sits under an embedded demo. The demo carries no CTA of its own
   (demo-embed §4), so the page supplies one — the lead-magnet rail, not a second copy of the
   hero pair. */
.page-sov .demo-note {
  display: flex;
  flex-wrap: wrap;
  align-items: baseline;
  justify-content: space-between;
  gap: var(--s3) var(--s5);
  margin-top: var(--s4);
}
.page-sov .demo-note .caption { max-width: 640px; }

/* Engine coverage strip — the honest occupant of the customer-logo-marquee slot (P1 §6, G1).
   Names, not logos: three engine marks would be a wall of borrowed brand. */
.page-sov .coverage { display: flex; flex-wrap: wrap; align-items: baseline; gap: var(--s3) var(--s5); }
.page-sov .coverage .eyebrow { margin-bottom: 0; }
.page-sov .coverage-list { display: flex; flex-wrap: wrap; gap: var(--s3) var(--s5); }
.page-sov .coverage-list li { font-size: 17px; font-weight: 500; }
.page-sov .coverage .caption { flex: 1 1 320px; max-width: 480px; }

.page-sov .sec-head .star-list { margin-top: var(--s5); }
.page-sov .star-list { margin-top: var(--s6); }

/* Proof units: eyebrow tightened against its own heading, body pushed off it. */
.page-sov .unit .eyebrow { margin-bottom: var(--s3); }
.page-sov .unit p { margin-top: var(--s3); }

/* Method table on ink. The dash is the argument, so it gets the mono treatment and sits on the
   baseline of the sentence it qualifies rather than in a column of its own. */
.page-sov .spec-na {
  font-family: var(--mono);
  font-weight: 500;
  color: var(--on-ink-text);
  margin-right: 6px;
}
.page-sov .band-ink .reg-ticks { margin-top: var(--s7); }
.page-sov .band-ink .spec th { color: rgba(255, 255, 255, 0.62); }

/* How-it-works: heading column narrower than the steps column, both top-aligned. */
.page-sov .how { grid-template-columns: minmax(0, 0.85fr) minmax(0, 1.15fr); align-items: start; }
.page-sov .how .sec-head { margin-bottom: 0; }

/* Comparison cards are whole-card links: the arrow is furniture inside them, never a nested <a>. */
.page-sov .compare-card { display: block; color: var(--ink); }
.page-sov .compare-card:hover { background: var(--band-tint); text-decoration: none; color: var(--ink); }
.page-sov .compare-card p { margin-top: var(--s3); }
.page-sov .compare-card .btn-text { margin-top: var(--s4); }

@media (max-width: 768px) {
  .page-sov .how { grid-template-columns: minmax(0, 1fr); gap: var(--s6); }
  .page-sov .demo-note { gap: var(--s3); }
  .page-sov .coverage-list li { font-size: 16px; }
}

/* css/pages/features-shopping.css */
/* /features/shopping — AI Shopping (P1 §P-09).
 * Page-specific rhythm only. The page carries NO fabricated product numbers: the surfaces are
 * described through their real column definitions and the generator's real question templates,
 * so nothing here needs a demo chip and nothing here can drift from the module. */

.page-shopping .band-hero .sub-hero { margin-top: var(--s5); }
.page-shopping .band-hero .cta-row { margin-top: var(--s7); }

/* ---- the pain row: numeral, claim, mechanism ------------------------------------------------ */
.page-shopping .shop-pain .numeral { display: block; margin-bottom: var(--s3); }
.page-shopping .shop-pain .h4 + p { margin-top: var(--s3); }

/* ---- the three "what you see" units --------------------------------------------------------- */
.page-shopping .shop-unit { align-items: start; }
.page-shopping .shop-unit + .shop-unit { margin-top: var(--s9); }
.page-shopping .shop-unit .spec { align-self: start; }
.page-shopping .shop-unit .spec th { width: 30%; }

/* The generated-question panel: real templates, set with the variable parts in the mono face so
   they read as slots rather than as a fabricated example catalog.
   UNSCOPED: /features shows this same panel as its AI Shopping row, because the demo fixture holds
   no product data and there is no products board to mount. One panel, two pages, one stylesheet. */
.shop-qs {
  background: var(--band-tint);
  border: 1px solid var(--line);
  border-radius: var(--r-card);
  padding: var(--s6);
}
.shop-qs-h {
  font-family: var(--mono);
  font-size: 12px;
  font-weight: 500;
  letter-spacing: 0.08em;
  text-transform: uppercase;
  color: var(--steel);
  padding-bottom: var(--s3);
  border-bottom: 1px solid var(--line);
}
.shop-qs .star-list { margin-top: var(--s2); }
.shop-qs .caption { margin-top: var(--s5); }
.tok { font-family: var(--mono); font-size: 0.9em; color: var(--iron); }

/* ---- what it writes back -------------------------------------------------------------------- */
.page-shopping .grid-2 .card .eyebrow { margin-bottom: var(--s3); }
.page-shopping .grid-2 .card p + p { margin-top: var(--s3); }
.page-shopping .grid-2 .card .btn-text { margin-top: var(--s4); }

/* ---- the Shopify install band --------------------------------------------------------------- */
.page-shopping .shop-install { align-items: start; }
.page-shopping .shop-install .cta-row { margin-top: var(--s6); }
.page-shopping .shop-steps { padding-top: var(--s2); }
.page-shopping .shop-steps .h4 + p { margin-top: 6px; }

/* ---- the demo band --------------------------------------------------------------------------- */
.page-shopping .shop-demo-note { margin-top: var(--s4); max-width: var(--measure-read); }

@media (max-width: 768px) {
  .page-shopping .shop-unit + .shop-unit { margin-top: var(--s8); }
  .shop-qs { padding: var(--s5); }
  .page-shopping .shop-steps { padding-top: var(--s6); }
}

/* css/pages/features.css */
/* /features — the T4-lite index (P1 §P-03).
 *
 * The only page-specific thing here is the MODULE ROW: one column, six rows, each carrying the
 * module's copy at a reading measure and then the live surface that module produces. It is
 * deliberately not a card grid — the eyebrow + icon + title + three-cards loop is the single most
 * recognisable generated-page rhythm (P2 §12 tell 2), and an index of real rows, each showing its
 * own surface, is what an honest six-item inventory should look like.
 * Everything else on the page is base.css.
 */

.page-features .band-hero .sub-hero { margin-top: var(--s5); }
.page-features .band-hero .cta-row { margin-top: var(--s7); }

/* Demo section: the component sits on the tinted band as its own screenshot-card surface, so
   the CTA pair under it needs to read as page furniture rather than demo chrome. */
.page-features .demo-foot { margin-top: var(--s6); }
/* The demo-data chip sits on the same line as its caption: one label, in the P2 section 9 wording,
   on every surface showing fabricated numbers. */
.page-features .demo-note { display: flex; flex-wrap: wrap; align-items: baseline; gap: var(--s2) var(--s3); margin-top: var(--s3); }

/* ---- the module index: one column, six rows ------------------------------------------------
 * Replaces the old .dir list. Each row is the module's copy at a reading measure, then the LIVE
 * surface that module produces at .wrap-mid - wider than the copy on purpose, because width is
 * what stopped the coverage grid cropping its last column.
 *
 * The old .dir-row grid is gone rather than repaired: it declared three tracks (72px for a mono
 * index, the content, the link) against two children, because the numbered-chip strip removed
 * .dir-idx and left its column behind. Every description rendered in 72px - ten characters a line.
 * The numeral is back here as a real element, so the track it sits in has something in it.
 */
.page-features .mrows { border-top: 1px solid var(--line); }
.page-features .mrow { padding: var(--s8) 0; border-bottom: 1px solid var(--line); }
.page-features .mrow-head {
  display: grid;
  grid-template-columns: 52px minmax(0, 1fr) auto;
  gap: var(--s5);
  align-items: start;
}
.page-features .mnum {
  font-family: var(--mono);
  font-size: 13px;
  font-weight: 600;
  color: var(--accent-ink);
  letter-spacing: 0.04em;
  font-variant-numeric: tabular-nums;
  padding-top: 8px;
}
.page-features .mrow-txt a { color: var(--ink); }
.page-features .mrow-txt a:hover { color: var(--accent-ink); text-decoration: none; }
.page-features .mjob { margin-top: var(--s3); font-size: 20px; line-height: 1.35; letter-spacing: -0.015em; color: var(--ink); }
/* 570px at 17px is ~68 characters. The measure token is 720, which is set for the 20px sub-hero;
   at 17px it runs to 83 and over the comfortable ceiling. */
.page-features .mrow-txt .body-sm { margin-top: var(--s4); max-width: 570px; font-size: 17px; line-height: 1.55; }
.page-features .mopen { padding-top: 6px; white-space: nowrap; }

/* The surface. A dashboard never sits on the bare page (base.css section 07): it gets a frame with
   real padding, and the surface keeps its own card edge inside that.
   IMAGES, not live mounts (George, 2026-08-19: outside the homepage, surfaces "need to be true to
   the real dashboard ... and serve them as images as opposed to dynamic modules"). They are
   rendered FROM the real components by scripts/capture-surfaces.mjs, so they follow the product
   rather than drifting from it, and this page no longer loads charts.js + demo-data.js + demo.js at
   all. Width and height are on every <img> so the row reserves its space before the bytes land. */
.page-features .msurf { margin: var(--s7) 0 0; }
.page-features .msurf-frame {
  background: var(--band-tint);
  border: 1px solid var(--line);
  border-radius: var(--r-frame);
  padding: var(--s5);
}
.page-features .msurf-img { display: block; width: 100%; height: auto; border-radius: var(--r-card); }
.page-features .msurf-doc { max-width: 720px; }
.page-features .msurf figcaption { margin-top: var(--s4); display: flex; flex-wrap: wrap; gap: var(--s2) var(--s3); align-items: baseline; }
/* The connector fan inside a row: it brings its own dark ground and dune, so it needs no frame -
   only the row's radius and its own breathing room without the homepage's 100px band padding. */
.page-features .msurf-connect { border-radius: var(--r-frame); padding: var(--s8) 0 var(--s7); }
.page-features .msurf-connect .cfan-in { max-width: none; }
.page-features .mrows-live { display: flex; flex-wrap: wrap; gap: var(--s2) var(--s3); align-items: baseline; margin-top: var(--s7); }
.page-features .mrows-cta { margin-top: var(--s5); }

/* The four reporting principles read at ~26 characters a line at 4-up in a 960 column. Two-up puts
   them at ~57, which is the measure every other block of copy on this page is held to. */
.page-features .rep-principles { gap: var(--s7) var(--s8); }

/* The scope table carries prose in the value column, so it wants a wider label gutter than the
   spec-sheet default and a reading measure on the answer.
   PANEL, not .breakout (George, 2026-08-19). As a breakout it started at x=202 with transparent
   cells while the column rule is drawn at x=240, so the hairline ran straight through the first
   letters of "Prompt volume", "Locations" and "Customer logos". An opaque panel occludes it. */
.page-features .spec-panel {
  max-width: 772px;
  background: var(--panel);
  border: 1px solid var(--line);
  border-radius: var(--r-card);
  padding: 0 var(--s5);
}
.page-features .spec-scope th { width: 28%; }
.page-features .spec-scope td { max-width: var(--measure-read); }

@media (max-width: 1024px) {
  .page-features .mrow-head { grid-template-columns: 44px minmax(0, 1fr) auto; gap: var(--s4); }
}

@media (max-width: 768px) {
  .page-features .mrow { padding: var(--s7) 0; }
  .page-features .mrow-head { grid-template-columns: 32px minmax(0, 1fr); gap: var(--s4); }
  .page-features .mopen { grid-column: 2; padding-top: var(--s2); }
  .page-features .mjob { font-size: 18px; }
  .page-features .mrow-txt .body-sm { font-size: 16px; }
  .page-features .msurf { margin-top: var(--s6); }
  .page-features .msurf-frame { padding: var(--s3); }
  .page-features .rep-principles { grid-template-columns: minmax(0, 1fr); }
  .page-features .band-hero .cta-row { margin-top: var(--s6); }
}

/* css/pages/home-dark.css */
/* marketing/css/pages/home-dark.css - the dark homepage (marketing/pages/home.html, bodyClass
 * page-home-dark). Smoke direction approved 2026-09-05; Constitution amendments A1 (dark ground),
 * A2 (the 1320 stage) and A3 (square corners) ruled by George the same day.
 *
 * TOKENS. The values below are ui-contract/tokens.json profiles.marketing.dark, mirrored by hand
 * (no generator exists, docs/DESIGN_SYSTEM.md 1.1). They are page-scoped custom properties with a
 * --dk- prefix so they never cascade into the light pages' names; the recipes are
 * docs/UI_PATTERN_CATALOG.md 2.16 and the judgement is DESIGN_DIRECTION.md (the dark art direction).
 *
 * TWO KINDS OF RULE LIVE HERE, and only those:
 *   A. The page's own devices, every class prefixed dh- (hero, stage wrap, statement band, strip,
 *      pills, rows, modules, carousel, evidence explorer, routes, report, pricing head).
 *   B. The dark skin for the SHARED chrome and the SERVER-RENDERED blocks this page cannot restyle
 *      at source: the announce bar, the nav and its sheets, the footer, the CTA band, the pricing
 *      cards and matrix (.plan / .pr-table from src/routes/pages.js) and the FAQ (#faq). Those class
 *      names are load-bearing: if a partial or a renderer changes its markup, this section changes.
 *
 * CUTOVER NOTE. marketing/css/pages/home.css is the LIVE homepage's sheet and stays until the hold
 * comes off this page; it is scoped to .page-home, so nothing in it reaches .page-home-dark. At
 * cutover home.css retires and this file keeps its name.
 *
 * Laws kept: weights 400/500/600 only; breakpoints 1180/1024/768/480 only; no !important; radii
 * 0 and 2 on the site, the product's own inside the stage (dashboard-showcase.css) and on the
 * product-in-site pieces below (the composer 12, its controls 8, chips 999).
 */

/* The dark ground, tokens, type roles, buttons, field, engine marks and the shared chrome live in
   marketing/css/theme-dark.css (loaded after base.css, before every page sheet) since 2026-09-06, so
   every held dark page shares one chrome. This sheet is the homepage's own sections only. */
/* ====================================================================== A1 the hero */
.dh-hero { position: relative; z-index: 1; min-height: 900px; margin-top: calc(-1 * var(--nav-h)); padding: 150px var(--gutter) 0; text-align: center; overflow: hidden; background: var(--dk-sky-low); }
.dh-hero::after { content: ''; position: absolute; inset: 0; z-index: 1; pointer-events: none; background: linear-gradient(180deg, rgba(10, 11, 13, 0) 60%, rgba(10, 11, 13, 0.6) 100%); }
.dh-sky { position: absolute; inset: 0; pointer-events: none; overflow: hidden; background: radial-gradient(120% 90% at 50% -20%, var(--dk-sky-top) 0%, var(--dk-sky-mid) 28%, var(--dk-sky-low) 58%, var(--dk-ground) 100%); }
.dh-grain { position: absolute; inset: 0; pointer-events: none; opacity: 0.07; mix-blend-mode: overlay; }
.dh-sky-canvas { position: absolute; inset: 0; width: 100%; height: 100%; pointer-events: none; display: block; opacity: 0.42; mix-blend-mode: soft-light; }
.dh-hero-in { position: relative; z-index: 2; display: grid; grid-template-columns: minmax(0, 1fr); justify-items: center; gap: 18px; }
.dh-hero .dh-h1 { max-width: 34ch; margin-top: 6px; }
.dh-hero .dh-lead { max-width: 52ch; color: rgba(255, 255, 255, 0.82); }
/* the engine rotator: five items share one inline-grid cell so the words around them never move */
.page-home-dark .eswap { display: inline-grid; vertical-align: baseline; white-space: nowrap; }
.page-home-dark .eswap-item { grid-area: 1 / 1; display: inline-flex; align-items: baseline; gap: 0.24em; opacity: 0; filter: blur(10px); transition: opacity 550ms ease, filter 550ms ease; }
.page-home-dark .eswap-item.is-on { opacity: 1; filter: blur(0); }
.page-home-dark .ew-lg { width: 0.72em; height: 0.72em; align-self: auto; color: var(--dk-text); }

/* ====================================================================== A2 the stage (A2) */
.dh-stage-wrap { position: relative; z-index: 3; margin-top: -250px; padding: 0 var(--gutter) 96px; }
.dh-stage { position: relative; width: min(100%, 1320px); margin: 0 auto; }

/* ====================================================================== A3 sections and the column */
.dh-col { position: relative; width: 100%; max-width: var(--container); margin: 0 auto; }
.dh-sec { position: relative; z-index: 1; margin: 0; border-top: 1px solid var(--dk-line); }
.dh-sec:last-of-type { border-bottom: 1px solid var(--dk-line); }
.dh-sec-body { padding: 96px var(--gutter) 100px; }   /* the gutter, never less: no text sits closer than 32px to a rule */
.dh-statement .dh-sec-body { padding: 136px var(--gutter) 112px; }
.dh-prompts .dh-sec-body { padding: 96px 0 104px; }
.dh-sec-body.dh-rows { padding: 72px var(--gutter); }

/* the statement band */
.page-home-dark .statement { display: grid; gap: 18px; max-width: 720px; margin: 0 auto; text-align: center; }
.page-home-dark .st-line { font-size: clamp(20px, 2.2vw, 28px); font-weight: 500; letter-spacing: -0.02em; line-height: 1.3; color: var(--dk-grey); margin: 0; }
.page-home-dark .st-line.is-lead { color: var(--dk-text); }
.page-home-dark .statement.is-armed .st-w { display: inline-block; will-change: opacity, filter; }
.dh-marquee-label { margin: 120px 0 0; text-align: center; }
/* the marquee: home.js marquee() measures the track and sets --mq-dur; the keyframes are home.css's */
.dh-mq { margin-top: 28px; overflow: hidden; -webkit-mask-image: linear-gradient(90deg, transparent, #000 10%, #000 90%, transparent); mask-image: linear-gradient(90deg, transparent, #000 10%, #000 90%, transparent); }
.page-home-dark .mq-row { overflow: hidden; }
.page-home-dark .mq-track { display: flex; width: max-content; margin: 0; padding: 0; list-style: none; }
.page-home-dark .mq-track > li { flex: none; margin-right: 64px; position: relative; height: 32px; display: grid; place-items: center; }
.page-home-dark .mq img { height: 32px; width: auto; display: block; }
.page-home-dark .mq .mq-rest { filter: brightness(0) invert(1); opacity: 0.55; transition: opacity 350ms; }
.page-home-dark .mq .mq-hov { position: absolute; inset: 0; margin: auto; opacity: 0; transition: opacity 350ms; }
.page-home-dark .mq-track > li:hover .mq-rest { opacity: 0; }
.page-home-dark .mq-track > li:hover .mq-hov { opacity: 1; }
.page-home-dark .mq-row.is-live[data-mq-dir="left"] .mq-track { animation: mq-left var(--mq-dur, 46s) linear infinite; }
.page-home-dark .mq-row.is-live[data-mq-dir="right"] .mq-track { animation: mq-right var(--mq-dur, 46s) linear infinite; }
.page-home-dark .mq-row.is-live:hover .mq-track { animation-play-state: paused; }
/* the question pills */
.dh-pq-h { text-align: center; margin: 0 auto 48px; font-size: clamp(26px, 3vw, 38px); }
.dh-pq { display: grid; gap: 12px; overflow: hidden; -webkit-mask-image: linear-gradient(90deg, transparent, #000 12%, #000 88%, transparent); mask-image: linear-gradient(90deg, transparent, #000 12%, #000 88%, transparent); }
.dh-pq-row { display: flex; width: max-content; gap: 14px; animation: dh-pq-move var(--dur, 80s) linear infinite; animation-direction: var(--dir, normal); }
.dh-pq:hover .dh-pq-row { animation-play-state: paused; }
@keyframes dh-pq-move { from { transform: translateX(0); } to { transform: translateX(-50%); } }
.dh-pq-pill { display: inline-flex; align-items: center; gap: 9px; height: 40px; padding: 0 16px 0 13px; border-radius: 9px; background: var(--dk-text); color: var(--dk-ground); font-size: 14px; font-weight: 500; letter-spacing: -0.01em; white-space: nowrap; box-shadow: 0 20px 40px -24px rgba(0, 0, 0, 0.9); }
.dh-pq-pill svg { width: 16px; height: 16px; flex: none; }

/* ====================================================================== A4 the rows and the modules */
.dh-split { display: grid; grid-template-columns: minmax(0, 0.8fr) minmax(0, 1.2fr); gap: 48px; align-items: center; padding: 56px 0; border-top: 1px solid var(--dk-line-soft); }
.dh-split:first-child { border-top: 0; padding-top: 0; }
.dh-split:last-child { padding-bottom: 0; }
.dh-split-text { display: grid; gap: 16px; align-content: center; justify-items: start; }
.dh-split-text .dh-body { max-width: 44ch; }
.dh-module { position: relative; min-width: 0; background: var(--dk-glass); border: 1px solid var(--dk-line-strong); -webkit-backdrop-filter: blur(20px); backdrop-filter: blur(20px); box-shadow: var(--dk-shadow), inset 0 1px 0 rgba(255, 255, 255, 0.14); }
.dh-mod { padding: 22px 24px; color: var(--dk-text); }
.dh-phead { display: flex; justify-content: space-between; align-items: baseline; gap: 12px; margin: 0 0 16px; }
.dh-phead b { font-size: 13px; font-weight: 500; letter-spacing: -0.01em; color: var(--dk-text); }
.dh-phead span { font-size: 12px; color: var(--dk-muted); text-align: right; }
.dh-mod-foot { display: flex; justify-content: space-between; gap: 12px; margin: 14px 0 0; font-size: 12px; color: var(--dk-muted); }
.dh-module tbody tr { opacity: 0; transform: translateY(6px); transition: opacity 600ms ease, transform 600ms var(--dk-ease); }
.dh-module.is-in tbody tr { opacity: 1; transform: none; }
/* coverage */
.dh-cv { width: 100%; border-collapse: collapse; font-size: 13px; table-layout: fixed; }
.dh-cv th { font-weight: 400; font-size: 11px; color: var(--dk-muted); text-align: center; padding: 0 0 10px; white-space: nowrap; }
.dh-cv th:first-child { width: 38%; }
.dh-cv td { padding: 8px 4px; border-top: 1px solid var(--dk-line-soft); text-align: center; vertical-align: middle; }
.dh-cv td:first-child { text-align: left; color: var(--dk-grey); white-space: nowrap; overflow: hidden; text-overflow: ellipsis; padding-left: 0; }
.dh-cv-lg { width: 14px; height: 14px; vertical-align: -2px; margin-right: 8px; color: var(--dk-text); }
.dh-cvc { display: inline-block; min-width: 44px; padding: 5px 0; font-size: 12px; font-weight: 500; text-align: center; }
.dh-cvc.n { background: rgba(85, 168, 255, 0.16); color: var(--dk-blue); }
.dh-cvc.r { background: rgba(255, 255, 255, 0.06); color: var(--dk-grey); font-weight: 400; }
.dh-cvc.a { background: rgba(255, 255, 255, 0.03); color: var(--dk-muted); }
.dh-cvc.a::after { content: ''; display: inline-block; width: 8px; height: 1px; background: rgba(255, 255, 255, 0.3); vertical-align: middle; }
.dh-cvc.u { color: var(--dk-muted); }
.dh-lgd { display: inline-block; width: 8px; height: 8px; margin: 0 5px 0 10px; vertical-align: middle; }
.dh-lgd:first-child { margin-left: 0; }
.dh-lgd.n { background: var(--dk-blue); }
.dh-lgd.r { background: rgba(255, 255, 255, 0.22); }
.dh-lgd.a { background: rgba(255, 255, 255, 0.08); }
/* visibility */
.dh-vis-kpi { display: flex; align-items: baseline; gap: 10px; margin: -4px 0 4px; }
.dh-vis-kpi b { font-size: 26px; font-weight: 500; letter-spacing: -0.03em; line-height: 1; color: var(--dk-text); }
.dh-vis-kpi i { font-style: normal; font-size: 12px; color: var(--dk-good-text); }
.dh-vis-kpi span { font-size: 12px; color: var(--dk-muted); }
.dh-vis-chart { position: relative; height: 200px; margin-top: 14px; }
.dh-vis-eng { display: grid; grid-template-columns: repeat(var(--n, 5), 1fr); gap: 14px; margin-top: 16px; padding-top: 14px; border-top: 1px solid var(--dk-line-soft); }
.dh-vis-eng div { font-size: 11px; color: var(--dk-muted); white-space: nowrap; }
.dh-ve-lg { display: block; width: 18px; height: 18px; color: var(--dk-text); }
.dh-vis-eng b { display: block; font-size: 13px; font-weight: 500; color: var(--dk-text); margin: 3px 0 7px; }
.dh-vis-eng i { display: block; height: 2px; background: var(--dk-line-strong); }
.dh-vis-eng i::after { content: ''; display: block; height: 100%; width: var(--w, 0%); background: var(--dk-blue); transform-origin: left; transform: scaleX(0); transition: transform 1s var(--dk-ease) 500ms; }
.dh-module.is-in .dh-vis-eng i::after { transform: none; }
/* the Agent's first entry: the product's own shapes, so the product's radii (12, 8, 999) */
.dh-agd-greet { margin: 0 0 14px; text-align: center; font-size: 20px; font-weight: 500; letter-spacing: -0.02em; color: var(--dk-text); }
.dh-agd-box { border: 1px solid var(--dk-line-strong); border-radius: 12px; background: rgba(255, 255, 255, 0.03); padding: 12px 12px 10px; box-shadow: 0 1px 2px rgba(0, 0, 0, 0.35); }
.dh-agd-ta { min-height: 58px; font-size: 13px; line-height: 1.5; color: var(--dk-text); }
.dh-agd-ta .dh-agd-ph { color: var(--dk-muted); }
.dh-agd-ta.on::after { content: ''; display: inline-block; width: 1px; height: 1em; background: var(--dk-text); vertical-align: -0.15em; margin-left: 1px; animation: dh-blink 1s steps(2) infinite; }
@keyframes dh-blink { 50% { opacity: 0; } }
.dh-agd-foot { display: flex; justify-content: space-between; align-items: center; margin-top: 8px; }
.dh-agd-scope { display: inline-flex; align-items: center; gap: 6px; height: 26px; padding: 0 9px 0 5px; border: 1px solid var(--dk-line-strong); border-radius: 999px; font-size: 12px; font-weight: 500; color: var(--dk-text); }
.dh-agd-scope img, .dh-brand-fav { width: 16px; height: 16px; border-radius: 4px; display: block; flex: none; }
.dh-agd-send { display: grid; place-items: center; width: 30px; height: 30px; border-radius: 8px; background: var(--dk-text); color: var(--dk-ground); }
.dh-agd-send svg { width: 14px; height: 14px; fill: none; stroke: currentColor; stroke-width: 2; stroke-linecap: round; stroke-linejoin: round; }
.dh-agd-usage { margin: 8px 0 0; display: grid; gap: 6px; }
.dh-agd-usage i { display: block; height: 3px; border-radius: 2px; background: rgba(255, 255, 255, 0.08); }
.dh-agd-usage span { font-size: 11px; color: var(--dk-muted); }
.dh-agd-from { margin: 18px 0 8px; font-size: 12px; color: var(--dk-muted); }
.dh-agd-list { list-style: none; margin: 0; padding: 0; display: grid; gap: 6px; }
.dh-agd-list li { opacity: 0; transform: translateY(6px); transition: opacity 600ms ease, transform 600ms var(--dk-ease); }
.dh-module.is-in .dh-agd-list li { opacity: 1; transform: none; }
.dh-agd-q { all: unset; box-sizing: border-box; width: 100%; display: flex; justify-content: space-between; align-items: center; gap: 16px; padding: 10px 12px; border: 1px solid var(--dk-line-soft); border-radius: 10px; font: 400 13px/1.5 var(--sans); color: var(--dk-text); cursor: pointer; transition: border-color 250ms, background-color 250ms; }
.dh-agd-q:hover { border-color: var(--dk-line-strong); background: rgba(255, 255, 255, 0.03); }
.dh-agd-q:focus-visible { outline: 2px solid var(--dk-blue); outline-offset: 1px; }
.dh-agd-meta { display: inline-flex; align-items: center; gap: 6px; font-size: 11px; color: var(--dk-muted); white-space: nowrap; }
.dh-agd-meta i { width: 6px; height: 6px; border-radius: 50%; background: var(--dk-warn); }
.dh-agd-meta i.ok { background: var(--dk-good-text); }
.dh-agd-bound { margin: 14px 0 0; font-size: 12px; color: var(--dk-muted); text-align: center; }
/* rankings */
.dh-rk { width: 100%; border-collapse: collapse; font-size: 13px; }
.dh-rk th { font-weight: 400; font-size: 11px; color: var(--dk-muted); text-align: right; padding: 0 0 10px; white-space: nowrap; }
.dh-rk th.l, .dh-rk td.l { text-align: left; }
.dh-rk th:first-child, .dh-rk td:first-child { text-align: left; width: 22px; color: var(--dk-muted); font-size: 12px; }
.dh-rk td { padding: 9px 0 9px 12px; border-top: 1px solid var(--dk-line-soft); text-align: right; vertical-align: middle; color: var(--dk-grey); }
.dh-rk td:first-child { padding-left: 0; }
.dh-rk tr.you td { color: var(--dk-text); }
.dh-rk .dh-chip { display: inline-block; width: 20px; height: 20px; margin-right: 9px; border-radius: 4px; vertical-align: middle; }
.dh-rk .dh-you-chip { display: inline-block; margin-left: 8px; padding: 1px 7px; font-size: 10px; font-weight: 500; background: rgba(85, 168, 255, 0.16); color: var(--dk-blue); }
.dh-rk .dh-na { display: inline-block; padding: 2px 8px; font-size: 11px; background: rgba(255, 255, 255, 0.06); color: var(--dk-muted); }
/* deployments */
.dh-pf-page { display: flex; justify-content: space-between; align-items: center; gap: 12px; padding: 10px 12px; border: 1px solid var(--dk-line-soft); background: rgba(255, 255, 255, 0.02); }
.dh-pf-url { display: inline-flex; align-items: center; gap: 8px; min-width: 0; font-size: 13px; color: var(--dk-text); }
.dh-pf-url span { overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
.dh-pf-chip { padding: 2px 8px; font-size: 11px; font-weight: 500; background: rgba(224, 176, 64, 0.14); color: var(--dk-warn); white-space: nowrap; }
.dh-pf-chip.ok { background: rgba(70, 185, 127, 0.14); color: var(--dk-good-text); }
.dh-pf-steps { list-style: none; margin: 18px 0 0; padding: 0; display: grid; grid-template-columns: repeat(4, 1fr); gap: 0 16px; position: relative; }
.dh-pf-steps::before { content: ''; position: absolute; left: 5px; right: 0; top: 5px; height: 1px; background: var(--dk-line-soft); }
.dh-pf-steps li { position: relative; padding: 18px 0 0; }
.dh-pf-steps li i { position: absolute; left: 0; top: 0; width: 11px; height: 11px; border-radius: 50%; border: 1px solid var(--dk-line-strong); background: var(--dk-ground); transform: scale(0.6); transition: background-color 400ms, border-color 400ms, transform 500ms cubic-bezier(0.2, 0.9, 0.3, 1.3); transition-delay: var(--d, 0ms); }
.dh-pf-steps li b { display: block; font-size: 13px; font-weight: 500; color: var(--dk-text); }
.dh-pf-steps li span { display: block; margin-top: 3px; font-size: 11px; line-height: 1.45; color: var(--dk-muted); }
.dh-module.is-in .dh-pf-steps li i { background: var(--dk-good); border-color: var(--dk-good); transform: none; }
.dh-module.is-in .dh-pf-steps li.hot i { box-shadow: 0 0 0 4px rgba(70, 185, 127, 0.18); }
.dh-pf-delta { display: grid; grid-template-columns: minmax(0, 1fr) auto minmax(0, 1fr); gap: 20px; align-items: center; margin-top: 18px; padding-top: 16px; border-top: 1px solid var(--dk-line-soft); }
.dh-pf-side { display: grid; gap: 7px; align-content: start; }
.dh-pf-side small { font-size: 11px; line-height: 1.45; color: var(--dk-muted); }
.dh-pf-side b { font-size: 22px; font-weight: 500; letter-spacing: -0.03em; line-height: 1; color: var(--dk-text); }
.dh-pf-engs { display: flex; gap: 6px; }
.dh-pf-eng { position: relative; display: inline-grid; place-items: center; width: 28px; height: 28px; border: 1px solid var(--dk-line-soft); border-radius: 50%; color: var(--dk-muted); font-style: normal; transition: border-color 500ms, color 500ms; }
.dh-pf-eng svg { width: 14px; height: 14px; opacity: 0.55; }
.dh-pf-eng.on { border-color: rgba(70, 185, 127, 0.65); color: var(--dk-text); }
.dh-pf-eng.on svg { opacity: 1; }
.dh-pf-eng.on::after { content: ''; position: absolute; right: -2px; bottom: -2px; width: 9px; height: 9px; border-radius: 50%; background: var(--dk-good); border: 2px solid var(--dk-ground); }
.dh-pf-arrow { width: 18px; height: 18px; fill: none; stroke: var(--dk-muted); stroke-width: 1.6; stroke-linecap: round; stroke-linejoin: round; }

/* ====================================================================== A5 the carousel */
.dh-car { display: grid; gap: 18px; }
.dh-car-head { display: flex; justify-content: space-between; align-items: center; }
.dh-car-step { display: inline-flex; align-items: baseline; gap: 8px; font: 400 12px var(--sans); letter-spacing: 0.06em; color: var(--dk-muted); }
.dh-car-step b { font-size: 15px; font-weight: 500; color: var(--dk-text); letter-spacing: 0; }
.dh-car-step i { font: 500 13px var(--sans); letter-spacing: -0.01em; font-style: normal; color: var(--dk-grey); margin-left: 6px; }
.dh-car-nav { display: flex; gap: 8px; }
.dh-car-btn { all: unset; box-sizing: border-box; display: grid; place-items: center; width: 38px; height: 38px; border: 1px solid var(--dk-line-strong); background: rgba(255, 255, 255, 0.03); color: var(--dk-text); cursor: pointer; transition: background-color 250ms, border-color 250ms, transform 250ms; }
.dh-car-btn:hover { background: rgba(255, 255, 255, 0.08); border-color: rgba(255, 255, 255, 0.4); }
.dh-car-btn:active { transform: scale(0.96); }
.dh-car-btn:focus-visible { outline: 2px solid var(--dk-blue); outline-offset: 2px; }
.dh-car-btn svg { width: 18px; height: 18px; fill: none; stroke: currentColor; stroke-width: 1.75; stroke-linecap: round; stroke-linejoin: round; }
.dh-car-track { display: grid; grid-auto-flow: column; grid-auto-columns: calc(62% - 8px); gap: 16px; overflow-x: auto; overscroll-behavior-x: contain; scroll-snap-type: x mandatory; scrollbar-width: none; padding: 2px; -webkit-mask-image: linear-gradient(90deg, #000 0, #000 60%, rgba(0, 0, 0, 0.55) 82%, rgba(0, 0, 0, 0.08) 100%); mask-image: linear-gradient(90deg, #000 0, #000 60%, rgba(0, 0, 0, 0.55) 82%, rgba(0, 0, 0, 0.08) 100%); }
.dh-car-track::-webkit-scrollbar { display: none; }
.dh-car-track:focus-visible { outline: 2px solid var(--dk-blue); outline-offset: 4px; }
.dh-cell { position: relative; padding: 32px 28px 34px; border: 1px solid var(--dk-line-soft); display: grid; gap: 12px; align-content: start; min-height: 230px; overflow: hidden; }
.dh-cell .dh-icon { width: 44px; height: 44px; border: 1px solid var(--dk-line-strong); background: rgba(255, 255, 255, 0.03); display: grid; place-items: center; margin-bottom: 8px; transition: border-color 400ms; }
.dh-cell .dh-icon svg { width: 18px; height: 18px; stroke: var(--dk-text); stroke-width: 1.5; fill: none; stroke-linecap: round; stroke-linejoin: round; }
.dh-cell code { display: block; font: 400 13px/1.6 var(--sans); color: var(--dk-grey); background: rgba(255, 255, 255, 0.03); border: 1px solid var(--dk-line-soft); padding: 10px 12px; white-space: pre-wrap; overflow-wrap: anywhere; margin-top: 6px; }
.dh-car-card { scroll-snap-align: start; min-height: 0; opacity: 0.85; transition: border-color 350ms, opacity 450ms; }
.dh-car-card.on { border-color: var(--dk-line-strong); opacity: 1; }
.dh-car-card.on .dh-icon { border-color: rgba(255, 255, 255, 0.4); }
.dh-car-dots { display: flex; gap: 6px; }
.dh-car-dots button { all: unset; box-sizing: border-box; width: 36px; height: 14px; display: grid; align-items: center; cursor: pointer; }
.dh-car-dots button i { display: block; height: 2px; background: rgba(255, 255, 255, 0.14); position: relative; overflow: hidden; }
.dh-car-dots button i::after { content: ''; position: absolute; inset: 0; background: var(--dk-text); transform: scaleX(0); transform-origin: left; }
.dh-car-dots button.on i::after { transform: scaleX(1); transition: transform var(--car-ms, 5000ms) linear; }
.dh-car.stopped .dh-car-dots button.on i::after { transition: none; }
.dh-car-dots button:focus-visible { outline: 2px solid var(--dk-blue); outline-offset: 2px; }
.dh-bound { margin: 28px 0 0; font-size: 14.5px; line-height: 1.6; color: var(--dk-grey); text-align: center; }
.dh-bound b { color: var(--dk-text); font-weight: 500; }
.dh-bound .dh-btn { display: inline-flex; }

/* ====================================================================== A6 the evidence explorer */
.dh-ev { display: grid; grid-template-columns: minmax(0, 0.85fr) minmax(0, 1.45fr); border: 1px solid var(--dk-line-soft); background: var(--dk-glass); }
.dh-ev-list { display: grid; align-content: start; border-right: 1px solid var(--dk-line-soft); }
.dh-ev-row { all: unset; position: relative; box-sizing: border-box; display: grid; gap: 5px; padding: 20px 22px; border-bottom: 1px solid var(--dk-line-soft); color: var(--dk-grey); cursor: pointer; transition: background-color 250ms, color 250ms; }
.dh-ev-row:last-child { border-bottom: 0; }
.dh-ev-row:hover { background: rgba(255, 255, 255, 0.03); }
.dh-ev-row.active { background: rgba(255, 255, 255, 0.045); color: var(--dk-text); box-shadow: inset 2px 0 0 var(--dk-blue); }
.dh-ev-row:focus-visible { outline: 2px solid var(--dk-blue); outline-offset: -2px; }
.dh-ev-prog { position: absolute; left: 0; right: 0; bottom: -1px; height: 2px; background: var(--dk-blue); opacity: 0.7; transform-origin: left; transform: scaleX(0); pointer-events: none; }
.dh-ev.stopped .dh-ev-prog { display: none; }
.dh-ev-k { display: inline-flex; align-items: center; gap: 7px; font-size: 12px; color: var(--dk-muted); }
.dh-ev-row b { font-size: 24px; font-weight: 500; letter-spacing: -0.03em; line-height: 1.05; }
.dh-ev-row small { font-size: 12px; line-height: 1.45; color: var(--dk-muted); }
.dh-ev-panel { padding: 22px 24px 24px; display: grid; gap: 14px; align-content: start; }
.dh-ev-panel.swap { animation: dh-ev-in 350ms var(--dk-ease); }
@keyframes dh-ev-in { from { opacity: 0; transform: translateY(4px); } }
.dh-ev-head { display: flex; justify-content: space-between; align-items: center; gap: 12px; font-size: 12px; color: var(--dk-muted); }
.dh-ev-eng { display: inline-flex; align-items: center; gap: 8px; font-size: 13px; font-weight: 500; color: var(--dk-text); }
.dh-ev-eng svg { width: 16px; height: 16px; }
.dh-ev-q { margin: 0; font-size: 15px; font-weight: 500; letter-spacing: -0.01em; color: var(--dk-text); }
.dh-ev-x { margin: 0; padding-left: 14px; border-left: 2px solid var(--dk-line-strong); font-size: 14px; line-height: 1.65; color: var(--dk-grey); }
.dh-ev-x mark { background: rgba(85, 168, 255, 0.18); color: var(--dk-text); padding: 0 3px; }
.dh-ev-x mark.r { background: rgba(224, 176, 64, 0.16); }
.dh-ev-verdict { display: inline-flex; align-items: center; gap: 6px; padding: 3px 9px; font-size: 12px; font-weight: 500; }
.dh-ev-verdict.n { background: rgba(85, 168, 255, 0.16); color: var(--dk-blue); }
.dh-ev-verdict.r { background: rgba(224, 176, 64, 0.14); color: var(--dk-warn); }
.dh-ev-verdict.a { background: rgba(255, 255, 255, 0.06); color: var(--dk-grey); }
.dh-ev-src { display: flex; flex-wrap: wrap; gap: 6px; align-items: center; font-size: 12px; color: var(--dk-muted); }
.dh-ev-src span { padding: 3px 8px; border: 1px solid var(--dk-line-soft); color: var(--dk-grey); }
.dh-ev-src span.you { border-color: rgba(85, 168, 255, 0.4); color: var(--dk-blue); }
.dh-ev-note { margin: 0; font-size: 12px; line-height: 1.5; color: var(--dk-muted); }

/* ====================================================================== A7 the routes */
.dh-routes { max-width: 1000px; margin: 44px auto 0; }
.dh-route-tiles { display: grid; grid-template-columns: repeat(4, 1fr); gap: 16px; }
.dh-route { all: unset; box-sizing: border-box; display: grid; justify-items: center; gap: 8px; padding: 26px 16px 22px; border: 1px solid var(--dk-line-strong); background: linear-gradient(180deg, rgba(255, 255, 255, 0.06), rgba(255, 255, 255, 0.02)); box-shadow: 0 30px 60px -30px rgba(0, 0, 0, 0.9), inset 0 1px 0 rgba(255, 255, 255, 0.14); cursor: pointer; text-align: center; transition: border-color 350ms ease, transform 450ms var(--dk-ease); }
.dh-route:hover { transform: translateY(-3px); border-color: rgba(255, 255, 255, 0.4); }
.dh-route.on { border-color: rgba(85, 168, 255, 0.75); transform: translateY(-3px); }
.dh-route:focus-visible { outline: 2px solid var(--dk-blue); outline-offset: 2px; }
.dh-route-ic { display: grid; place-items: center; width: 52px; height: 52px; color: var(--dk-text); }
.dh-route-ic svg { width: 34px; height: 34px; fill: none; stroke: currentColor; stroke-width: 1.6; stroke-linecap: round; stroke-linejoin: round; }
.dh-route-ic img { width: 42px; height: 42px; filter: brightness(0) invert(1); }
.dh-route b { font-size: 15px; font-weight: 500; color: var(--dk-text); letter-spacing: -0.01em; }
.dh-route > span:last-child { font-size: 12px; line-height: 1.4; color: var(--dk-muted); }
.dh-route-lines { display: block; width: 100%; height: 110px; overflow: visible; }
.dh-route-lines path { fill: none; stroke: var(--dk-line-strong); stroke-width: 1; transition: stroke 350ms; }
.dh-route-lines path.on { stroke: var(--dk-blue); stroke-width: 1.5; stroke-dasharray: 5 9; animation: dh-route-flow 1.1s linear infinite; }
@keyframes dh-route-flow { to { stroke-dashoffset: -28; } }
.dh-route-node { display: flex; align-items: center; gap: 14px; max-width: 680px; margin: 0 auto; padding: 14px 18px; border: 1px solid var(--dk-line-strong); background: var(--dk-panel); text-align: left; box-shadow: 0 30px 60px -30px rgba(0, 0, 0, 0.9), inset 0 1px 0 rgba(255, 255, 255, 0.1); }
.dh-route-node-ic { flex: none; display: grid; place-items: center; width: 38px; height: 38px; border-radius: 50%; border: 1px solid var(--dk-line-strong); color: var(--dk-blue); }
.dh-route-node-ic svg { width: 18px; height: 18px; }
.dh-route-node-t { min-width: 0; flex: 1; }
.dh-route-node b { display: block; font-size: 14px; font-weight: 500; color: var(--dk-text); }
.dh-route-node code { display: block; margin-top: 4px; font: 400 12.5px/1.4 var(--sans); color: var(--dk-grey); white-space: nowrap; overflow: hidden; text-overflow: ellipsis; }
.dh-route-node-state { flex: none; font-size: 12px; color: var(--dk-good-text); white-space: nowrap; transition: opacity 300ms; }
.dh-route-node-state.dim { opacity: 0.35; }

/* ====================================================================== A8 the free report */
.dh-report { display: grid; grid-template-columns: 1.1fr 0.9fr; gap: 56px; align-items: center; }
.dh-report .dh-body { max-width: 44ch; margin: 16px 0 22px; }
.dh-report .dh-field { max-width: 520px; }
.dh-report-list { list-style: none; margin: 0; padding: 0; border-top: 1px solid var(--dk-line-soft); }
.dh-report-list li { padding: 18px 0; border-bottom: 1px solid var(--dk-line-soft); font-size: 17px; letter-spacing: -0.01em; color: var(--dk-text); display: flex; gap: 14px; align-items: center; }
.dh-bul { width: 16px; height: 16px; flex: none; color: var(--dk-blue); }

/* ====================================================================== breakpoints: 1180 / 1024 / 768 / 480 */
@media (max-width: 1180px) {
  .dh-route-tiles { grid-template-columns: repeat(2, 1fr); }
  .dh-route-lines { display: none; }
}
@media (max-width: 1024px) {
  /* no minimum height here: at 804px an 820px hero left a dark band between the trial line and the
     tab strip (George, 2026-09-06). The bottom padding is exactly the room the stage overlaps. */
  .dh-hero { min-height: 0; padding: 110px var(--gutter) 200px; }
  .dh-stage-wrap { margin-top: -160px; }
  .dh-split, .dh-report, .dh-ev { grid-template-columns: 1fr; }
  .dh-ev-list { border-right: 0; border-bottom: 1px solid var(--dk-line-soft); }
  .dh-car-track { grid-auto-columns: calc(84% - 8px); }
}
@media (max-width: 768px) {
  .dh-h1, .page-home-dark .inset-cta .h2-section { font-size: 34px; }
  .dh-t1 { font-size: 30px; }
  .dh-sec-body, .dh-statement .dh-sec-body { padding: 64px 20px; }
  .dh-prompts .dh-sec-body { padding: 64px 0; }
  .dh-sec-body.dh-rows { padding: 48px 20px; }
  .dh-hero { min-height: 0; padding: 96px 20px 240px; }
  .dh-stage-wrap { margin-top: -120px; padding: 0 20px 64px; }
  .dh-field { flex-wrap: wrap; }
  .dh-field .dh-btn { width: 100%; }
  .dh-pf-steps { grid-template-columns: repeat(2, 1fr); gap: 16px; }
  .dh-pf-steps::before { display: none; }
  .dh-pf-delta { grid-template-columns: 1fr; }
  .dh-pf-arrow { transform: rotate(90deg); }
  .dh-vis-eng { grid-template-columns: repeat(3, 1fr); }
  /* A six-column table does not fit a phone: it scrolls inside its module (base.js makes the region
     keyboard-reachable); the Agent's proposals wrap their measure under the question. */
  .dh-mod { overflow-x: auto; }
  .dh-agd-q { flex-wrap: wrap; }
  .dh-agd-meta { white-space: normal; }
  .page-home-dark .inset-cta { padding: 80px 20px; }
}
@media (max-width: 480px) {
  .dh-hero { padding-top: 80px; }
  .dh-cell { padding: 24px 20px 26px; }
  .dh-route-tiles { grid-template-columns: 1fr; }
  .dh-route-node { flex-wrap: wrap; }
}

@media (prefers-reduced-motion: reduce) {
  .dh-hbg-ring { animation: none; background: rgba(255, 255, 255, 0.35); }
  .dh-pq-row { animation: none; }
  .page-home-dark .eswap-item { transition: none; }
  .page-home-dark .st-line { opacity: 1; transform: none; transition: none; }
  .dh-module tbody tr, .dh-agd-list li, .dh-strip-lg .mk { opacity: 1; transform: none; transition: none; }
  .dh-vis-eng i::after { transition: none; }
  .dh-day .ring, .dh-day .ring-on, .dh-day .ltr, .dh-day .badge { transition: none; }
  .dh-route-lines path.on { animation: none; }
  .dh-agd-ta.on::after { animation: none; }
}

/* ---------------------------------------------------------------- the close: the mockup's .cta (label, headline,
   lead, the hero's field, the proof line) on its radial ground */
.dh-cta { position: relative; z-index: 1; padding: 120px var(--gutter); text-align: center; display: grid; justify-items: center; gap: 18px; justify-content: center; background: radial-gradient(60% 60% at 50% 100%, var(--dk-sky-low) 0%, var(--dk-ground) 70%); }
.dh-cta .dh-label-grey { color: var(--dk-grey); }
.dh-cta .dh-lead { max-width: 46ch; }
.dh-cta .dh-field { margin-top: 10px; }
/* ---------------------------------------------------------------- the FAQ: the mockup's .faq */
.dh-faq { display: grid; grid-template-columns: 0.8fr 1.2fr; gap: 48px; align-items: start; }
.dh-faq .dh-faq-sub { margin: 20px 0 0; font: 400 13px/1.6 var(--sans); color: var(--dk-muted); }
.dh-faq details { border-top: 1px solid var(--dk-line-soft); }
.dh-faq details:last-child { border-bottom: 1px solid var(--dk-line-soft); }
.dh-faq summary { cursor: pointer; list-style: none; display: flex; justify-content: space-between; align-items: center; padding: 16px 0; font-size: 15px; font-weight: 500; color: var(--dk-text); }
.dh-faq summary::-webkit-details-marker { display: none; }
.dh-faq summary span { font: 400 18px var(--sans); color: var(--dk-muted); transition: transform 300ms var(--dk-ease); }
.dh-faq details[open] summary span { transform: rotate(45deg); }
.dh-faq p { padding: 0 0 16px; max-width: 60ch; margin: 0; }
@media (max-width: 768px) {
  .dh-faq { grid-template-columns: 1fr; gap: 24px; }
  .dh-cta { padding: 80px var(--gutter); }
}

/* css/pages/home.css */
/* marketing/css/pages/home.css — page-specific styles for the flagship (P1 §P-01).
 *
 * Everything here is scoped under `.page-home` (the source's bodyClass). Two kinds of rule live
 * in this file and nothing else does:
 *
 *   A. Devices this page owns — the hero question line, the engine strip, the free-report form,
 *      the loop line, the per-client money row.
 *   B. Skin for the SERVER-RENDERED blocks. src/routes/pages.js splices the pricing grid
 *      (.pricing/.pcard/.pn/.pp/.pb/.ptag) and the FAQ (.h2/.lead/.faq/.faq-i) into this page at
 *      serve time, in markup this file cannot change. Those class names are therefore load-bearing
 *      here: if the renderer's markup changes, this section changes with it.
 *
 * Laws inherited from base.css and not re-litigated: hovers are tints, no CSS gradients at all
 * (e2e greps public css for that function name — in comments too), weights cap at 600, radii come
 * from the five-step scale, breakpoints are 1180/1024/768/480.
 */

/* ---------------------------------------------------------------- hero */
/* The mockup runs the stat line straight into the dashboard - about 48px between them, not the
   ~180 that two default band paddings stacked up to. */
.page-home .band-hero { position: relative; overflow: hidden; padding: 88px 0 24px; }
.page-home .band-demo { padding-top: var(--s5); }
.page-home .hero-centred { text-align: center; display: flex; flex-direction: column; align-items: center; }
/* No ch cap and no balancing: this headline's break is AUTHORED (the <br> before "across"), and
   both of those fight it - a 20ch measure pushed "the answer" onto its own line and balance then
   evened out the result, turning a deliberate two-line headline into three. The container width
   is the only limit it needs; below ~1080 it wraps naturally, which is correct. */
.page-home .hero-h1 { max-width: none; margin: 0 auto; text-wrap: normal; }
.page-home .hero-sub { max-width: 52ch; margin: var(--s5) auto 0; font-size: 17px; color: var(--iron); }

/* ---- the firing lines -------------------------------------------------
 * Two paths per line on identical geometry: .hl-track is the permanent hairline, .hl-fire is a
 * single short dash travelling it. pathLength=1000 in the markup normalises every path to 1000
 * dash units, so ONE keyframe pair drives all four lines whatever their real length.
 * The SVG is `slice`-fitted and oversized so the curves stay off the text at every width. */
.page-home .hero-lines {
  position: absolute;
  inset: -1px 0 0;
  z-index: 0;
  pointer-events: none;
}
.page-home .hero-lines svg { width: 100%; height: 100%; display: block; }
.page-home .hl-track { fill: none; stroke: var(--line); stroke-width: 1; }
.page-home .hl-fire {
  fill: none;
  stroke: var(--accent);
  stroke-width: 1.6;
  stroke-linecap: round;
  stroke-dasharray: 116 1000;
  stroke-dashoffset: 116;
  animation: hl-fire 5.2s linear var(--d, 0s) infinite;
}
@keyframes hl-fire {
  /* 116 = the dash sits just before the start (invisible). -1000 = it has left the far end.
     The pause is baked into the tail of the cycle so the lines fire in bursts, not as a
     continuous conveyor. */
  0%   { stroke-dashoffset: 116; }
  62%  { stroke-dashoffset: -1000; }
  100% { stroke-dashoffset: -1000; }
}
.page-home .hero .wrap, .page-home .band-hero .wrap { position: relative; z-index: 1; }

/* ---- the engine swap inside the headline ------------------------------
 * All three variants occupy ONE inline-grid cell, so the track is permanently as wide as the
 * widest of them ("Perplexity"). That is the whole mechanism behind George's requirement that
 * the title text must not move: the slot has a constant width, so the words before it cannot
 * be pushed around when the name changes. Only opacity and blur animate - never geometry. */
.page-home .eswap {
  display: inline-grid;
  vertical-align: bottom;
  text-align: left;
}
.page-home .eswap-item {
  grid-area: 1 / 1;
  display: inline-flex;
  align-items: center;
  justify-content: flex-start;
  gap: 0.22em;
  white-space: nowrap;
  /* BLUR-CROSSFADE, and the two directions are timed DIFFERENTLY on purpose.
     George: "the fade should take half a second and the blur should be the shape of the next
     logo". Those two asks are the same mechanism. If both items blur simultaneously you see a
     mush of BOTH silhouettes and the blur has no shape at all; the only way the blur can be the
     shape of the NEXT logo is for the outgoing one to be gone before the incoming one resolves.
     So: leaving is quick (220ms, the rule below), entering is the half-second he asked for and
     starts 160ms late (the .is-on rule). A transition declared on the base rule governs leaving
     that state; one declared on .is-on governs entering it - which is what lets a single class
     toggle carry two different timings.
     Blur amount measured off tryprofound.com's own rotator: 12px. */
  opacity: 0;
  filter: blur(12px);
  transition: opacity 220ms var(--ease), filter 220ms var(--ease);
}
.page-home .eswap-item.is-on {
  opacity: 1;
  filter: blur(0);
  transition: opacity 500ms var(--ease) 160ms, filter 500ms var(--ease) 160ms;
}
.page-home .eswap-mark {
  flex: none;
  width: 0.82em;
  height: 0.82em;
  object-fit: contain;
  /* The marks are the assistants' own artwork and sit optically high next to a cap-height
     wordmark; this drops them onto the visual centre of the line. */
  transform: translateY(-0.03em);
}

/* ---- the capture box + its shimmer ------------------------------------
 * The shimmer is a slow conic sweep clipped to a 1px edge. It is built as a rotating
 * pseudo-element UNDER an opaque inner panel rather than an animated conic gradient, because
 * that needs no @property support: the effect is a plain rotate() on a square big enough to
 * cover the box, and the inner panel masks everything except the 1px margin.
 * Kept deliberately faint - George asked for "a very light shimmer... to catch peoples eye",
 * which is a glint, not a border animation. */
.page-home .hero-capture {
  position: relative;
  width: min(100%, 480px);
  margin: var(--s7) auto 0;
  padding: 1px;
  border-radius: var(--r-card);
  background: var(--line-strong);
  overflow: hidden;
  isolation: isolate;
}
.page-home .hero-capture::before {
  content: '';
  position: absolute;
  top: 50%;
  left: 50%;
  width: 150%;
  aspect-ratio: 1;
  translate: -50% -50%;
  background: conic-gradient(
    from 0deg,
    transparent 0deg 250deg,
    var(--accent) 300deg,
    #FFFFFF 330deg,
    transparent 360deg
  );
  animation: hc-shimmer 4.6s linear infinite;
  z-index: 0;
}
@keyframes hc-shimmer { to { rotate: 360deg; } }
.page-home .hc-inner {
  position: relative;
  z-index: 1;
  display: flex;
  align-items: center;
  gap: var(--s2);
  padding: 6px 6px 6px 8px;
  background: var(--panel);
  border-radius: calc(var(--r-card) - 1px);
}
.page-home .hc-input {
  flex: 1 1 auto;
  min-width: 0;
  border: 0;
  outline: 0;
  background: transparent;
  font: inherit;
  font-size: 15px;
  color: var(--ink);
  padding: 12px 8px;   /* 44px total, not 43 - the minimum target is a floor */
}
.page-home .hc-input::placeholder { color: var(--steel); }
.page-home .hc-input:focus-visible { outline: none; }
.page-home .hero-capture:focus-within { background: var(--accent-tint-border); }
.page-home .hc-btn { flex: none; white-space: nowrap; }

.page-home .hero-microcopy {
  margin-top: var(--s3);
  font-size: 13px;
  color: var(--steel);
}
.page-home .hero-stat {
  margin-top: var(--s7);
  font-size: 15px;
  color: var(--iron);
}
.page-home .hero-stat b { font-weight: 600; color: var(--accent-ink); font-variant-numeric: tabular-nums; }

/* ---- the trust marquee ------------------------------------------------
 * Two rows travelling opposite ways. The track holds the item set TWICE (home.js clones it), so
 * translating exactly -50% lands on the duplicate and the loop is seamless. home.js also sets
 * --mq-dur from the measured width so both rows move at the same speed regardless of content.
 *
 * REST-TO-COLOUR IS A CROSS-FADE BETWEEN TWO FILES, NOT A FILTER (George, 2026-08-20, on the real
 * marks). filter: grayscale(1) was right for invented placeholders, which were all dark artwork on
 * a light ground. It cannot work for the real set: five of the ten arrived as WHITE artwork on a
 * dark ground, and desaturating white gives white - invisible on --paper. Each brand therefore
 * ships a flat --steel silhouette painted through its own alpha for the rest state, and its real
 * artwork for the hover. That also makes the rest state genuinely uniform, which a per-logo
 * grayscale never was: it mapped each mark to a different grey depending on its source luminance. */
.page-home .band-logos { padding: var(--s7) 0; }
.page-home .logos-eyebrow { text-align: center; margin-bottom: var(--s6); }
/* The rows are COLUMN WIDTH and hard-clipped, not full-bleed with a fade (George, 2026-08-16:
   "the logos ... should ... dissapear behind the grey lines not full width"). The clip edge is
   the container edge, which is exactly where body::before draws the rules, so a mark travels
   until it meets the rule and is cut by it - it reads as passing behind the line. A gradient
   fade would dissolve the mark BEFORE the rule and lose that. */
.page-home .mq {
  display: flex;
  flex-direction: column;
  gap: var(--s5);
  /* Cancel .wrap's gutter so the clip edge is the wrap's OUTER edge - which is exactly where
     body::before draws the rules. Inside the gutter the marks stopped 32px short of the line,
     which reads as "cut off" rather than "passing behind". */
  margin-left: calc(var(--gutter) * -1);
  margin-right: calc(var(--gutter) * -1);
}
.page-home .mq-row { overflow: hidden; }
/* The spacing is margin ON THE ITEM, never gap/padding on the track. That is load-bearing:
   translateX(-50%) moves by half the track's own width, so the two halves must be byte-identical
   in layout. A track-level padding-left or a gap between the two halves makes -50% land slightly
   off the duplicate and the loop visibly jumps once per cycle. */
.page-home .mq-track {
  display: flex;
  align-items: center;
  width: max-content;
}
/* position:relative so the colour copy can sit exactly on top of the grey one. */
.page-home .mq-track > li { flex: none; margin-right: 72px; position: relative; }
.page-home .mq img {
  height: 44px;
  width: auto;
  display: block;
  transition: opacity var(--dur) var(--ease);
}
/* The hover copy is stacked on the rest copy and cross-faded. Both carry width/height so the box
   is reserved before either decodes - the marquee measures track width to set its duration, and a
   mark that is 0px wide while it decodes makes the row run several times too fast. */
.page-home .mq .mq-hov { position: absolute; inset: 0; opacity: 0; }
/* Hover is on the LI, not the img: an img that fades to opacity 0 stops being the hover target
   half way through and the pair flickers between the two states under a still cursor. */
.page-home .mq-track > li:hover .mq-hov { opacity: 1; }
.page-home .mq-track > li:hover .mq-rest { opacity: 0; }
/* Armed by home.js only once the track has been cloned - an un-cloned track must never animate,
   because it would scroll to a gap. */
.page-home .mq-row.is-live[data-mq-dir="left"] .mq-track { animation: mq-left var(--mq-dur, 46s) linear infinite; }
.page-home .mq-row.is-live[data-mq-dir="right"] .mq-track { animation: mq-right var(--mq-dur, 46s) linear infinite; }
.page-home .mq-row.is-live:hover .mq-track { animation-play-state: paused; }
@keyframes mq-left  { from { transform: translateX(0); }     to { transform: translateX(-50%); } }
@keyframes mq-right { from { transform: translateX(-50%); }  to { transform: translateX(0); } }

/* ---- the statement block ----------------------------------------------
 * Scroll-driven, not timer-driven. home.js splits each line into word spans and writes opacity
 * and blur per word from the section's scroll progress, so the reader resolves the text by
 * scrolling and it re-blurs on the way back up.
 *
 * The markup ships FULLY LEGIBLE. The blurred start state is armed by home.js (.is-armed) one
 * statement before it starts driving it - same contract as the reveal observer, and for the
 * same reason: a blocked or throwing script must never be able to leave a blurred, unreadable
 * paragraph on the page. */
.page-home .band-statement { padding: 168px 0; }
.page-home .statement {
  /* Wide enough that "...their competitors are." holds one line: at 960 the measure orphaned
     "are." on a line of its own, which reads as a typo rather than a line break. */
  margin: 0 auto;
  text-align: center;
  /* Sized off the mockup by width: its middle line runs ~606px on a 1440 artboard. At the old
     34px it measured ~900 in an 896 column and orphaned "are." onto a line of its own. */
  font-size: clamp(20px, 2.1vw, 28px);
  font-weight: 500;
  letter-spacing: -0.04em;
  line-height: 1.38;
}
.page-home .st-line + .st-line { margin-top: 0.15em; }
.page-home .st-line-lead { margin-top: 1.1em; color: var(--accent-ink); }
.page-home .statement.is-armed .st-w {
  display: inline-block;
  will-change: opacity, filter;
}

/* ---- the free-report band + its spotlight -----------------------------
 * Rebuild of Aceternity's card-spotlight from what it DOES, not from its source (that is React +
 * framer-motion + a three.js dot canvas). Two layers over a near-black band:
 *   .spot-base  the matrix at rest - just enough that the band has texture with no pointer on it
 *   .spot-lit   the same matrix, brighter, masked to a soft circle that tracks the cursor
 * home.js writes --sx/--sy and toggles .is-lit. Greys only (the original is blue/violet), and the
 * mask is the whole effect: no canvas, no rAF loop, nothing running when the pointer is elsewhere.
 */
.page-home .band-spot {
  position: relative;
  overflow: hidden;
  background: #0B0C0E;
}
.page-home .spot-base,
.page-home .spot-lit {
  position: absolute;
  inset: 0;
  z-index: 0;
  pointer-events: none;
  background-image: var(--dot-spot);
}
.page-home .spot-base { opacity: 0.05; }
.page-home .spot-lit {
  opacity: 0;
  transition: opacity 300ms var(--ease);
  -webkit-mask-image: radial-gradient(340px circle at var(--sx, 50%) var(--sy, 50%), #000 0%, rgba(0, 0, 0, 0.55) 42%, transparent 78%);
  mask-image: radial-gradient(340px circle at var(--sx, 50%) var(--sy, 50%), #000 0%, rgba(0, 0, 0, 0.55) 42%, transparent 78%);
}
.page-home .band-spot.is-lit .spot-lit { opacity: 0.28; }
.page-home .band-spot .wrap { position: relative; z-index: 1; }

.page-home .report-band { text-align: center; }
.page-home .report-band .eyebrow { margin-bottom: var(--s3); }
.page-home .report-sub {
  margin: var(--s4) auto 0;
  max-width: 46ch;
  font-size: 17px;
  color: var(--on-ink-body);
}
/* The field and its button are ONE white pill, as in the reference: the input has no chrome of
   its own and the pill carries the shape. */
.page-home .rep-form {
  display: flex;
  align-items: center;
  gap: var(--s2);
  width: min(100%, 560px);
  margin: var(--s6) auto 0;
  padding: 6px 6px 6px 8px;
  background: var(--panel);
  border-radius: var(--r-ctl);
}
/* The input zeroes its own outline, so the wrap carries keyboard focus - the ink band behind
   makes a white ring the readable choice (audit, 2026-08-30). */
.page-home .rep-form:focus-within { outline: 2px solid #FFFFFF; outline-offset: 2px; }
.page-home .rep-input {
  flex: 1 1 auto;
  min-width: 0;
  border: 0;
  outline: 0;
  background: transparent;
  font: inherit;
  font-size: 15px;
  color: var(--ink);
  padding: 12px 8px;   /* 44px total, not 43 - the minimum target is a floor */
}
.page-home .rep-input::placeholder { color: var(--steel); }
.page-home .rep-btn { flex: none; height: 44px; white-space: nowrap; }
.page-home .rep-meta {
  display: flex;
  justify-content: space-between;
  width: min(100%, 560px);
  margin: var(--s3) auto 0;
  font-size: 13px;
  color: rgba(255, 255, 255, 0.45);
}

/* ---- "Access the tools you need to scale." ----------------------------
 * Left-aligned against the column rule. Sizes are taken off the mockup by ratio against the
 * hero line (its cap runs ~0.64 of the hero's), which is why this is 34px rather than the
 * 40px .h2-compact step. */
.page-home .band-scale { padding: var(--s9) 0 var(--s10); }
.page-home .scale-h {
  font-size: 34px;
  font-weight: 600;
  letter-spacing: -0.05em;
  line-height: 1.12;
  margin-bottom: var(--s4);
}
.page-home .scale-lead {
  font-size: 16px;
  line-height: 1.5;
  color: var(--iron);
}
.page-home .scale-lead b { font-weight: 600; color: var(--ink); }
.page-home .scale-credit { color: var(--accent-ink); font-weight: 500; }
.page-home .scale-cta { margin-top: var(--s6); }

/* ---------------------------------------------------------------- demo */
.page-home .demo-head { margin-bottom: var(--s5); }
.page-home .demo-head p { max-width: var(--measure-read); }
.page-home .demo-cta { margin-top: var(--s5); }

/* ------------------------------------------------------- engine strip */
/* The logo row, with the real marks: the engines ARE the proof, so they are set at heading scale
   rather than shrunk into a grey wall of borrowed logos. */
.page-home .eng-list { display: flex; flex-wrap: wrap; align-items: center; gap: var(--s4) var(--s7); }
.page-home .eng-list li {
  display: flex;
  align-items: center;
  gap: 12px;
  font-size: 24px;
  font-weight: 500;
  letter-spacing: -0.02em;
}
.page-home .eng-list .eng-mark { width: 30px; height: 30px; }
/* The add-ons sit visibly one rank down - they are per client, never bundled. */
.page-home .eng-list-addon { margin-top: var(--s4); gap: var(--s3) var(--s5); }
.page-home .eng-list-addon li { font-size: 17px; font-weight: 400; color: var(--iron); }
.page-home .eng-list-addon .eng-mark { width: 24px; height: 24px; }
.page-home .eng-note { margin-top: var(--s5); max-width: 660px; }

/* The free-report band's old skin lived here: a bare outlined field sitting DIRECTLY on the ink
   band, with a white border and a white placeholder. It is gone because the field now sits inside
   a white pill (see "the free-report band + its spotlight" above) - and while it existed it won on
   source order and painted white-on-white, which is how the placeholder and the button both
   vanished the first time this band was rebuilt. */

/* --------------------------------------------- feature blocks (2-col) */
/* gojiberry.ai's block (George prefers it), measured off its live DOM: panel with 20px padding,
 * 24px gap, a numbered step chip filled with the accent at 10% alpha (radius 10px), heading
 * 38/400/-1.5px, and 24px between every element in the text column. White ground, not grey.
 *
 * TWO MEASURED FACTS forced the geometry, and both were learned the hard way:
 *   1. The BLOCK HAS TO BE WIDER THAN THE PAGE COLUMN. Gojiberry's block is 1200 and Searchable's
 *      1216; ours was 896, and no amount of splitting or scaling fixes that. At 896 the surface
 *      column lands ~530px against surfaces that need ~720, which is what produced first a
 *      sideways scrollbar, then a 187px crop, then a 0.58 scale with 6px labels. The section now
 *      breaks out to 1216 - the same move the dashboard band already makes, and the same width
 *      the reference uses for the same reason.
 *   2. The split is 1fr 2fr, not gojiberry's 50/50. Their right column is an ILLUSTRATION and is
 *      scale-free; ours is a dense table. 2fr of 1216 is ~790, which is where these surfaces
 *      render at their natural size - so there is NO transform and NO crop here at all.
 * Blocks are therefore not equal height: the three surfaces are 328/438/614 tall and the frame
 * follows them. Forcing one height is what cropped the sources card by 173px last time.
 */
.page-home .feat { display: flex; flex-direction: column; gap: 80px; }
/* Was 1216px, which put the fblock COPY 55px past the left rule. The wrap now matches the
   column; the product SHOT keeps its size by breaking out on its own side - boxes may cross the
   lines, words may not (George, 2026-08-18). */
.page-home .wrap-feat { max-width: var(--container); }
/* The shot LIVES INSIDE its card (George, 2026-08-19: "the inner box is hanging out of the outer
   box"). A breakout crosses the PAGE rules, never its own parent - the earlier negative margins
   pushed the tablet through the card edge on all three feature blocks. */
.page-home .fblock .shot { margin-inline: 0; min-width: 0; }
.page-home .fblock { overflow: hidden; }
.page-home .fblock {
  display: grid;
  grid-template-columns: 1fr 2fr;
  gap: 24px;
  align-items: center;
  padding: 20px;
  background: var(--panel);
  border: 1px solid var(--line);
  border-radius: 18px;
}
/* Ordering the CHILDREN rather than reversing the columns keeps text first in the DOM, so reading
   and tab order stay text-then-surface however the block is painted. */
.page-home .fblock.is-flipped { grid-template-columns: 2fr 1fr; }
.page-home .fblock.is-flipped .fblock-text { order: 2; }

.page-home .fblock-text {
  display: flex;
  flex-direction: column;
  align-items: flex-start;
  gap: 24px;
  padding: 20px 12px 20px 20px;
}
/* The step chip. Their icon is a lego brick; ours is the mark's own four-point star - the same
   move made with our furniture instead of theirs. */
.page-home .fstep {
  display: inline-flex;
  align-items: center;
  gap: 7px;
  padding: 8px 13px 8px 9px;
  border-radius: 10px;
  background: var(--accent-soft);
  color: var(--accent-ink-hover);
  font-size: 15px;
  font-weight: 500;
  font-variant-numeric: tabular-nums;
}
.page-home .fstep-ic { width: 15px; height: 15px; flex: none; fill: currentColor; }
.page-home .fblock-h {
  font-size: 30px;
  font-weight: 600;
  letter-spacing: -0.05em;
  line-height: 1.14;
}
.page-home .fblock-body { font-size: 16px; line-height: 1.55; color: var(--iron); }
.page-home .fblock-link { margin: 0; }

/* The photo-backed frame. It SIZES TO ITS SURFACE - no fixed height, no aspect-ratio, nothing to
   crop against. The padding is the photograph showing around the card. */
.page-home .fblock-shot {
  padding: 36px;
  border-radius: 12px;
}
.page-home .fblock-shot .inc-demo { border-radius: var(--r-card); }

@media (max-width: 1024px) {
  /* One column, surface below. A 1fr 2fr grid at tablet width leaves a 180px text column. */
  .page-home .fblock,
  .page-home .fblock.is-flipped { grid-template-columns: 1fr; }
  .page-home .fblock.is-flipped .fblock-text { order: 0; }
  .page-home .fblock-text { padding: 20px 12px; }
  .page-home .fblock-shot { padding: 20px; }
}

/* ----------------------------------------------------------- the loop */
.page-home .loop-line > div + div {
  margin-top: var(--s4);
  padding-top: var(--s4);
  border-top: 1px solid var(--line);
}
.page-home .loop-line .numeral { display: block; margin-bottom: 2px; }
.page-home .loop-line p { max-width: 34ch; }
.page-home .loop-band .proof-slot { margin-top: var(--s5); }
.page-home .loop-band .proof-slot .chip { margin-bottom: var(--s4); }
.page-home .loop-band .proof-slot .h4 { margin-bottom: var(--s3); }

/* ------------------------------------------------------- integrations */
.page-home .int-cta { margin-top: var(--s6); }

/* ---------------------------------------------- pricing (server block) */
/* Markup owned by src/routes/pages.js renderPricingGrid(). Plan prices stay Ink: the cobalt in
   this band belongs to the per-client arithmetic below the grid, which is the actual argument. */
.page-home .pricing {
  display: grid;
  grid-template-columns: repeat(3, minmax(0, 1fr));
  gap: var(--s5);
}
/* Plan cards are a SYSTEM component now - styled once in base.css §14 (the figr-structure
   redesign, George 2026-08-18). Only the page grid/layout below stays page-scoped. */
.money-plot { margin-top: var(--s7); }
.page-home .money { display: grid; grid-template-columns: repeat(3, minmax(0, 1fr)); gap: var(--s5); }
.page-home .money p { margin-top: var(--s2); max-width: 32ch; }
.page-home .pricing-foot { margin-top: var(--s5); }

/* -------------------------------------------------- FAQ (server block) */
/* Markup owned by src/routes/pages.js renderFaqSection(). The eyebrow used to ship a decorative
   icon and was suppressed here with display:none - which fixed the render but still shipped the
   icon in the markup on every home page, invisibly. The svg is now gone at source instead: an
   icon-prefixed eyebrow is P2 section 12 tell 2, the single most recognisable LLM page rhythm. */
.page-home .h2 { font-size: 48px; font-weight: 600; letter-spacing: -0.05em; line-height: 1.0; }
.page-home .lead {
  margin-top: var(--s4);
  max-width: var(--measure-read);
  font-size: 20px;
  line-height: 1.45;
  letter-spacing: -0.01em;
  color: var(--iron);
}
.page-home .faq { border-top: 1px solid var(--line); }
.page-home .faq-i { border-bottom: 1px solid var(--line); }
.page-home .faq-i summary {
  display: flex;
  align-items: center;
  justify-content: space-between;
  gap: var(--s4);
  padding: 20px 0;
  font-size: 17px;
  font-weight: 500;
  cursor: pointer;
  list-style: none;
}
.page-home .faq-i summary::-webkit-details-marker { display: none; }
.page-home .faq-i summary svg {
  width: 16px;
  height: 16px;
  flex: none;
  fill: none;
  stroke: currentColor;
  stroke-width: 1.75;
  stroke-linecap: round;
  color: var(--steel);
  transition: transform var(--dur) var(--ease), color var(--dur) var(--ease);
}
.page-home .faq-i[open] summary svg { transform: rotate(45deg); color: var(--accent); }
.page-home .faq-i p { padding-bottom: 20px; max-width: var(--measure-read); color: var(--iron); }

/* ------------------------------------------------------- breakpoints */
@media (max-width: 1024px) {
  .page-home .eng-list li { font-size: 21px; }
}

@media (max-width: 768px) {
  .page-home .feat .row-split + .row-split { margin-top: var(--s8); }
  .page-home .eng-list { gap: var(--s3) var(--s5); }
  .page-home .pricing { grid-template-columns: minmax(0, 1fr); }
  .page-home .money { grid-template-columns: minmax(0, 1fr); }
  .page-home .money p { max-width: none; }
  .page-home .h2 { font-size: 34px; font-weight: 600; letter-spacing: -0.05em; line-height: 1.05; }
  .page-home .lead { font-size: 17px; }
  .page-home .loop-line p { max-width: none; }
}

@media (max-width: 480px) {
  /* Stacked, the flex MAIN axis is vertical — `flex: 1 1 240px` would become a 240px-tall input.
     Both children go back to auto sizing and full width. */
  /* The pill keeps its shape on mobile - it is one control, not a stacked pair - but the button
     loses its label padding so a narrow screen does not force the field to nothing. */
  .page-home .rep-btn { padding: 0 14px; }
  .page-home .ask { padding: 12px 14px; }
}

@media (prefers-reduced-motion: reduce) {
  .page-home .ask-caret { animation: none; }
}

/* ------------------------------------------------- integrations rail
   The logos carry this section. The strip drifts continuously (Register A), pauses on hover or
   focus, and picking a mark swaps the detail card beneath it. Duplicated track = seamless loop. */
/* ---- the connector fan ------------------------------------------------
 * Structure is gojiberry's connector section; the motion is specified by George and every number
 * below was arrived at by fixing something specific. READ THIS BEFORE EDITING.
 *
 * WHAT IT DOES
 *   idle      the blue glow leaves the lockup and FILLS all eight wires on one clock, arriving at
 *             the connectors and leaving the wire lit behind the leading edge
 *   selected  every blue fill stops; ONE green line draws from the logo, down that wire and around
 *             that connector's box, and STAYS there; the detail panel below opens
 *
 * FIVE THINGS THAT LOOK ARBITRARY AND ARE NOT
 * 1. `pathLength="1000"` on every animated path, with dash values in those normalised units.
 *    Baking getTotalLength() into px instead means the dash pattern can be SHORTER than the path
 *    whenever the stage differs from its measured size - and a dash pattern shorter than its path
 *    REPEATS. That single fault produced a glow at the top and another at the bottom of the same
 *    wire, a green landing off its box, and a fill that appeared to crash half way.
 * 2. NO `vector-effect: non-scaling-stroke`. It makes the stroke - dashes included - ignore the
 *    path's coordinate space, which is the space pathLength normalises against. The two contradict
 *    each other and different renderers resolve it differently.
 * 3. The box trace does NOT end in `Z`. Z closes back to the last `M`, which is the HUB, so the
 *    path drew a straight line from the tile back up to the logo - a second green line, and the
 *    reason it looked like it travelled back up. It closes with an explicit L instead.
 * 4. `.cf-stage` has bottom padding. The wires layer is inset:0 to it, so with the tile row flush
 *    to the bottom the box trace's lower edge sat on the clip boundary and was shaved off.
 * 5. `animation: none` on a deselected fill, NOT `animation-play-state: paused`. The keyframes
 *    animate opacity and an animation's value beats a normal declaration, so a paused fill keeps
 *    whatever opacity it froze at and the blue stays on screen.
 *
 * The green is #05BD61, solved for the SAME luminance as --accent #55A8FF (0.372). --good #52A185
 * sits at 0.290 and reads as a different colour family beside the blue. Matching HSL instead gives
 * a neon that outshouts it, because green carries far more perceived luminance than blue.
 */
/* SHARED, not homepage-only (George, 2026-08-19: /features row 06 "should be the real integrations
   module from the homepage with the actions"). The selectors below are deliberately UNSCOPED: the
   page bundle is one concatenated file served to every page, so dropping the .page-home prefix is
   all it takes for /features to mount the same component - same markup, same connectors() wiring in
   marketing/js/pages/home.js, which guards on [data-cfan] and is a no-op on pages without one.
   /features omits .cfan-head, because the module row above it is already the heading. */
.band-connect {
  position: relative;
  overflow: hidden;
  padding: 100px 0 104px;
  background: #0B0C0E;
}
.band-connect::before {
  content: '';
  position: absolute;
  inset: 0;
  z-index: 0;
  background-image: url('/img/dunes.webp');
  background-size: cover;
  background-position: center bottom;
}
.cfan-in { position: relative; z-index: 1; max-width: var(--container); margin: 0 auto; padding: 0 var(--gutter); }
.cfan-head { text-align: center; max-width: 46ch; margin: 0 auto 52px; }
.cfan-head h2 { color: #fff; margin-top: var(--s3); }
.cfan-head p { margin-top: 14px; font-size: 17px; color: rgba(255, 255, 255, 0.6); }
.cfan-head .eyebrow { color: rgba(255, 255, 255, 0.5); }

.cf-stage { position: relative; padding-bottom: 34px; --wire-green: #05BD61; }
.cf-hub { display: grid; justify-items: center; }
.cf-hub svg { width: 190px; height: auto; color: #fff; display: block; }
.cf-wires {
  position: absolute;
  inset: 0;
  width: 100%;
  height: 100%;
  overflow: visible;
  pointer-events: none;
  z-index: 0;
}
.cf-wires path { fill: none; }
.cf-track { stroke: rgba(255, 255, 255, 0.22); stroke-width: 1.25; }

.cf-fill {
  stroke: var(--accent);
  stroke-width: 2.5;
  stroke-linecap: round;
  stroke-dasharray: 1000 1000;
  stroke-dashoffset: 1000;
  filter: drop-shadow(0 0 4px var(--accent)) drop-shadow(0 0 11px var(--accent));
  animation: cffill 3.2s linear infinite;
}
@keyframes cffill {
  0%   { stroke-dashoffset: 1000; opacity: 1; }
  55%  { stroke-dashoffset: 0;    opacity: 1; }
  88%  { stroke-dashoffset: 0;    opacity: 1; }
  100% { stroke-dashoffset: 0;    opacity: 0; }
}
.cf-green {
  stroke: var(--wire-green);
  stroke-width: 2.75;
  stroke-linecap: round;
  opacity: 0;
  stroke-dasharray: 1000 1000;
  stroke-dashoffset: 1000;
  filter: drop-shadow(0 0 4px var(--wire-green)) drop-shadow(0 0 12px var(--wire-green));
}
@keyframes cfdraw { from { stroke-dashoffset: 1000; } to { stroke-dashoffset: 0; } }
.cf-stage.is-sel .cf-fill { animation: none; opacity: 0; transition: opacity 220ms var(--ease); }
.cf-stage.is-sel .cf-green.is-sel { opacity: 1; animation: cfdraw 1.5s linear forwards; }

.cf-row {
  display: grid;
  grid-template-columns: repeat(8, 1fr);
  justify-items: center;
  position: relative;
  z-index: 1;
  margin-top: 236px;
}
.cf-tile {
  display: grid;
  place-items: center;
  width: 82px;
  height: 82px;
  padding: 0;
  border: 0;
  border-radius: 22px;
  background: #FFFFFF;
  box-shadow: 0 8px 22px rgba(0, 0, 0, 0.35);
  cursor: pointer;
  transition: box-shadow 220ms var(--ease);
}
/* The marks are plated on white because the plate is what the wire ARRIVES at, and because a
   near-black mark (Framer, REST API) is invisible on the dune otherwise. */
.cf-tile img { width: 52px; height: 52px; object-fit: contain; }

/* [hidden] is display:none in the UA stylesheet, and an author `display` beats it - without this
   the panel renders empty with a broken <img> at rest. */
.cf-dialog[hidden] { display: none; }
.cf-dialog {
  display: flex;
  gap: 18px;
  align-items: flex-start;
  max-width: 660px;
  margin: 56px auto 0;
  padding: 24px 26px;
  border: 1px solid rgba(255, 255, 255, 0.14);
  border-radius: var(--r-card);
  background: rgba(255, 255, 255, 0.07);
  backdrop-filter: blur(14px);
}
.cf-dialog-mark { width: 44px; height: 44px; object-fit: contain; flex: none; }
.cf-dialog-t { font-size: 18px; font-weight: 600; letter-spacing: -0.03em; color: #fff; }
.cf-dialog-p { margin-top: 6px; font-size: 15px; line-height: 1.55; color: rgba(255, 255, 255, 0.66); }
/* The detail copy stays in the DOM as real content for crawlers and screen readers; the panel is
   populated from it. Visually hidden rather than display:none so it is still in the a11y tree. */
.cf-source { position: absolute; width: 1px; height: 1px; overflow: hidden; clip-path: inset(50%); }
.cf-cta { justify-content: center; margin-top: var(--s7); }
.cf-cta .btn-text { color: #fff; }

@media (max-width: 768px) {
  /* Eight columns is four too many on a phone: the fan comes off and the tiles wrap to two rows. */
  .cf-wires { display: none; }
  .cf-row { grid-template-columns: repeat(4, 1fr); gap: var(--s3); margin-top: var(--s6); }
  .cf-stage { padding-bottom: 0; }
  /* THE TILE FITS ITS TRACK, it does not assert 82px into whatever container it lands in. This
     block is unscoped and the fan ships on TWO surfaces: the homepage's full-bleed dark band, where
     four 82px tiles fit easily, and /features' .band-connect panel, which is 342px wide at 390 - so
     four tiles plus gaps needed 412px and the 4th column was sliced clean down the middle. Framer
     and Lovable were each cut in half on the phone. Home never showed it because home had room,
     which is exactly the trap in sizing a component by viewport instead of by the space it is
     actually given (DESIGN_SYSTEM.md RESP-01).
     The mark keeps its designed proportion: 52/82 = 63%, so the tile-to-mark ratio that stops it
     reading as clipart is preserved at every size rather than the mark filling a shrunken tile.

     `justify-items: stretch` is required, not tidying. The grid items are the <li>, not the button,
     and .cf-row centres them - so each grid area is shrink-to-fit, `width: 100%` on the button has
     no definite basis, and it resolves to auto. The tile then sized to its MARK: the two marks with
     small intrinsic dimensions - wordpress-icon.svg (64px) and New_Replit_Logo.svg (32px) -
     collapsed to 25px and 13px while every 512px+ mark capped out correctly. Stretching gives the
     area a definite width that the tile's 100% and the mark's 63% can both resolve against. */
  .cf-row { justify-items: stretch; }
  .cf-tile { width: 100%; max-width: 82px; height: auto; aspect-ratio: 1; margin: 0 auto; }
  .cf-tile img { width: 63%; height: 63%; }
}
@media (prefers-reduced-motion: reduce) {
  .cf-fill { animation: none; opacity: 0; }
  .cf-stage.is-sel .cf-green.is-sel { animation: none; stroke-dashoffset: 0; }
}

/* css/pages/legal-dark.css */
/* marketing/css/pages/legal-dark.css - /privacy and /terms dark, held until cutover (family class
 * legal-dark). The prose skin lives in the theme; this sheet only sets the reading column. */
.legal-dark .band-hero { padding-bottom: 24px; text-align: left; }
.legal-dark .band-hero .wrap { justify-items: start; }
.legal-dark .band-hero h1 { max-width: none; }
.legal-dark .band-hero .sub-hero { max-width: 72ch; }
.legal-dark .legal { margin: 0; }

/* css/pages/legal.css */
/* Legal prose — /terms and /privacy.
 *
 * Ported from public/m.css when those two pages moved onto the marketing build (George,
 * 2026-08-24: "move them to the new nav for continuity throughout"). They could not simply LOAD
 * marketing.css alongside m.css: both define .wrap, .brand and .btn, and .wrap disagrees on the
 * measure (1080px vs 960px), so the page body would have reflowed. Owning the page here means one
 * stylesheet, the real header, and the real footer — and no second copy to drift.
 *
 * Tokens are the marketing set: --ink/--muted for text, --line/--line-strong for rules,
 * --accent-ink for inline links (--accent is the light brand blue and fails AA at 15px). */
/* The prose sits INSIDE .wrap and shares its left edge with the hero above. Centring it in the
   viewport instead put the body text 120px to the right of the h1 it belongs to. */
.legal { max-width: var(--measure-read); line-height: 1.7; }
/* The hero band and the prose band would otherwise stack two --s9 paddings between the lede
   and the first clause. */
.band-legal { padding-top: 0; }
.legal h2 { font-size: 19px; letter-spacing: -0.01em; margin: 34px 0 var(--s2); color: var(--ink); }
.legal p, .legal li { color: var(--muted); font-size: 15px; margin: 0 0 var(--s3); }
.legal ul { margin: 0 0 14px; padding-left: 22px; }
.legal li { margin: var(--s1) 0; }
.legal a { color: var(--accent-ink); font-weight: 500; }
.legal .tw { overflow-x: auto; margin: 10px 0 18px; }
.legal table { width: 100%; border-collapse: collapse; font-size: 13px; }
.legal th {
  text-align: left;
  font-weight: 600;
  color: var(--muted);
  font-size: 11px;
  text-transform: uppercase;
  letter-spacing: 0.05em;
  padding: 7px 10px;
  border-bottom: 1px solid var(--line-strong);
}
.legal td { padding: var(--s2) 10px; border-bottom: 1px solid var(--line); vertical-align: top; color: var(--muted); line-height: 1.55; }

/* css/pages/methodology-dark.css */
/* marketing/css/pages/methodology-dark.css - /methodology dark, held until cutover. One reading column;
 * the theme's prose rules do the rest. */
.page-methodology-dark .band-hero { padding-bottom: 24px; }
.page-methodology-dark .wrap.stack { max-width: 72ch; margin-left: auto; margin-right: auto; gap: 10px; }
.page-methodology-dark .wrap.stack > h2 { margin-top: 34px; }
.page-methodology-dark .wrap.stack > h2:first-child { margin-top: 0; }
.page-methodology-dark .spec { border: 1px solid var(--dk-line-soft); margin: 8px 0 14px; }

/* css/pages/methodology.css */
/* /methodology - the only page styles it needs. The global reset strips list markers
   (base.css section 03); the method article's lists are genuine lists and read as walls
   without them (audit Batch 1, 2026-08-30). */
.page-methodology ul.measure { list-style: disc; padding-left: 22px; }
.page-methodology ul.measure li { margin: 6px 0; }

/* css/pages/pricing-dark.css */
/* marketing/css/pages/pricing-dark.css - the DARK /pricing (marketing/pages/pricing.html, bodyClass
 * page-pricing-dark, held until the site's one cutover). Everything shared with the other dark pages
 * lives in marketing/css/theme-dark.css: the tokens, type roles, buttons, the plan cards and the
 * everything-included matrix (the .plans, .plan-, .pr-table and .pr-foot rules), the FAQ, the strip. This sheet is
 * the page's own devices only. Values are the recipes' (docs/UI_PATTERN_CATALOG.md 2.16); the
 * section rule and the glass module are repeated from the homepage sheet in two rules here and
 * consolidate into the theme sheet at cutover, when home-dark.css is cut down with the light chrome.
 * Laws kept: weights 400/500 only; breakpoints 1180/1024/768/480 only; no !important; radii 0 and 2
 * on the site, the product's own inside the cards. */

/* the page hero: a statement on the ground, no stage */
.page-pricing-dark .dh-phero { padding: 128px var(--gutter) 24px; text-align: center; }
.page-pricing-dark .dh-phero-in { display: grid; justify-items: center; gap: 18px; }
.page-pricing-dark .dh-phero .dh-h1 { max-width: 20ch; }
.page-pricing-dark .dh-h1 .dim { color: var(--dk-muted); }
.page-pricing-dark .dh-phero .dh-lead { max-width: 60ch; }
.page-pricing-dark .dh-phero .dh-body { max-width: 62ch; }
.page-pricing-dark .dh-phero-link { margin-top: 6px; }
.page-pricing-dark .dh-link { display: inline-flex; align-items: center; gap: 8px; min-height: 40px; color: var(--dk-text); font-size: 14px; font-weight: 500; text-decoration: underline; text-underline-offset: 4px; text-decoration-color: var(--dk-line-strong); }
.page-pricing-dark .dh-link:hover { text-decoration-color: var(--dk-text); }
.page-pricing-dark .dh-link .arrow { width: 16px; height: 16px; transition: transform 300ms var(--dk-ease); }
.page-pricing-dark .dh-link:hover .arrow { transform: translateX(3px); }

/* sections: one rule between, the recipe's inset */
.page-pricing-dark .dh-sec { border-top: 1px solid var(--dk-line); }
.page-pricing-dark .dh-sec-body { padding: 96px var(--gutter) 100px; }
.page-pricing-dark .dh-pricing .dh-sec-body { padding-top: 56px; }
.page-pricing-dark .dh-note { margin: 18px auto 0; max-width: 76ch; text-align: center; font-size: 12.5px; line-height: 1.55; color: var(--dk-muted); }
.page-pricing-dark .dh-note:empty { display: none; }

/* the maths strip: three figures on one baseline, their basis under each */
.page-pricing-dark .dh-strip-maths > div { padding-top: 0; }
.page-pricing-dark .dh-strip-maths span strong { display: block; color: var(--dk-text); font-weight: 500; margin-bottom: 4px; }

/* the add-ons table: hairlines, the price in the text colour */
.page-pricing-dark .dh-table { border: 1px solid var(--dk-line-soft); overflow-x: auto; }
.page-pricing-dark .dh-table table { width: 100%; border-collapse: collapse; font-size: 13.5px; }
.page-pricing-dark .dh-table th { padding: 14px 16px; text-align: left; font-size: 12px; font-weight: 500; letter-spacing: 0.06em; text-transform: uppercase; color: var(--dk-muted); border-bottom: 1px solid var(--dk-line); }
.page-pricing-dark .dh-table td, .page-pricing-dark .dh-table tbody th { padding: 14px 16px; text-align: left; vertical-align: top; border-top: 1px solid var(--dk-line-soft); }
.page-pricing-dark .dh-table tbody th { font-size: 14px; font-weight: 500; letter-spacing: 0; text-transform: none; color: var(--dk-text); width: 22%; border-bottom: 0; }
.page-pricing-dark .dh-table .price { width: 24%; color: var(--dk-text); white-space: nowrap; font-variant-numeric: tabular-nums; }
.page-pricing-dark .dh-table td:last-child { color: var(--dk-grey); line-height: 1.55; }

/* who it is for: two glass modules (recipe: module card) */
.page-pricing-dark .dh-who { display: grid; grid-template-columns: 1fr 1fr; gap: 14px; }
.page-pricing-dark .dh-who-card { display: grid; align-content: start; gap: 14px; padding: 22px 24px; background: var(--dk-glass); -webkit-backdrop-filter: blur(20px); backdrop-filter: blur(20px); border: 1px solid var(--dk-line-strong); box-shadow: var(--dk-shadow), inset 0 1px 0 rgba(255, 255, 255, 0.14); }
.page-pricing-dark .dh-who-card p { margin: 0; }
.page-pricing-dark .dh-who-card .dh-btn { margin-top: 4px; }

/* the FAQ keeps the page's nine questions in the theme's FAQ anatomy, bounded to the column (the homepage
   bounds its FAQ with its column container; this page has none, so the wrap itself takes the width) */
.page-pricing-dark #faq .wrap { max-width: var(--container); margin: 0 auto; }
.page-pricing-dark #faq .h2 .dim { color: var(--dk-muted); }

@media (max-width: 1024px) {
  .page-pricing-dark .dh-who { grid-template-columns: 1fr; }
}
@media (max-width: 768px) {
  .page-pricing-dark .dh-phero { padding: 96px 20px 16px; }
  .page-pricing-dark .dh-sec-body { padding: 64px 20px; }
  .page-pricing-dark .dh-table td:last-child { min-width: 30ch; }
}
@media (max-width: 480px) {
  .page-pricing-dark .dh-h1 { font-size: 34px; }
}

/* css/pages/pricing.css */
/* marketing/css/pages/pricing.css - /pricing only. Everything is scoped under .page-pricing.
 *
 * The plan grid's MARKUP is not ours: src/routes/pages.js renderPricingGrid() emits
 * .pricing/.pcard/.pop/.ptag/.pn/.pp/.pb/ul/li and .btn(.primary) between the pricing markers at
 * serve time. So the card styling below targets those class names rather than inventing new ones -
 * changing them here would silently un-style the live, server-rendered grid.
 *
 * Laws inherited from base.css and not re-litigated: flat (no shadows), hovers are tints, radius
 * from the five-step scale, cobalt only on CTAs, links, key stats and numerals, four breakpoints.
 */

/* ----------------------------------------------------------------------- hero
 * base.css zeroes paragraph margins (rhythm is a layout job, not a default), so the hero's
 * stack is spaced here rather than by wrapping five elements in a helper div.
 */
.page-pricing .band-hero h1 { margin-bottom: var(--s5); }
.page-pricing .band-hero p + p { margin-top: var(--s4); }
.page-pricing .band-hero .micro-proof { margin-top: var(--s5); }

/* ------------------------------------------------------------------ plan grid */
/* The cards are the hero's payoff, not a separate argument: 48px above them instead of the
   standard 96, so they read as one move with the headline. */
.page-pricing .band-cards { padding-top: var(--s7); }

.page-pricing .pricing {
  display: grid;
  grid-template-columns: repeat(3, minmax(0, 1fr));
  gap: var(--s5);
  align-items: stretch;
}
/* Plan cards are a SYSTEM component now - styled once in base.css §14 (the figr-structure
   redesign, George 2026-08-18). Only the page grid/layout below stays page-scoped. */
/* --------------------------------------------------------- per-client maths */
.page-pricing .stat-label {
  margin-top: var(--s2);
  font-size: 11px;
  letter-spacing: 0.08em;
  text-transform: uppercase;
}
.page-pricing .plot .card p { margin-top: var(--s4); }
/* Where a number comes from travels with the number. */
.page-pricing .basis {
  max-width: var(--measure-read);
  margin-top: var(--s6);
}

/* ------------------------------------------------------------ engine add-ons */
.page-pricing .addons { font-size: 15px; }
.page-pricing .addons th,
.page-pricing .addons td {
  text-align: left;
  vertical-align: top;
  padding: 16px var(--s5) 16px 0;
  border-bottom: 1px solid var(--line);
}
.page-pricing .addons thead th {
  padding-top: 0;
  font-family: var(--mono);
  font-size: 12px;
  font-weight: 500;
  letter-spacing: 0.06em;
  text-transform: uppercase;
  color: var(--steel);
}
.page-pricing .addons tbody th { width: 22%; font-weight: 500; }
.page-pricing .addons .price {
  width: 14%;
  font-family: var(--mono);
  font-weight: 500;
  color: var(--accent-ink);
  white-space: nowrap;
}
.page-pricing .addons td:last-child { padding-right: 0; color: var(--iron); }
.page-pricing .addons tbody tr:last-child th,
.page-pricing .addons tbody tr:last-child td { border-bottom: 0; }

/* --------------------------------------------------------- comparison matrix */
.page-pricing .matrix-switch { display: none; gap: var(--s2); margin-bottom: var(--s5); }
/* --accent-ink: white on --accent is 2.49:1. Hidden above 768, so only the MOBILE axe project
   ever saw it - a reminder that a desktop-only a11y pass misses whole controls. */
.page-pricing .matrix-switch button[aria-pressed='true'] {
  background: var(--accent-ink);
  border-color: var(--accent-ink);
  color: #FFFFFF;
}
/* No overflow container above 768: it would become the scrollport for the sticky header and the
   header would stop sticking to the viewport. Mobile gets the scroll AND the one-plan switcher. */
.page-pricing .matrix-wrap { overflow-x: visible; }
.page-pricing .matrix { font-size: 15px; }
.page-pricing .matrix thead th {
  position: sticky;
  top: var(--nav-h);
  z-index: 2;
  background: var(--ink);
  color: var(--on-ink-text);
  font-weight: 500;
  text-align: center;
  padding: 14px var(--s4);
  border-right: 1px solid var(--on-ink-line);
}
.page-pricing .matrix thead th:first-child { text-align: left; border-top-left-radius: var(--r-ctl); }
.page-pricing .matrix thead th:last-child { border-right: 0; border-top-right-radius: var(--r-ctl); }
.page-pricing .matrix thead th small {
  display: block;
  margin-top: 2px;
  font-family: var(--mono);
  font-size: 11px;
  font-weight: 400;
  letter-spacing: 0.04em;
  color: var(--on-ink-body);
}
.page-pricing .matrix tbody th {
  text-align: left;
  font-weight: 400;
  padding: 14px var(--s5) 14px 0;
  border-bottom: 1px solid var(--line);
}
.page-pricing .matrix tbody td {
  text-align: center;
  padding: 14px var(--s4);
  color: var(--iron);
  border-bottom: 1px solid var(--line);
}
.page-pricing .matrix tbody tr:last-child th,
.page-pricing .matrix tbody tr:last-child td { border-bottom: 0; }
.page-pricing .matrix .yes { display: inline-block; color: var(--ink); vertical-align: -3px; }
.page-pricing .matrix .no { color: var(--steel); }

/* -------------------------------------------------------------- breakpoints
 * 1180 / 1024 / 768 / 480 - the site's four. No fifth width is introduced here.
 */
@media (max-width: 1180px) {
  .page-pricing .pcard { padding: var(--s5); }
  .page-pricing .ptag { top: var(--s5); right: var(--s5); }
}

@media (max-width: 1024px) {
  .page-pricing .pricing { grid-template-columns: minmax(0, 1fr); }
  .page-pricing .pcard { padding: var(--s6); }
  .page-pricing .ptag { top: var(--s6); right: var(--s6); }
  .page-pricing .pcard ul { margin-bottom: var(--s5); }
  .page-pricing .matrix { font-size: 14px; }
  .page-pricing .matrix tbody th { padding-right: var(--s4); }
}

@media (max-width: 768px) {
  /* One plan at a time, the measured mobile fallback. The switcher only appears when the script
     that drives it is running (`js` is set on <html> before first paint); without it the table is
     complete and scrolls sideways instead of hiding two thirds of itself. */
  .js .page-pricing .matrix-switch { display: flex; }
  .page-pricing .matrix-wrap { overflow-x: auto; }
  .page-pricing .matrix-wrap[data-col='1'] .col-2,
  .page-pricing .matrix-wrap[data-col='1'] .col-3,
  .page-pricing .matrix-wrap[data-col='2'] .col-1,
  .page-pricing .matrix-wrap[data-col='2'] .col-3,
  .page-pricing .matrix-wrap[data-col='3'] .col-1,
  .page-pricing .matrix-wrap[data-col='3'] .col-2 { display: none; }
  .page-pricing .matrix thead th { position: static; }
  .page-pricing .pp { font-size: 40px; }
}

@media (max-width: 480px) {
  .page-pricing .matrix-switch { flex-wrap: wrap; }
  .page-pricing .matrix-switch .btn { width: auto; flex: 1 1 30%; }
  .page-pricing .addons thead { display: none; }
  .page-pricing .addons tbody th,
  .page-pricing .addons tbody td { display: block; width: auto; padding: 0; border-bottom: 0; }
  .page-pricing .addons tbody th { padding-top: var(--s5); }
  .page-pricing .addons .price { padding: 2px 0; }
  .page-pricing .addons tbody td:last-child { padding-bottom: var(--s5); border-bottom: 1px solid var(--line); }
  .page-pricing .addons tbody tr:last-child td:last-child { border-bottom: 0; }
}

/* css/pages/solutions-agencies.css */
/* /solutions/agencies — the priority page (P1 §P-10, template T6 inverted: a plan sell, never
 * partner recruitment). Everything structural comes from base.css; only this page's own rhythm
 * and the two bespoke blocks (the economics tiles, the pricing-model contrast) live here. */

/* Hero: the CTA pair and its reassurance line need their own air below a 72px display line. */
.page-agencies .band-hero .sub-hero { margin-top: var(--s5); }
.page-agencies .band-hero .cta-row { margin-top: var(--s7); }

/* Demo band. The embed is the widest thing on the page, so its footer links sit tight under it
   rather than opening a second section-sized gap. */
.page-agencies .demo-foot { margin-top: var(--s5); gap: var(--s6); }

/* ECONOMICS TILES — plot cards (dot paper + registration ticks), one arithmetic fact each.
   The stat leads, the mono label names the unit, the body shows the working. Nothing here is a
   fabricated number: every figure is a published plan price or a plan limit. */
.page-agencies .econ .card { display: flex; flex-direction: column; height: 100%; }
.page-agencies .econ .stat-num { display: block; }
.page-agencies .econ .eyebrow { margin: var(--s3) 0 var(--s4); }
.page-agencies .econ .body-sm { margin-top: auto; }
.page-agencies .econ-basis { margin-top: var(--s6); max-width: var(--measure-hero); }

/* The 01–04 week. Step bodies are the page's longest prose, so they hold the reading measure. */
.page-agencies .steps h3 + p { margin-top: var(--s3); }
.page-agencies .steps p { max-width: var(--measure-read); }

/* Winning-the-work rails: two cards of equal height with the link pinned to the foot. */
.page-agencies .card-lg { display: flex; flex-direction: column; }
.page-agencies .card-lg .body-sm { margin-top: var(--s3); }
.page-agencies .card-lg .btn-text { margin-top: auto; padding-top: var(--s5); align-self: flex-start; }
.page-agencies code {
  font-family: var(--mono);
  font-size: 0.92em;
  padding: 1px 5px;
  border: 1px solid var(--line);
  border-radius: var(--r-ctl);
  background: var(--band-tint);
  white-space: nowrap;
}

/* Proof pair: the demo-labelled walk-through beside the honest reserved slot. The chip sits above
   the heading in both, so the two cards read as one system rather than a card and an apology. */
.page-agencies .proof .chip { margin-bottom: var(--s4); }
.page-agencies .proof h3 + .star-list { margin-top: var(--s5); }
.page-agencies .proof .star-list > li + li { margin-top: var(--s3); }
.page-agencies .proof-slot .body-sm + .body-sm { margin-top: var(--s4); }

/* PRICING-MODEL CONTRAST. The left card is the category's shape, deliberately de-emphasised in
   Iron/Steel; the right is ours at full contrast. No colour wash on either — the hierarchy is
   weight and the cobalt star bullets, per the pigment discipline. */
.page-agencies .models .card { height: 100%; }
.page-agencies .models .star-list { margin-top: var(--s2); }
.page-agencies .models .star-list > li + li { margin-top: var(--s3); }
.page-agencies .models .is-muted { background: transparent; color: var(--iron); }
.page-agencies .models .is-muted .star-list > li { color: var(--iron); }
.page-agencies .models-basis { margin-top: var(--s6); max-width: var(--measure-read); }

@media (max-width: 1024px) {
  /* 4-up collapses to 2-up here; the tiles are the page's argument, so they keep their own rhythm
     rather than inheriting the generic grid gap at a size where they sit two abreast. */
  .page-agencies .econ { gap: var(--s5); }
}

@media (max-width: 768px) {
  .page-agencies .band-hero .cta-row { margin-top: var(--s6); }
  .page-agencies .demo-foot { flex-direction: column; align-items: flex-start; gap: var(--s3); }
  .page-agencies .econ .stat-num { font-size: 40px; }
  .page-agencies .card-lg .btn-text { padding-top: var(--s4); }
}

/* css/pages/solutions-dark.css */
/* marketing/css/pages/solutions-dark.css - the SOLUTIONS pair, dark (agencies and in-house, held until the
 * site's one cutover). Both pages keep their markup and copy; marketing/css/theme-dark.css skins the base
 * vocabulary and this sheet holds only the pair's own devices: the economics figures, the two pricing
 * models, the month-in-proof, the Shopify aside. Keyed on the family class solutions-dark. Values are the
 * recipes' (docs/UI_PATTERN_CATALOG.md 2.16). Laws kept: weights 400/500 only; breakpoints 1180/1024/768/480
 * only; no forced overrides; radii 0 and 2 on the site. */

/* the economics: four figures in glass modules, the label under the figure */
.solutions-dark .econ .card { display: grid; gap: 6px; align-content: start; }
.solutions-dark .stat-num { display: block; font-size: 40px; font-weight: 500; letter-spacing: -0.03em; line-height: 1.1; color: var(--dk-text); font-variant-numeric: tabular-nums; }
.solutions-dark .econ .eyebrow { margin: 4px 0 8px; }
.solutions-dark .econ-basis, .solutions-dark .models-basis { margin: 24px auto 0; max-width: 76ch; font-size: 12.5px; line-height: 1.55; color: var(--dk-muted); text-align: center; }
.solutions-dark .econ-basis a, .solutions-dark .models-basis a { color: var(--dk-grey); text-decoration: underline; text-underline-offset: 2px; }
/* the two pricing models: the per-brand model recedes, ours is the glass */
.solutions-dark .models .card.is-muted { background: rgba(255, 255, 255, 0.02); -webkit-backdrop-filter: none; backdrop-filter: none; box-shadow: none; }
.solutions-dark .models .card .star-list { margin-top: 4px; }
/* the month, and what you walk in with: both panels are glass (the light design set them on the panel) */
.solutions-dark .proof .h3-block { margin-bottom: 14px; font-size: 22px; letter-spacing: -0.02em; }
.solutions-dark .proof, .solutions-dark .proof-loop { padding: 22px 24px; background: var(--dk-glass); -webkit-backdrop-filter: blur(20px); backdrop-filter: blur(20px); border: 1px solid var(--dk-line-strong); box-shadow: var(--dk-shadow), inset 0 1px 0 rgba(255, 255, 255, 0.14); display: grid; gap: 10px; align-content: start; }
.solutions-dark .proof-loop .h4 { margin: 0; }
/* the Shopify aside: a split row inside one glass module */
.solutions-dark .shopify .row-split { gap: 24px 48px; }
.solutions-dark .shopify .h3-block { font-size: 22px; letter-spacing: -0.02em; }
/* the third button the in-house hero used is the ghost */
.solutions-dark .btn-tinted { background: rgba(255, 255, 255, 0.04); border-color: var(--dk-line-strong); color: var(--dk-text); }
.solutions-dark .btn-tinted:hover { background: rgba(255, 255, 255, 0.09); border-color: rgba(255, 255, 255, 0.38); color: var(--dk-text); text-decoration: none; }
.solutions-dark .values .card .btn-text { margin-top: 14px; }
.solutions-dark .steps .h3-block { font-size: 20px; letter-spacing: -0.015em; }
.solutions-dark .steps > li > p { margin-top: 8px; color: var(--dk-grey); }
.solutions-dark .demo-foot { margin-top: 24px; display: flex; gap: 10px 24px; flex-wrap: wrap; justify-content: center; }
@media (max-width: 1024px) {
  .solutions-dark .econ { grid-template-columns: repeat(2, minmax(0, 1fr)); }
}
@media (max-width: 768px) {
  .solutions-dark .econ, .solutions-dark .models, .solutions-dark .values { grid-template-columns: minmax(0, 1fr); }
  .solutions-dark .stat-num { font-size: 34px; }
}

/* css/pages/solutions-in-house.css */
/* /solutions/in-house — the single-brand page (P1 §P-11, T6). Deliberately the short one: it
 * converts on price and simplicity, and depth lives on the feature pages it links to. Only this
 * page's rhythm lives here; every component is base.css. */

.page-inhouse .band-hero .sub-hero { margin-top: var(--s5); }
.page-inhouse .band-hero .cta-row { margin-top: var(--s7); }

.page-inhouse .demo-foot { margin-top: var(--s5); }

/* Value tiles: three equal cards, each ending in its feature-page link on the same baseline. */
.page-inhouse .values .card { display: flex; flex-direction: column; height: 100%; }
.page-inhouse .values .h4 + .body-sm { margin-top: var(--s3); }
.page-inhouse .values .btn-text { margin-top: auto; padding-top: var(--s5); align-self: flex-start; }

/* The free-report ink band: the entry ramp (report, trial, Solo) as numbered steps beside the
   pitch. On ink the step numerals go white, which base.css already handles. */
.page-inhouse .band-ink .row-split { grid-template-columns: minmax(0, 0.95fr) minmax(0, 1.05fr); align-items: start; gap: var(--s8); }
.page-inhouse .band-ink .steps > li + li { margin-top: var(--s5); }
.page-inhouse .band-ink .steps h3 + .body-sm { margin-top: var(--s2); }
.page-inhouse .band-ink .cta-row { margin-top: var(--s2); }

.page-inhouse .steps h3 + p { margin-top: var(--s3); }
.page-inhouse .steps p { max-width: var(--measure-read); }

/* Shopify cross-link: one card carrying a split row, so the merchant lane is a visible door
   rather than a sentence buried in a FAQ. */
.page-inhouse .shopify .row-split { gap: var(--s7); align-items: start; }
.page-inhouse .shopify .eyebrow { margin-bottom: var(--s3); }
.page-inhouse .shopify .btn-text { margin-top: var(--s4); }

@media (max-width: 1024px) {
  .page-inhouse .band-ink .row-split { gap: var(--s7); }
}

@media (max-width: 768px) {
  .page-inhouse .band-hero .cta-row { margin-top: var(--s6); }
  .page-inhouse .band-ink .row-split { grid-template-columns: minmax(0, 1fr); gap: var(--s6); }
  .page-inhouse .values .btn-text { padding-top: var(--s4); }
  .page-inhouse .shopify .row-split { gap: var(--s5); }
}
