/* ==========================================================================
   Onbixo public / marketing site.
   Loaded ONLY on the public layout (layout/public.php), on top of app.css - so it
   inherits the app's design tokens (the indigo/blurple accent, ink/surface, radii)
   and adds the marketing-only display font, shell, navigation, and section system.
   One source of truth for brand colour: app.css. No external assets (strict CSP).
   ========================================================================== */

/* ---- display font: Fraunces (variable, self-hosted, latin) --------------------------------
   One variable file covers weights 300-900. We set large display at a LIGHTER weight for the
   elegant high-contrast look; smaller heads use a touch more weight for solidity. */
@font-face {
  font-family: "Fraunces";
  src: url("/assets/vendor/fonts/fraunces-var.woff2") format("woff2");
  font-weight: 300 900;
  font-style: normal;
  font-display: swap;
}

:root {
  /* marketing type tokens */
  --pub-display: "Fraunces", Georgia, "Times New Roman", serif;
  --pub-sans: var(--font);            /* inherit the app's system sans for body/UI */
  --pub-maxw: 1140px;
  --pub-gutter: 24px;
  /* section rhythm */
  --pub-sec-y: clamp(56px, 8vw, 104px);
  /* a soft, brand-tinted neutral for large fills (not pure grey) */
  --pub-tint: color-mix(in srgb, var(--accent) 5%, var(--surface));
  --pub-tint-2: color-mix(in srgb, var(--accent) 8%, var(--bg));
  --pub-hairline: color-mix(in srgb, var(--accent) 8%, var(--border));

  /* Functional accent palette (light). Used ONLY where colour carries meaning: per-flow-type
     identity on the product tabs, and the chart's second series / success states. Buttons, text,
     and structure stay indigo+ink. A harmonised jewel-tone set, not a rainbow. All WCAG-checked. */
  --c-tours:  #4F46E5;   /* indigo - the brand (tours) */
  --c-tips:   #0D9488;   /* teal (tooltips & hints) */
  --c-check:  #B45309;   /* amber (checklists) */
  --c-announce:#BE185D;  /* rose (announcements) */
  --c-target: #0891B2;   /* cyan (no-code targeting) */
  --c-analytics: #0EA5E9;/* bright sky blue (analytics - clearly bluer than the tours indigo) */
  --c-resource: #65A30D; /* lime (resource center - a yellow-green, clearly distinct from the checklist amber) */
  --c-survey: #7C3AED;   /* violet (surveys & NPS) - the one unused hue between the tours indigo and the announce rose */
  --c-ab: #D2400A;       /* vermilion (A/B testing) - warm, so it separates from the analytics blue it used to share.
                            Deliberately NOT a brighter orange: #EA580C is only 3.56:1 under white button text, and
                            darkening past this walks into the checklist amber (#B45309). This sits at 4.69:1 with
                            10deg of hue between them.
                            KNOWN LIMIT: at the .hp-band 9% tint this is 3.2 from the amber, i.e. the two bands read
                            the same. That is the band mechanism, not this hue - eight EXISTING pairs are already
                            below the threshold there (target/tips 3.8, survey/tours 4.3, ai/check 4.6), and no
                            tested hue cleared it against all nine. The chip, hero, buttons and links do separate,
                            which is where the colour earns its keep. See /preview/topic-colors. */
  --c-good:   #059669;   /* emerald - chart series 2 + graceful/success semantics */
  --c-ai:     #B8860B;    /* golden (AI page) - dark goldenrod, reads on white */
}
/* Dark theme: lighter tints so they read on the near-black ground. */
@media (prefers-color-scheme: dark) {
  :root:not([data-theme="light"]) {
    --c-tours: #9184D9; --c-tips: #2dd4bf; --c-check: #fbbf46; --c-announce: #f472b6; --c-target: #22d3ee; --c-analytics: #38bdf8; --c-resource: #a3e635; --c-survey: #a78bfa; --c-ab: #fb8b5c; --c-good: #34d399; --c-ai: #E0A82E;
  }
}
:root[data-theme="dark"] {
  --c-tours: #9184D9; --c-tips: #2dd4bf; --c-check: #fbbf46; --c-announce: #f472b6; --c-target: #22d3ee; --c-analytics: #38bdf8; --c-resource: #a3e635; --c-survey: #a78bfa; --c-ab: #fb8b5c; --c-good: #34d399; --c-ai: #E0A82E;
}

/* ---- base -------------------------------------------------------------------------------- */
/* Public-only background: a whisper of the brand indigo instead of a neutral grey, so the site
   reads as intentionally branded (like Linear/Framer/Stripe) rather than generic. Scoped to
   .public-body so the dashboard keeps its own neutral --bg. Very light: white cards still pop. */
/* app.css sets `html, body { height: 100% }` for the dashboard's full-height shell. That makes the
   body a viewport-tall scroll container, which CONFINES position:sticky to one viewport - the nav
   "releases" after the first scroll. The marketing site must scroll the natural document, so we drop
   the height constraint on the public <html> (which carries .public-html) and its body. This is the
   real sticky-nav fix. */
html.public-html { height: auto; }
html.public-html body.public-body { height: auto; }
.public-body {
  --bg: #f8f8fe;                 /* ~4% indigo into white */
  --surface-2: #f1f1fb;          /* the muted fill, retinted to match */
  /* Soft accent wash - used by the nav "New" badge and anything else off the product pages
     (the pr-page-* scopes redefine this per topic; here is the base so it is never undefined). */
  --accent-soft: color-mix(in srgb, var(--accent) 13%, #ffffff);
  background: var(--bg);
  color: var(--ink);
  font-family: var(--pub-sans);
  font-size: 16px;
  line-height: 1.6;
  -webkit-font-smoothing: antialiased;
  text-rendering: optimizeLegibility;
  /* Also override the dashboard's flex-column .public-body (a flex parent confines a sticky child). */
  display: block;
  height: auto;
  min-height: 100vh;
}
/* Dark theme: keep the deep near-black ground (it already carries the brand via the accent);
   a tint here would muddy it. Nudge it a hair toward indigo, no more. */
:root[data-theme="dark"] .public-body,
:root:not([data-theme="light"]) .public-body { }
@media (prefers-color-scheme: dark) {
  :root:not([data-theme="light"]) .public-body { --bg: #0b0c17; --surface-2: #0f1622; --accent-soft: color-mix(in srgb, var(--accent) 22%, #0b0c17); }
}
:root[data-theme="dark"] .public-body { --bg: #0b0c17; --surface-2: #0f1622; --accent-soft: color-mix(in srgb, var(--accent) 22%, #0b0c17); }
.pub-wrap { max-width: var(--pub-maxw); margin: 0 auto; padding: 0 var(--pub-gutter); }

/* Staff blog-preview strip: an unmistakable top banner so a draft preview is never taken for the
   live page. Sits above the article; high-contrast amber. */
.preview-banner { background: #7a4d00; color: #fff; text-align: center; padding: 10px 16px;
  font-size: 14px; line-height: 1.5; }
.preview-banner a { color: #ffe1a8; text-decoration: underline; }

/* display type */
.pub-display,
.public-body h1, .public-body h2 {
  font-family: var(--pub-display);
  font-weight: 380;               /* light-ish: Fraunces 400 reads heavy, this stays elegant */
  letter-spacing: -0.018em;
  line-height: 1.06;
  text-wrap: balance;
}
.public-body h3 { font-family: var(--pub-display); font-weight: 460; letter-spacing: -0.01em; line-height: 1.15; }
.eyebrow {
  font-family: var(--pub-sans);
  font-size: 12px; font-weight: 700; letter-spacing: 0.16em; text-transform: uppercase;
  color: var(--accent);
}
.pub-lede { font-size: clamp(17px, 2.2vw, 20px); line-height: 1.55; color: var(--ink-soft); max-width: 58ch; }
/* Newsletter confirm / unsubscribe result pages: a short centred message, not a full page of
   content, so it needs its own vertical rhythm rather than sitting flush under the header. */
.news-result { padding-top: 72px; padding-bottom: 96px; max-width: 62ch; }
/* .public-body h1 sets family/weight/spacing but no SIZE, so an h1 here fell back to the browser
   default (~32px) - barely above .pub-lede's 20px, which is why the title did not read as one.
   Sized explicitly, and it scales down on narrow screens. */
.news-result h1 { margin: 0 0 12px; font-size: clamp(30px, 5vw, 44px); }
.news-result p { margin: 0 0 22px; }

/* ---- announcement bar -------------------------------------------------------------------- */
/* No-JS notice (rendered only inside <noscript>): a thin, neutral info strip. */
.pub-noscript { background: var(--surface-2); border-bottom: 1px solid var(--pub-hairline);
  color: var(--ink-soft); font-size: 13px; text-align: center; padding: 9px 16px; }
.pub-noscript a { color: var(--accent); font-weight: 600; text-decoration: underline; }
.pub-announce {
  background: var(--accent); color: var(--accent-ink);
  font-size: 13.5px; text-align: center; position: relative;
}
.pub-announce[hidden] { display: none; }
.pub-announce-in {
  max-width: var(--pub-maxw); margin: 0 auto; padding: 8px 44px 8px var(--pub-gutter);
  display: flex; align-items: center; justify-content: center; gap: 8px;
}
.pub-announce a { color: var(--accent-ink); font-weight: 650; text-decoration: underline; text-underline-offset: 2px; }
.pub-announce-x {
  position: absolute; right: 10px; top: 50%; transform: translateY(-50%);
  background: none; border: 0; color: var(--accent-ink); cursor: pointer; opacity: .75;
  font-size: 18px; line-height: 1; padding: 4px 8px; border-radius: 6px;
}
.pub-announce-x:hover { opacity: 1; background: color-mix(in srgb, #000 12%, transparent); }

/* ---- sticky nav -------------------------------------------------------------------------- */
.pub-nav {
  position: sticky; top: 0; z-index: 60;
  background: color-mix(in srgb, var(--bg) 88%, transparent);
  backdrop-filter: blur(10px);
  border-bottom: 1px solid transparent;
  transition: border-color .2s ease, background .2s ease;
}
.pub-nav.is-scrolled { border-bottom-color: var(--pub-hairline); }
.pub-nav-in {
  max-width: var(--pub-maxw); margin: 0 auto; padding: 13px var(--pub-gutter);
  display: flex; align-items: center; gap: 8px;
}
.pub-brand { display: flex; align-items: center; gap: 7px; font-weight: 680; font-size: 17px;
  letter-spacing: -0.02em; color: var(--ink); flex: none; }
.pub-brand:hover { text-decoration: none; }
.pub-brand .pub-mark { width: 22px; height: 22px; }

/* primary nav links (desktop) */
.pub-nav-links { display: flex; align-items: center; gap: 2px; margin-left: 22px; }
.pub-nav-link {
  display: inline-flex; align-items: center; gap: 5px;
  padding: 8px 12px; border-radius: 9px; font-size: 14.5px; font-weight: 550;
  color: var(--ink-soft); background: none; border: 0; cursor: pointer; font-family: inherit;
}
.pub-nav-link:hover { color: var(--ink); background: var(--surface-2); text-decoration: none; }
.pub-nav-link .caret { width: 9px; height: 9px; opacity: .6; transition: transform .18s ease; }
.pub-nav-item.is-open > .pub-nav-link { color: var(--ink); background: var(--surface-2); }
.pub-nav-item.is-open > .pub-nav-link .caret { transform: rotate(180deg); }

.pub-nav-right { margin-left: auto; display: flex; align-items: center; gap: 8px; }
.pub-login { font-size: 14.5px; font-weight: 550; color: var(--ink-soft); padding: 8px 12px; border-radius: 9px; }
.pub-login:hover { color: var(--ink); text-decoration: none; background: var(--surface-2); }
.pub-theme {
  width: 34px; height: 34px; display: grid; place-items: center; flex: none;
  border: 1px solid var(--border); background: var(--surface); color: var(--ink-soft);
  border-radius: 9px; cursor: pointer;
}
.pub-theme:hover { color: var(--accent); border-color: var(--accent); }
.pub-theme svg { width: 16px; height: 16px; }

/* ---- dropdown (Product / Solutions / Resources) ------------------------------------------ */
.pub-nav-item { position: relative; }
.pub-drop {
  position: absolute; top: calc(100% + 8px); left: 0; z-index: 70;
  min-width: 300px; padding: 8px;
  background: var(--surface); border: 1px solid var(--border); border-radius: 14px;
  box-shadow: var(--shadow);
  opacity: 0; visibility: hidden; transform: translateY(-6px);
  transition: opacity .16s ease, transform .16s ease, visibility .16s;
}
.pub-nav-item.is-open .pub-drop { opacity: 1; visibility: visible; transform: none; }
.pub-drop.two-col { display: grid; grid-template-columns: 1fr 1fr; gap: 8px; min-width: 520px; }
/* cols-2: items flow directly into two even columns (no section headers) - for a long single list. */
.pub-drop.cols-2 { display: grid; grid-template-columns: 1fr 1fr; gap: 2px 8px; min-width: 600px; }
.pub-drop-col-head {
  font-size: 11px; font-weight: 700; letter-spacing: .07em; text-transform: uppercase;
  color: var(--ink-faint); padding: 8px 10px 4px;
}
.pub-drop-item { display: flex; gap: 11px; align-items: flex-start; padding: 9px 10px; border-radius: 10px; }
.pub-drop-item:hover { background: var(--surface-2); text-decoration: none; }
.pub-drop-ico {
  width: 30px; height: 30px; flex: none; border-radius: 8px; display: grid; place-items: center;
  background: var(--accent-soft); color: var(--accent);
}
.pub-drop-ico svg { width: 17px; height: 17px; }
.pub-drop-txt b { display: block; font-size: 13.5px; font-weight: 620; color: var(--ink); letter-spacing: -.01em; }
/* Direct child only: the DESCRIPTION span. Without `>` this also caught the nested
   `.pub-badge` span inside the title <b>, forcing it to display:block on its own line. */
.pub-drop-txt > span { display: block; font-size: 12px; color: var(--ink-faint); margin-top: 1px; line-height: 1.4; }
.pub-drop-item.is-soon { opacity: .55; pointer-events: none; }
.pub-badge {
  display: inline-block; line-height: 1.4;   /* self-defending: never forced to block by an ancestor rule */
  font-size: 9.5px; font-weight: 800; letter-spacing: .05em; text-transform: uppercase;
  color: var(--accent); background: var(--accent-soft); border-radius: 5px; padding: 1px 5px;
  margin-left: 6px; vertical-align: 1px;
}
.pub-badge.soon { color: var(--ink-faint); background: var(--surface-2); }

/* ---- buttons (marketing sizes; base .btn styles come from app.css) ----------------------- */
.pub-btn {
  display: inline-flex; align-items: center; justify-content: center; gap: 7px;
  font-family: inherit; font-weight: 600; font-size: 14px; line-height: 1;
  padding: 10px 17px; border-radius: 10px; border: 1px solid transparent; cursor: pointer;
  text-decoration: none; transition: background .15s ease, border-color .15s ease, transform .12s ease;
}
.pub-btn:hover { text-decoration: none; }
.pub-btn:active { transform: translateY(1px); }
.pub-btn-primary { background: var(--accent); color: var(--accent-ink); border-color: var(--accent); }
.pub-btn-primary:hover { background: var(--accent-hover); border-color: var(--accent-hover); }
.pub-btn-primary:active { background: var(--accent-pressed); border-color: var(--accent-pressed); }
.pub-btn-ghost { background: var(--surface); color: var(--ink); border-color: var(--border-strong); }
.pub-btn-ghost:hover { border-color: var(--accent); color: var(--accent); }
.pub-btn-lg { font-size: 16px; padding: 13px 24px; border-radius: 12px; }

/* ---- mobile nav / drawer ----------------------------------------------------------------- */
.pub-burger { display: none; width: 38px; height: 38px; margin-left: 4px; flex: none;
  border: 1px solid var(--border); background: var(--surface); border-radius: 9px; cursor: pointer;
  color: var(--ink); }
.pub-burger svg { width: 18px; height: 18px; }
.pub-drawer { display: none; }

@media (max-width: 900px) {
  .pub-nav-links { display: none; }
  .pub-nav-right .pub-login { display: none; }
  .pub-burger { display: grid; place-items: center; }
  /* drawer */
  .pub-drawer {
    display: block; position: fixed; inset: 0; z-index: 90; visibility: hidden;
  }
  .pub-drawer[aria-hidden="false"] { visibility: visible; }
  .pub-drawer-scrim {
    position: absolute; inset: 0; background: color-mix(in srgb, #000 45%, transparent);
    opacity: 0; transition: opacity .2s ease;
  }
  .pub-drawer[aria-hidden="false"] .pub-drawer-scrim { opacity: 1; }
  .pub-drawer-panel {
    position: absolute; top: 0; right: 0; height: 100%; width: min(88vw, 360px);
    background: var(--surface); border-left: 1px solid var(--border);
    transform: translateX(100%); transition: transform .24s ease;
    display: flex; flex-direction: column; padding: 16px;
  }
  .pub-drawer[aria-hidden="false"] .pub-drawer-panel { transform: none; }
  .pub-drawer-head { display: flex; align-items: center; justify-content: space-between; margin-bottom: 12px; }
  .pub-drawer-x { width: 38px; height: 38px; border: 1px solid var(--border); background: var(--surface);
    border-radius: 9px; color: var(--ink); cursor: pointer; display: grid; place-items: center; }
  .pub-drawer-nav { flex: 1; overflow-y: auto; }
  .pub-drawer-group summary {
    list-style: none; cursor: pointer; padding: 12px 8px; font-size: 16px; font-weight: 600;
    color: var(--ink); display: flex; align-items: center; justify-content: space-between;
    border-bottom: 1px solid var(--border);
  }
  .pub-drawer-group summary::-webkit-details-marker { display: none; }
  .pub-drawer-group summary .caret { width: 11px; height: 11px; opacity: .5; transition: transform .18s; }
  .pub-drawer-group[open] summary .caret { transform: rotate(180deg); }
  .pub-drawer-sub { padding: 4px 0 10px; }
  /* Section label inside a drawer group, matching the desktop dropdown's column heads - the
     drawer now lists use cases AND industries, which run together without one. */
  .pub-drawer-subhead { padding: 10px 8px 4px 16px; font-size: 11px; font-weight: 700;
    letter-spacing: .07em; text-transform: uppercase; color: var(--ink-faint); }
  .pub-drawer-sub > .pub-drawer-subhead:first-child { padding-top: 4px; }
  .pub-drawer-sub a { display: block; padding: 9px 8px 9px 16px; font-size: 14.5px; color: var(--ink-soft); }
  .pub-drawer-sub a:hover { color: var(--accent); text-decoration: none; }
  .pub-drawer-flat a { display: block; padding: 12px 8px; font-size: 16px; font-weight: 600;
    color: var(--ink); border-bottom: 1px solid var(--border); }
  .pub-drawer-foot { padding-top: 14px; display: flex; flex-direction: column; gap: 8px; }
}

.pub-noscroll { overflow: hidden; }

/* ---- footer ------------------------------------------------------------------------------ */
.pub-footer { border-top: 1px solid var(--pub-hairline); background: var(--pub-tint); }
.pub-footer-in { max-width: var(--pub-maxw); margin: 0 auto; padding: 56px var(--pub-gutter) 40px;
  display: grid; grid-template-columns: 1.6fr repeat(4, 1fr); gap: 32px; }
.pub-footer-brand .pub-brand { font-size: 18px; }
.pub-footer-brand p { margin: 14px 0 0; font-size: 13.5px; color: var(--ink-faint); max-width: 30ch; line-height: 1.5; }
.pub-footer-social { display: flex; flex-wrap: wrap; gap: 10px; margin: 16px 0 0; }
.pub-social-link { display: inline-flex; align-items: center; justify-content: center; width: 34px; height: 34px;
  border: 1px solid var(--pub-hairline); border-radius: 9px; color: var(--ink-soft); transition: color .12s ease, border-color .12s ease, background .12s ease; }
.pub-social-link:hover { color: var(--accent); border-color: var(--accent); background: color-mix(in srgb, var(--accent) 8%, transparent); text-decoration: none; }
.pub-social-link:focus-visible { outline: 2px solid var(--accent); outline-offset: 2px; }
.pub-footer-col h4 { font-size: 11.5px; font-weight: 700; letter-spacing: .06em; text-transform: uppercase;
  color: var(--ink-faint); margin: 0 0 12px; }
.pub-footer-col a { display: block; font-size: 13.5px; color: var(--ink-soft); padding: 5px 0; }
.pub-footer-col a:hover { color: var(--accent); text-decoration: none; }
/* ---- marketing lead capture (public footer) ---- */
/* Lives in the footer's brand column, under the social links. That column is the narrow 1.6fr track
   of a 5-column grid, so the form STACKS (input over button) rather than sitting on one line - a
   side-by-side field would leave the input a few characters wide at common desktop widths. */
.pub-lead { margin: 22px 0 0; max-width: 34ch; }
/* The uppercase label sits tight to its subtext (they read as one block), and the gap before the
   form is the larger one - the form is the separate, actionable element. */
.pub-lead-h { font-size: 11.5px; font-weight: 700; letter-spacing: .06em; text-transform: uppercase;
  color: var(--ink-faint); margin: 0 0 6px; }
/* Scoped to the brand column: `.pub-footer-brand p` (the tagline rule above) also matches this
   paragraph and outranks a bare .pub-lead-p, which is where the unwanted 14px top gap came from. */
.pub-footer-brand .pub-lead-p { font-size: 12.5px; line-height: 1.5; color: var(--ink-faint);
  margin: 0 0 8px; max-width: none; }
/* Input and button on ONE line. The input is flex:1 with min-width:0 so it shrinks inside the
   narrow column instead of forcing the button to wrap (a flex item's default min-width:auto would). */
.pub-lead-form { display: flex; align-items: stretch; gap: 6px; }
.pub-lead-field { display: block; margin: 0; flex: 1 1 auto; min-width: 0; }
.pub-lead-input { width: 100%; box-sizing: border-box; font: inherit; font-size: 13px;
  color: var(--ink); background: var(--surface); border: 1px solid var(--border);
  border-radius: 9px; padding: 6px 10px; }
.pub-lead-input:focus { outline: none; border-color: var(--accent);
  box-shadow: 0 0 0 3px color-mix(in srgb, var(--accent) 18%, transparent); }
.pub-lead-btn { flex: 0 0 auto; justify-content: center; padding: 6px 14px;
  font-size: 13px; white-space: nowrap; }
.pub-lead-form.is-done { opacity: .55; pointer-events: none; }
.pub-lead-msg { font-size: 12.5px; line-height: 1.45; margin: 8px 0 0; }
.pub-lead-msg.is-ok { color: var(--good, #2e9e6b); }
.pub-lead-msg.is-err { color: #d9534f; }
/* Honeypot: off-canvas rather than display:none - some bots skip fields they can tell are hidden. */
.pub-lead-hp { position: absolute; left: -9999px; width: 1px; height: 1px; overflow: hidden; }
/* Visually hidden but read by screen readers (the email field's label). Not previously defined in
   this stylesheet - the public pages had no visually-hidden text until now. */
.pub-lead .sr-only { position: absolute; width: 1px; height: 1px; padding: 0; margin: -1px;
  overflow: hidden; clip: rect(0 0 0 0); white-space: nowrap; border: 0; }
.pub-footer-bar { border-top: 1px solid var(--pub-hairline); }
.pub-footer-bar-in { max-width: var(--pub-maxw); margin: 0 auto; padding: 18px var(--pub-gutter);
  display: flex; flex-wrap: wrap; align-items: center; gap: 12px 20px; font-size: 12.5px; color: var(--ink-faint); }
.pub-footer-legal { display: flex; flex-wrap: wrap; gap: 4px 18px; }
.pub-footer-legal a { color: var(--ink-faint); }
.pub-footer-legal a:hover { color: var(--ink-soft); text-decoration: none; }
.pub-footer-bar .spacer { margin-left: auto; }

@media (max-width: 820px) {
  .pub-footer-in { grid-template-columns: 1fr 1fr; gap: 28px; }
  .pub-footer-brand { grid-column: 1 / -1; }
}
/* On phones keep the link columns TWO-up (side by side) instead of one long stack. */
@media (max-width: 480px) {
  .pub-footer-in { grid-template-columns: 1fr 1fr; gap: 24px 20px; }
  .pub-footer-brand { grid-column: 1 / -1; }
}

/* the brand mark uses the same theme-swap logic as the app's .brand-mark, via app.css. Here we
   just size the inline SVG marks used in the nav/footer (they carry their own fills). */
.pub-mark rect:nth-child(3) { fill: var(--accent); }
.pub-mark rect:nth-child(1), .pub-mark rect:nth-child(2) { fill: var(--ink); }

@media (prefers-reduced-motion: reduce) {
  .pub-drawer-panel, .pub-drawer-scrim, .pub-drop, .pub-btn, .caret { transition: none !important; }
}

/* ==========================================================================
   HOMEPAGE
   ========================================================================== */
.hp-h1 { font-family: var(--pub-display); font-weight: 370; letter-spacing: -0.022em; line-height: 1.04;
  font-size: clamp(38px, 6.2vw, 66px); margin: 16px 0 0; text-wrap: balance; }
.hp-h2 { font-family: var(--pub-display); font-weight: 390; letter-spacing: -0.018em; line-height: 1.1;
  font-size: clamp(27px, 3.8vw, 40px); margin: 12px 0 0; text-wrap: balance; }
.hp-ink-accent { color: var(--accent); font-style: italic; }
.hp-narrow { max-width: 780px; }

/* Hero AI pill: a bold "Now with OnbiAI" badge above the H1 - a solid indigo lozenge with white text
   and a golden sparkle, so AI registers instantly and unmistakably against the light hero. */
.hp-ai-pill {
  display: inline-flex; align-items: center; gap: 8px; margin-top: 14px;
  font-size: 13.5px; font-weight: 700; line-height: 1; letter-spacing: .005em;
  padding: 8px 15px; border-radius: 999px;
  color: #fff;
  background: var(--accent);
  border: 0;
}
/* Golden sparkle inside the indigo pill - rhymes with the "Write with AI" button (gold = the AI action),
   while the pill itself stays on-brand indigo. $spark is a stroked icon, so recolor its stroke. */
.hp-ai-pill svg { width: 17px; height: 17px; flex: none; stroke: #ffd24a; stroke-width: 2; filter: drop-shadow(0 0 4px rgba(255,206,74,.5)); }
@media (max-width: 900px) { .hp-hero-copy .hp-ai-pill { margin-left: auto; margin-right: auto; } }
.hp-section { padding: var(--pub-sec-y) 0; }
/* Tinted bands alternate with the plain sections to give the page a visible rhythm. The page bg is
   already ~4% accent-on-white, so the band tint must be clearly stronger than that to read as a
   distinct zone (a faint 5% tint looked identical to the bg). */
/* --pb is the band accent: a product page sets --pr-page to its topic colour (via a pr-page-* body
   class), so its bands tint with the topic; elsewhere it falls back to the global indigo accent. */
.hp-band {
  --pb: var(--pr-page, var(--accent));
  /* Tint strength, as a variable so one band can ask for more without a second background rule.
     Default is unchanged (9% light / 10% dark); see .hp-band-strong. */
  --pb-tint: 9%;
  padding: var(--pub-sec-y) 0;
  background: color-mix(in srgb, var(--pb) var(--pb-tint), var(--surface));
  border-top: 1px solid color-mix(in srgb, var(--pb) 15%, var(--border));
  border-bottom: 1px solid color-mix(in srgb, var(--pb) 15%, var(--border));
}
:root[data-theme="dark"] .hp-band { --pb-tint: 10%; background: color-mix(in srgb, var(--pb) var(--pb-tint), var(--bg)); }
@media (prefers-color-scheme: dark) {
  :root:not([data-theme="light"]) .hp-band { --pb-tint: 10%; background: color-mix(in srgb, var(--pb) var(--pb-tint), var(--bg)); }
}
/* per-page topic accent (set on <body> by ProductController): --pr-page drives the bands + CTA,
   and a whisper of it retints the page ground (--bg) + muted fill so the plain .hp-section areas
   pick up the topic colour too. Everything stays cohesive to the page's colour. */
.pr-page-tours    { --pr-page: var(--c-tours); }
.pr-page-tips     { --pr-page: var(--c-tips); }
.pr-page-check    { --pr-page: var(--c-check); }
.pr-page-announce { --pr-page: var(--c-announce); }
.pr-page-target   { --pr-page: var(--c-target); }
.pr-page-analytics{ --pr-page: var(--c-analytics); }
.pr-page-resource { --pr-page: var(--c-resource); }
/* Violet reads white text at 5.70:1 in light mode, so unlike the gold AI page it needs no
   --accent-ink override - the default white button text passes AA as-is. */
.pr-page-survey   { --pr-page: var(--c-survey); }
.pr-page-ab       { --pr-page: var(--c-ab); }
/* Gold button text is theme-aware: white on the deeper light-mode gold (#B8860B, ~4.6:1),
   near-black on the brighter dark-mode gold (#E0A82E) where dark reads better + avoids glare. */
.pr-page-ai { --pr-page: var(--c-ai); --pr-accent-ink: #ffffff; --accent-ink: #ffffff; }
@media (prefers-color-scheme: dark) {
  /* Was ALSO stated outside this block, so auto mode took the dark-mode ink on a light system.
     The media-query copy below already covered the real auto case. */
  :root:not([data-theme="light"]) .pr-page-ai { --pr-accent-ink: #1a1205; --accent-ink: #1a1205; }
}
:root[data-theme="dark"] .pr-page-ai { --pr-accent-ink: #1a1205; --accent-ink: #1a1205; }
/* On the AI page the mock cards are single-hue gold too (elsewhere the rule rows are multi-colour). */
.pr-page-ai .hp-rule.r-1, .pr-page-ai .hp-rule.r-2, .pr-page-ai .hp-rule.r-3 { --rc: var(--c-ai); }
.public-body[class*="pr-page-"] {
  --bg: color-mix(in srgb, var(--pr-page) 4%, #ffffff);
  --surface-2: color-mix(in srgb, var(--pr-page) 6%, #ffffff);
  /* the whole page adopts the topic colour: eyebrows, checkmarks, mocks, links AND buttons. */
  --accent: var(--pr-page);
  --accent-soft: color-mix(in srgb, var(--pr-page) 14%, #ffffff);
  --accent-hover: color-mix(in srgb, var(--pr-page) 82%, #000000);
  --accent-pressed: color-mix(in srgb, var(--pr-page) 68%, #000000);
}
:root[data-theme="dark"] .public-body[class*="pr-page-"] {
  --bg: color-mix(in srgb, var(--pr-page) 6%, #0b0c17);
  --surface-2: color-mix(in srgb, var(--pr-page) 7%, #0f1622);
  --accent: var(--pr-page);
  --accent-soft: color-mix(in srgb, var(--pr-page) 22%, #0b0c17);
  --accent-hover: color-mix(in srgb, var(--pr-page) 86%, #ffffff);
  --accent-pressed: color-mix(in srgb, var(--pr-page) 72%, #ffffff);
}
@media (prefers-color-scheme: dark) {
  :root:not([data-theme="light"]) .public-body[class*="pr-page-"] {
    --bg: color-mix(in srgb, var(--pr-page) 6%, #0b0c17);
    --surface-2: color-mix(in srgb, var(--pr-page) 7%, #0f1622);
    --accent: var(--pr-page);
    --accent-soft: color-mix(in srgb, var(--pr-page) 22%, #0b0c17);
    --accent-hover: color-mix(in srgb, var(--pr-page) 86%, #ffffff);
    --accent-pressed: color-mix(in srgb, var(--pr-page) 72%, #ffffff);
  }
}
/* The two bands hugging the #product gradient band are kept PLAIN, so the per-tab gradient reads as
   one distinct colour moment instead of blurring into a run of three tinted zones. */
.hp-band.hp-band-plain { background: transparent; border-top-color: var(--pub-hairline); border-bottom-color: var(--pub-hairline); }

/* A band that carries its topic colour properly.
   At the default 9% a band is 91% white, which collapses every topic into a near-identical
   off-white: A/B's vermilion lands 3.2 from the checklist amber, well under the ~10 where a
   difference is visible at all. Raising THIS band to 16% puts the same pair 22.8 apart while
   staying a tint rather than a colour block. 16% also clears it in dark mode (15.8 against the
   dark amber), so one value serves both themes.
   Opt-in per band (like .hp-band-plain) rather than global - the other pages were designed around
   the soft wash, and this is the page that needed telling apart from its neighbour. */
.hp-band.hp-band-strong { --pb-tint: 16%; }
/* The dark-theme rules above set --pb-tint on `:root[...] .hp-band`, which outranks the plain
   class pair (0,3,0 vs 0,2,0) - so without these the strong band silently fell back to 10% in
   dark mode. Same specificity, stated after, so 16% wins in both themes. */
:root[data-theme="dark"] .hp-band.hp-band-strong { --pb-tint: 16%; }
@media (prefers-color-scheme: dark) {
  :root:not([data-theme="light"]) .hp-band.hp-band-strong { --pb-tint: 16%; }
}
.hp-sec-head { max-width: 640px; margin: 0 auto var(--pub-sec-y) auto; text-align: center; }
.hp-sec-head.hp-sec-head { margin-bottom: clamp(32px, 5vw, 56px); }
.hp-sec-sub { margin: 14px auto 0; color: var(--ink-soft); font-size: 16.5px; max-width: 56ch; }
.hp-link { display: inline-flex; align-items: center; gap: 6px; font-weight: 600; font-size: 15px; margin-top: 18px; }
.hp-link:hover { text-decoration: none; gap: 9px; }
.hp-link span { transition: transform .15s ease; }
/* Inline prose link (inside a sentence/paragraph). INHERITS the surrounding font-size and
   weight so it never shrinks the text or breaks the line - unlike .hp-link, which is a
   standalone call-to-action link with its own size + top margin. */
/* keep an inline group (e.g. a "(link)") from breaking across lines when text wraps on mobile */
.nowrap { white-space: nowrap; }
.pub-link { color: var(--accent); font-weight: inherit; font-size: inherit; text-decoration: underline;
  text-underline-offset: 2px; text-decoration-thickness: 1px; }
.pub-link:hover { text-decoration-thickness: 2px; }

/* ---- 01 hero ---- */
.hp-hero { padding: clamp(48px, 7vw, 96px) 0 clamp(40px, 6vw, 72px); overflow: hidden; }
.hp-hero-grid { display: grid; grid-template-columns: 1.05fr 1fr; gap: clamp(28px, 5vw, 64px); align-items: center; }
.hp-hero-cta { display: flex; gap: 12px; margin-top: 30px; flex-wrap: wrap; }
.hp-hero-meta { display: flex; flex-wrap: wrap; gap: 10px 22px; margin-top: 26px; font-size: 13.5px; color: var(--ink-soft); }
.hp-hero-meta span { display: inline-flex; align-items: center; gap: 6px; }
.hp-hero-meta svg { color: var(--c-good); }

/* hero demo: a muted app mock with a hopping tooltip */
/* Decorative previews are illustrations, not content - make their placeholder text non-selectable so
   dragging to select real copy doesn't catch the fake text. The install code snippet is REAL,
   copyable content, so it stays selectable (explicitly re-enabled below). */
.hp-hero-demo, .hp-scene, .hp-rules, .hp-chart, .hp-tab-visual {
  user-select: none; -webkit-user-select: none;
}
.hp-code, .hp-code * { user-select: text; -webkit-user-select: text; }
.hp-hero-demo { position: relative; }
.hp-demo-app { position: relative; background: var(--surface); border: 1px solid var(--border);
  border-radius: 16px; box-shadow: 0 12px 40px color-mix(in srgb, var(--ink) 10%, transparent);
  overflow: hidden; aspect-ratio: 4 / 3.3; }
.hp-demo-bar { display: flex; gap: 6px; padding: 12px 14px; border-bottom: 1px solid var(--border); background: var(--surface-2); }
.hp-demo-bar span { width: 9px; height: 9px; border-radius: 50%; background: var(--border-strong); }
.hp-demo-body { display: grid; grid-template-columns: 74px 1fr; height: calc(100% - 37px); }
.hp-demo-side { border-right: 1px solid var(--border); padding: 14px 10px; display: flex; flex-direction: column; gap: 9px; }
.hp-demo-row { height: 9px; border-radius: 5px; background: var(--surface-2); }
.hp-demo-row.is-active { background: var(--accent-soft); }
.hp-demo-main { padding: 16px; display: flex; flex-direction: column; gap: 12px; }
.hp-demo-block { height: 12px; border-radius: 6px; background: var(--surface-2); }
.hp-demo-block-lg { height: 40px; border-radius: 10px; }
/* Demo header row: the title bar + a "Write with AI" button, so AI shows in the hero product shot. */
.hp-demo-head { display: flex; align-items: center; gap: 12px; }
.hp-demo-head .hp-demo-block-lg { flex: 1 1 auto; width: auto; }
.hp-demo-ai { flex: none; display: inline-flex; align-items: center; gap: 6px;
  font-size: 12.5px; font-weight: 700; color: #fff; white-space: nowrap;
  background: linear-gradient(180deg, #7a6cff, #5a4de0); border: 1px solid rgba(109,94,252,.9);
  border-radius: 9px; padding: 8px 12px; box-shadow: 0 6px 16px rgba(109,94,252,.35); }
.hp-demo-ai svg { width: 15px; height: 15px; flex: none; filter: drop-shadow(0 0 3px rgba(255,206,74,.55)); }
.hp-demo-block-sm { width: 55%; }
.hp-demo-cards { display: grid; grid-template-columns: repeat(3, 1fr); gap: 10px; }
.hp-demo-card { height: 56px; border-radius: 10px; background: var(--surface-2); border: 1px solid var(--border); }
.hp-demo-target-on { outline: 2px solid var(--accent); outline-offset: 3px; border-radius: 8px; transition: outline-color .3s; }

.hp-demo-tip { position: absolute; width: 210px; background: var(--surface); border: 1px solid var(--border-strong);
  border-radius: 12px; box-shadow: 0 12px 34px rgba(0,0,0,.18); padding: 13px 15px; z-index: 3;
  transition: top .5s cubic-bezier(.4,0,.2,1), left .5s cubic-bezier(.4,0,.2,1), opacity .3s;
  top: 46%; left: 30%; }
.hp-demo-tip-step { font-size: 10.5px; font-weight: 700; letter-spacing: .05em; text-transform: uppercase; color: var(--accent); }
.hp-demo-tip-title { font-weight: 650; font-size: 14px; margin-top: 5px; color: var(--ink); }
.hp-demo-tip-body { font-size: 12px; color: var(--ink-soft); margin-top: 4px; line-height: 1.45; }
.hp-demo-tip-foot { display: flex; align-items: center; justify-content: space-between; margin-top: 11px; }
.hp-demo-dots { display: inline-flex; gap: 4px; }
.hp-demo-dots i { width: 5px; height: 5px; border-radius: 50%; background: var(--border-strong); display: block; }
.hp-demo-dots i.on { background: var(--accent); }
.hp-demo-next { font-size: 11px; font-weight: 700; color: var(--accent-ink); background: var(--accent); border-radius: 6px; padding: 3px 9px; }

/* Dark mode: the default --surface / --surface-2 sit too close to the dark hero background, so the
   demo app frame and its placeholder blocks nearly vanish. Elevate the surface + lighten the fills
   (same treatment as the product-page mocks) so the hero demo stays legible on dark. */
.hp-hero-demo { --mock-surf: var(--surface); --mock-fill: var(--surface-2); --mock-line: var(--border); }
@media (prefers-color-scheme: dark) {
  :root:not([data-theme="light"]) .hp-hero-demo { --mock-surf: #273349; --mock-fill: #3d4d68; --mock-line: #46587a; }
}
:root[data-theme="dark"] .hp-hero-demo { --mock-surf: #273349; --mock-fill: #3d4d68; --mock-line: #46587a; }
.hp-demo-app, .hp-demo-tip { background: var(--mock-surf); }
.hp-demo-app { border-color: var(--mock-line); }
.hp-demo-bar { background: color-mix(in srgb, var(--mock-surf) 80%, var(--mock-fill)); border-bottom-color: var(--mock-line); }
.hp-demo-side { border-right-color: var(--mock-line); }
.hp-demo-row, .hp-demo-block, .hp-demo-card { background: var(--mock-fill); }
.hp-demo-card { border-color: var(--mock-line); }

/* ---- 02 proof ---- */
.hp-proof { padding: clamp(32px, 4vw, 44px) 0; border-bottom: 1px solid var(--pub-hairline); }
.hp-proof-lead { text-align: center; font-size: 13px; color: var(--ink-faint); letter-spacing: .06em; text-transform: uppercase; font-weight: 600; margin: 0 0 12px; }
.hp-proof-audience { text-align: center; font-size: 15.5px; line-height: 1.5; color: var(--ink-soft); max-width: 46ch; margin: 0 auto; }
.hp-logos { display: flex; flex-wrap: wrap; justify-content: center; gap: 14px 40px; align-items: center; }
.hp-logo { font-family: var(--pub-display); font-weight: 500; font-size: 20px; letter-spacing: -.01em;
  color: var(--ink-faint); opacity: .8; }
.hp-proof-stats { display: flex; flex-wrap: wrap; justify-content: center; gap: 20px 56px; margin-top: 34px; }
.hp-proof-stats > div, .hp-proof-stats > a { text-align: center; }
.hp-proof-stats b { display: block; font-family: var(--pub-display); font-weight: 420; font-size: 34px; color: var(--ink); letter-spacing: -.02em; }
.hp-proof-stats span { font-size: 13px; color: var(--ink-faint); }
/* The "10x cheaper" stat links to pricing - inherits the stat look. No underline anywhere (a link
   underline on the big number reads as a stray bar); the hover cue is just the label turning accent. */
.hp-proof-stat-link,
.hp-proof-stat-link:hover,
.hp-proof-stat-link b,
.hp-proof-stat-link span { text-decoration: none; }
.hp-proof-stat-link { display: block; transition: color .15s; }
.hp-proof-stat-link:hover span { color: var(--accent); }

/* ---- 03 problem band lede ---- */
.hp-band-lede { font-size: clamp(17px, 2.2vw, 20px); line-height: 1.6; color: var(--ink-soft); margin-top: 18px; }

/* ---- 04 product tabs ---- */
.hp-tabs { max-width: 960px; margin: 0 auto; }
.hp-tablist { display: inline-flex; gap: 4px; padding: 5px; background: var(--surface-2); border: 1px solid var(--border);
  border-radius: 12px; margin: 0 auto clamp(28px,4vw,44px); flex-wrap: wrap; justify-content: center; }
.hp-tablist { display: flex; width: fit-content; margin-left: auto; margin-right: auto; }
.hp-tab { font-family: inherit; font-size: 14px; font-weight: 600; color: var(--ink-soft); background: none;
  border: 0; border-radius: 8px; padding: 9px 16px; cursor: pointer; }
.hp-tab:hover { color: var(--ink); }
.hp-tab.is-active { background: var(--surface); color: var(--accent); box-shadow: var(--shadow); }
/* per-flow-type identity: the active tab takes its type's colour, and each panel's mock accents use
   the same via a scoped --accent override so all the accent-referencing bits recolour automatically. */
.hp-tab.is-active[data-tab="tours"]        { color: var(--c-tours); }
.hp-tab.is-active[data-tab="tooltips"]     { color: var(--c-tips); }
.hp-tab.is-active[data-tab="checklists"]   { color: var(--c-check); }
.hp-tab.is-active[data-tab="resource-center"]{ color: var(--c-resource); }
.hp-tab.is-active[data-tab="announcements"]{ color: var(--c-announce); }
.hp-tabpanel[data-panel="tours"]        { --accent: var(--c-tours); }
.hp-tabpanel[data-panel="tooltips"]     { --accent: var(--c-tips); }
.hp-tabpanel[data-panel="checklists"]   { --accent: var(--c-check); }
.hp-tabpanel[data-panel="resource-center"]{ --accent: var(--c-resource); }
.hp-tabpanel[data-panel="announcements"]{ --accent: var(--c-announce); }
/* recompute the soft wash from the scoped accent so tinted fills match the type colour */
.hp-tabpanel[data-panel] { --accent-soft: color-mix(in srgb, var(--accent) 14%, var(--surface)); }
.hp-tabpanel { display: none; grid-template-columns: 1fr 1fr; gap: clamp(28px,4vw,56px); align-items: center; }
.hp-tabpanel.is-active { display: grid; }
.hp-tab-copy h3 { font-size: 24px; margin: 0 0 12px; }
.hp-tab-copy p { color: var(--ink-soft); font-size: 15.5px; }
.hp-ticks { list-style: none; padding: 0; margin: 18px 0 0; display: flex; flex-direction: column; gap: 10px; }
.hp-ticks li { display: flex; align-items: flex-start; gap: 9px; font-size: 14.5px; color: var(--ink); }
.hp-ticks svg { color: var(--accent); flex: none; margin-top: 2px; }

/* The homepage "four experiences" tabs section gets its own subtly tinted band so it stands apart
   from the plain sections around it. */
/* The #product band's gradient recolors with the selected tab. --tab-a is the active topic color,
   set per data-active-tab (toggled by home-demo.js); it defaults to the brand indigo. The gentle
   transition makes switching tabs feel like the whole zone shifts hue. */
#product {
  --tab-a: var(--c-tours);
  background:
    radial-gradient(90% 80% at 15% 0%, color-mix(in srgb, var(--tab-a) 16%, var(--surface)), transparent 60%),
    radial-gradient(90% 90% at 100% 100%, color-mix(in srgb, var(--tab-a) 11%, var(--surface)), transparent 55%),
    color-mix(in srgb, var(--tab-a) 7%, var(--surface));
  border-top: 1px solid color-mix(in srgb, var(--tab-a) 18%, var(--border));
  border-bottom: 1px solid color-mix(in srgb, var(--tab-a) 18%, var(--border));
  transition: background .45s ease, border-color .45s ease;
}
#product[data-active-tab="tours"]         { --tab-a: var(--c-tours); }
#product[data-active-tab="tooltips"]      { --tab-a: var(--c-tips); }
#product[data-active-tab="checklists"]    { --tab-a: var(--c-check); }
#product[data-active-tab="resource-center"]{ --tab-a: var(--c-resource); }
#product[data-active-tab="announcements"] { --tab-a: var(--c-announce); }
/* dark: mix into the near-black bg instead of white surface */
:root[data-theme="dark"] #product {
  background:
    radial-gradient(90% 80% at 15% 0%, color-mix(in srgb, var(--tab-a) 20%, var(--bg)), transparent 60%),
    radial-gradient(90% 90% at 100% 100%, color-mix(in srgb, var(--tab-a) 13%, var(--bg)), transparent 55%),
    color-mix(in srgb, var(--tab-a) 8%, var(--bg));
}
@media (prefers-color-scheme: dark) {
  :root:not([data-theme="light"]) #product {
    background:
      radial-gradient(90% 80% at 15% 0%, color-mix(in srgb, var(--tab-a) 20%, var(--bg)), transparent 60%),
      radial-gradient(90% 90% at 100% 100%, color-mix(in srgb, var(--tab-a) 13%, var(--bg)), transparent 55%),
      color-mix(in srgb, var(--tab-a) 8%, var(--bg));
  }
}

/* tab visuals: a shared mini "app" scene (browser chrome + sidebar + content), like the hero demo,
   with a per-flow-type element layered on top. Product-like, not abstract grey. */
.hp-tab-visual { display: grid; place-items: center; }
.hp-scene { position: relative; width: 100%; max-width: 400px; aspect-ratio: 4/3; background: var(--surface);
  border: 1px solid var(--border); border-radius: 16px; box-shadow: 0 14px 44px color-mix(in srgb, var(--ink) 9%, transparent);
  overflow: hidden; }
.hp-scene-bar { display: flex; gap: 6px; padding: 11px 13px; border-bottom: 1px solid var(--border); background: var(--surface-2); }
.hp-scene-bar span { width: 8px; height: 8px; border-radius: 50%; background: var(--border-strong); }
.hp-scene-body { display: grid; grid-template-columns: 72px 1fr; height: calc(100% - 33px); }
.hp-scene-side { border-right: 1px solid var(--border); padding: 14px 10px; display: flex; flex-direction: column; gap: 9px; }
.hp-scene-side i { height: 9px; border-radius: 5px; background: var(--surface-2); }
.hp-scene-side i.on { background: var(--accent-soft); }
.hp-scene-main { padding: 15px; display: flex; flex-direction: column; gap: 12px; transition: filter .3s; }
.hp-scene-main.dim { filter: saturate(.6) opacity(.7); }
.hp-scene-block { height: 12px; border-radius: 6px; background: var(--surface-2); }
.hp-scene-block.lg { height: 42px; border-radius: 10px; }
.hp-scene-grid { display: grid; grid-template-columns: repeat(3, 1fr); gap: 9px; }
.hp-scene-grid span { height: 52px; border-radius: 9px; background: var(--surface-2); border: 1px solid var(--border); }
.hp-scene-grid span.hi { border-color: var(--accent); box-shadow: 0 0 0 2px var(--accent-soft); }
.hp-scene-grid span.hi-dot { position: relative; }

/* tours: a soft dim over the whole scene, the ONE highlighted card stays bright with an accent ring,
   and a step tooltip sits below-right. The dim is a contained overlay (never escapes the frame). */
/* dim the WHOLE frame, then lift the browser bar back above it so only the app content dims. The
   dim is inset:0 (covers top-to-bottom edge to edge); the bar's z-index keeps the chrome clean. */
.hp-scene-tour::before { content: ""; position: absolute; inset: 0; z-index: 2;
  background: color-mix(in srgb, var(--ink) 16%, transparent); pointer-events: none; }
.hp-scene-tour .hp-scene-bar { position: relative; z-index: 3; }
.hp-scene-tour .hp-scene-grid span.hi { position: relative; z-index: 3; background: var(--surface);
  border: 1.5px solid var(--accent); box-shadow: 0 8px 22px rgba(0,0,0,.2); }
.hp-scene-tip { position: absolute; z-index: 4; background: var(--surface); border: 1px solid var(--border-strong);
  border-radius: 11px; box-shadow: 0 14px 34px rgba(0,0,0,.2); padding: 13px 14px; width: 154px; }
.hp-scene-tip b { display: block; font-size: 9.5px; font-weight: 800; letter-spacing: .06em; text-transform: uppercase; color: var(--accent); }
.hp-scene-tip i { display: block; height: 7px; border-radius: 4px; background: var(--surface-2); margin-top: 8px; }
.hp-scene-tip i.s { width: 62%; }
.hp-scene-tip em { display: block; width: 48px; height: 22px; border-radius: 7px; background: var(--accent); margin-top: 13px; }
.hp-scene-tip.t-tour { left: 36%; bottom: 10%; }
.hp-scene-tip.t-tip { left: 46%; top: 40%; width: 130px; }
/* tooltip hotspot pulse on a grid card */
.hi-dot::after { content: ""; position: absolute; top: -6px; right: -6px; width: 16px; height: 16px; border-radius: 50%;
  background: var(--accent); box-shadow: 0 0 0 5px color-mix(in srgb, var(--accent) 24%, transparent); }

/* checklist: a launcher card in the corner */
/* The four question KINDS, drawn as they appear in the runtime: a 0-10 row, a star rating, a
   choice list with one picked, and a text box. Each is a small stacked card so the four read as
   one set rather than four unrelated widgets. */
/* .hp-feature-visual is `place-items: center`, so a child with no width collapses to its
   intrinsic content width - which made this render as a narrow phone-shaped column. Same
   width/max-width pair the other feature visuals use (.hp-rules). */
.hp-sv-kinds { display: grid; gap: 14px; width: 100%; max-width: 400px;
  background: var(--surface); border: 1px solid var(--border-strong);
  border-radius: 14px; padding: 18px 20px; box-shadow: 0 16px 36px rgba(0,0,0,.14); }
.hp-svk { display: grid; gap: 8px; }
/* A real caption per row. Without it the four kinds were four anonymous bar stacks - the reader
   had no way to tell which was which, which is the one thing this visual has to say. */
.hp-svk-cap { display: block; font-size: 9.5px; font-weight: 800; letter-spacing: .07em;
  text-transform: uppercase; color: var(--ink-faint); }
/* NPS: the FULL 0-10. An abbreviated scale (0 5 9 10) is not a scale and reads as broken. */
.hp-svk-nps { display: flex; gap: 3px; }
.hp-svk-nps em { flex: 1; font-style: normal; font-size: 8.5px; font-weight: 700; line-height: 1;
  display: grid; place-items: center; aspect-ratio: 1; border-radius: 4px;
  background: var(--surface-2); color: var(--ink-faint); }
.hp-svk-nps em.on { background: var(--accent); color: #fff; }
/* Real stars, not squares - the same glyph the runtime draws for a star scale. Filled ones take
   the accent; the rest stay a light grey so the "4 of 5" reads at a glance. */
.hp-svk-stars { display: flex; gap: 5px; }
/* NOT --surface-2 for the empty star: on a product page that resolves to 6% accent in white,
   which against this white card is ~21 RGB apart - a small glyph at that contrast disappears.
   The border tone keeps the unfilled stars readable as stars. */
.hp-svk-stars b { font-size: 19px; line-height: 1; color: var(--border-strong); }
.hp-svk-stars b.on { color: var(--accent); }
/* Choice: a radio mark + a label per row, so an option cannot be mistaken for a plain bar. */
.hp-svk-opts { display: grid; gap: 6px; }
.hp-svk-opts i { display: flex; align-items: center; gap: 8px; }
.hp-svk-opts i s { flex: none; width: 12px; height: 12px; border-radius: 50%;
  border: 2px solid var(--border-strong); background: var(--surface); }
.hp-svk-opts i u { display: block; height: 8px; width: 58%; border-radius: 4px;
  background: var(--surface-2); text-decoration: none; }
.hp-svk-opts i.on s { border-color: var(--accent); background: var(--accent);
  box-shadow: inset 0 0 0 2.5px var(--surface); }
.hp-svk-opts i.on u { width: 72%; background: color-mix(in srgb, var(--accent) 22%, var(--surface-2)); }
.hp-svk-text { display: block; height: 34px; border-radius: 7px; background: var(--surface-2);
  border: 1px dashed var(--border-strong); }

/* SURVEY scene (surveys hero): an NPS card with a real 0-10 scale, one point selected. The
   numbers are actual text rather than blank bars - a scale drawn as anonymous blocks reads as a
   progress bar, and the whole point is that this is a SCORED question. */
.hp-scene-survey { position: absolute; left: 50%; top: 52%; transform: translate(-50%, -50%); width: 66%;
  background: var(--surface); border: 1px solid var(--border-strong); border-radius: 14px;
  box-shadow: 0 18px 40px rgba(0,0,0,.18); padding: 16px 18px 18px; }
/* The question line is the card's TITLE, so it is taller than a body line - a thin bar the same
   weight as the rest read as filler rather than the thing being asked. Height carries the
   emphasis; the fill stays a light wash. */
.hp-sv-q b { display: block; height: 15px; width: 55%; border-radius: 7px;
  background: color-mix(in srgb, var(--accent) 12%, var(--surface)); }
.hp-sv-scale { display: flex; gap: 4px; margin-top: 16px; }
.hp-sv-scale em { flex: 1; font-style: normal; font-size: 9px; font-weight: 700; line-height: 1;
  display: grid; place-items: center; aspect-ratio: 1; border-radius: 5px;
  background: var(--surface-2); color: var(--ink-faint); }
/* the picked score - a promoter, which is what an NPS card is asking about */
.hp-sv-scale em.on { background: var(--accent); color: #fff; }
.hp-sv-ends { display: flex; justify-content: space-between; margin-top: 11px; }
.hp-sv-ends span { display: block; height: 6px; width: 26%; border-radius: 3px; background: var(--surface-2); }
/* Submit - same dimensions and treatment as the tour card's button (.hp-scene-tip em), but
   right-aligned: a submit sits at the end of a form, not under its first field. */
.hp-sv-btn { display: block; width: 48px; height: 22px; border-radius: 7px; background: var(--accent);
  margin: 14px 0 0 auto; }

.hp-scene-checklist { position: absolute; right: 6%; bottom: 8%; width: 54%; background: var(--surface);
  border: 1px solid var(--border-strong); border-radius: 12px; box-shadow: 0 14px 34px rgba(0,0,0,.16); padding: 12px 13px; }
.hp-cl-head { display: flex; align-items: center; justify-content: space-between; margin-bottom: 10px; }
.hp-cl-head b { display: block; width: 54%; height: 9px; border-radius: 5px; background: var(--accent-soft); }
.hp-cl-head em { font-style: normal; font-size: 10px; font-weight: 700; color: var(--accent); }
.hp-cl-li { display: flex; align-items: center; gap: 9px; margin-top: 9px; }
.hp-cl-li span { width: 16px; height: 16px; border-radius: 5px; border: 2px solid var(--border-strong); flex: none; }
.hp-cl-li svg { width: 16px; height: 16px; color: var(--accent); flex: none; }
.hp-cl-li i { flex: 1; height: 8px; border-radius: 4px; background: var(--surface-2); }
.hp-cl-li i.s { width: 60%; flex: none; }
.hp-cl-li.done i { background: color-mix(in srgb, var(--accent) 16%, var(--surface-2)); }

/* announcement: a centered modal card */
.hp-scene-modal { position: absolute; left: 50%; top: 52%; transform: translate(-50%, -50%); width: 62%;
  background: var(--surface); border: 1px solid var(--border-strong); border-radius: 13px;
  box-shadow: 0 18px 44px rgba(0,0,0,.22); padding: 18px; }
.hp-modal-badge { display: inline-block; font-size: 9.5px; font-weight: 800; letter-spacing: .05em; text-transform: uppercase;
  color: var(--accent); background: var(--accent-soft); border-radius: 6px; padding: 2px 8px; margin-bottom: 12px; }
.hp-scene-modal b { display: block; height: 13px; width: 72%; border-radius: 6px; background: var(--accent-soft); }
.hp-scene-modal i { display: block; height: 8px; border-radius: 4px; background: var(--surface-2); margin-top: 9px; }
.hp-scene-modal i.s { width: 55%; }
.hp-modal-btn { display: block; height: 28px; width: 84px; border-radius: 8px; background: var(--accent); margin-top: 15px; }
/* multi-step announcement: a footer with step dots + Next button (dots show it's more than one card) */
.hp-modal-foot { display: flex; align-items: center; justify-content: space-between; margin-top: 15px; }
.hp-modal-foot .hp-modal-btn { margin-top: 0; height: 24px; width: 64px; }
.hp-modal-dots { display: inline-flex; gap: 6px; }
.hp-modal-dots em { width: 7px; height: 7px; border-radius: 50%; background: var(--surface-2); }
.hp-modal-dots em.on { background: var(--accent); }

/* ---- 05 how it works ---- */
.hp-steps { display: flex; align-items: flex-start; justify-content: center; gap: 8px; flex-wrap: wrap; max-width: 900px; margin: 0 auto; }
.hp-step { flex: 1; min-width: 200px; max-width: 260px; text-align: center; }
.hp-step-n { width: 42px; height: 42px; margin: 0 auto 14px; border-radius: 12px; display: grid; place-items: center;
  font-family: var(--pub-display); font-size: 20px; font-weight: 500; color: var(--accent); background: var(--accent-soft);
  border: 1px solid color-mix(in srgb, var(--accent) 22%, transparent); }
.hp-step h3 { font-size: 19px; margin: 0 0 8px; }
.hp-step p { font-size: 14.5px; color: var(--ink-soft); }
/* The OnbiAI "or let AI do it" accelerator line under each step - gold, so AI reads as one thread. */
.hp-step-ai {
  --ai: var(--c-ai);
  display: inline-flex; align-items: flex-start; gap: 6px; justify-content: center;
  margin-top: 10px !important; padding-top: 10px; border-top: 1px solid color-mix(in srgb, var(--ai) 22%, var(--border));
  font-size: 13px !important; line-height: 1.45; color: color-mix(in srgb, var(--ai) 65%, var(--ink)) !important;
}
.hp-step-ai svg { width: 15px; height: 15px; flex: none; margin-top: 1px; color: var(--ai); }
.hp-step-bars { display: flex; flex-direction: column; gap: 4px; padding-top: 12px; flex: none; }
.hp-step-bars i { display: block; height: 4px; border-radius: 2px; background: var(--border-strong); }
.hp-step-bars i:nth-child(1) { width: 20px; }
.hp-step-bars i:nth-child(2) { width: 26px; margin-left: 6px; }
.hp-step-bars i:nth-child(3) { width: 28px; margin-left: 12px; background: var(--accent); }

/* ---- 06 feature blocks ---- */
.hp-feature { display: grid; grid-template-columns: 1fr 1fr; gap: clamp(28px,5vw,64px); align-items: center; }
.hp-feature + .hp-feature { margin-top: clamp(48px, 7vw, 96px); }
.hp-feature-rev .hp-feature-copy { order: 2; }
.hp-feature p { color: var(--ink-soft); font-size: 15.5px; margin-top: 14px; }
.hp-feature-visual { display: grid; place-items: center; }
.hp-rules { width: 100%; max-width: 400px; background: var(--surface); border: 1px solid var(--border); border-radius: 14px;
  box-shadow: var(--shadow); padding: 16px; }
.hp-rule-head { font-size: 12.5px; color: var(--ink-faint); margin-bottom: 12px; }
.hp-rule-head b { color: var(--accent); }
.hp-rule { display: flex; align-items: center; gap: 8px; flex-wrap: wrap; padding: 10px 12px 10px 15px; border: 1px solid var(--border);
  border-radius: 9px; margin-bottom: 8px; background: var(--surface-2); font-size: 12.5px; }
.hp-rule-k { font-weight: 650; color: var(--ink); }
.hp-rule-op { color: var(--ink-faint); }
/* the value becomes a soft colour chip, one hue per rule - reads like a real rule builder */
.hp-rule-v { margin-left: auto; font-weight: 600; font-size: 12px; padding: 3px 9px; border-radius: 7px;
  color: var(--rc); background: color-mix(in srgb, var(--rc) 12%, var(--surface)); }
/* a slim left-accent bar in the rule's colour */
.hp-rule { position: relative; overflow: hidden; }
.hp-rule::before { content: ""; position: absolute; left: 0; top: 0; bottom: 0; width: 3px; background: var(--rc); }
.hp-rule.r-1 { --rc: var(--c-tours); }
.hp-rule.r-2 { --rc: var(--c-tips); }
.hp-rule.r-3 { --rc: var(--c-check); }
.hp-rule-add { font-size: 12.5px; color: var(--accent); font-weight: 600; padding: 6px 12px; }
.hp-chart { width: 100%; max-width: 400px; background: var(--surface); border: 1px solid var(--border); border-radius: 14px;
  box-shadow: var(--shadow); padding: 18px; }
.hp-chart-head { display: flex; align-items: baseline; justify-content: space-between; margin-bottom: 10px; }
.hp-chart-head span { font-size: 13px; color: var(--ink-faint); }
.hp-chart-head b { font-family: var(--pub-display); font-size: 26px; color: var(--ink); font-weight: 440; }
/* two-series legend: indigo Starts, emerald Completions */
.hp-chart-legend { display: flex; gap: 14px; }
.hp-leg { display: inline-flex; align-items: center; gap: 6px; font-size: 12px; color: var(--ink-soft); }
.hp-leg::before { content: ""; width: 9px; height: 9px; border-radius: 50%; }
.hp-leg-starts::before { background: var(--c-tours); }
.hp-leg-completes::before { background: var(--c-good); }
.hp-chart-svg { width: 100%; height: 90px; display: block; }
.hp-chart-area { fill: color-mix(in srgb, var(--c-good) 12%, transparent); stroke: none; }
.hp-chart-line { fill: none; stroke-width: 2.4; stroke-linecap: round; stroke-linejoin: round; vector-effect: non-scaling-stroke; }
.hp-chart-line.s-starts { stroke: var(--c-tours); }
.hp-chart-line.s-completes { stroke: var(--c-good); }
.hp-chart-bars { display: flex; align-items: flex-end; gap: 8px; height: 46px; margin-top: 12px; }
.hp-chart-bars i { flex: 1; border-radius: 4px 4px 0 0; background: color-mix(in srgb, var(--accent) 30%, var(--surface-2)); }

/* ---- 07 pricing preview ---- */
.hp-tiers { display: grid; grid-template-columns: repeat(5, 1fr); gap: 14px; max-width: 1000px; margin: 0 auto; }
.hp-tier { position: relative; background: var(--surface); border: 1px solid var(--border); border-radius: 14px;
  padding: 22px 18px; text-align: center; display: flex; flex-direction: column; align-items: center; gap: 4px; }
.hp-tier.is-featured { border-color: var(--accent); box-shadow: 0 12px 34px color-mix(in srgb, var(--accent) 16%, transparent); }
.hp-tier-flag { position: absolute; top: -11px; left: 50%; transform: translateX(-50%); font-size: 10.5px; font-weight: 700;
  letter-spacing: .04em; text-transform: uppercase; color: var(--accent-ink); background: var(--accent); border-radius: 20px; padding: 3px 12px; white-space: nowrap; }
.hp-tier-name { font-weight: 650; font-size: 15px; }
.hp-tier-price { font-family: var(--pub-display); font-size: 32px; line-height: 1.1; font-weight: 440; letter-spacing: -.02em; color: var(--ink); }
/* the price WRAPPERS (.hp-price-m/.hp-price-y) inherit the big price size; only the inner "/mo"
   suffix is the small muted text. (Targeting `.hp-tier-price span` blanket-shrank the wrappers too.) */
.hp-price-m, .hp-price-y { font-size: inherit; color: inherit; }
.hp-price-m span, .hp-price-y span, .hp-tier-price > span { font-family: var(--pub-sans); font-size: 13px; font-weight: 500; color: var(--ink-faint); }
.hp-tier-mau { font-size: 12.5px; color: var(--ink-faint); margin-bottom: 14px; }
.hp-tier .pub-btn { width: 100%; margin-top: auto; }
.hp-tiers-foot { text-align: center; margin-top: 28px; }

/* ---- 08 comparison ---- */
.hp-compare { border: 1px solid var(--border); border-radius: 14px; overflow: hidden; background: var(--surface); margin-top: 12px; }
.hp-compare-row { display: grid; grid-template-columns: 1.3fr 1.4fr 1.3fr; gap: 8px; padding: 14px 18px; border-bottom: 1px solid var(--border); align-items: center; font-size: 14px; }
.hp-compare-row:last-child { border-bottom: 0; }
.hp-compare-head { background: var(--surface-2); font-size: 12px; font-weight: 700; letter-spacing: .04em; text-transform: uppercase; color: var(--ink-faint); }
.hp-compare-head .hp-compare-us { color: var(--accent); }
.hp-compare-k { color: var(--ink-faint); }
.hp-compare-us { display: inline-flex; align-items: center; gap: 7px; font-weight: 600; color: var(--ink); }
.hp-compare-us svg { color: var(--c-good); flex: none; }
.hp-compare-them { color: var(--ink-faint); }

/* ---- 09 quote ---- */
.hp-quote { margin: 0; text-align: center; }
/* Founder's-promise variant (no avatar/stat): eyebrow above the quote, centred attribution. */
.hp-promise .eyebrow { justify-content: center; text-align: center; margin-bottom: 18px; }
.hp-promise .hp-quote-who { text-align: center; }
.hp-quote blockquote { font-family: var(--pub-display); font-weight: 380; font-size: clamp(21px, 3vw, 30px);
  line-height: 1.35; letter-spacing: -.01em; color: var(--ink); margin: 0; text-wrap: balance; }
.hp-quote figcaption { display: inline-flex; align-items: center; gap: 12px; margin-top: 26px; flex-wrap: wrap; justify-content: center; }
.hp-quote-avatar { width: 40px; height: 40px; border-radius: 50%; background: var(--accent); color: var(--accent-ink);
  display: grid; place-items: center; font-weight: 700; font-size: 14px; }
.hp-quote-who { text-align: left; }
.hp-quote-who b { display: block; font-size: 14px; }
.hp-quote-who span { font-size: 13px; color: var(--ink-faint); }
.hp-quote-stat { border-left: 1px solid var(--border-strong); padding-left: 12px; margin-left: 4px; font-size: 13px; color: var(--ink-soft); }
.hp-quote-stat b { color: var(--accent); font-size: 15px; }

/* ---- 10 install ---- */
.hp-install { display: grid; grid-template-columns: 1fr 1.1fr; gap: clamp(28px,4vw,52px); align-items: center; max-width: 980px; }
.hp-install p { color: var(--ink-soft); font-size: 15.5px; margin-top: 14px; }
/* Code block: a real surface that follows the theme (light card in light mode, dark in dark) so it
   never clashes. Syntax colours use theme-aware tokens. */
.hp-install-code { background: var(--surface); border: 1px solid var(--border); border-radius: 14px;
  overflow: hidden; box-shadow: var(--shadow); }
.hp-code-bar { display: flex; gap: 6px; padding: 12px 14px; border-bottom: 1px solid var(--border); background: var(--surface-2); }
.hp-code-bar span { width: 9px; height: 9px; border-radius: 50%; background: var(--border-strong); }
.hp-code { margin: 0; padding: 18px; overflow-x: auto; }
.hp-code code { font-family: var(--mono); font-size: 12px; line-height: 1.7; color: var(--ink-soft); white-space: pre; }
/* Caption below the code block. It sits INSIDE the bordered card, so align it to the code's 18px
   inset (it had no padding and hugged the card edge/border), separate it with a hairline, and give
   it the muted-fill footer look. */
/* Scoped under .hp-install-code so it outweighs `.hp-install p` (which set a 15.5px body size + a
   top margin that leaked onto this caption). */
.hp-install-code .hp-code-note { margin: 0; padding: 11px 18px; font-size: 12px; color: var(--ink-faint);
  border-top: 1px solid var(--border); background: var(--surface-2); }
.hp-code-fn { color: var(--accent); font-weight: 600; }
.hp-code-str { color: var(--good); }

/* ---- 11 faq ---- */
.hp-faq { max-width: 720px; margin: 0 auto; border-top: 1px solid var(--border); }
.hp-faq-item { border-bottom: 1px solid var(--border); }
.hp-faq-item summary { list-style: none; cursor: pointer; padding: 20px 4px; display: flex; align-items: center;
  justify-content: space-between; gap: 16px; font-weight: 600; font-size: 16.5px; color: var(--ink); }
.hp-faq-item summary::-webkit-details-marker { display: none; }
.hp-faq-ico { position: relative; width: 16px; height: 16px; flex: none; }
.hp-faq-ico::before, .hp-faq-ico::after { content: ""; position: absolute; background: var(--accent); border-radius: 2px; transition: transform .2s ease; }
.hp-faq-ico::before { top: 7px; left: 0; width: 16px; height: 2px; }
.hp-faq-ico::after { top: 0; left: 7px; width: 2px; height: 16px; }
.hp-faq-item[open] .hp-faq-ico::after { transform: rotate(90deg); opacity: 0; }
.hp-faq-a { padding: 0 4px 22px; color: var(--ink-soft); font-size: 15px; line-height: 1.6; max-width: 62ch; }

/* ---- 12 closing cta ---- */
/* Closing CTA: a stronger accent gradient so the final conversion moment stands out as the finale,
   rather than fading into the page (the old --pub-tint gradient was nearly invisible). */
.hp-cta {
  --pb: var(--pr-page, var(--accent));
  padding: clamp(64px, 8vw, 112px) 0 clamp(80px, 9vw, 128px); text-align: center;
  background:
    radial-gradient(80% 120% at 50% 0%, color-mix(in srgb, var(--pb) 18%, var(--surface)), transparent 62%),
    color-mix(in srgb, var(--pb) 8%, var(--surface));
  border-top: 1px solid color-mix(in srgb, var(--pb) 18%, var(--border));
}
:root[data-theme="dark"] .hp-cta {
  background:
    radial-gradient(80% 120% at 50% 0%, color-mix(in srgb, var(--pb) 24%, var(--bg)), transparent 62%),
    color-mix(in srgb, var(--pb) 10%, var(--bg));
}
@media (prefers-color-scheme: dark) {
  :root:not([data-theme="light"]) .hp-cta {
    background:
      radial-gradient(80% 120% at 50% 0%, color-mix(in srgb, var(--pb) 24%, var(--bg)), transparent 62%),
      color-mix(in srgb, var(--pb) 10%, var(--bg));
  }
}
.hp-cta-title { font-family: var(--pub-display); font-weight: 380; letter-spacing: -.02em; line-height: 1.08;
  font-size: clamp(30px, 5vw, 50px); margin: 0 auto; max-width: 18ch; text-wrap: balance; }
.hp-cta-sub { margin: 18px auto 0; color: var(--ink-soft); font-size: 17px; max-width: 52ch; }
.hp-cta-actions { display: flex; gap: 12px; justify-content: center; margin-top: 30px; flex-wrap: wrap; }
/* OnbiAI nudge in the shared product CTA - a gold pill link, so AI stays one visible thread site-wide. */
.hp-cta-ai {
  --ai: var(--c-ai);
  display: inline-flex; align-items: center; gap: 9px; margin: 22px auto 0; max-width: max-content;
  padding: 9px 16px; border-radius: 999px; font-size: 14px; line-height: 1.35;
  color: color-mix(in srgb, var(--ai) 70%, var(--ink));
  background: color-mix(in srgb, var(--ai) 8%, var(--surface));
  border: 1px solid color-mix(in srgb, var(--ai) 30%, var(--border));
  transition: background .2s ease, border-color .2s ease;
}
.hp-cta-ai:hover { text-decoration: none; background: color-mix(in srgb, var(--ai) 13%, var(--surface));
  border-color: color-mix(in srgb, var(--ai) 45%, var(--border)); }
.hp-cta-ai svg { flex: none; color: var(--ai); }
.hp-cta-ai b { font-weight: 700; color: color-mix(in srgb, var(--ai) 80%, var(--ink)); }
.hp-cta-ai-go { color: var(--ai); font-weight: 700; }

/* reveal-on-scroll (set by home-demo island; static without JS / reduced-motion) */

/* ---- responsive ---- */
@media (max-width: 900px) {
  .hp-hero-grid { grid-template-columns: 1fr; }
  .hp-hero-demo { max-width: 480px; margin: 0 auto; width: 100%; }
  /* Centre the hero too, so it matches every other section on narrow screens. */
  .hp-hero-copy { text-align: center; }
  .hp-hero-copy .pub-lede { margin-left: auto; margin-right: auto; }
  .hp-hero-cta, .hp-hero-meta { justify-content: center; }
  /* Below 900px, centre the section headings that are left-aligned on desktop (the activation-gap
     band + the feature blocks), so every section reads centred and consistent down the page. The
     hero copy stays left - paragraphs read better left-aligned. */
  /* Centre the HEADING blocks only (eyebrow + h2 + their intro line) - not the content that follows.
     The activation-gap band is heading-only so it centres wholesale; the feature + install blocks
     have their own copy; the FAQ answers stay LEFT (readability). */
  .hp-band > .hp-narrow > .eyebrow,
  .hp-band > .hp-narrow > .hp-h2 { text-align: center; }
  .hp-band > .hp-narrow > .hp-band-lede { text-align: center; margin-left: auto; margin-right: auto; }
  .hp-feature-copy { text-align: center; }
  .hp-feature-copy p { margin-left: auto; margin-right: auto; }
  .hp-feature-copy .hp-link { justify-content: center; }
  .hp-install-copy { text-align: center; }
  .hp-install-copy p { margin-left: auto; margin-right: auto; }
  .hp-tabpanel.is-active { grid-template-columns: 1fr; justify-items: center; }
  /* justify-items:center above shrinks each grid item to its content, which collapsed the preview
     scene to its tiny intrinsic size (width:100% had nothing to fill). Let the visual STRETCH to the
     column and cap the scene so it renders at a proper size, centred. */
  .hp-tab-visual { justify-self: stretch; width: 100%; }
  .hp-tab-visual .hp-scene { width: 100%; max-width: 400px; margin: 0 auto; }
  /* Show all 5 flow-type tabs as buttons (no scroll). Drop the grey pill container (background /
     border / padding) on mobile - it looked heavy around the grid - and lay the tabs out in an even
     2-column grid, each tab its own bordered button. The odd 5th tab spans both columns. */
  .hp-tablist { display: grid; grid-template-columns: 1fr 1fr; gap: 8px; width: 100%; max-width: 360px;
    background: none; border: 0; padding: 0; }
  .hp-tab { white-space: normal; text-align: center; padding: 11px 8px; border: 1px solid var(--border);
    border-radius: 10px; background: var(--surface); }
  .hp-tab.is-active { border-color: var(--accent); box-shadow: none; }
  /* The odd 5th tab sits on its own row: span both columns for alignment, but keep it the SAME width
     as the others (don't let it stretch full-width and look oversized) by centring it. */
  .hp-tab:last-child { grid-column: span 2; justify-self: center; width: calc(50% - 4px); }
  /* centre + constrain the tab copy so it matches the centred tab bar + heading above it */
  .hp-tab-copy { text-align: center; max-width: 520px; margin: 0 auto; }
  .hp-ticks { display: inline-flex; text-align: left; }
  .hp-feature, .hp-feature-rev .hp-feature-copy { grid-template-columns: 1fr; order: 0; }
  .hp-feature { grid-template-columns: 1fr; }
  .hp-install { grid-template-columns: 1fr; }
  .hp-tiers { grid-template-columns: repeat(2, 1fr); }
  /* keep the natural Free -> Starter -> Growth -> Team -> Scale order at every width; the featured
     card is emphasised by its border + badge, not by reordering (which broke the sequence). */
  .hp-install { max-width: 620px; margin-left: auto; margin-right: auto; }
}
@media (max-width: 560px) {
  .hp-tiers { grid-template-columns: 1fr; }
  /* Stack the comparison. The header row is hidden, so each value carries an inline "who" label
     (Onbixo / Others) that only appears on mobile - so it's unambiguous which side is which. */
  .hp-compare-row { grid-template-columns: 1fr; gap: 8px; padding: 18px; }
  .hp-compare-head { display: none; }
  .hp-compare-k { font-size: 11px; font-weight: 700; text-transform: uppercase; letter-spacing: .06em; color: var(--ink-faint); margin-bottom: 2px; }
  .hp-compare-us, .hp-compare-them { display: flex; align-items: baseline; gap: 6px; }
  .hp-compare-us { color: var(--ink); font-weight: 600; }
  .hp-compare-them { color: var(--ink-faint); }
  /* inline who-labels (mobile only) */
  .hp-compare-us::before, .hp-compare-them::before {
    flex: none; width: 68px; font-size: 11px; font-weight: 700; text-transform: uppercase; letter-spacing: .03em;
  }
  .hp-compare-us::before  { content: "Onbixo"; color: var(--c-good); }
  .hp-compare-them::before { content: "Others"; color: var(--ink-faint); }
  /* Stacked steps: keep the three-bar connectors in their natural column orientation, centred with
     breathing room between steps. (flex-direction stays column from the base rule.) */
  .hp-steps { flex-direction: column; align-items: center; gap: 20px; }
  .hp-step { max-width: none; }
  .hp-step-bars {
    padding-top: 0;
    padding-bottom: 10px;
  }
}

/* ---- CSP-safe helpers: no inline styles / JS .style writes are allowed under style-src 'self',
   so heights, reveals, and demo-tip positions are all class-driven. ---------------------------- */
.hp-chart-bars .h40 { height: 40%; }
.hp-chart-bars .h55 { height: 55%; }
.hp-chart-bars .h62 { height: 62%; }
.hp-chart-bars .h72 { height: 72%; }
.hp-chart-bars .h80 { height: 80%; }

/* (scroll-reveal removed: it blanked sections on fast scroll. data-reveal attributes are now inert.
   Content is always visible - no opacity:0 hidden state.) */

/* hero demo tooltip: three fixed positions (one per step), toggled by class. Percentages keep it
   inside the frame across sizes; the transition on .hp-demo-tip animates the hop. */
.hp-demo-tip.pos-0 { left: 35%; top: 26%; }
.hp-demo-tip.pos-1 { left: 30%; top: 44%; }
.hp-demo-tip.pos-2 { left: 6%;  top: 27%; }
.hp-demo-tip.is-fading { opacity: .4; }

/* ---- pricing preview: detailed tier cards (name, price, MAU, CTA, feature highlights) --------- */
.hp-tiers-detailed { align-items: stretch; }
.hp-tiers-detailed .hp-tier { padding: 26px 22px 24px; gap: 0; text-align: left; align-items: stretch; }
.hp-tiers-detailed .hp-tier-name { font-size: 17px; margin-bottom: 4px; }
/* One-line audience descriptor under the plan name; fixed min-height so the price row lines
   up across all four cards even when a tag wraps to two lines. */
.hp-tiers-detailed .hp-tier-tag {
  font-size: 13px; line-height: 1.35; color: var(--ink-soft); margin-bottom: 16px; min-height: 2.7em;
}
.hp-tiers-detailed .hp-tier-price { line-height: 1.02; margin: 0 0 6px; color: var(--ink); }
/* Set the big size DIRECTLY on the price wrappers (not via inherit) so nothing shrinks the number.
   Only the nested "/mo" span is small. */
.hp-tiers-detailed .hp-price-m, .hp-tiers-detailed .hp-price-y {
  font-family: var(--pub-display); font-size: 44px; font-weight: 440; letter-spacing: -.02em; color: var(--ink);
}
.hp-tiers-detailed .hp-price-m > span, .hp-tiers-detailed .hp-price-y > span {
  font-family: var(--pub-sans); font-size: 16px; font-weight: 500; color: var(--ink-faint); margin-left: 2px; letter-spacing: 0.1px;
}
/* MAU line + the "billed $X/yr" subline. The subline always reserves its row (even when empty on
   monthly / Free) so every card's price block is the same height and the CTAs line up. */
.hp-tiers-detailed .hp-tier-mau { margin-bottom: 18px; }
.hp-tier-mau .hp-mau-line { display: block; font-size: 14px; color: var(--ink-soft); }
.hp-tier-mau .hp-mau-line b { color: var(--ink); font-weight: 700; }
.hp-price-billed { display: block; min-height: 16px; font-size: 11.5px; color: var(--ink-faint); font-weight: 500; margin-top: 2px; }
.hp-tiers-detailed.is-yearly .hp-price-billed { color: var(--ink-faint); }
.hp-tiers-detailed .pub-btn { width: 100%; margin-top: 0; margin-bottom: 20px; }
.hp-tier-feats { list-style: none; margin: 0; padding: 14px 0 0; border-top: 1px solid var(--border);
  display: flex; flex-direction: column; gap: 9px; }
.hp-tier-feats li { display: flex; align-items: flex-start; gap: 8px; font-size: 13.5px; color: var(--ink); line-height: 1.45; }
.hp-tier-feats li svg { color: var(--accent); flex: none; margin-top: 2px; }
.hp-tier-prev { display: block !important; color: var(--ink-faint); font-size: 12px; font-weight: 600; padding-bottom: 2px; }
.hp-tiers-note { display: inline-flex; align-items: center; gap: 4px; flex-wrap: wrap; justify-content: center;
  font-size: 13px; color: var(--ink-soft); margin-bottom: 14px; }
.hp-tiers-note svg { color: var(--c-good); }
.hp-tiers-foot { display: flex; flex-direction: column; align-items: center; gap: 6px; }

@media (max-width: 1040px) {
  /* 3 across, but 5 cards leave 2 orphans in row 2. Use a 6-track grid, each card spans 2, and the
     last two (Team, Scale) start at columns 2 and 4 so row 2 is centred instead of left-aligned. */
  .hp-tiers-detailed { grid-template-columns: repeat(6, 1fr); }
  .hp-tiers-detailed .hp-tier { grid-column: span 2; }
  .hp-tiers-detailed .hp-tier:nth-child(4) { grid-column: 2 / span 2; }
  .hp-tiers-detailed .hp-tier:nth-child(5) { grid-column: 4 / span 2; }
}
@media (max-width: 760px) {
  /* back to a normal 2-col grid: reset the 6-track spans/offsets from the 1040 rule */
  .hp-tiers-detailed { grid-template-columns: repeat(2, 1fr); }
  .hp-tiers-detailed .hp-tier,
  .hp-tiers-detailed .hp-tier:nth-child(4),
  .hp-tiers-detailed .hp-tier:nth-child(5) { grid-column: auto; }
}
@media (max-width: 500px) {
  .hp-tiers-detailed { grid-template-columns: 1fr; }
}

/* ---- billing toggle (monthly / yearly) ------------------------------------------------------- */
.hp-billing-toggle { display: inline-flex; gap: 3px; padding: 4px; margin: 22px auto 0; background: var(--surface-2);
  border: 1px solid var(--border); border-radius: 11px; }
.hp-bt { font-family: inherit; font-size: 13.5px; font-weight: 600; color: var(--ink-soft); background: none;
  border: 0; border-radius: 8px; padding: 8px 16px; cursor: pointer; display: inline-flex; align-items: center; gap: 8px; }
.hp-bt:hover { color: var(--ink); }
.hp-bt.is-active { background: var(--surface); color: var(--accent); box-shadow: var(--shadow); }
.hp-bt-save { font-size: 10.5px; font-weight: 700; letter-spacing: .02em; color: var(--accent); background: var(--accent-soft);
  border-radius: 20px; padding: 2px 8px; }
/* price swap: show monthly OR yearly based on the wrapper class. No JS .style writes. */
.hp-price-y { display: none; }
.hp-tiers-detailed.is-yearly .hp-price-m { display: none; }
.hp-tiers-detailed.is-yearly .hp-price-y { display: inline; }
/* billed line: "billed monthly" on the monthly toggle, "billed $X/yr" on yearly. Both are rendered;
   the wrapper class picks which shows. The row always has height (min-height above) so cards align. */
.hp-price-billed .bill-y { display: none; }
.hp-tiers-detailed.is-yearly .hp-price-billed .bill-m { display: none; }
.hp-tiers-detailed.is-yearly .hp-price-billed .bill-y { display: inline; }

/* ==========================================================================
   PRICING PAGE
   ========================================================================== */
.pm-hero { padding: clamp(48px, 7vw, 88px) 0 clamp(28px, 4vw, 44px); text-align: center; }
.pm-hero .eyebrow { display: block; }
.pm-hero .hp-h1 { margin: 14px auto 0; max-width: 18ch; }
.pm-hero .pub-lede { margin: 18px auto 0; text-align: center; }
.pm-hero .hp-billing-toggle { margin-top: 28px; }

.pm-tiers-sec { padding: 0 0 clamp(40px, 6vw, 72px); }
.pm-tiers-note { display: flex; flex-wrap: wrap; align-items: center; justify-content: center; gap: 4px 8px;
  font-size: 13px; color: var(--ink-soft); margin: 28px auto 0; }
.pm-tiers-note svg { color: var(--c-good); }

/* graceful-block explainer */
/* Same centred icon-tile treatment as the AI block: no card, colour in one rounded tile, and a
   single hairline between items instead of four borders around each. The three tile colours are
   semantic here - green keeps going, indigo pauses, amber is the bill - so the tint carries
   meaning rather than decoration, and they stay larger than the old 40px chips. */
.pm-graceful .pm-grace-grid { display: grid; grid-template-columns: repeat(3, 1fr); gap: 0;
                              margin-top: 30px; text-align: center; }
.pm-grace-card { position: relative; padding: 4px 30px; }
.pm-grace-card + .pm-grace-card::before {
  content: ""; position: absolute; left: 0; top: 2px; bottom: 2px; width: 1px;
  background: linear-gradient(180deg, transparent, var(--border) 18%, var(--border) 82%, transparent);
}
.pm-grace-ico { width: 54px; height: 54px; border-radius: 16px; display: grid; place-items: center;
                font-size: 22px; margin: 0 auto 18px; border: 1px solid transparent; }
.pm-grace-ico.ok { background: color-mix(in srgb, var(--c-good) 15%, var(--surface));
                   border-color: color-mix(in srgb, var(--c-good) 20%, var(--surface));
                   color: color-mix(in srgb, var(--c-good) 88%, #000); }
.pm-grace-ico.ok svg { width: 23px; height: 23px; }
.pm-grace-ico.pause { background: color-mix(in srgb, var(--accent) 13%, var(--surface));
                      border-color: color-mix(in srgb, var(--accent) 18%, var(--surface));
                      color: color-mix(in srgb, var(--accent) 88%, #000); }
.pm-grace-ico.bill { background: color-mix(in srgb, var(--warn) 15%, var(--surface));
                     border-color: color-mix(in srgb, var(--warn) 20%, var(--surface));
                     color: color-mix(in srgb, var(--warn) 88%, #000); font-size: 25px; }
.pm-grace-card h3 { font-size: 17px; font-weight: 700; margin: 0 0 9px; color: var(--ink);
                    text-wrap: balance; }
.pm-grace-card p { font-size: 14.5px; line-height: 1.65; color: var(--ink-soft); margin: 0;
                   max-width: 38ch; margin-inline: auto; }

/* feature comparison matrix */
.pm-matrix-sec { padding: clamp(48px, 7vw, 96px) 0; }
.pm-matrix-scroll { overflow-x: auto; border: 1px solid var(--border); border-radius: 16px; background: var(--surface); }
.pm-matrix { width: 100%; border-collapse: collapse; min-width: 720px; }
.pm-matrix th, .pm-matrix td { padding: 14px 16px; text-align: center; border-bottom: 1px solid var(--border); vertical-align: middle; }
.pm-matrix thead th { position: sticky; top: 0; z-index: 2; background: var(--surface);
  border-bottom: 1px solid var(--border-strong); }
.pm-feat-col { text-align: left !important; font-weight: 600; color: var(--ink); width: 30%; }
.pm-th-name { display: block; font-family: var(--pub-display); font-size: 19px; font-weight: 460; letter-spacing: -.01em; }
.pm-th-price { display: block; font-size: 12.5px; color: var(--ink-faint); margin: 2px 0 10px; }
.pm-matrix th.is-featured { background: var(--accent-soft); }
.pm-matrix th.is-featured .pm-th-name { color: var(--accent); }
.pm-matrix td.is-featured { background: color-mix(in srgb, var(--accent) 4%, var(--surface)); }
.pm-section-row td { text-align: left !important; font-size: 11.5px; font-weight: 700; letter-spacing: .06em;
  text-transform: uppercase; color: var(--ink-faint); background: var(--surface-2); padding: 10px 16px; }
.pm-yes { color: var(--c-good); display: inline-flex; }
.pm-dash { color: var(--ink-faint); opacity: .6; }
.pm-txt { font-size: 13.5px; color: var(--ink); }
.pm-matrix .pub-btn-sm { font-size: 12.5px; padding: 6px 14px; border-radius: 8px; }

@media (max-width: 900px) {
  .pm-graceful .pm-grace-grid { grid-template-columns: 1fr; }
  .pm-grace-card { padding: 4px 0; }
  .pm-grace-card + .pm-grace-card { padding-top: 30px; margin-top: 30px; }
  .pm-grace-card + .pm-grace-card::before { left: 0; right: 0; top: 0; bottom: auto; width: auto;
    height: 1px; background: var(--border); }
}

/* ---- 4-card tier grid + Scale banner (replaces the crowded 5-across) ------------------------- */
.hp-tiers-4 { grid-template-columns: repeat(4, 1fr); max-width: 1080px; }
/* the 6-track orphan-centering hack was for 5 cards; with 4 it's unneeded - reset it */
@media (max-width: 1040px) {
  .hp-tiers-detailed.hp-tiers-4 { grid-template-columns: repeat(2, 1fr); max-width: 640px; }
  .hp-tiers-detailed.hp-tiers-4 .hp-tier,
  .hp-tiers-detailed.hp-tiers-4 .hp-tier:nth-child(4),
  .hp-tiers-detailed.hp-tiers-4 .hp-tier:nth-child(5) { grid-column: auto; }
}
@media (max-width: 560px) {
  .hp-tiers-detailed.hp-tiers-4 { grid-template-columns: 1fr; max-width: 400px; }
}

/* Scale banner: full-width horizontal strip under the 4 cards. */
.hp-scale-banner {
  max-width: 1080px; margin: 16px auto 0; display: flex; align-items: center; gap: 24px;
  background: var(--surface); border: 1px solid var(--border); border-radius: 16px; padding: 22px 28px;
  box-shadow: var(--shadow);
}
.hp-scale-info { flex: 1; min-width: 0; }
.hp-scale-name { font-family: var(--pub-display); font-size: 22px; font-weight: 460; letter-spacing: -.01em; color: var(--ink); }
.hp-scale-desc { font-size: 14px; color: var(--ink-soft); margin: 5px 0 0; max-width: 62ch; }
.hp-scale-desc b { color: var(--ink); font-weight: 650; }
.hp-scale-price { flex: none; font-family: var(--pub-display); color: var(--ink); white-space: nowrap; }
.hp-scale-price b { font-size: 34px; font-weight: 440; letter-spacing: -.02em; }
.hp-scale-price span { font-family: var(--pub-sans); font-size: 14px; color: var(--ink-faint); margin-left: 2px; }
.hp-scale-banner .pub-btn { flex: none; }
@media (max-width: 680px) {
  .hp-scale-banner { flex-direction: column; align-items: flex-start; gap: 16px; text-align: left; }
  .hp-scale-banner .pub-btn { width: 100%; }
}

/* ============================================================================
   PRODUCT PAGES (.pr-*)  -  layered on the .hp-* homepage system
   ---------------------------------------------------------------------------
   Each page carries a per-topic accent via .pr-accent-<x> on the hero. The
   accent recolors ONLY the hero visual mock + the eyebrow dot; the primary CTA
   button stays brand indigo (var(--accent) untouched) so calls-to-action read
   consistently site-wide. Mocks internally keyed on --accent get it scoped to
   the hero visual alone.
   ========================================================================== */

/* ---- per-topic accent tokens (mirror the homepage tab accents) ------------ */
.pr-accent-tours    { --pr-accent: var(--c-tours); }
.pr-accent-tips     { --pr-accent: var(--c-tips); }
.pr-accent-check    { --pr-accent: var(--c-check); }
.pr-accent-announce { --pr-accent: var(--c-announce); }
.pr-accent-target   { --pr-accent: var(--c-target); }
.pr-accent-analytics { --pr-accent: var(--c-analytics); }
.pr-accent-survey   { --pr-accent: var(--c-survey); }
.pr-accent-ab       { --pr-accent: var(--c-ab); }
.pr-accent-resource { --pr-accent: var(--c-resource); }
.pr-accent-good     { --pr-accent: var(--c-good); }
/* AI page: a warm golden accent (its own hue, distinct from the topic colors). Darker gold in light
   mode for contrast on white; brighter gold in dark mode. Set with --accent-ink so filled chips
   keep readable text. */
.pr-accent-ai {
  /* A warm amber-gold. The old #B8860B (darkgoldenrod) is desaturated enough that it read olive/green
     on white; this keeps the same contrast weight for text but stays unmistakably gold. */
  --pr-accent: #C0870A;
  --pr-accent-ink: #ffffff;        /* white text on the deeper light-mode gold */
}
/* The dark values live in the two rules below - a prefers-color-scheme block for auto, and an
   explicit [data-theme="dark"] one. Stating them here as well, outside any media query, meant auto
   mode took the dark gold on a light system. */
@media (prefers-color-scheme: dark) {
  :root:not([data-theme="light"]) .pr-accent-ai { --pr-accent: #E0A82E; --pr-accent-ink: #1a1205; }
}
:root[data-theme="dark"] .pr-accent-ai { --pr-accent: #E0A82E; --pr-accent-ink: #1a1205; }
.pr-accent-tours, .pr-accent-tips, .pr-accent-check, .pr-accent-announce, .pr-accent-target, .pr-accent-analytics, .pr-accent-resource, .pr-accent-good, .pr-accent-ai {
  --pr-soft: color-mix(in srgb, var(--pr-accent) 14%, var(--surface));
}

/* ---- hero ----------------------------------------------------------------- */
/* The hero sits on its own subtly accent-tinted panel with a bottom hairline, so it reads as a
   distinct zone and separates cleanly from the first content section below (which is on the plain
   page bg). Without this the hero + first feature row butt together into one undifferentiated block. */
.pr-hero {
  padding: clamp(44px, 6.5vw, 88px) 0 clamp(48px, 6.5vw, 84px); overflow: hidden;
  background: color-mix(in srgb, var(--pr-accent, var(--accent)) 6%, var(--surface));
  border-bottom: 1px solid color-mix(in srgb, var(--pr-accent, var(--accent)) 14%, var(--border));
}
.pr-hero-grid { display: grid; grid-template-columns: 1.05fr 1fr; gap: clamp(28px, 5vw, 64px); align-items: center; }
.pr-hero-copy .hp-h1 { max-width: 15ch; }
.pr-eyebrow { color: var(--pr-accent, var(--accent)); }
.pr-eyebrow::before {
  content: ""; display: inline-block; width: 7px; height: 7px; border-radius: 50%;
  background: var(--pr-accent, var(--accent)); margin-right: 8px; vertical-align: middle;
  position: relative; top: -1px;
}
/* When the eyebrow already carries an inline icon (the AI page), drop the leading dot + tint the icon. */
.pr-eyebrow-ico::before { display: none; }
.pr-eyebrow-ico svg { width: 15px; height: 15px; vertical-align: middle; margin-right: 6px;
  position: relative; top: -1px; color: var(--pr-accent, var(--accent)); }
.pr-hero-visual { display: grid; place-items: center; }
/* Scope the topic accent to the visual mock only: scenes/rules/chart read --accent internally. */
.pr-hero-visual { --accent: var(--pr-accent); --accent-soft: var(--pr-soft); }
/* AI page: carry the golden accent-ink so filled chips/buttons in the hero + switcher stay readable. */
.pr-accent-ai .pr-hero-visual, .ai-switch.pr-accent-ai { --accent-ink: var(--pr-accent-ink, #1a1205); }
.pr-hero-visual .hp-scene { max-width: 420px; }

/* Home AI band: the section uses the page's own indigo accent (not the gold topic accent used on
   /product/ai), so it sits in the home page's alternating band rhythm without introducing a third
   colour. The golden sparkles inside it are the AI cue. */

/* Industry pages - OnbiAI as a full 4th ind-row in ind-solves, in the industry's own accent. The chat sits
   INSIDE the same tinted tile as the other .ind-row-vis mocks (so it matches the section); we just
   center a compact .ai-chat inside it and force white button ink. */
.ind-row-ai { --pr-accent: var(--accent); --pr-soft: var(--accent-soft); }
.ind-row-ai .ind-row-vis {
  display: grid; place-items: center; height: auto; min-height: 260px; padding: 22px; overflow: visible;
}
.ind-row-ai .ai-chat {
  max-width: 340px; padding: 14px 14px 12px; border-radius: 14px; font-size: 13px;
}
.ind-row-ai .ai-chat .ai-msg p { font-size: 12.5px; }
.ind-row-ai .ai-chat .ai-chat-head { margin-bottom: 12px; }
.ind-row-ai .ai-chat .ai-chat-btn { font-size: 12px; padding: 7px 11px; }
/* Force white text on the coloured Create-with-AI button - .ai-chat re-declares --accent-ink from a
   self-referencing fallback, so override the button colour directly rather than the variable. */
.ind-row-ai .ai-chat-btn-primary { color: #ffffff; }
.ind-row-ai .ai-chat-btn-primary svg { color: #ffffff; }

/* Solutions AI band: page's own (brand indigo) accent, NOT gold, so it blends with the page.
   --pr-accent feeds the eyebrow + the .ai-chat mock. Plain (untinted) background so it doesn't merge
   with the tinted stats band that follows - the two must read as separate zones. */
.sol-ai-band { --pr-accent: var(--accent); --pr-soft: var(--accent-soft); --pr-accent-ink: var(--accent-ink); background: transparent; }
:root[data-theme="dark"] .sol-ai-band, :root:not([data-theme="light"]) .sol-ai-band { background: transparent; }

/* Pricing "AI on every plan" reassurance band - a conversion nudge under the tier cards. */
.pm-ai { text-align: center; }
.pm-ai-head { max-width: 620px; margin: 0 auto; }
.pm-ai-lede { margin-top: 14px; color: var(--ink-soft); font-size: 16px; line-height: 1.6; }
/* Centred icon tile, no card. The box was carrying no meaning: a border plus a tinted chip plus
   tight leading meant four elements competed and none led. Colour now sits in one rounded tile and
   whitespace does the separating, with body copy at 1.65 rather than 1.55 - the leading is most of
   why this reads calmer than a row of boxes. */
.pm-ai-grid { display: grid; grid-template-columns: repeat(3, 1fr); gap: 0; margin-top: 40px;
              text-align: center; }
/* One hairline between items instead of four around each. It fades at both ends so it reads as a
   soft separator rather than a table rule, and it groups the three as one set - which is the job
   the card borders were doing badly. */
.pm-ai-card { position: relative; padding: 4px 30px; }
.pm-ai-card + .pm-ai-card::before {
  content: ""; position: absolute; left: 0; top: 2px; bottom: 2px; width: 1px;
  background: linear-gradient(180deg, transparent, var(--border) 18%, var(--border) 82%, transparent);
}
.pm-ai-ico {
  display: grid; place-items: center; width: 54px; height: 54px; border-radius: 16px;
  margin: 0 auto 18px; color: color-mix(in srgb, var(--accent) 88%, #000);
  background: color-mix(in srgb, var(--accent) 13%, var(--surface));
  /* A hairline mixed from the tile's own colour, not the neutral --border: the edge then belongs
     to the tile and defines it, where a grey outline would sit on top of it. */
  border: 1px solid color-mix(in srgb, var(--accent) 18%, var(--surface));
}
.pm-ai-ico svg { width: 23px; height: 23px; }
.pm-ai-card h3 { font-size: 17px; font-weight: 700; margin: 0 0 9px; color: var(--ink); }
.pm-ai-card p { font-size: 14.5px; line-height: 1.65; color: var(--ink-soft); margin: 0;
                max-width: 32ch; margin-inline: auto; }
.pm-ai-card p b { color: color-mix(in srgb, var(--accent) 72%, var(--ink)); font-weight: 700; }
.pm-ai-link { display: inline-flex; margin-top: 30px; }
@media (max-width: 820px) {
  .pm-ai-grid { grid-template-columns: 1fr; }
  .pm-ai-card { padding: 4px 0; }
  .pm-ai-card + .pm-ai-card { padding-top: 30px; margin-top: 30px; }
  .pm-ai-card + .pm-ai-card::before { left: 0; right: 0; top: 0; bottom: auto; width: auto;
    height: 1px; background: var(--border); }
}

/* Pricing: "Compare all plans" jump-link under the tier cards -> smooth-scrolls to the matrix. */
.pm-compare-wrap { text-align: center; margin-top: 14px; }
.pm-compare-link {
  display: inline-flex; align-items: center; gap: 6px;
  font-size: 14px; font-weight: 650; color: var(--accent);
}
.pm-compare-link:hover { text-decoration: none; gap: 8px; }
.pm-compare-link span { transition: transform .2s ease; }
.pm-compare-link:hover span { transform: translateY(2px); }
.pm-matrix-sec { scroll-margin-top: 25px; }   /* small offset when jumped to */
html.public-html { scroll-behavior: smooth; }
@media (prefers-reduced-motion: reduce) { html.public-html { scroll-behavior: auto; } }

/* Pricing: minimalist per-action credit-cost reference, a quiet note right under the comparison table
   (not a highlighted band). Makes the "AI credits/month" rows concrete without shouting. */
.pm-credits { max-width: 760px; margin: 30px auto 0; }
.pm-credits-head { font-size: 13px; font-weight: 700; letter-spacing: .02em; color: var(--ink); text-align: center; }
.pm-credits-head span { font-weight: 500; color: var(--ink-faint); }
.pm-credits-list {
  list-style: none; margin: 14px 0 0; padding: 0;
  display: grid; grid-template-columns: repeat(2, 1fr); gap: 0 28px;
}
.pm-credits-list li {
  display: flex; align-items: baseline; justify-content: space-between; gap: 12px;
  padding: 9px 0; border-bottom: 1px solid var(--border);
}
.pm-credit-name { font-size: 14px; color: var(--ink-soft); }
.pm-credit-cost { flex: none; font-size: 13.5px; font-weight: 650; color: var(--ink); }
.pm-credit-cost.is-free { color: var(--c-good, #10b981); }
.pm-credits-foot { margin-top: 16px; text-align: center; font-size: 13px; color: var(--ink-faint); }
@media (max-width: 560px) { .pm-credits-list { grid-template-columns: 1fr; } }

/* Contextual OnbiAI callout on feature pages (_ai_note.php). Rendered as a full-width row INSIDE the
   hero (its own .pub-wrap after the grid), so it belongs to the hero and never straddles a section
   divider. It is the <a> itself - no negative margins, no section wrapper. */
.pr-ai-note {
  --ai: var(--pr-accent, var(--c-ai));
  display: flex; align-items: center; gap: 14px; flex-wrap: wrap;
  margin-top: clamp(28px, 4vw, 44px);
  padding: 15px 20px; border-radius: 14px;
  background: color-mix(in srgb, var(--ai) 7%, var(--surface));
  border: 1px solid color-mix(in srgb, var(--ai) 26%, var(--border));
  transition: background .2s ease, border-color .2s ease;
}
.pr-ai-note:hover { text-decoration: none; background: color-mix(in srgb, var(--ai) 11%, var(--surface));
  border-color: color-mix(in srgb, var(--ai) 42%, var(--border)); }
.pr-ai-note-ico {
  display: grid; place-items: center; width: 38px; height: 38px; flex: none; border-radius: 10px;
  color: var(--ai); background: color-mix(in srgb, var(--ai) 14%, var(--surface));
}
.pr-ai-note-txt { flex: 1; min-width: 220px; font-size: 15px; line-height: 1.45; color: var(--ink); }
.pr-ai-note-txt b { color: color-mix(in srgb, var(--ai) 72%, var(--ink)); font-weight: 700; }
.pr-ai-note-go { flex: none; font-size: 14px; font-weight: 650; color: var(--ai); white-space: nowrap; }
@media (max-width: 640px) { .pr-ai-note-go { display: none; } }

/* Home AI mini-demo: two panels (chat / draft) share one grid cell so the card height never changes
   (no layout shift). The Create-with-AI button "presses", then the chat cross-fades to the draft. */
.ai-swap { position: relative; display: grid; }
.ai-swap-panel {
  grid-area: 1 / 1; display: flex; flex-direction: column; gap: 10px;
  opacity: 0; visibility: hidden; transform: translateY(6px);
  transition: opacity .45s ease, transform .45s ease, visibility 0s linear .45s;
  pointer-events: none;
}
.ai-swap-panel.is-active {
  opacity: 1; visibility: visible; transform: none; pointer-events: auto;
  transition: opacity .5s ease, transform .5s ease;
}
[data-ai-demo-btn] { transition: transform .18s ease, box-shadow .18s ease; }
[data-ai-demo-btn].is-pressing { transform: scale(.94); box-shadow: 0 0 0 4px color-mix(in srgb, var(--accent) 25%, transparent); }
.ai-draft-out-head {
  display: flex; align-items: center; gap: 7px; font-size: 12px; font-weight: 700; letter-spacing: .01em;
  color: var(--accent); margin-bottom: 2px;
}
.ai-draft-out-head svg { width: 15px; height: 15px; }
.ai-draft-out-steps { display: flex; flex-direction: column; gap: 8px; }
.ai-draft-out-step {
  display: flex; align-items: center; gap: 10px; font-size: 14px; color: var(--ink);
  padding: 9px 12px; border: 1px solid var(--border); border-radius: 9px; background: var(--surface);
  opacity: 0; transform: translateY(6px); transition: opacity .32s ease, transform .32s ease;
}
.ai-swap-panel[data-ai-demo-panel="draft"]:not(.is-active) .ai-draft-out-step { opacity: 0; } /* reset for the next loop */
.ai-draft-out-step.is-in { opacity: 1; transform: none; }
.ai-draft-out-step > i {
  display: grid; place-items: center; width: 22px; height: 22px; flex: none; border-radius: 6px;
  font-style: normal; font-size: 12px; font-weight: 700; color: var(--accent-ink); background: var(--accent);
}
@media (prefers-reduced-motion: reduce) {
  .ai-swap-panel, .ai-swap-panel.is-active, [data-ai-demo-btn], .ai-draft-out-step { transition: none; }
}

/* ===== /product/ai hero: the rotating assistant chat demo ===== */
.ai-chat {
  --accent: var(--pr-accent, var(--accent)); --accent-soft: var(--pr-soft, var(--accent-soft));
  --accent-ink: var(--pr-accent-ink, var(--accent-ink));
  width: 100%; max-width: 440px; background: var(--surface);
  border: 1px solid var(--border); border-radius: 18px; padding: 18px 18px 14px;
  box-shadow: var(--shadow);
  -webkit-user-select: none; user-select: none;   /* decorative preview - not selectable */
}
.ai-chat-head {
  display: flex; align-items: center; gap: 8px; margin-bottom: 40px;
  font-size: 13.5px; font-weight: 650; color: var(--ink);
}
.ai-chat-head svg { width: 18px; height: 18px; color: var(--accent); }
/* The stage: scenes are stacked in one grid cell; only .is-active is shown. The stage holds the
   height of the TALLEST scene, and each scene bottom-aligns its messages within it - so shorter
   conversations sit at the bottom (like a real chat) instead of jumping to the top. */
.ai-chat-scenes { position: relative; display: grid; align-items: end; }
.ai-chat-scene {
  grid-area: 1 / 1; display: flex; flex-direction: column; justify-content: flex-end; gap: 10px;
  align-self: stretch;
  opacity: 0; visibility: hidden; transform: translateY(8px);
  transition: opacity .45s ease, transform .45s ease, visibility 0s linear .45s;
  pointer-events: none;
}
.ai-chat-scene.is-active {
  opacity: 1; visibility: visible; transform: none; pointer-events: auto;
  transition: opacity .5s ease .05s, transform .5s ease .05s;
}
/* One message bubble: hugs its content (max ~80% width), user tinted + right, assistant neutral +
   left - like a real chat, not a full-width block. */
.ai-msg {
  position: relative; max-width: 82%; width: fit-content;
  border: 1px solid var(--border); padding: 10px 14px;
}
.ai-msg-you {
  margin-left: auto; align-self: flex-end; text-align: left;
  background: color-mix(in srgb, var(--accent) 10%, var(--surface));
  border-color: color-mix(in srgb, var(--accent) 22%, var(--border));
  border-radius: 14px 14px 4px 14px;
}
.ai-msg-ai {
  margin-right: auto; align-self: flex-start;
  background: var(--surface);
  border-radius: 14px 14px 14px 4px;
}
.ai-msg-who { display: block; font-size: 10.5px; font-weight: 700; letter-spacing: .04em;
  text-transform: uppercase; margin-bottom: 4px; }
.ai-msg-you .ai-msg-who { color: var(--accent); }
/* The assistant's speaker label takes the AI accent (gold inside .pr-accent-ai), not the success green
   it used to use - green read as a status colour and clashed with the AI topic colour. */
.ai-msg-ai .ai-msg-who { color: var(--accent); }
.ai-msg p { margin: 0; font-size: 14px; line-height: 1.5; color: var(--ink); }
.ai-msg p b { font-weight: 650; color: var(--ink); }
/* Real-looking action chips (not bracketed placeholder text). */
.ai-chat-actions { display: flex; flex-wrap: wrap; gap: 8px; margin-top: 2px; }
.ai-chat-btn {
  display: inline-flex; align-items: center; gap: 6px; font-size: 13px; font-weight: 600;
  padding: 8px 13px; border-radius: 9px; border: 1px solid var(--border-strong);
  background: var(--surface); color: var(--ink); white-space: nowrap;
}
.ai-chat-btn svg { width: 14px; height: 14px; }
.ai-chat-btn-primary {
  background: var(--accent); border-color: var(--accent); color: var(--accent-ink);
}
/* Caption strip: names the current scene (auto-advances) + progress ticks. No clickable controls. */
.ai-chat-foot {
  display: flex; align-items: center; justify-content: space-between; gap: 12px;
  margin-top: 16px; padding-top: 13px; border-top: 1px solid var(--pub-hairline, var(--border));
}
.ai-chat-tag {
  font-size: 12.5px; font-weight: 650; letter-spacing: .02em; color: var(--accent);
}
.ai-chat-ticks { display: inline-flex; gap: 6px; }
.ai-chat-tick {
  width: 18px; height: 4px; border-radius: 999px; cursor: pointer;
  background: var(--border-strong); opacity: .5; transition: opacity .3s ease, background .3s ease;
}
.ai-chat-tick.is-active { background: var(--accent); opacity: 1; }
@media (prefers-reduced-motion: reduce) {
  .ai-chat-scene, .ai-chat-scene.is-active { transition: opacity .2s ease; transform: none; }
}

/* ===== /product/ai: interactive feature switcher (tab rail drives a live preview) ===== */
.ai-switch {
  --accent: var(--pr-accent); --accent-soft: var(--pr-soft); --accent-ink: var(--pr-accent-ink, #1a1205);
  display: grid; grid-template-columns: minmax(300px, 380px) 1fr; gap: clamp(20px, 3vw, 40px);
  align-items: start; margin-top: 42px;
  -webkit-user-select: none; user-select: none;   /* decorative preview - not selectable */
}
.ai-switch-rail { display: flex; flex-direction: column; gap: 8px; }
/* A tab: icon + title/desc + a progress bar that fills while it is the active, playing tab. */
.ai-tab {
  position: relative; display: grid; grid-template-columns: auto 1fr; gap: 12px; align-items: start;
  text-align: left; font: inherit; cursor: pointer; overflow: hidden;
  padding: 14px 16px; border-radius: 14px; border: 1px solid transparent; background: transparent;
  color: var(--ink); transition: background .2s ease, border-color .2s ease;
}
.ai-tab:hover { background: color-mix(in srgb, var(--accent) 5%, var(--surface)); }
.ai-tab.is-active {
  background: var(--surface); border-color: var(--border);
  box-shadow: 0 6px 20px rgba(0,0,0,.05);
}
.ai-tab-ico {
  display: grid; place-items: center; width: 38px; height: 38px; border-radius: 10px;
  background: color-mix(in srgb, var(--accent) 12%, var(--surface)); color: var(--accent);
  transition: background .2s ease, color .2s ease;
}
.ai-tab-ico svg { width: 19px; height: 19px; }
.ai-tab.is-active .ai-tab-ico { background: var(--accent); color: var(--accent-ink); }
.ai-tab-main { min-width: 0; }
.ai-tab-t { display: block; font-size: 15px; font-weight: 650; color: var(--ink); }
.ai-tab-d {
  display: block; font-size: 13px; line-height: 1.45; color: var(--ink-faint);
  margin-top: 3px; max-height: 0; opacity: 0; overflow: hidden;
  transition: max-height .35s ease, opacity .3s ease, margin-top .35s ease;
}
.ai-tab.is-active .ai-tab-d { max-height: 96px; opacity: 1; margin-top: 5px; }
.ai-tab-bar { position: absolute; left: 0; right: 0; bottom: 0; height: 2px; background: transparent; }
.ai-tab-bar > i { display: block; height: 100%; width: 0; background: var(--accent); }
.ai-tab:not(.is-active) .ai-tab-bar > i { width: 0 !important; }

/* The stage: crafted "plain text -> result" demos stacked; only .is-active shows, cross-faded. */
.ai-switch-stage { position: relative; display: grid; min-height: 340px; }
.ax-demo {
  grid-area: 1 / 1; margin: 0; padding: 20px; border: 1px solid var(--border); border-radius: 16px;
  background: var(--surface); box-shadow: var(--shadow);
  display: flex; flex-direction: column; gap: 14px;
  opacity: 0; visibility: hidden; transform: scale(.985);
  transition: opacity .5s ease, transform .5s ease, visibility 0s linear .5s;
}
.ax-demo.is-active {
  opacity: 1; visibility: visible; transform: none;
  transition: opacity .55s ease, transform .55s ease;
}
.ax-head { display: flex; align-items: center; gap: 8px; font-size: 13px; font-weight: 650; color: var(--ink-faint); }
.ax-head svg { width: 17px; height: 17px; color: var(--accent); }
/* The input the user "types" into. */
.ax-input {
  display: flex; align-items: center; gap: 8px; flex-wrap: wrap;
  padding: 13px 15px; border: 1px solid var(--border-strong); border-radius: 11px;
  background: color-mix(in srgb, var(--accent) 4%, var(--surface)); min-height: 22px;
}
.ax-input-label { font-size: 10.5px; font-weight: 700; letter-spacing: .05em; text-transform: uppercase;
  color: var(--accent); padding: 2px 7px; border-radius: 6px;
  background: color-mix(in srgb, var(--accent) 14%, var(--surface)); }
.ax-type { font-size: 14.5px; color: var(--ink); line-height: 1.4; }
.ax-caret { display: inline-block; width: 2px; height: 17px; background: var(--accent); vertical-align: middle;
  animation: ax-blink 1s step-end infinite; }
.ax-demo.is-typed .ax-caret { display: none; }
@keyframes ax-blink { 50% { opacity: 0; } }
/* The "thinking -> done" connector between input and result. */
.ax-arrow { display: flex; align-items: center; gap: 8px; font-size: 12.5px; font-weight: 600; color: var(--accent);
  opacity: 0; transition: opacity .3s ease; }
.ax-demo.is-typed .ax-arrow { opacity: 1; }
.ax-arrow svg { width: 15px; height: 15px; }
.ax-demo.is-typed .ax-arrow svg { animation: ax-spin 1.1s linear 2; }
.ax-demo.is-done .ax-arrow svg { animation: none; }
@keyframes ax-spin { to { transform: rotate(360deg); } }
/* The generated result: header + rows that reveal one-by-one. */
.ax-result { border: 1px solid var(--border); border-radius: 12px; padding: 14px;
  background: color-mix(in srgb, var(--accent) 3%, var(--surface));
  opacity: 0; transform: translateY(8px); transition: opacity .4s ease, transform .4s ease; }
.ax-demo.is-typed .ax-result { opacity: 1; transform: none; }
.ax-result-head { font-size: 12px; font-weight: 700; letter-spacing: .02em; color: var(--accent); margin-bottom: 11px; }
.ax-rows { display: flex; flex-direction: column; gap: 9px; }
.ax-rows > * { opacity: 0; transform: translateY(6px); transition: opacity .35s ease, transform .35s ease; }
.ax-rows > *.is-in { opacity: 1; transform: none; }
/* Row kinds. */
.ax-step { display: flex; align-items: center; gap: 10px; font-size: 14px; color: var(--ink);
  padding: 9px 12px; border: 1px solid var(--border); border-radius: 9px; background: var(--surface); }
.ax-step > i { display: grid; place-items: center; width: 22px; height: 22px; flex: none; border-radius: 6px;
  font-style: normal; font-size: 12px; font-weight: 700; color: var(--accent-ink);
  background: var(--accent); }
.ax-cond { display: flex; align-items: center; gap: 8px; flex-wrap: wrap; font-size: 13.5px;
  padding: 9px 12px; border: 1px solid var(--border); border-radius: 9px; background: var(--surface); }
.ax-cond b { font-weight: 650; color: var(--ink); }
.ax-cond em { font-style: normal; color: var(--ink-faint); }
.ax-cond > span:last-child { font-weight: 600; color: var(--accent);
  padding: 2px 9px; border-radius: 6px; background: color-mix(in srgb, var(--accent) 12%, var(--surface)); }
.ax-insight { display: block; font-size: 14px; line-height: 1.5; color: var(--ink); }
.ax-insight b { color: var(--accent); }
.ax-fix { display: flex; align-items: flex-start; gap: 7px; font-size: 13.5px; line-height: 1.45; color: var(--ink);
  padding: 10px 12px; border: 1px dashed color-mix(in srgb, var(--accent) 40%, var(--border));
  border-radius: 9px; background: color-mix(in srgb, var(--accent) 6%, var(--surface)); }
.ax-fix svg { width: 15px; height: 15px; flex: none; margin-top: 2px; color: var(--accent); }
.ax-rank { display: flex; align-items: center; gap: 11px; font-size: 14px; color: var(--ink);
  padding: 9px 12px; border: 1px solid var(--border); border-radius: 9px; background: var(--surface); }
.ax-rank > b { display: grid; place-items: center; width: 22px; height: 22px; flex: none; border-radius: 50%;
  font-size: 12px; color: var(--accent-ink); background: var(--accent); }
.ax-rank > span { font-weight: 600; }
.ax-rank > em { margin-left: auto; font-style: normal; font-size: 12.5px; color: var(--ink-faint); }
.ax-copy { display: block; font-size: 14px; line-height: 1.45; padding: 9px 12px; border-radius: 9px; border: 1px solid var(--border); }
.ax-copy-old { color: var(--ink-faint); text-decoration: line-through; background: var(--surface); }
.ax-copy-new { color: var(--ink); font-weight: 600; background: color-mix(in srgb, var(--accent) 8%, var(--surface));
  border-color: color-mix(in srgb, var(--accent) 30%, var(--border)); display: flex; align-items: center; gap: 7px; }
.ax-copy-new svg { width: 15px; height: 15px; flex: none; color: var(--accent); }
.ax-answer { display: block; font-size: 14px; line-height: 1.5; color: var(--ink); }
.ax-answer b { color: var(--accent); font-weight: 650; }
.ax-links { display: flex; gap: 8px; flex-wrap: wrap; }
.ax-link { font-size: 13px; font-weight: 600; padding: 7px 12px; border-radius: 8px; border: 1px solid var(--border-strong);
  color: var(--ink); background: var(--surface); }
.ax-link-go { color: var(--accent-ink); background: var(--accent); border-color: var(--accent); }

/* Static "Suggested by AI" draft-review mock (the trust band). Real buttons, not bracket text. */
.ai-draft {
  --accent: var(--pr-accent); --accent-soft: var(--pr-soft); --accent-ink: var(--pr-accent-ink, #1a1205);
  width: 100%; max-width: 420px; background: var(--surface);
  border: 1px solid var(--border); border-radius: 16px; padding: 18px; box-shadow: var(--shadow);
  -webkit-user-select: none; user-select: none;   /* decorative preview - not selectable */
}
.ai-draft-head { display: flex; align-items: center; justify-content: space-between; gap: 10px; margin-bottom: 14px; }
.ai-draft-title { display: inline-flex; align-items: center; gap: 7px; font-size: 13px; font-weight: 650; color: var(--ink-faint); }
.ai-draft-title svg { width: 16px; height: 16px; color: var(--accent); }
.ai-draft-pill {
  font-size: 11px; font-weight: 650; padding: 3px 9px; border-radius: 999px;
  color: var(--accent); background: color-mix(in srgb, var(--accent) 12%, var(--surface));
  border: 1px solid color-mix(in srgb, var(--accent) 26%, var(--border));
}
.ai-draft-name { font-size: 16px; font-weight: 700; color: var(--ink); margin-bottom: 12px; }
.ai-draft-steps { display: flex; flex-direction: column; gap: 8px; margin-bottom: 16px; }
.ai-draft-step {
  display: flex; align-items: center; gap: 10px; font-size: 14px; color: var(--ink);
  padding: 9px 12px; border: 1px solid var(--border); border-radius: 9px; background: var(--surface);
}
.ai-draft-step > i {
  display: grid; place-items: center; width: 22px; height: 22px; flex: none; border-radius: 6px;
  font-style: normal; font-size: 12px; font-weight: 700; color: var(--accent-ink); background: var(--accent);
}
.ai-draft-more { font-size: 12.5px; font-weight: 600; color: var(--ink-faint); padding-left: 2px; }
.ai-draft-actions { display: flex; gap: 9px; }
.ai-draft-btn {
  display: inline-flex; align-items: center; gap: 6px; font-size: 13.5px; font-weight: 600;
  padding: 9px 15px; border-radius: 9px; border: 1px solid var(--border-strong);
  background: var(--surface); color: var(--ink);
}
.ai-draft-btn svg { width: 15px; height: 15px; }
.ai-draft-btn-primary { background: var(--accent); border-color: var(--accent); color: var(--accent-ink); }

@media (max-width: 860px) {
  .ai-switch { grid-template-columns: 1fr; }
  .ai-tab-d, .ai-tab.is-active .ai-tab-d { max-height: none; opacity: 1; margin-top: 5px; } /* always show desc when stacked */
  .ai-switch-stage { order: -1; }   /* preview on top on narrow screens */
}
@media (prefers-reduced-motion: reduce) {
  .ax-demo, .ax-demo.is-active { transition: opacity .2s ease; transform: none; }
  .ax-result, .ax-rows > *, .ax-arrow { transition: none; }
  .ax-caret, .ax-arrow svg { animation: none; }
  .ai-tab-bar > i { transition: none !important; }
}

/* centered hero variant (product index) */
.pr-hero-center { text-align: center; }
.pr-lede-center { margin-left: auto; margin-right: auto; }
.pr-name-pron { color: var(--ink-faint); font-style: italic; white-space: nowrap; }
.pr-cta-center, .pr-meta-center { justify-content: center; }

/* Feature-row sub-heading: used when the section already has a centered .hp-sec-head, so the
   individual feature rows read as sub-sections (smaller title, no eyebrow) rather than competing
   with a second full .hp-h2 + eyebrow directly under the section title. */
.hp-feature-h {
  font-family: var(--pub-display); font-weight: 440; letter-spacing: -.012em; line-height: 1.15;
  font-size: clamp(22px, 2.8vw, 28px); color: var(--ink); margin: 0;
}

/* ---- feature "good for" bento (.pr-grid / .pr-card) ------------------------
   Bento layout for exactly six items: two wide hero tiles on top (each spans 2 of 4 columns),
   then a row of four below. Balanced, no empty cells. The first two cards get .pr-card-wide. */
.pr-grid { display: grid; grid-template-columns: repeat(4, 1fr); grid-auto-rows: minmax(150px, auto); gap: clamp(12px, 1.4vw, 16px); }
.pr-card-wide { grid-column: span 2; overflow: hidden; }

/* Company-page variant of the card grid: no box, hairline dividers, and type carrying the
   structure. Opt-in via .pr-grid-plain so the nine product pages that use .pr-card keep their
   current treatment. These cards have no icon tile, so alignment stays left - centred copy with
   nothing above it to centre on reads adrift. */
.pr-grid-plain { grid-template-columns: repeat(2, 1fr); gap: 0; grid-auto-rows: auto; }
.pr-grid-plain .pr-card {
  border: 0; border-radius: 0; background: none; padding: 26px 34px;
  position: relative; min-height: 0;
}
/* Vertical rule between the columns, horizontal rule between the rows. Both fade at the ends so
   they read as separators rather than a table. */
.pr-grid-plain .pr-card:nth-child(2n)::before {
  content: ""; position: absolute; left: 0; top: 10px; bottom: 10px; width: 1px;
  background: linear-gradient(180deg, transparent, var(--border) 18%, var(--border) 82%, transparent);
}
.pr-grid-plain .pr-card:nth-child(n+3)::after {
  content: ""; position: absolute; top: 0; left: 14px; right: 14px; height: 1px;
  background: linear-gradient(90deg, transparent, var(--border) 12%, var(--border) 88%, transparent);
}
.pr-grid-plain .pr-card-t { font-size: 17px; font-weight: 700; letter-spacing: -.01em;
                            margin: 0 0 9px; color: var(--ink); text-wrap: balance; }
.pr-grid-plain .pr-card-d { font-size: 14.5px; line-height: 1.68; color: var(--ink-soft); margin: 0; }

/* No hover state at all. .pr-card:hover lifts, shadows and repaints the background, which assumes
   the card is a box - without one it conjures a raised white rectangle out of nothing. These cards
   carry no link or action either, so there is nothing to afford and any hover effect would promise
   a click that does not exist. */
.pr-grid-plain .pr-card:hover {
  transform: none; box-shadow: none; border-color: transparent; background: none;
}
@media (max-width: 820px) {
  .pr-grid-plain { grid-template-columns: 1fr; }
  .pr-grid-plain .pr-card { padding: 26px 0; }
  /* One rule between every item once stacked; the column rule has no meaning in a single column. */
  .pr-grid-plain .pr-card:nth-child(2n)::before { display: none; }
  .pr-grid-plain .pr-card:nth-child(n+2)::after {
    content: ""; position: absolute; top: 0; left: 0; right: 0; height: 1px; background: var(--border);
  }
}

/* (the animated hero-tile styles for .pr-card-wide are appended at the end of this file) */
.pr-card {
  --pr-a: var(--pr-accent, var(--accent));
  position: relative; border: 1px solid var(--border); border-radius: 14px;
  padding: 22px 22px 24px; display: flex; flex-direction: column; align-items: flex-start;
  transition: box-shadow .16s ease, border-color .16s ease, transform .16s ease;
  /* soft theme-tinted wash: a whisper of the page accent in the top-left corner, fading to the
     plain surface. Subtle at rest, a touch stronger on hover. Each product page's accent flows
     through automatically via --pr-accent. */
  background:
    radial-gradient(120% 100% at 0% 0%, color-mix(in srgb, var(--pr-a) 7%, transparent), transparent 60%),
    var(--surface);
}
.pr-card:hover {
  transform: translateY(-2px); box-shadow: var(--shadow);
  border-color: color-mix(in srgb, var(--pr-a) 30%, var(--border));
  background:
    radial-gradient(120% 100% at 0% 0%, color-mix(in srgb, var(--pr-a) 13%, transparent), transparent 62%),
    var(--surface);
}
/* icon chip: rounded, accent-tinted; icon + title + body stack from the TOP of the card. */
.pr-card { justify-content: flex-start; }
.pr-card-ico {
  width: 40px; height: 40px; border-radius: 11px; display: grid; place-items: center;
  background: color-mix(in srgb, var(--pr-a) 12%, var(--surface)); color: var(--pr-a); margin-bottom: 16px;
  border: 1px solid color-mix(in srgb, var(--pr-a) 16%, transparent);
  transition: background .16s ease;
}
.pr-card:hover .pr-card-ico:not(.pr-ci) { background: color-mix(in srgb, var(--pr-a) 18%, var(--surface)); }
.pr-card-t {
  font-family: var(--pub-sans); font-size: 16px; font-weight: 600; letter-spacing: -.006em;
  color: var(--ink); line-height: 1.3; margin: 0 0 7px;
}
.pr-card-d { font-size: 13.5px; line-height: 1.6; color: var(--ink-soft); margin: 0; }

/* ---- cross-link row (_more.php) ------------------------------------------- */
/* Cross-link row: each card is a tiny real product preview on the left (topic-gradient panel) +
   text on the right. --pr-dot is the topic colour (set by .pr-dot-*). */
.pr-more { display: grid; grid-template-columns: repeat(3, 1fr); gap: 20px; }
.pr-more-item {
  display: flex; align-items: stretch; border: 1px solid var(--border); border-radius: 14px;
  background: var(--surface); overflow: hidden; transition: border-color .16s ease, transform .16s ease, box-shadow .16s ease;
}
.pr-more-item:hover { border-color: var(--pr-dot, var(--accent)); text-decoration: none; transform: translateY(-3px); box-shadow: var(--shadow); }
.pr-more-prev {
  flex: none; width: 128px; display: flex; align-items: center; justify-content: center; padding: 10px;
  border-right: 1px solid color-mix(in srgb, var(--pr-dot, var(--accent)) 12%, var(--border));
  background:
    radial-gradient(120% 120% at 20% 10%, color-mix(in srgb, var(--pr-dot, var(--accent)) 20%, var(--surface)), transparent 58%),
    color-mix(in srgb, var(--pr-dot, var(--accent)) 7%, var(--surface));
}
.pr-more-prev > .cm { margin: auto; }
.pr-more-body { flex: 1; min-width: 0; padding: 16px 16px 16px 18px; display: flex; flex-direction: column; justify-content: center; }
.pr-more-body b { display: block; font-size: 15px; font-weight: 600; color: var(--ink); }
.pr-more-body em { display: block; font-style: normal; font-size: 12.5px; color: var(--ink-faint); margin-top: 2px; }
.pr-more-arrow { flex: none; align-self: center; padding-right: 16px; color: var(--ink-faint); font-size: 16px; transition: transform .16s ease, color .16s ease; }
.pr-more-item:hover .pr-more-arrow { transform: translateX(3px); color: var(--pr-dot, var(--accent)); }
.pr-dot-tours    { --pr-dot: var(--c-tours); }
.pr-dot-tips     { --pr-dot: var(--c-tips); }
.pr-dot-check    { --pr-dot: var(--c-check); }
.pr-dot-announce { --pr-dot: var(--c-announce); }
.pr-dot-target   { --pr-dot: var(--c-target); }
.pr-dot-analytics { --pr-dot: var(--c-analytics); }
.pr-dot-resource { --pr-dot: var(--c-resource); }
.pr-dot-survey   { --pr-dot: var(--c-survey); }
.pr-dot-ab       { --pr-dot: var(--c-ab); }
.pr-dot-ai       { --pr-dot: var(--c-ai); }
.pr-dot-good     { --pr-dot: var(--c-good); }

/* --- the tiny mocks (--a = topic colour) --- */
.cm { --a: var(--pr-dot, var(--accent)); width: 100%; background: var(--surface); border: 1px solid var(--border);
  border-radius: 8px; padding: 8px; box-shadow: 0 6px 16px -10px rgba(0,0,0,.3); }
.cm-win { display: flex; gap: 3px; margin-bottom: 7px; }
.cm-win s { width: 5px; height: 5px; border-radius: 50%; background: var(--border-strong); }
/* tours: spotlighted block + coach-mark */
.cm-tours-body { position: relative; }
.cm-spot { height: 30px; border-radius: 5px; background: var(--surface-2);
  border: 1.5px solid var(--a); box-shadow: 0 0 0 3px color-mix(in srgb, var(--a) 18%, transparent); }
.cm-coach { position: absolute; left: 22%; bottom: -14px; width: 74%; background: var(--surface);
  border: 1px solid var(--border-strong); border-radius: 5px; padding: 6px; box-shadow: 0 6px 14px -6px rgba(0,0,0,.4); }
.cm-coach b { display: block; font-size: 6.5px; font-weight: 800; letter-spacing: .04em; color: var(--a); }
.cm-coach i { display: block; height: 3.5px; border-radius: 2px; background: var(--surface-2); margin-top: 4px; }
.cm-coach i.s { width: 62%; }
/* tooltips: input field + tooltip bubble with pointer */
.cm-tips { display: flex; flex-direction: column; align-items: center; gap: 12px; padding-top: 12px; }
.cm-tips-field { width: 88%; height: 20px; border-radius: 5px; background: var(--surface-2); border: 1.5px solid var(--a); }
.cm-tips-tip { position: relative; width: 74%; background: var(--surface); border: 1px solid var(--border-strong);
  border-radius: 5px; padding: 6px 7px; box-shadow: 0 6px 14px -6px rgba(0,0,0,.4); }
.cm-tips-tip::before { content: ""; position: absolute; top: -4px; left: 24px; width: 7px; height: 7px;
  background: var(--surface); border-left: 1px solid var(--border-strong); border-top: 1px solid var(--border-strong); transform: rotate(45deg); }
.cm-tips-tip i { display: block; height: 3.5px; border-radius: 2px; background: var(--surface-2); }
.cm-tips-tip i.s { width: 58%; margin-top: 4px; }
/* checklist: real checkboxes with ticks */
.cm-check .cm-cl-h { display: flex; align-items: center; justify-content: space-between; margin-bottom: 5px; }
.cm-check .cm-cl-h b { display: block; width: 50%; height: 5px; border-radius: 3px; background: color-mix(in srgb, var(--a) 24%, var(--surface-2)); }
.cm-check .cm-cl-h em { font-style: normal; font-size: 7px; font-weight: 800; color: var(--a); }
.cm-li { display: flex; align-items: center; gap: 6px; margin-top: 4px; }
.cm-box { flex: none; width: 11px; height: 11px; border-radius: 3px; border: 1.5px solid var(--border-strong); display: grid; place-items: center; color: #fff; }
.cm-box svg { width: 9px; height: 9px; opacity: 0; }
.cm-li.done .cm-box { background: var(--a); border-color: var(--a); }
.cm-li.done .cm-box svg { opacity: 1; }
.cm-li i { flex: 1; height: 4px; border-radius: 2px; background: var(--surface-2); }
.cm-li.done i { background: color-mix(in srgb, var(--a) 18%, var(--surface-2)); }
/* announcement: a single modal card (no outer .cm frame) */
.cm-ann { background: none; border: 0; box-shadow: none; padding: 0; display: flex; align-items: center; justify-content: center; }
.cm-ann-card { width: 100%; background: var(--surface); border: 1px solid var(--border-strong);
  border-radius: 6px; padding: 9px; box-shadow: 0 8px 18px -8px rgba(0,0,0,.4);
  display: flex; flex-direction: column; justify-content: center; align-items: center; }
.cm-badge { display: inline-block; font-size: 5.5px; font-weight: 800; letter-spacing: .06em; color: #fff;
  background: var(--a); border-radius: 3px; padding: 2px 4px; }
.cm-ann-card b { display: block; width: 100%; height: 5px; border-radius: 3px; background: var(--surface-2); margin-top: 4px; }
.cm-ann-card b.s { width: 70%; }
.cm-ann-card .cm-badge { align-self: center; margin-bottom: 4px; }
.cm-ann-foot { display: flex; align-items: center; justify-content: space-between; width: 100%; margin-top: 6px; }
/* Surveys cross-link mock: a question card with a rating scale, one point picked. */
.cm-survey { background: none; border: 0; box-shadow: none; padding: 0; display: flex; align-items: center; justify-content: center; }
.cm-sv-card { width: 100%; background: var(--surface); border: 1px solid var(--border-strong);
  border-radius: 6px; padding: 9px; box-shadow: 0 8px 18px -8px rgba(0,0,0,.4);
  display: flex; flex-direction: column; align-items: center; gap: 7px; }
.cm-sv-card b { display: block; width: 100%; height: 5px; border-radius: 3px; background: var(--surface-2); }
.cm-sv-scale { display: inline-flex; gap: 4px; }
.cm-sv-scale em { width: 7px; height: 7px; border-radius: 2px; background: var(--surface-2); }
/* .on keeps the accent: the dot is deliberately NOT in the --mock-fill list below, which would
   override it (same specificity, later in the file) - the same reason .cm-dots em is not. */
.cm-sv-scale em.on { background: var(--a); }

.cm-dots { display: inline-flex; gap: 3px; }
.cm-dots em { width: 4px; height: 4px; border-radius: 50%; background: var(--surface-2); }
.cm-dots em.on { background: var(--a); }
.cm-btn { display: block; width: 30px; height: 10px; border-radius: 4px; background: var(--a); }
/* targeting: condition rows + AND chip */
.cm-rules { display: flex; flex-direction: column; gap: 4px; }
.cm-rule { display: flex; align-items: center; gap: 4px; }
.cm-k { height: 9px; width: 42%; border-radius: 3px; background: color-mix(in srgb, var(--a) 22%, var(--surface-2)); }
.cm-v { height: 9px; flex: 1; border-radius: 3px; background: var(--surface-2); border: 1px solid var(--border); }
.cm-and { align-self: flex-start; font-size: 5.5px; font-weight: 800; letter-spacing: .06em; color: var(--a);
  background: color-mix(in srgb, var(--a) 14%, var(--surface)); border-radius: 3px; padding: 1px 4px; margin: 1px 0; }
/* analytics: area chart + bars */
.cm-chart svg { width: 100%; height: 26px; display: block; }
.cm-chart .cm-ar { fill: color-mix(in srgb, var(--a) 14%, transparent); stroke: none; }
.cm-chart .cm-ln { fill: none; stroke: var(--a); stroke-width: 2; stroke-linecap: round; stroke-linejoin: round; }
.cm-bars { display: grid; grid-template-columns: repeat(4, 1fr); gap: 3px; align-items: end; height: 12px; margin-top: 4px; }
.cm-bars i { border-radius: 2px 2px 0 0; background: color-mix(in srgb, var(--a) 26%, var(--surface-2)); }
.cm-bars i.b1 { height: 45%; } .cm-bars i.b2 { height: 70%; } .cm-bars i.b3 { height: 55%; } .cm-bars i.b4 { height: 90%; }
/* resource center: a help-hub launcher panel (rows with an icon slot) + a corner fab pill */
.cm-resource { position: relative; padding-bottom: 16px; }
.cm-rc-panel { display: flex; flex-direction: column; gap: 4px; }
.cm-rc-h { width: 40%; height: 5px; border-radius: 3px; background: color-mix(in srgb, var(--a) 24%, var(--mock-fill)); margin-bottom: 3px; }
.cm-rc-row { display: flex; align-items: center; gap: 6px; }
.cm-rc-ico { flex: none; width: 9px; height: 9px; border-radius: 3px; background: color-mix(in srgb, var(--a) 30%, var(--mock-fill)); }
.cm-rc-row i { flex: 1; height: 5px; border-radius: 2px; background: var(--mock-fill); }
.cm-rc-row i.s { flex: 0 0 60%; }
.cm-rc-fab { position: absolute; right: 6px; bottom: 4px; width: 26px; height: 11px; border-radius: 6px; background: var(--a); }
/* dark mode: elevate the mock surfaces so the previews stay legible (see the .ps-card treatment) */
.pr-more-item { --mock-surf: var(--surface); --mock-fill: var(--surface-2); --mock-line: var(--border); }
:root[data-theme="dark"] .pr-more-item { --mock-surf: #273349; --mock-fill: #3d4d68; --mock-line: #46587a; }
@media (prefers-color-scheme: dark) {
  :root:not([data-theme="light"]) .pr-more-item { --mock-surf: #273349; --mock-fill: #3d4d68; --mock-line: #46587a; }
}
.cm, .cm-coach, .cm-tips-tip, .cm-ann-card, .cm-sv-card { background: var(--mock-surf); border-color: var(--mock-line); }
.cm-win s { background: var(--mock-line); }
.cm-spot, .cm-coach i, .cm-tips-field, .cm-tips-tip i, .cm-li i, .cm-ann-card b, .cm-v,
.cm-sv-card b { background: var(--mock-fill); }
.cm-box { border-color: var(--mock-line); }
.cm-v { border-color: var(--mock-line); }

/* ---- small bespoke mocks --------------------------------------------------- */
/* step list (tours page) */
.hp-steps-mini { width: 100%; max-width: 360px; background: var(--surface); border: 1px solid var(--border);
  border-radius: 14px; padding: 18px; box-shadow: var(--shadow); }
.hp-sm-row { display: flex; align-items: center; gap: 12px; padding: 10px 4px; }
.hp-sm-row.is-on { background: var(--accent-soft); border-radius: 9px; padding: 10px; }
.hp-sm-n { flex: none; width: 22px; height: 22px; border-radius: 50%; display: grid; place-items: center;
  font-size: 11px; font-weight: 700; background: var(--surface-2); color: var(--ink-soft); }
.hp-sm-row.is-on .hp-sm-n { background: var(--accent); color: var(--accent-ink); }
.hp-sm-bar { flex: 1; height: 10px; border-radius: 5px; background: var(--surface-2); }
.hp-sm-bar.lg { width: 90%; } .hp-sm-bar.med { width: 66%; flex: none; } .hp-sm-bar.sm { width: 44%; flex: none; }
.hp-sm-add { margin-top: 8px; font-size: 12px; font-weight: 600; color: var(--accent); padding: 8px 4px; }

/* static checklist + launcher (checklists page) */
.hp-cl-static { position: static; width: 100%; max-width: 340px; box-shadow: var(--shadow); }
/* TRIGGERS (tooltips page): the three ways a hint fires, as three real rows - a mark, a name,
   and what it is for. Same shape as the A/B page's verdict list (.pr-ab-verdicts), and STATIC:
   every feature-row visual on the product pages is a still artifact; only the card-grid mocks
   animate. Each mark is drawn as the interaction itself rather than a generic bullet. */
.pr-trig { width: 100%; max-width: 380px; display: flex; flex-direction: column; gap: 10px; }
.pr-trig-row { display: flex; align-items: center; gap: 14px; padding: 14px 16px;
  background: var(--surface); border: 1px solid var(--border); border-radius: 12px; }
.pr-trig-txt b { display: block; font-size: 13.5px; color: var(--ink); }
.pr-trig-txt em { display: block; font-style: normal; font-size: 12px; color: var(--ink-faint); margin-top: 2px; }
/* the active row, like .pr-ab-v.is-on - accent rather than --c-good, which is only defined in
   the light palette. */
.pr-trig-row.is-on { border-color: color-mix(in srgb, var(--accent) 45%, var(--border));
  background: color-mix(in srgb, var(--accent) 7%, var(--surface)); }

/* Each mark IS its trigger, not a generic dot. */
.pr-trig-mark { position: relative; flex: none; width: 26px; height: 26px; }
/* hover: a cursor arrow */
/* hover: a real pointer outline. A CSS-border arrow draws a WEDGE - three straight edges - which
   reads as a triangle, not a cursor, so this is an actual path. */
.pr-trig-mark.is-hover { display: grid; place-items: center; color: var(--accent); }
.pr-trig-mark.is-hover svg { width: 20px; height: 20px; }
/* click: a dot inside a ripple ring */
/* click: the same pointer, mid-click. A dot-in-a-ring was both generic AND nearly identical to
   the hotspot halo below it - the rays are what say "clicked". */
.pr-trig-mark.is-click { display: grid; place-items: center; color: var(--accent); }
.pr-trig-mark.is-click svg { width: 20px; height: 20px; }
.pr-trig-mark.is-click .ray { opacity: .75; }
/* hotspot: a dot with a soft halo, the way the runtime draws one */
.pr-trig-mark.is-spot::before { content: ""; position: absolute; left: 50%; top: 50%; width: 10px; height: 10px;
  margin: -5px 0 0 -5px; border-radius: 50%; background: var(--accent);
  box-shadow: 0 0 0 6px color-mix(in srgb, var(--accent) 20%, transparent); }

/* ANCHOR (tooltips page): the ranked selector chain, with the confidence scores the engine
   really assigns. Struck-through rows are candidates that no longer resolve after a re-render;
   the highlighted one is what the hint anchors to. Purpose-built rather than borrowing .hp-rules
   (the TARGETING page's rule editor), which made a selector chain read as an audience rule. */
.pr-anchor { width: 100%; max-width: 400px; background: var(--surface);
  border: 1px solid var(--border-strong); border-radius: 14px; padding: 14px 16px 15px;
  box-shadow: 0 16px 36px -14px rgba(0,0,0,.3); }
.pr-anchor-head { font-size: 10px; font-weight: 800; letter-spacing: .07em; text-transform: uppercase;
  color: var(--ink-faint); margin-bottom: 11px; }
.pr-anchor-row { display: flex; align-items: center; gap: 10px; padding: 8px 10px; border-radius: 8px;
  border: 1px solid transparent; }
.pr-anchor-sel { flex: 1; min-width: 0; font-family: ui-monospace, SFMono-Regular, Menlo, monospace;
  font-size: 11.5px; color: var(--ink-soft); overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
.pr-anchor-score { flex: none; font-size: 11px; font-weight: 700; color: var(--ink-faint);
  font-variant-numeric: tabular-nums; }
/* a candidate that no longer resolves - struck through, so the FALLBACK is the visible story */
.pr-anchor-row.is-gone .pr-anchor-sel { text-decoration: line-through; opacity: .45; }
.pr-anchor-row.is-gone .pr-anchor-score { opacity: .45; }
/* the one it anchors to */
.pr-anchor-row.is-on { border-color: color-mix(in srgb, var(--accent) 45%, var(--border));
  background: color-mix(in srgb, var(--accent) 8%, var(--surface)); }
.pr-anchor-row.is-on .pr-anchor-sel { color: var(--ink); font-weight: 600; }
.pr-anchor-row.is-on .pr-anchor-score { color: var(--accent); }
.pr-anchor-foot { font-size: 11.5px; color: var(--ink-faint); margin-top: 11px;
  padding-top: 11px; border-top: 1px solid var(--pub-hairline); }

/* PER-ITEM (checklists page): completion for each item on its own, the way the real analytics
   report a checklist - it is not a funnel, so a single total says nothing about WHICH step stalls
   people. The low item is flagged, matching the "biggest friction" callout in the dashboard.
   Widths are classes, not inline styles: style-src 'self' blocks the latter. */
.pr-items { width: 100%; max-width: 400px; background: var(--surface);
  border: 1px solid var(--border-strong); border-radius: 14px; padding: 15px 17px 16px;
  box-shadow: 0 16px 36px -14px rgba(0,0,0,.3); }
.pr-items-head { font-size: 10px; font-weight: 800; letter-spacing: .07em; text-transform: uppercase;
  color: var(--ink-faint); margin-bottom: 12px; }
.pr-item { display: grid; grid-template-columns: 1fr 82px 34px; align-items: center; gap: 10px;
  padding: 7px 0; }
.pr-item-n { font-size: 12.5px; color: var(--ink-soft); overflow: hidden; text-overflow: ellipsis;
  white-space: nowrap; }
.pr-item-bar { display: block; height: 8px; border-radius: 4px; background: var(--surface-2); overflow: hidden; }
.pr-item-bar i { display: block; height: 100%; border-radius: 4px; background: var(--accent); }
.pr-item-bar i.w92 { width: 92%; } .pr-item-bar i.w74 { width: 74%; }
.pr-item-bar i.w63 { width: 63%; } .pr-item-bar i.w21 { width: 21%; }
.pr-item em { font-style: normal; font-size: 11.5px; font-weight: 700; color: var(--ink-faint);
  font-variant-numeric: tabular-nums; text-align: right; }
/* the friction item - rose, the same cue the analytics funnel uses for its worst step */
.pr-item.is-low .pr-item-n { color: var(--ink); font-weight: 600; }
.pr-item.is-low .pr-item-bar i { background: var(--c-announce); }
.pr-item.is-low em { color: var(--c-announce); }
.pr-items-foot { font-size: 11.5px; color: var(--ink-faint); margin-top: 12px; padding-top: 12px;
  border-top: 1px solid var(--pub-hairline); }
.pr-items-foot b { color: var(--ink); font-weight: 650; }

/* FREQUENCY + AUDIENCE (announcements page): the row promises two different things - who sees it,
   and how often - so they are shown as two blocks rather than one rule list. Frequency is a CAP,
   not a condition, and folding it in under a "+ add rule" affordance made this page look like the
   targeting editor it borrowed (.hp-rules). */
.pr-nag { width: 100%; max-width: 400px; display: grid; gap: 12px; }
.pr-nag-block { background: var(--surface); border: 1px solid var(--border-strong);
  border-radius: 14px; padding: 14px 16px 15px; box-shadow: 0 14px 32px -14px rgba(0,0,0,.28); }
.pr-nag-head { font-size: 10px; font-weight: 800; letter-spacing: .07em; text-transform: uppercase;
  color: var(--ink-faint); margin-bottom: 11px; }
/* audience: conditions as chips - a summary of who, not an editor to build one */
.pr-nag-chips { display: flex; flex-wrap: wrap; gap: 8px; }
.pr-nag-chip { font-size: 12px; color: var(--ink-soft); background: var(--surface-2);
  border-radius: 999px; padding: 6px 12px; }
.pr-nag-chip b { color: var(--ink); font-weight: 650; }
/* frequency: the three caps, with the chosen one set */
.pr-nag-opts { display: flex; flex-wrap: wrap; gap: 8px; }
.pr-nag-opt { font-size: 12px; font-weight: 600; color: var(--ink-faint); border-radius: 8px;
  padding: 7px 12px; border: 1px solid var(--border); }
.pr-nag-opt.is-on { color: var(--accent); border-color: color-mix(in srgb, var(--accent) 45%, var(--border));
  background: color-mix(in srgb, var(--accent) 8%, var(--surface)); }
.pr-nag-note { font-size: 11.5px; color: var(--ink-faint); margin-top: 11px; }
/* Saved-as-you-go strip (surveys): each question, with the two that were answered marked. The
   point is that a half-finished survey still yields data - the abandoned questions stay empty
   rather than the whole response being discarded. */
.pr-sv-saved { display: flex; gap: 8px; }
.pr-sv-q { flex: 1; display: grid; gap: 6px; justify-items: center; font-size: 10px; font-weight: 700;
  color: var(--ink-faint); }
.pr-sv-q b { display: block; width: 100%; height: 8px; border-radius: 4px; background: var(--surface-2); }
.pr-sv-q.is-saved { color: var(--accent); }
.pr-sv-q.is-saved b { background: var(--accent); }

.pr-launcher { position: relative; width: 100%; max-width: 340px; min-height: 220px; }
/* Inside the hero browser-mock, the launcher is a corner OVERLAY (like a real resource-center
   launcher sits in the app's corner), floating over the dimmed app - not flowing below it, where the
   scene's overflow:hidden would clip it. Anchored bottom-right with a little inset. */
.hp-scene .pr-launcher { position: absolute; right: 16px; bottom: 16px; width: 184px; min-height: 0;
  max-width: none; z-index: 2; padding-bottom: 34px; }
/* Scaled-down widget so it reads as a corner launcher, not a second app. */
.hp-scene .pr-launcher-panel { padding: 13px; border-radius: 12px; }
.hp-scene .pr-launch-row { gap: 9px; padding: 7px 2px; }
.hp-scene .pr-launch-ico { width: 19px; height: 19px; border-radius: 6px; }
.hp-scene .pr-launch-row i { height: 7px; }
.hp-scene .pr-launcher-fab { right: 0; bottom: 0; width: 84px; height: 26px; border-radius: 14px; }
.pr-launcher-panel { background: var(--surface); border: 1px solid var(--border); border-radius: 14px;
  padding: 16px; box-shadow: var(--shadow); }
.pr-launch-row { display: flex; align-items: center; gap: 11px; padding: 9px 4px; }
.pr-launch-ico { flex: none; width: 24px; height: 24px; border-radius: 7px; display: grid; place-items: center;
  background: var(--accent-soft); color: var(--accent); }
.pr-launch-ico svg { width: 14px; height: 14px; }
.pr-launch-row i { flex: 1; height: 9px; border-radius: 5px; background: var(--surface-2); }
.pr-launch-row i.med { width: 70%; flex: none; } .pr-launch-row i.sm { width: 50%; flex: none; }
/* the launcher is a PILL (matches the runtime's launcher button), in the page's topic colour */
.pr-launcher-fab { position: absolute; right: -6px; bottom: -14px; width: 120px; height: 36px; border-radius: 20px;
  background: var(--pr-page, var(--accent)); font-size: 0; box-shadow: var(--shadow); }

/* Replay variant: the rows are RELAUNCHABLE FLOWS. The icon chip shows a play glyph, and the rows
   light up in sequence (as if each flow is being replayed on click). */
/* Darken the topic colour for the small play chip so the white triangle stays legible (the light-mode
   resource lime is otherwise too pale under a white glyph). */
.pr-launch-play { position: relative; background: color-mix(in srgb, var(--pr-page, var(--accent)) 78%, #1a1f14); }
.pr-launch-play::after { content: ""; position: absolute; left: 53%; top: 50%; transform: translate(-50%,-50%);
  border-style: solid; border-width: 5px 0 5px 8px; border-color: transparent transparent transparent #fff; }
@media (prefers-reduced-motion: no-preference) {
  .pr-launcher-replay .pr-launch-row { animation: pr-replay 4.5s ease-in-out infinite; border-radius: 8px; padding: 9px 8px; margin: 0 -4px; }
  .pr-launcher-replay .pr-launch-row:nth-child(1) { animation-delay: 0s; }
  .pr-launcher-replay .pr-launch-row:nth-child(2) { animation-delay: 1.5s; }
  .pr-launcher-replay .pr-launch-row:nth-child(3) { animation-delay: 3s; }
}
@keyframes pr-replay {
  0%, 8%   { background: transparent; }
  14%, 22% { background: color-mix(in srgb, var(--pr-page, var(--accent)) 12%, transparent); }
  30%,100% { background: transparent; }
}

/* announcement stack (announcements page) */
.pr-announce-stack { width: 100%; max-width: 360px; display: flex; flex-direction: column; gap: 16px; }
.pr-ann-banner { display: flex; align-items: center; gap: 10px; background: var(--surface); border: 1px solid var(--border);
  border-radius: 11px; padding: 12px 14px; box-shadow: var(--shadow); }
.pr-ann-banner i { flex: 1; height: 8px; border-radius: 4px; background: var(--surface-2); }
.pr-ann-banner i.s { width: 40%; flex: none; }
/* Capped like every other feature visual (360-400px): width:100% with no max stretched the card
   across the whole slot, so it read as a banner rather than a modal. */
.hp-scene-modal-static { position: static; transform: none; width: 100%; max-width: 400px;
  box-shadow: var(--shadow); }

/* rule group (targeting page) */
.hp-rules-lg { max-width: 440px; box-shadow: var(--shadow); }
.pr-rule-group { display: block; padding: 12px 12px 12px 14px; background: var(--pub-tint); border-style: dashed; }
.pr-rule-group-h { font-size: 12px; color: var(--ink-faint); margin-bottom: 8px; }
.pr-rule-group-h b { color: var(--accent); }
.pr-rule-group .hp-rule { margin-top: 8px; background: var(--surface); }

/* saved audiences (targeting page) */
.pr-aud { width: 100%; max-width: 340px; background: var(--surface); border: 1px solid var(--border);
  border-radius: 14px; padding: 16px; box-shadow: var(--shadow); }
.pr-aud-row { display: flex; align-items: center; gap: 10px; padding: 10px; border-radius: 9px; }
.pr-aud-row.is-on { background: var(--accent-soft); }
.pr-aud-tag { flex: none; font-size: 10px; font-weight: 700; text-transform: uppercase; letter-spacing: .05em;
  color: var(--accent); background: color-mix(in srgb, var(--accent) 12%, var(--surface)); border-radius: 5px; padding: 3px 7px; }
.pr-aud-row i { flex: 1; height: 9px; border-radius: 5px; background: var(--surface-2); }
.pr-aud-row i.med { width: 60%; flex: none; } .pr-aud-row i.sm { width: 42%; flex: none; }
.pr-aud-row em { flex: none; font-style: normal; font-size: 11px; color: var(--ink-faint); }
.pr-aud-cap { margin-top: 12px; padding-top: 12px; border-top: 1px solid var(--border); font-size: 13px; color: var(--ink-soft); }
.pr-aud-cap b { color: var(--ink); font-weight: 650; }

/* funnel (analytics page) */
.pr-funnel { width: 100%; max-width: 380px; background: var(--surface); border: 1px solid var(--border);
  border-radius: 14px; padding: 20px; box-shadow: var(--shadow); display: flex; flex-direction: column; gap: 12px; }
.pr-fn-row { display: flex; align-items: center; gap: 12px; }
.pr-fn-label { flex: none; width: 46px; font-size: 12px; color: var(--ink-faint); }
.pr-fn-bar { height: 20px; border-radius: 6px; background: var(--accent); opacity: .85; }
.pr-fn-row.is-drop .pr-fn-bar { background: var(--c-announce); }
.pr-fn-row em { flex: none; font-style: normal; font-size: 12px; font-weight: 650; color: var(--ink); width: 38px; text-align: right; font-variant-numeric: tabular-nums; }
.pr-fn-bar.w100 { width: 100%; } .pr-fn-bar.w88 { width: 88%; } .pr-fn-bar.w54 { width: 54%; }
.pr-fn-bar.w49 { width: 49%; } .pr-fn-bar.w46 { width: 46%; }

/* ---- A/B testing page ----------------------------------------------------
   Two arms compared. The winner is marked with the success colour and a slightly
   heavier bar, so the comparison reads at a glance without needing the numbers. */
.pr-ab-card { width: 100%; max-width: 400px; background: var(--surface); border: 1px solid var(--border);
  border-radius: 14px; padding: 20px; box-shadow: var(--shadow); display: flex; flex-direction: column; gap: 14px; }
.pr-ab-head { display: flex; align-items: center; justify-content: space-between; font-size: 12px; color: var(--ink-faint); }
.pr-ab-live { display: inline-flex; align-items: center; gap: 6px; font-weight: 700; text-transform: uppercase;
  letter-spacing: .05em; font-size: 10px; color: var(--c-good); }
.pr-ab-live::before { content: ""; width: 7px; height: 7px; border-radius: 50%; background: var(--c-good); }
.pr-ab-head b { color: var(--ink); font-variant-numeric: tabular-nums; }
.pr-ab-arm { display: grid; grid-template-columns: 1fr auto; gap: 6px 12px; align-items: center; }
.pr-ab-label { grid-column: 1 / -1; display: flex; align-items: center; gap: 8px; font-size: 13px; color: var(--ink); }
.pr-ab-label i { flex: none; width: 20px; height: 20px; border-radius: 6px; display: grid; place-items: center;
  font-style: normal; font-size: 11px; font-weight: 800; background: var(--surface-2); color: var(--ink-soft); }
.pr-ab-label span { color: var(--ink-faint); font-size: 12px; }
.pr-ab-bar { height: 22px; border-radius: 7px; background: var(--surface-2); overflow: hidden; }
.pr-ab-bar span { display: block; height: 100%; border-radius: 7px; background: var(--accent); opacity: .55; }
.pr-ab-bar span.w52 { width: 52%; } .pr-ab-bar span.w71 { width: 71%; }
.pr-ab-arm em { font-style: normal; font-size: 13px; font-weight: 700; color: var(--ink);
  font-variant-numeric: tabular-nums; }
.pr-ab-arm.is-winner .pr-ab-label i { background: var(--c-good); color: var(--bg); }
.pr-ab-arm.is-winner .pr-ab-bar span { background: var(--c-good); opacity: 1; }
.pr-ab-verdict { display: flex; align-items: center; gap: 8px; font-size: 13px; font-weight: 650; color: var(--c-good);
  padding-top: 4px; border-top: 1px solid var(--border); }

/* the three-step "starting a test" strip */
.pr-ab-steps { width: 100%; max-width: 360px; display: flex; flex-direction: column; gap: 10px; }
.pr-ab-step { display: flex; align-items: center; gap: 12px; padding: 13px 16px; font-size: 13.5px; color: var(--ink);
  background: var(--surface); border: 1px solid var(--border); border-radius: 12px; }
.pr-ab-step i { flex: none; width: 22px; height: 22px; border-radius: 50%; display: grid; place-items: center;
  font-style: normal; font-size: 11px; font-weight: 800; background: var(--surface-2); color: var(--ink-soft); }
.pr-ab-step.is-done { border-color: color-mix(in srgb, var(--c-good) 45%, var(--border));
  background: color-mix(in srgb, var(--c-good) 7%, var(--surface)); color: var(--ink); font-weight: 650; }
.pr-ab-step.is-done svg { color: var(--c-good); flex: none; }

/* the three possible verdicts */
.pr-ab-verdicts { width: 100%; max-width: 360px; display: flex; flex-direction: column; gap: 10px; }
.pr-ab-v { display: grid; grid-template-columns: auto 1fr; gap: 3px 10px; align-items: center; padding: 13px 16px;
  background: var(--surface); border: 1px solid var(--border); border-radius: 12px; }
.pr-ab-v b { font-size: 13.5px; color: var(--ink); }
.pr-ab-v em { grid-column: 2; font-style: normal; font-size: 12px; color: var(--ink-faint); }
.pr-ab-dot { grid-row: span 2; width: 9px; height: 9px; border-radius: 50%; background: var(--ink-faint); }
.pr-ab-dot.is-wait { background: var(--warn); }
.pr-ab-dot.is-none { background: var(--ink-faint); }
.pr-ab-dot.is-win { background: var(--c-good); }
.pr-ab-v.is-on { border-color: color-mix(in srgb, var(--c-good) 45%, var(--border));
  background: color-mix(in srgb, var(--c-good) 7%, var(--surface)); }

/* centred CTA row (the pricing note at the foot of the A/B page) */
.hp-cta-center { justify-content: center; }

/* cross-link card mock: two arms, B winning */
.cm-ab { display: flex; flex-direction: column; gap: 8px; justify-content: center; padding: 4px 2px; }
.cm-ab-row { display: flex; align-items: center; gap: 7px; }
.cm-ab-row b { flex: none; font-size: 9px; font-weight: 800; color: var(--ink-faint); width: 8px; }
.cm-ab-bar { height: 9px; border-radius: 4px; background: var(--accent); opacity: .45; }
.cm-ab-bar.w52 { width: 52%; } .cm-ab-bar.w78 { width: 78%; }
.cm-ab-row.is-win b { color: var(--c-good); }
.cm-ab-row.is-win .cm-ab-bar { background: var(--c-good); opacity: 1; }

/* stat grid (analytics page) */
.pr-stat-grid { display: grid; grid-template-columns: repeat(2, 1fr); gap: 14px; width: 100%; max-width: 360px; }
.pr-stat { background: var(--surface); border: 1px solid var(--border); border-radius: 12px; padding: 20px; text-align: center; }
.pr-stat b { display: block; font-family: var(--pub-display); font-size: 30px; font-weight: 440; letter-spacing: -.02em; color: var(--ink); }
.pr-stat span { font-size: 12.5px; color: var(--ink-faint); }

/* larger chart in hero */
.hp-chart-lg { max-width: 440px; box-shadow: var(--shadow); }

/* ---- responsive ----------------------------------------------------------- */
@media (max-width: 900px) {
  .pr-hero-grid { grid-template-columns: 1fr; }
  .pr-hero-copy { text-align: center; }
  .pr-hero-copy .hp-h1 { max-width: none; }
  .pr-hero-copy .pub-lede { margin-left: auto; margin-right: auto; }
  .pr-hero-cta, .pr-hero-meta { justify-content: center; }
  .pr-hero-visual { margin: 0 auto; width: 100%; }
  .pr-grid { grid-template-columns: repeat(2, 1fr); }
  .pr-more { grid-template-columns: repeat(2, 1fr); }
  .pr-tiles { grid-template-columns: 1fr; max-width: 560px; margin-left: auto; margin-right: auto; }
}
@media (max-width: 560px) {
  /* Mobile bento: the two hero tiles (.pr-card-wide) stay FULL-WIDTH (span both columns, stacked
     one per row), then the remaining four cards fill a clean 2x2 grid below - all four equal width. */
  .pr-grid { grid-template-columns: repeat(2, 1fr); }
  .pr-card-wide { grid-column: span 2; }
  .pr-more { grid-template-columns: 1fr; }
  .pr-stat-grid { max-width: none; }
}

/* ============================================================================
   PRODUCT INDEX SHOWCASE CARDS (.ps-*)  -  premium mock-in-gradient tiles
   ---------------------------------------------------------------------------
   Each flow-type card: a topic-tinted gradient panel holding a mini product
   mock, then title + arrow, then description on the plain card surface. The
   topic accent flows through --pr-accent (set by .pr-accent-* on the card).
   ========================================================================== */
/* 2x2 grid of vertical cards: gradient mock panel on top, copy below. */
.pr-showcase { display: grid; grid-template-columns: repeat(2, 1fr); gap: 30px; }
.ps-card {
  --pr-a: var(--pr-accent, var(--accent));
  display: flex; flex-direction: column; border: 1px solid var(--border); border-radius: 18px;
  background: var(--surface); overflow: hidden;
  transition: transform .18s ease, box-shadow .18s ease, border-color .18s ease;
}
.ps-card:hover { transform: translateY(-4px); box-shadow: var(--shadow-lg, var(--shadow)); border-color: color-mix(in srgb, var(--pr-a) 32%, var(--border)); text-decoration: none; }

/* gradient visual panel - a two-stop diagonal wash in the topic color */
.ps-visual {
  position: relative; aspect-ratio: 2 / 1; display: grid; place-items: center; padding: 20px 22px;
  border-bottom: 1px solid color-mix(in srgb, var(--pr-a) 12%, var(--border));
  background:
    radial-gradient(120% 120% at 20% 10%, color-mix(in srgb, var(--pr-a) 22%, var(--surface)), transparent 55%),
    radial-gradient(130% 130% at 90% 100%, color-mix(in srgb, var(--pr-a) 14%, var(--surface)), transparent 60%),
    color-mix(in srgb, var(--pr-a) 6%, var(--surface));
}

/* body */
.ps-body { padding: 22px 24px 24px; display: flex; flex-direction: column; gap: 8px; }
.ps-title-row { display: flex; align-items: center; justify-content: space-between; gap: 10px; }
.ps-title { font-family: var(--pub-sans); font-size: 18px; font-weight: 600; letter-spacing: -.01em; color: var(--ink); margin: 0; }
.ps-arrow {
  flex: none; width: 30px; height: 30px; border-radius: 50%; display: grid; place-items: center;
  background: var(--surface-2); color: var(--ink-soft); font-size: 16px; line-height: 1;
  transition: background .16s ease, color .16s ease, transform .16s ease;
}
.ps-card:hover .ps-arrow { background: var(--pr-a); color: var(--accent-ink); transform: translateX(2px); }
.ps-desc { font-size: 14px; line-height: 1.55; color: var(--ink-soft); margin: 0; }
.ps-points { list-style: none; padding: 0; margin: 4px 0 0; display: flex; flex-direction: column; gap: 7px; }
.ps-points li { display: flex; align-items: flex-start; gap: 8px; font-size: 13px; line-height: 1.4; color: var(--ink); }
.ps-points svg { color: var(--pr-a); flex: none; margin-top: 2px; width: 15px; height: 15px; }

/* ---- the mini mocks (built from simple bars; --pr-a colors the accents) ---- */
.ps-mini {
  width: 100%; max-width: 310px; background: var(--surface); border: 1px solid var(--border);
  border-radius: 12px; padding: 14px 16px; box-shadow: 0 8px 24px -12px rgba(0,0,0,.25);
}
.ps-mini-head { font-size: 11px; font-weight: 650; color: var(--ink-soft); margin-bottom: 10px; }
.ps-mini-row { display: flex; align-items: center; gap: 8px; margin-top: 8px; }
.ps-mini-row span { width: 14px; height: 14px; border-radius: 4px; border: 2px solid var(--border-strong); flex: none; }
.ps-mini-row svg { width: 14px; height: 14px; color: var(--pr-a); flex: none; }
.ps-mini-row i { flex: 1; height: 7px; border-radius: 4px; background: var(--surface-2); }
.ps-mini-row i.s { width: 60%; flex: none; }
.ps-mini-row.done i { background: color-mix(in srgb, var(--pr-a) 16%, var(--surface-2)); }

/* tours: a mini app with one tile spotlighted + a floating step tooltip pointing at it */
.ps-tour { position: relative; width: 100%; max-width: 300px; }
.ps-tour-app {
  position: relative; background: var(--surface); border: 1px solid var(--border); border-radius: 11px;
  overflow: hidden; box-shadow: 0 8px 24px -12px rgba(0,0,0,.25);
}
/* page dim - everything except the highlighted tile + tooltip sits under this */
.ps-tour-app::after { content: ""; position: absolute; inset: 0; z-index: 2; background: color-mix(in srgb, var(--pr-a) 10%, rgba(15,18,30,.28)); }
.ps-tour-bar { display: flex; gap: 5px; padding: 8px 10px; border-bottom: 1px solid var(--border); background: var(--surface-2); }
.ps-tour-bar span { width: 6px; height: 6px; border-radius: 50%; background: var(--border-strong); }
.ps-tour-body { display: grid; grid-template-columns: 40px 1fr; }
.ps-tour-side { border-right: 1px solid var(--border); padding: 10px 8px; display: flex; flex-direction: column; gap: 7px; }
.ps-tour-side i { height: 7px; border-radius: 4px; background: var(--surface-2); }
.ps-tour-side i.on { background: color-mix(in srgb, var(--pr-a) 30%, var(--surface-2)); }
.ps-tour-main { padding: 11px; display: flex; flex-direction: column; gap: 9px; }
.ps-tour-block { height: 26px; border-radius: 7px; background: var(--surface-2); }
.ps-tour-grid { display: grid; grid-template-columns: repeat(3, 1fr); gap: 7px; }
.ps-tour-grid span { height: 34px; border-radius: 7px; background: var(--surface-2); border: 1px solid var(--border); }
/* the spotlighted tile: lifted above the dim, ringed in the topic color */
.ps-tour-grid span.hi {
  position: relative; z-index: 3; background: var(--surface); border-color: var(--pr-a);
  box-shadow: 0 0 0 1px color-mix(in srgb, var(--pr-a) 30%, transparent), 0 3px 8px -5px rgba(0,0,0,.25);
}
/* Tooltip sits to the RIGHT of the spotlighted tile, clear of it - anchored beside its target
   like a real tour step tooltip. */
.ps-tour-tip {
  position: absolute; z-index: 4; left: 46%; top: 62%; width: 120px;
  background: var(--surface); border: 1px solid var(--border-strong); border-radius: 9px; padding: 10px 11px;
  box-shadow: 0 10px 26px -10px rgba(0,0,0,.4);
}
.ps-tour-tip b { display: block; font-size: 8px; font-weight: 800; letter-spacing: .06em; text-transform: uppercase; color: var(--pr-a); }
.ps-tour-tip i { display: block; height: 6px; border-radius: 3px; background: var(--surface-2); margin-top: 7px; }
.ps-tour-tip i.s { width: 64%; }
.ps-tour-tip em { display: block; width: 40px; height: 17px; border-radius: 6px; background: var(--pr-a); margin-top: 10px; }

/* tooltips: a card with a highlighted dot + a hint bubble */
.ps-mini-tips { display: flex; flex-direction: column; gap: 12px; }
.ps-mini-card i.lg { display: block; height: 30px; border-radius: 8px; background: var(--surface-2); }
.ps-mini-dots { display: grid; grid-template-columns: repeat(3, 1fr); gap: 7px; margin-top: 9px; }
.ps-mini-dots span { position: relative; height: 26px; border-radius: 7px; background: var(--surface-2); border: 1px solid var(--border); }
.ps-mini-dots span.hi { border-color: var(--border); }
/* pulsing accent dot on the highlighted element's corner - same effect as the homepage tooltip preview */
.ps-mini-dots span.hi::after {
  content: ""; position: absolute; top: -5px; right: -5px; width: 12px; height: 12px; border-radius: 50%;
  background: var(--pr-a); box-shadow: 0 0 0 4px color-mix(in srgb, var(--pr-a) 24%, transparent);
}
.ps-mini-hint { align-self: center; width: 42%; margin-top: -6px; border: 1px solid var(--border-strong); border-radius: 8px; padding: 9px; background: var(--surface); box-shadow: 0 6px 16px -8px rgba(0,0,0,.3); }
.ps-mini-hint i { display: block; height: 6px; border-radius: 3px; background: var(--surface-2); }
.ps-mini-hint i.s { width: 60%; margin-top: 6px; }

/* checklist */
.ps-mini-cl-head { display: flex; align-items: center; justify-content: space-between; margin-bottom: 8px; }
.ps-mini-cl-head i { display: block; width: 50%; height: 8px; border-radius: 4px; background: color-mix(in srgb, var(--pr-a) 22%, var(--surface-2)); }
.ps-mini-cl-head em { font-style: normal; font-size: 9px; font-weight: 700; color: var(--pr-a); }

/* announcement modal */
.ps-mini-announce { display: grid; place-items: center; }
.ps-mini-modal { width: 100%; }
.ps-mini-badge { display: inline-block; font-size: 8px; font-weight: 800; letter-spacing: .05em; text-transform: uppercase; color: var(--pr-a); background: color-mix(in srgb, var(--pr-a) 14%, var(--surface)); border-radius: 5px; padding: 2px 6px; margin-bottom: 10px; }
.ps-mini-modal i { display: block; height: 7px; border-radius: 4px; background: var(--surface-2); margin-top: 7px; }
.ps-mini-modal i.lg { height: 11px; width: 70%; background: color-mix(in srgb, var(--pr-a) 18%, var(--surface-2)); margin-top: 0; }
.ps-mini-modal i.s { width: 55%; }
.ps-mini-foot { display: flex; align-items: center; justify-content: space-between; margin-top: 11px; }
.ps-mini-dots2 { display: inline-flex; gap: 4px; }
.ps-mini-dots2 em { width: 5px; height: 5px; border-radius: 50%; background: var(--surface-2); }
.ps-mini-dots2 em.on { background: var(--pr-a); }
.ps-mini-foot .ps-mini-btn { margin-top: 0; }
.ps-mini-btn { display: block; width: 46px; height: 18px; border-radius: 6px; background: var(--pr-a); margin-top: 11px; }

/* resource center: a help-hub launcher panel + a corner fab pill */
.ps-mini-resource { position: relative; padding-bottom: 26px; }
.ps-mini-rc { display: flex; flex-direction: column; gap: 8px; }
.ps-mini-rc-head { width: 42%; height: 8px; border-radius: 4px; background: color-mix(in srgb, var(--pr-a) 22%, var(--mock-fill)); margin-bottom: 2px; }
.ps-mini-rc-row { display: flex; align-items: center; gap: 8px; }
.ps-mini-rc-row span { flex: none; width: 13px; height: 13px; border-radius: 4px; background: color-mix(in srgb, var(--pr-a) 28%, var(--mock-fill)); }
.ps-mini-rc-row i { flex: 1; height: 7px; border-radius: 4px; background: var(--mock-fill); }
.ps-mini-rc-row i.s { width: 60%; flex: none; }
.ps-mini-rc-fab { position: absolute; right: 4px; bottom: 6px; width: 44px; height: 18px; border-radius: 9px; background: var(--pr-a); }

/* targeting: a mini rule builder */
.ps-mini-rules { max-width: 300px; }
.ps-rules-head { font-size: 10px; color: var(--ink-faint); margin-bottom: 9px; }
.ps-rules-head b { color: var(--pr-a); font-weight: 700; }
.ps-rule {
  display: flex; align-items: center; justify-content: space-between; gap: 8px;
  border: 1px solid var(--border); border-left: 3px solid var(--pr-a); border-radius: 7px;
  padding: 8px 9px; margin-bottom: 6px; background: var(--surface-2);
}
.ps-rule-k { height: 6px; border-radius: 3px; background: color-mix(in srgb, var(--pr-a) 28%, var(--surface-2)); }
.ps-rule .ps-rule-v { height: 6px; border-radius: 3px; background: var(--border-strong); }
.ps-rule.r1 .ps-rule-k { width: 46%; } .ps-rule.r1 .ps-rule-v { width: 26%; }
.ps-rule.r2 .ps-rule-k { width: 54%; } .ps-rule.r2 .ps-rule-v { width: 16%; }
.ps-rule.r3 .ps-rule-k { width: 38%; } .ps-rule.r3 .ps-rule-v { width: 32%; }
.ps-rules-add { font-size: 10px; font-weight: 650; color: var(--pr-a); margin-top: 8px; }

/* analytics: a mini chart (line + area + bars) */
.ps-mini-chart { max-width: 300px; }
.ps-chart-head { display: flex; align-items: center; justify-content: space-between; margin-bottom: 8px; }
.ps-chart-leg { width: 44px; height: 6px; border-radius: 3px; background: color-mix(in srgb, var(--pr-a) 30%, var(--surface-2)); }
.ps-chart-head b { font-family: var(--pub-display); font-size: 15px; font-weight: 500; color: var(--pr-a); }
.ps-chart-svg { width: 100%; height: 56px; display: block; }
.ps-chart-line { fill: none; stroke: var(--pr-a); stroke-width: 2.5; stroke-linecap: round; stroke-linejoin: round; }
.ps-chart-line.two { stroke: color-mix(in srgb, var(--pr-a) 55%, var(--ink-faint)); }
.ps-chart-area { fill: color-mix(in srgb, var(--pr-a) 12%, transparent); stroke: none; }
.ps-chart-bars { display: grid; grid-template-columns: repeat(5, 1fr); gap: 6px; align-items: end; height: 26px; margin-top: 8px; }
.ps-chart-bars i { border-radius: 3px 3px 0 0; background: color-mix(in srgb, var(--pr-a) 26%, var(--surface-2)); }
.ps-chart-bars i.b1 { height: 42%; } .ps-chart-bars i.b2 { height: 66%; } .ps-chart-bars i.b3 { height: 54%; }
.ps-chart-bars i.b4 { height: 88%; } .ps-chart-bars i.b5 { height: 74%; }

@media (max-width: 760px) {
  .pr-showcase { grid-template-columns: 1fr; max-width: 460px; margin: 0 auto; }
}

/* ---- dark mode: the mocks sit on a dark gradient panel, and the default --surface /
   --surface-2 are darker-than-panel, so the mock card and its placeholder bars nearly vanish.
   Elevate the mock card and lighten the fills so the previews stay legible in dark mode. */
.ps-card { --mock-surf: var(--surface); --mock-fill: var(--surface-2); --mock-line: var(--border); }
.ps-mini, .ps-tour-app, .ps-tour-tip, .ps-mini-hint, .ps-launcher-panel { background: var(--mock-surf); }
@media (prefers-color-scheme: dark) {
  :root:not([data-theme="light"]) .ps-card {
    --mock-surf: #273349; --mock-fill: #3d4d68; --mock-line: #46587a;
  }
}
:root[data-theme="dark"] .ps-card {
  --mock-surf: #273349; --mock-fill: #3d4d68; --mock-line: #46587a;
}
/* repoint mock placeholders at the elevated fill/line tokens (both themes; light = unchanged values) */
.ps-mini-row i, .ps-mini-card i.lg, .ps-mini-hint i, .ps-tour-block, .ps-tour-side i,
.ps-tour-tip i, .ps-mini-modal i { background: var(--mock-fill); }
.ps-mini-row span { border-color: var(--mock-line); }
.ps-tour-grid span { background: var(--mock-fill); border-color: var(--mock-line); }
.ps-mini-dots span { background: var(--mock-fill); border-color: var(--mock-line); }
.ps-tour-app, .ps-mini, .ps-tour-tip, .ps-mini-hint, .ps-launcher-panel { border-color: var(--mock-line); }
/* ============================================================================
   ANIMATED HERO TILES for the product "Good for" bento (finalised from the
   /preview/feature-cards harness). The two .pr-card-wide tiles carry a live
   animated mock (.hm-*) on top + copy below. --a is the topic accent, aliased
   from the page's --pr-a so every mock recolours per product page.
   ========================================================================== */
.pr-card-wide { --a: var(--pr-a, var(--accent)); }

/* hero tile: animated mock on TOP (plain panel), copy below (gradient). */
.pr-card-wide { display: flex; flex-direction: column; align-items: stretch; gap: 0; padding: 0; justify-content: initial; overflow: hidden; background: var(--surface); }
.pr-cv { --a: var(--pr-a, var(--accent)); position: relative; width: 100%; align-self: stretch; height: 210px;
  flex: none; display: block; border-bottom: 1px solid var(--border);
  background: color-mix(in srgb, var(--a) 5%, var(--surface)); }
.pr-cc { position: relative; z-index: 2; flex: 1; display: flex; flex-direction: column; align-items: flex-start;
  justify-content: center; padding: 22px 24px;
  background:
    radial-gradient(90% 120% at 12% 0%, color-mix(in srgb, var(--a) 12%, var(--surface)), transparent 62%),
    color-mix(in srgb, var(--a) 6%, var(--surface)); }
/* wide hero: icon + title on one row, description below */
.pr-ch { display: flex; align-items: center; gap: 13px; }
.pr-ch .pr-card-ico { margin: 0; }
.pr-ch .pr-card-t { margin: 0; }
.pr-cc .pr-card-d { margin-top: 12px; }

/* ---- the animated mock (.hm): a small UI where a tooltip highlights one element, then hops to
   another, with the highlighted element ringing in sync. Sits centred in the top visual panel. */
.hm { position: absolute; inset: 0; overflow: hidden; }
/* No outer frame - the mock elements float directly on the panel (avoids a card-in-a-card look). */
.hm-ui { position: absolute; left: 50%; top: 50%; transform: translate(-50%, -50%); width: 66%;
  display: flex; flex-direction: column; gap: 11px; }
/* the tooltip mock sits its fields higher, leaving clear room below field 3 for the
   card to drop into without clipping against the hm box's hidden overflow */
.hm-tooltip .hm-ui { top: 34%; }
.hm-el { position: relative; height: 22px; border-radius: 6px; background: var(--surface-2); border: 1.5px solid var(--border);
  transition: border-color .2s ease; }
.hm-el-1 { width: 100%; } .hm-el-2 { width: 70%; } .hm-el-3 { width: 88%; }
/* the two targets ring in turn - field 1, then field 3 (the bottom field). The card
   always sits BELOW the active field with its up-arrow, never overlapping the target. */
.hm-el-1 { animation: hm-ring1 8s ease-in-out infinite; }
.hm-el-3 { animation: hm-ring3 8s ease-in-out infinite; }
@keyframes hm-ring1 { 0%,6% { border-color: var(--border); box-shadow: none; }
  14%,40% { border-color: var(--a); box-shadow: 0 0 0 3px color-mix(in srgb, var(--a) 22%, transparent); }
  48%,100% { border-color: var(--border); box-shadow: none; } }
@keyframes hm-ring3 { 0%,52% { border-color: var(--border); box-shadow: none; }
  60%,86% { border-color: var(--a); box-shadow: 0 0 0 3px color-mix(in srgb, var(--a) 22%, transparent); }
  94%,100% { border-color: var(--border); box-shadow: none; } }
/* the tooltip: a small card with a pointer arrow on top, sitting BELOW the active field
   and hopping down as the highlight moves from field 1 to field 3 */
.hm-tip { position: absolute; left: 34%; width: 46%; background: var(--surface);
  border: 1px solid var(--border-strong); border-radius: 8px; padding: 9px; box-shadow: 0 12px 26px -10px rgba(0,0,0,.42);
  animation: hm-tiphop 8s ease-in-out infinite; }
.hm-tip::before { content: ""; position: absolute; top: -5px; left: 18px; width: 9px; height: 9px; background: var(--surface);
  border-left: 1px solid var(--border-strong); border-top: 1px solid var(--border-strong); transform: rotate(45deg); }
.hm-tip-b { display: block; height: 5px; border-radius: 3px; background: color-mix(in srgb, var(--a) 26%, var(--surface-2)); }
.hm-tip-b.s { width: 60%; margin-top: 6px; background: var(--surface-2); }
@keyframes hm-tiphop {
  /* below field 1 (which ends ~33%) */
  0%,4%    { top: 40%; opacity: 0; transform: translateY(-6px) scale(.97); }
  14%,40%  { top: 40%; opacity: 1; transform: none; }
  48%,54%  { top: 46%; opacity: 0; transform: translateY(-6px) scale(.97); }  /* fade out, glide down */
  /* fully below field 3 (the bottom field, which ends ~62%) */
  60%,86%  { top: 116%; opacity: 1; transform: none; }
  96%,100% { top: 124%; opacity: 0; transform: translateY(6px) scale(.97); }
}
.hm-mark { display: none; }

/* hotspot mock: a tile grid with a pulsing dot on one tile (the "always-on hotspot"). */
.hm-hotspot .hm-ui { justify-content: center; }
.hm-grid { display: grid; grid-template-columns: repeat(3, 1fr); gap: 8px; }
.hm-grid span { position: relative; height: 30px; border-radius: 6px; background: var(--surface-2); border: 1px solid var(--border); }
.hm-hot { border-color: color-mix(in srgb, var(--a) 40%, var(--border)) !important; }
.hm-hot i { position: absolute; top: -5px; right: -5px; width: 12px; height: 12px; border-radius: 50%; background: var(--a); }
/* the pulse: expanding ring emanating from the dot */
.hm-hot i::after { content: ""; position: absolute; inset: 0; border-radius: 50%; background: var(--a);
  animation: hm-pulse 2.2s ease-out infinite; }
@keyframes hm-pulse { 0% { transform: scale(1); opacity: .6; } 70%,100% { transform: scale(3.4); opacity: 0; } }

/* shared bar helpers */
.hm-line { height: 8px; border-radius: 4px; background: var(--surface-2); }
.hm-line.s { width: 62%; margin-top: 7px; }

/* PROGRESS (tours): an app row with a spotlight that moves tile-to-tile + a coach card that advances.
   Reads like a real guided tour, not abstract dots. Lifted so the low coach card stays in-frame. */
.hm-progress .hm-ui { width: 74%; gap: 0; top: 40%; }
.hm-tour { position: relative; }
.hm-tour-app { background: var(--surface-2); border: 1px solid var(--border); border-radius: 10px; padding: 12px; }
.hm-tour-row { display: grid; grid-template-columns: repeat(3, 1fr); gap: 8px; }
.hm-tour-row .t { height: 34px; border-radius: 7px; background: var(--surface); border: 1.5px solid var(--border); }
/* the spotlight ring moves across the three tiles */
.hm-tour-row .t1 { animation: hm-spot 8s ease-in-out infinite 0s; }
.hm-tour-row .t2 { animation: hm-spot 8s ease-in-out infinite 2s; }
.hm-tour-row .t3 { animation: hm-spot 8s ease-in-out infinite 4s; }
@keyframes hm-spot { 0%,4% { border-color: var(--border); box-shadow: none; }
  10%,28% { border-color: var(--a); box-shadow: 0 0 0 3px color-mix(in srgb, var(--a) 22%, transparent); }
  36%,100% { border-color: var(--border); box-shadow: none; } }
/* coach card floating below-left of the app (narrower, dropped lower so it clears the tiles) */
.hm-coach { position: absolute; left: 10%; bottom: -55px; width: 52%; background: var(--surface);
  border: 1px solid var(--border-strong); border-radius: 9px; padding: 10px; box-shadow: 0 12px 26px -10px rgba(0,0,0,.4);
  display: flex; flex-direction: column; gap: 8px; }
.hm-coach-step { width: 46%; height: 6px; border-radius: 3px; background: color-mix(in srgb, var(--a) 30%, var(--surface-2)); }
.hm-coach-bar { display: block; height: 5px; border-radius: 3px; background: var(--surface-2); overflow: hidden; }
.hm-coach-bar i { display: block; height: 100%; background: var(--a); width: 33%; animation: hm-coachfill 8s ease-in-out infinite; }
/* fill steps in sync with the spotlight: tile1 0s (1/3), tile2 ~2s (2/3), tile3 ~4s (3/3) */
@keyframes hm-coachfill {
  0%,30%    { width: 33%; }
  36%,63%   { width: 66%; }
  69%,100%  { width: 100%; }
}
.hm-coach-btn { align-self: flex-end; width: 34px; height: 12px; border-radius: 4px; background: var(--a); }

/* BRANCH (tours): one audience node on the left splits to TWO tour cards on the right; the active
   branch (connector + card) lights up, alternating - the classic "one input, two paths" diagram. */
.hm-branch .hm-ui { width: 75%; }
.hm-brn { position: relative; width: 100%; height: 118px; }
/* source node (the audience) - vertically centred on the left */
.hm-brn-src { position: absolute; left: 0; top: 50%; transform: translateY(-50%); width: 26px; height: 26px;
  border-radius: 8px; background: var(--a); box-shadow: 0 4px 12px -4px color-mix(in srgb, var(--a) 55%, transparent); }
/* two connector lines from the node out to each card */
.hm-brn-line { position: absolute; left: 50px; width: 40%; height: 2px; background: var(--border-strong); transform-origin: left; }
.hm-brn-line.ln1 { top: 34%; transform: rotate(-15deg); animation: hm-lineon 8s ease-in-out infinite; }
.hm-brn-line.ln2 { top: 64%; transform: rotate(15deg); animation: hm-lineon 8s ease-in-out infinite 2.5s; }
@keyframes hm-lineon { 0%,8% { background: var(--border-strong); } 20%,44% { background: var(--a); } 56%,100% { background: var(--border-strong); } }
/* two output tour cards on the right, stacked */
.hm-brn-out { position: absolute; right: 0; width: 40%; padding: 9px; border-radius: 8px; background: var(--surface);
  border: 1.5px solid var(--border); box-shadow: 0 8px 18px -12px rgba(0,0,0,.3); display: flex; flex-direction: column; gap: 6px; }
.hm-brn-out.o1 { top: -30px; animation: hm-brnon 8s ease-in-out infinite; }
.hm-brn-out.o2 { bottom: -30px; animation: hm-brnon 8s ease-in-out infinite 2.5s; }
.hm-brn-dot { width: 26%; height: 6px; border-radius: 3px; background: var(--surface-2); }
.hm-brn-out .l { height: 5px; border-radius: 3px; background: var(--surface-2); }
.hm-brn-out .l1 { width: 90%; } .hm-brn-out .l2 { width: 62%; }
/* active branch lights: teal border + accent dot */
@keyframes hm-brnon {
  0%,8%    { border-color: var(--border); transform: translateX(0); }
  20%,44%  { border-color: var(--a); transform: translateX(-4px); box-shadow: 0 10px 22px -10px color-mix(in srgb, var(--a) 40%, transparent); }
  56%,100% { border-color: var(--border); transform: translateX(0); }
}
.hm-brn-out.o1 { animation-name: hm-brnon; }
.hm-brn-out.o1.o1 .hm-brn-dot { animation: hm-doton 8s ease-in-out infinite; }
.hm-brn-out.o2 .hm-brn-dot { animation: hm-doton 8s ease-in-out infinite 2.5s; }
@keyframes hm-doton { 0%,12% { background: var(--surface-2); } 24%,42% { background: var(--a); } 54%,100% { background: var(--surface-2); } }

/* CHECKLIST: a getting-started card whose items tick off one by one (real checkmarks) */
.hm-checklist .hm-ui { width: 55%; }
.hm-clcard { background: var(--surface); border: 1px solid var(--border-strong); border-radius: 11px;
  padding: 14px; box-shadow: 0 12px 28px -14px rgba(0,0,0,.35); display: flex; flex-direction: column; gap: 12px; }
.hm-cl-head { display: flex; align-items: center; justify-content: space-between; }
.hm-cl-title { width: 52%; height: 7px; border-radius: 4px; background: color-mix(in srgb, var(--a) 26%, var(--surface-2)); }
.hm-cl-count { width: 22px; height: 7px; border-radius: 4px; background: var(--surface-2); }
.hm-ci { display: flex; align-items: center; gap: 10px; }
.hm-ci b { flex: none; width: 17px; height: 17px; border-radius: 5px; border: 1.5px solid var(--border-strong);
  background: var(--surface); display: grid; place-items: center; }
.hm-ci b svg { width: 12px; height: 12px; opacity: 0; transition: opacity .15s; }
.hm-ci i { flex: 1; height: 7px; border-radius: 4px; background: var(--surface-2); }
/* each item ticks in turn: box fills teal + checkmark appears + its line dims to "done" */
.hm-ci.c1 b { animation: hm-cibox 8s ease-in-out infinite .4s; }
.hm-ci.c2 b { animation: hm-cibox 8s ease-in-out infinite 2s; }
.hm-ci.c3 b { animation: hm-cibox 8s ease-in-out infinite 3.6s; }
.hm-ci.c1 b svg { animation: hm-citick 8s ease-in-out infinite .4s; }
.hm-ci.c2 b svg { animation: hm-citick 8s ease-in-out infinite 2s; }
.hm-ci.c3 b svg { animation: hm-citick 8s ease-in-out infinite 3.6s; }
@keyframes hm-cibox { 0%,4% { background: var(--surface); border-color: var(--border-strong); }
  12%,100% { background: var(--a); border-color: var(--a); } }
@keyframes hm-citick { 0%,10% { opacity: 0; } 18%,100% { opacity: 1; } }
.hm-ci.c1 i { animation: hm-ciline 8s ease-in-out infinite .4s; }
.hm-ci.c2 i { animation: hm-ciline 8s ease-in-out infinite 2s; }
.hm-ci.c3 i { animation: hm-ciline 8s ease-in-out infinite 3.6s; }
@keyframes hm-ciline { 0%,10% { background: var(--surface-2); } 20%,100% { background: color-mix(in srgb, var(--a) 16%, var(--surface-2)); } }

/* LAUNCHER (checklists): a launcher PILL bottom-right; clicking opens a resource panel above it. */
.hm-launcher .hm-ui { width: 60%; }
.hm-lch { position: relative; display: flex; flex-direction: column; align-items: flex-end; gap: 10px; }
.hm-lch-panel { width: 85%; transform-origin: bottom right; background: var(--surface); border: 1px solid var(--border-strong);
  border-radius: 11px; padding: 12px; box-shadow: 0 16px 34px -14px rgba(0,0,0,.4);
  display: flex; flex-direction: column; gap: 9px; animation: hm-pop 8s ease-in-out infinite; }
.hm-lch-h { width: 46%; height: 6px; border-radius: 3px; background: color-mix(in srgb, var(--a) 30%, var(--surface-2)); margin-bottom: 2px; }
/* resource-menu rows: a CIRCULAR icon chip + label + a trailing chevron, so it reads as a clickable
   help menu (a launcher), clearly distinct from the checklist's square checkboxes. */
.hm-lch-row { display: flex; align-items: center; gap: 9px; padding: 4px 0; }
.hm-lch-row::after { content: ""; flex: none; width: 5px; height: 5px; margin-left: auto;
  border-right: 1.5px solid var(--border-strong); border-top: 1.5px solid var(--border-strong); transform: rotate(45deg); }
.hm-lch-row b { flex: none; width: 16px; height: 16px; border-radius: 50%; background: color-mix(in srgb, var(--a) 14%, var(--surface));
  border: 1px solid color-mix(in srgb, var(--a) 22%, var(--border)); }
.hm-lch-row i { flex: none; width: 62%; height: 6px; border-radius: 3px; background: var(--surface-2); }
.hm-lch-row i.s { width: 46%; }
.hm-lch-pill { width: 86px; height: 26px; border-radius: 20px; background: var(--a);
  box-shadow: 0 8px 18px -6px color-mix(in srgb, var(--a) 55%, transparent); }
.hm-lch-pill span { display: none; }
/* pop in early, hold visible for most of the loop, brief reset at the very end */
@keyframes hm-pop { 0% { opacity: 0; transform: scale(.85) translateY(6px); } 12%,93% { opacity: 1; transform: none; } 100% { opacity: 0; transform: scale(.85) translateY(6px); } }

/* RELAUNCH (resource center): the panel's middle row lights up, then a tour coach-mark springs
   out of it - "a tour you can relaunch". Distinct from .hm-lch (which only opens the panel) and
   from .hm-tour (the tours page's own hero, which shows a tour already running with no launcher). */
/* Side by side: the panel on the left, the tour it relaunches on the right, so the mock reads
   left-to-right as cause then effect. Stacked, the coach-mark looked like a second panel rather
   than something the row had launched. */
.hm-rel { position: relative; display: flex; flex-direction: row; align-items: center; gap: 12px; }
/* The panel is the smaller half: it is the trigger, and the tour it relaunches is the point. */
.hm-rel-panel { flex: 0 1 38%; min-width: 0; background: var(--surface); border: 1px solid var(--border-strong);
  border-radius: 11px; padding: 11px 12px; box-shadow: 0 14px 30px -12px rgba(0,0,0,.45); }
.hm-rel-h { display: block; width: 46%; height: 6px; border-radius: 3px;
  background: color-mix(in srgb, var(--a) 30%, var(--surface-2)); margin-bottom: 6px; }
.hm-rel-row { display: flex; align-items: center; gap: 9px; padding: 4px 0; border-radius: 6px; }
.hm-rel-row b { flex: none; width: 16px; height: 16px; border-radius: 50%;
  background: color-mix(in srgb, var(--a) 14%, var(--surface)); }
.hm-rel-row i { flex: none; width: 62%; height: 6px; border-radius: 3px; background: var(--surface-2); }
.hm-rel-row i.s { width: 46%; }
/* the "relaunch this tour" row: highlights, then the coach-mark below appears */
.hm-rel-row.is-on { animation: hm-relRow 5s ease-in-out infinite; }
.hm-rel-row.is-on b { background: var(--a); }
@keyframes hm-relRow {
  0%, 18% { background: transparent; }
  26%, 72% { background: color-mix(in srgb, var(--a) 12%, transparent); }
  100% { background: transparent; }
}
/* the relaunched tour itself, springing from the panel */
.hm-rel-coach { flex: 1 1 auto; min-width: 0; background: var(--surface); border: 1px solid var(--border-strong);
  border-radius: 10px; padding: 10px 11px; box-shadow: 0 16px 32px -12px rgba(0,0,0,.5);
  display: flex; flex-direction: column; gap: 8px; opacity: 0; transform: translateX(-10px) scale(.9);
  transform-origin: center left; animation: hm-relPop 5s ease-in-out infinite; }
/* Springs in from the LEFT now, so it reads as coming out of the panel beside it. */
@keyframes hm-relPop {
  0%, 24% { opacity: 0; transform: translateX(-10px) scale(.9); }
  34%, 74% { opacity: 1; transform: none; }
  88%, 100% { opacity: 0; transform: translateX(-10px) scale(.9); }
}
.hm-rel-step { width: 26%; height: 6px; border-radius: 3px;
  background: color-mix(in srgb, var(--a) 32%, var(--surface-2)); }
.hm-rel-bar { display: block; width: 100%; height: 5px; border-radius: 3px; background: var(--surface-2); overflow: hidden; }
.hm-rel-bar i { display: block; height: 100%; border-radius: 3px; background: var(--a); width: 30%;
  animation: hm-relBar 5s ease-in-out infinite; }
@keyframes hm-relBar { 0%, 34% { width: 30%; } 60% { width: 66%; } 74%, 100% { width: 66%; } }
.hm-rel-btn { align-self: flex-end; width: 34px; height: 12px; border-radius: 6px; background: var(--a); }

/* MODAL (announcements): an announcement card pops in over a dimmed app backdrop */
.hm-modal .hm-ui { width: 55%; }
.hm-ann { position: relative; }
.hm-ann-modal { position: relative; background: var(--surface); border: 1px solid var(--border-strong); border-radius: 11px;
  padding: 14px; box-shadow: 0 18px 38px -12px rgba(0,0,0,.5); display: flex; flex-direction: column; align-items: flex-start; }
.hm-ann-badge { display: inline-block; font-size: 7px; font-weight: 800; letter-spacing: .08em; color: #fff;
  background: var(--a); border-radius: 4px; padding: 3px 6px; margin-bottom: 10px; }
.hm-ann-title { width: 66%; height: 8px; border-radius: 4px; background: color-mix(in srgb, var(--a) 30%, var(--surface-2));
  animation: hm-annT 6s steps(1) infinite; }
@keyframes hm-annT { 0% { width: 66%; } 33% { width: 50%; } 66% { width: 72%; } }
.hm-ann-line { width: 100%; height: 6px; border-radius: 3px; background: var(--surface-2); margin-top: 8px; }
.hm-ann-line.s { width: 72%; animation: hm-annL 6s steps(1) infinite; }
@keyframes hm-annL { 0% { width: 72%; } 33% { width: 58%; } 66% { width: 80%; } }
.hm-ann-foot { display: flex; align-items: center; justify-content: space-between; width: 100%; margin-top: 12px; }
.hm-ann-dots { display: inline-flex; gap: 5px; }
.hm-ann-dots i { width: 6px; height: 6px; border-radius: 50%; background: var(--surface-2); }
/* the active step dot advances 1 -> 2 -> 3 */
.hm-ann-dots .d1 { animation: hm-dot 8s steps(1) infinite 0s; }
.hm-ann-dots .d2 { animation: hm-dot 8s steps(1) infinite; }
.hm-ann-dots .d3 { animation: hm-dot 8s steps(1) infinite; }
@keyframes hm-dot { 0% { background: var(--surface-2); } }
.hm-ann-dots .d1 { animation-name: hm-d1; } .hm-ann-dots .d2 { animation-name: hm-d2; } .hm-ann-dots .d3 { animation-name: hm-d3; }
@keyframes hm-d1 { 0% { background: var(--a); } 33%,100% { background: var(--surface-2); } }
@keyframes hm-d2 { 0%,33% { background: var(--surface-2); } 33.001%,66% { background: var(--a); } 66.001%,100% { background: var(--surface-2); } }
@keyframes hm-d3 { 0%,66% { background: var(--surface-2); } 66.001% { background: var(--a); } }
.hm-ann-btn { width: 44px; height: 15px; border-radius: 5px; background: var(--a); }

/* THEME (announcements): the announcement card restyles - its accent (--tc) + corner radius morph
   between three brand looks, with the active swatch highlighted below. "Matches your app." */
.hm-theme .hm-ui { width: 60%; align-items: center; }
.hm-theme { --tc: var(--a); display: flex; flex-direction: column; align-items: center; gap: 14px; width: 100%;
  animation: hm-themehue 8s steps(1) infinite; }
@keyframes hm-themehue { 0% { --tc: #4F46E5; } 33% { --tc: #0D9488; } 66% { --tc: #B45309; } }
.hm-theme-card { width: 100%; background: var(--surface); border: 1px solid var(--border-strong);
  padding: 13px; box-shadow: 0 14px 30px -12px rgba(0,0,0,.4); display: flex; flex-direction: column; align-items: flex-start;
  border-radius: 12px; animation: hm-themeradius 8s steps(1) infinite; transition: border-radius .4s ease; }
@keyframes hm-themeradius { 0% { border-radius: 12px; } 33% { border-radius: 4px; } 66% { border-radius: 20px; } }
.hm-theme-badge { font-size: 7px; font-weight: 800; letter-spacing: .08em; color: #fff; background: var(--tc);
  border-radius: 4px; padding: 3px 6px; margin-bottom: 9px; transition: background .4s ease; }
.hm-theme-title { width: 62%; height: 7px; border-radius: 4px; background: color-mix(in srgb, var(--tc) 34%, var(--surface-2)); transition: background .4s ease; }
.hm-theme-line { width: 100%; height: 6px; border-radius: 3px; background: var(--surface-2); margin-top: 8px; }
.hm-theme-line.s { width: 70%; }
.hm-theme-btn { width: 46px; height: 15px; border-radius: 5px; background: var(--tc); margin-top: 11px; transition: background .4s ease; }
/* the three brand swatches; the active one (matching --tc's step) rings */
.hm-theme-swatches { display: flex; gap: 10px; }
.hm-theme-swatches i { width: 20px; height: 20px; border-radius: 6px; }
.hm-theme-swatches .s1 { background: #4F46E5; } .hm-theme-swatches .s2 { background: #0D9488; } .hm-theme-swatches .s3 { background: #B45309; }
.hm-theme-swatches .s1 { animation: hm-sw1 8s steps(1) infinite; }
.hm-theme-swatches .s2 { animation: hm-sw2 8s steps(1) infinite; }
.hm-theme-swatches .s3 { animation: hm-sw3 8s steps(1) infinite; }
@keyframes hm-sw1 { 0% { box-shadow: 0 0 0 3px color-mix(in srgb, #4F46E5 30%, transparent); } 33%,100% { box-shadow: none; } }
@keyframes hm-sw2 { 0%,33% { box-shadow: none; } 33.001%,66% { box-shadow: 0 0 0 3px color-mix(in srgb, #0D9488 30%, transparent); } 66.001%,100% { box-shadow: none; } }
@keyframes hm-sw3 { 0%,66% { box-shadow: none; } 66.001% { box-shadow: 0 0 0 3px color-mix(in srgb, #B45309 30%, transparent); } }

/* RULE (targeting): real condition rows (key / operator / value) that match with a green check */
.hm-rule .hm-ui { width: 78%; }
.hm-rules { display: flex; flex-direction: column; gap: 8px; }
.hm-rulehd { margin-bottom: 2px; }
.hm-rulehd span { display: block; width: 44%; height: 6px; border-radius: 3px; background: var(--surface-2); }
.hm-rr { display: flex; align-items: center; gap: 6px; padding: 8px 9px; border-radius: 7px;
  background: var(--surface-2); border: 1px solid var(--border); border-left: 3px solid var(--a); }
.hm-rk { width: 30%; height: 7px; border-radius: 4px; background: color-mix(in srgb, var(--a) 30%, var(--surface)); }
.hm-rop { width: 20%; height: 6px; border-radius: 3px; background: var(--border-strong); }
.hm-rv { width: 22%; height: 7px; border-radius: 4px; background: var(--surface); border: 1px solid var(--border); }
.hm-rchk { margin-left: auto; width: 15px; height: 15px; border-radius: 5px; border: 1.5px solid var(--border-strong);
  background: var(--surface); position: relative; }
.hm-rchk::after { content: ""; position: absolute; left: 2px; top: 3px; width: 6px; height: 3px;
  border-left: 2px solid #fff; border-bottom: 2px solid #fff; transform: rotate(-45deg); opacity: 0; }
/* each row's check ticks in turn (rules matching one after another) */
.hm-rr.r1 .hm-rchk { animation: hm-rchk 8s ease-in-out infinite .5s; }
.hm-rr.r2 .hm-rchk { animation: hm-rchk 8s ease-in-out infinite 1.6s; }
.hm-rr.r3 .hm-rchk { animation: hm-rchk 8s ease-in-out infinite 2.7s; }
.hm-rr.r1 .hm-rchk::after { animation: hm-rtick 8s ease-in-out infinite .5s; }
.hm-rr.r2 .hm-rchk::after { animation: hm-rtick 8s ease-in-out infinite 1.6s; }
.hm-rr.r3 .hm-rchk::after { animation: hm-rtick 8s ease-in-out infinite 2.7s; }
@keyframes hm-rchk { 0%,4% { background: var(--surface); border-color: var(--border-strong); } 12%,100% { background: var(--a); border-color: var(--a); } }
@keyframes hm-rtick { 0%,10% { opacity: 0; } 20%,100% { opacity: 1; } }

/* DAYCOUNT (targeting): the real rule in words - "Days since signup [is at most] [N]", N ticks up */
.hm-daycount .hm-ui { align-items: center; width: 82%; }
.hm-day { width: 100%; }
.hm-day-rule { display: flex; align-items: center; gap: 9px; width: 100%; padding: 12px 13px; border-radius: 10px;
  background: var(--surface); border: 1px solid var(--border-strong); border-left: 3px solid var(--a);
  box-shadow: 0 12px 26px -12px rgba(0,0,0,.32); }
.hm-day-key { font-size: 13px; font-weight: 650; color: var(--ink); white-space: nowrap; }
.hm-day-op2 { font-size: 12px; color: var(--ink-faint); white-space: nowrap; }
.hm-day-val { position: relative; margin-left: auto; min-width: 26px; height: 22px; border-radius: 6px;
  background: color-mix(in srgb, var(--a) 12%, var(--surface)); border: 1px solid color-mix(in srgb, var(--a) 26%, var(--border));
  display: grid; place-items: center; }
.hm-day-val b { grid-area: 1 / 1; font-size: 13px; font-weight: 700; color: var(--a); font-variant-numeric: tabular-nums; opacity: 0; }
.hm-day-val .n1 { animation: hm-dn1 7.5s steps(1) infinite; }
.hm-day-val .n2 { animation: hm-dn2 7.5s steps(1) infinite; }
.hm-day-val .n3 { animation: hm-dn3 7.5s steps(1) infinite; }
@keyframes hm-dn1 { 0% { opacity: 1; } 33%,100% { opacity: 0; } }
@keyframes hm-dn2 { 0%,33% { opacity: 0; } 33.001%,66% { opacity: 1; } 66.001%,100% { opacity: 0; } }
@keyframes hm-dn3 { 0%,66% { opacity: 0; } 66.001% { opacity: 1; } }

/* DEVICE (targeting): device / country / language rules (server-derived), each matches in turn */
.hm-device .hm-ui { width: 62%; display: flex; flex-direction: column; gap: 8px; }
.hm-dev { display: flex; flex-direction: column; gap: 8px; width: 100%; }
.hm-dev-row { display: flex; align-items: center; gap: 8px; padding: 6px 10px; border-radius: 8px;
  background: var(--surface); border: 1px solid var(--border); border-left: 3px solid var(--a);
  box-shadow: 0 4px 12px -8px rgba(0,0,0,.25); }
.hm-dev-k { font-size: 11px; font-weight: 650; color: var(--ink); }
.hm-dev-v { margin-left: auto; font-size: 10.5px; color: var(--a); background: color-mix(in srgb, var(--a) 12%, var(--surface));
  border: 1px solid color-mix(in srgb, var(--a) 24%, var(--border)); border-radius: 5px; padding: 2px 7px; }

/* COUNTER (analytics): a donut ring that fills, with a completion % counting up in the centre */
.hm-counter .hm-ui { align-items: center; flex-direction: column; gap: 10px; }
.hm-ring { position: relative; width: 104px; height: 104px; }
.hm-ring svg { width: 100%; height: 100%; transform: rotate(-90deg); }
.hm-ring-bg { fill: none; stroke: var(--surface-2); stroke-width: 4.5; }
.hm-ring-fg { fill: none; stroke: var(--a); stroke-width: 4.5; stroke-linecap: round; stroke-dasharray: 100.5; stroke-dashoffset: 100.5;
  animation: hm-ringsweep 8s ease-in-out infinite; }
/* 68% completion -> sweep to ~32% of the way remaining (dashoffset 100.5 * .32) */
@keyframes hm-ringsweep { 0%,4% { stroke-dashoffset: 100.5; } 30%,93% { stroke-dashoffset: 32; } 100% { stroke-dashoffset: 100.5; } }
.hm-pct { position: absolute; left: 50%; top: 50%; transform: translate(-50%,-50%); }
.hm-pct b { position: absolute; left: 50%; top: 50%; transform: translate(-50%,-50%); font-family: var(--pub-display);
  font-size: 24px; font-weight: 600; color: var(--ink); font-variant-numeric: tabular-nums; opacity: 0; white-space: nowrap; }
.hm-pct .p1 { animation: hm-pc1 8s steps(1) infinite; }
.hm-pct .p2 { animation: hm-pc2 8s steps(1) infinite; }
.hm-pct .p3 { animation: hm-pc3 8s steps(1) infinite; }
@keyframes hm-pc1 { 0% { opacity: 1; } 24%,100% { opacity: 0; } }
@keyframes hm-pc2 { 0%,24% { opacity: 0; } 24.001%,58% { opacity: 1; } 58.001%,100% { opacity: 0; } }
@keyframes hm-pc3 { 0%,58% { opacity: 0; } 58.001%,96% { opacity: 1; } 96.001%,100% { opacity: 0; } }
.hm-ring-cap { font-size: 12px; font-weight: 600; color: var(--ink-soft); }

/* FUNNEL (analytics): labeled steps whose bars narrow downward, with % - one step drops off */
.hm-funnel .hm-ui { width: 82%; }
.hm-funnel { display: flex; flex-direction: column; gap: 9px; width: 100%; }
/* NPS mock (surveys): the score, and the promoter/passive/detractor split it is made of.
   Colours are the same three the real report uses (green / amber / red), not the page accent -
   the split only means something if the three segments are distinguishable. */
.hm-nps { display: grid; gap: 12px; width: 100%; }
.hm-nps-score { display: flex; align-items: baseline; gap: 8px; }
.hm-nps-score b { font-size: 34px; font-weight: 800; line-height: 1; color: var(--a);
  font-variant-numeric: tabular-nums; }
.hm-nps-score span { font-size: 10px; font-weight: 800; letter-spacing: .1em; text-transform: uppercase;
  color: var(--ink-faint); }
.hm-nps-split { display: flex; gap: 3px; height: 14px; }
.hm-nps-seg { border-radius: 4px; }
.hm-nps-seg.pro { flex: 62; background: #12b886; }
.hm-nps-seg.pas { flex: 24; background: #f0a020; }
.hm-nps-seg.det { flex: 14; background: #f0466e; }
.hm-nps-keys { display: flex; flex-wrap: wrap; gap: 4px 12px; }
.hm-nps-key { display: inline-flex; align-items: center; gap: 5px; font-size: 9.5px; color: var(--ink-faint); }
.hm-nps-key i { width: 7px; height: 7px; border-radius: 2px; }
.hm-nps-key.pro i { background: #12b886; }
.hm-nps-key.pas i { background: #f0a020; }
.hm-nps-key.det i { background: #f0466e; }

/* Survey drop-off: same bars as the tour funnel, but per QUESTION and with the share that
   reached it, since "how far people got" is the number the card talks about. */
.hm-svdrop .hm-fn-lbl { width: 24px; }
.hm-svdrop .hm-fn-row em { flex: none; font-style: normal; font-size: 10px; font-weight: 700;
  color: var(--ink-faint); font-variant-numeric: tabular-nums; min-width: 30px; text-align: right; }

.hm-fn-row { display: flex; align-items: center; gap: 9px; }
.hm-fn-lbl { flex: none; width: 44px; font-size: 11px; color: var(--ink-faint); }
.hm-fn-bar { height: 18px; border-radius: 5px; background: color-mix(in srgb, var(--a) 28%, var(--surface-2));
  transform-origin: left; animation: hm-fdraw 8s ease-in-out infinite; }
/* the step with the biggest drop is flagged in rose (the "where you lose people" cue) */
.hm-fn-row.drop .hm-fn-bar { background: color-mix(in srgb, var(--c-announce) 45%, var(--surface-2)); }
.hm-fn-row.drop .hm-fn-lbl { color: var(--c-announce); font-weight: 650; }
.hm-fn-bar.w100 { width: 100%; animation-delay: .2s; } .hm-fn-bar.w82 { width: 82%; animation-delay: .5s; }
.hm-fn-bar.w54 { width: 54%; animation-delay: .8s; } .hm-fn-bar.w48 { width: 48%; animation-delay: 1.1s; }
@keyframes hm-fdraw { 0%,3% { transform: scaleX(0); opacity: .4; } 18%,93% { transform: scaleX(1); opacity: 1; } 100% { transform: scaleX(1); opacity: 1; } }

@media (prefers-reduced-motion: reduce) {
  .hm * , .hm *::after, .hm *::before { animation: none !important; }
  .hm-tip { top: 40%; opacity: 1; }
  .hm-el-1 { border-color: var(--a); box-shadow: 0 0 0 3px color-mix(in srgb, var(--a) 22%, transparent); }
  .hm-panel, .hm-modal, .hm-pass { opacity: 1; transform: none; }
  .hm-prog i { width: 72%; } .hm-ring-fg { stroke-dashoffset: 40; }
}

/* hero head: the large filled-gradient icon (matches the showcase thumbnails) */
.pr-ci { width: 46px; height: 46px; border-radius: 13px; color: #fff; border: 0; place-items: center; display: grid;
  background: radial-gradient(120% 120% at 22% 12%, color-mix(in srgb, var(--pr-a) 82%, #fff), var(--pr-a)); }
.pr-ci svg { width: 24px; height: 24px; }
.pr-card-wide .pr-card-t { font-size: 19px; }
.pr-card-wide .pr-card-d { max-width: 46ch; }

/* dark mode: the .hm-* mocks read var(--surface)/--surface-2/--border directly. On the dark hero
   panel those are near-black = invisible. Remap the tokens LOCALLY on the visual panel in dark so
   every surface inside the mock lifts to a legible elevated value (mocks need no edits). */
:root[data-theme="dark"] .pr-cv {
  --surface: #1f2a3d; --surface-2: #32405a; --border: #3c4c69; --border-strong: #4b5d7e;
}
@media (prefers-color-scheme: dark) {
  :root:not([data-theme="light"]) .pr-cv {
    --surface: #1f2a3d; --surface-2: #32405a; --border: #3c4c69; --border-strong: #4b5d7e;
  }
}
/* the panel background itself lifts a touch so the mock reads against it */
:root[data-theme="dark"] .pr-cv { background: color-mix(in srgb, var(--pr-a) 8%, #141d2b); }
@media (prefers-color-scheme: dark) {
  :root:not([data-theme="light"]) .pr-cv { background: color-mix(in srgb, var(--pr-a) 8%, #141d2b); }
}

/* ============================================================================
   SOLUTIONS PAGES (.sol-*) - outcome-led landing pages, shared brand-indigo accent.
   Reuse the .hp-* / .pr-* system; only a few page-specific bits below.
   ========================================================================== */
.sol-hero-grid { display: grid; grid-template-columns: 1.05fr 1fr; gap: clamp(28px, 5vw, 64px); align-items: center; }
.sol-hero-copy .hp-h1 { max-width: 16ch; }
/* the reused .hm-* mocks are position:absolute; inset:0, so they need a sized, positioned, clipped
   stage both in the hero and in each "how it solves it" feature row. --a drives the mock accent. */
.sol-hero-visual, .sol-mock {
  --a: var(--accent); position: relative; width: 100%; max-width: 400px; height: 230px;
  border: 1px solid color-mix(in srgb, var(--accent) 12%, var(--border)); border-radius: 18px; overflow: hidden;
  background: color-mix(in srgb, var(--accent) 5%, var(--surface)); margin: 0 auto;
}

/* proof stat strip: a compact band (not the full section height) with divided stats */
.sol-stats-band { padding: clamp(32px, 4vw, 48px) 0; }
.sol-stats { display: flex; flex-wrap: wrap; justify-content: center; align-items: center; }
.sol-stat { flex: 1; min-width: 180px; max-width: 300px; text-align: center; padding: 4px 28px; }
.sol-stat + .sol-stat { border-left: 1px solid color-mix(in srgb, var(--accent) 18%, var(--border)); }
.sol-stat b { display: block; font-family: var(--pub-display); font-weight: 420; font-size: clamp(28px, 3.6vw, 40px);
  letter-spacing: -.02em; color: var(--accent); line-height: 1.05; margin-bottom: 6px; }
.sol-stat span { font-size: 13.5px; color: var(--ink-soft); }
@media (max-width: 640px) {
  .sol-stats { flex-direction: column; gap: 20px; }
  .sol-stat + .sol-stat { border-left: 0; border-top: 1px solid color-mix(in srgb, var(--accent) 18%, var(--border)); padding-top: 20px; }
}

@media (max-width: 900px) {
  .sol-hero-grid { grid-template-columns: 1fr; }
  .sol-hero-copy { text-align: center; }
  .sol-hero-copy .hp-h1 { max-width: none; }
  .sol-hero-copy .pub-lede { margin-left: auto; margin-right: auto; }
  .sol-hero-cta, .hp-hero-meta { justify-content: center; }
  .sol-hero-visual { margin: 0 auto; max-width: 420px; }
}

/* solutions index: outcome cards */
.sol-grid { display: grid; grid-template-columns: repeat(3, 1fr); gap: clamp(14px, 1.8vw, 20px); }
.sol-card { display: flex; flex-direction: column; gap: 8px; padding: 26px 24px; border: 1px solid var(--border);
  border-radius: 16px; background: var(--surface); transition: border-color .16s ease, transform .16s ease, box-shadow .16s ease; }
.sol-card:hover { border-color: color-mix(in srgb, var(--accent) 30%, var(--border)); transform: translateY(-3px); box-shadow: var(--shadow); text-decoration: none; }
.sol-card-t { font-family: var(--pub-sans); font-size: 18px; font-weight: 600; letter-spacing: -.01em; color: var(--ink); }
.sol-card-d { font-size: 14px; line-height: 1.55; color: var(--ink-soft); flex: 1; }
.sol-card-link { display: inline-flex; align-items: center; gap: 6px; font-size: 14px; font-weight: 600; color: var(--accent); margin-top: 4px; }
.sol-card:hover .pr-more-arrow { transform: translateX(3px); }
@media (max-width: 860px) { .sol-grid { grid-template-columns: 1fr; max-width: 480px; margin: 0 auto; } }

/* ============================================================================
   Legal pages (/legal/*). A clean, readable document layout: centered hero,
   a table-of-contents card, numbered sections, and legal tables. Theme-aware
   via the public --ink/--surface/--border/--accent tokens. CSP-safe (all in
   this served stylesheet - no inline <style>).
   ============================================================================ */
.legal-hero { padding: clamp(48px,6vw,80px) 0 clamp(24px,3vw,36px); text-align: center; }
.legal-hero h1 { font-size: clamp(30px,4vw,42px); font-weight: 800; margin: 0 0 10px; letter-spacing: -0.02em; }
.legal-subtitle { font-size: 17px; color: var(--ink-soft); max-width: 640px; margin: 0 auto; line-height: 1.6; }
.legal-content { max-width: 820px; margin: 0 auto; padding: 0 20px clamp(48px,6vw,88px); }
.legal-updated { font-size: 13.5px; color: var(--ink-faint); margin-bottom: 32px; text-align: center; }
.legal-toc { background: var(--surface-2); border: 1px solid var(--border); border-radius: 14px; padding: 20px 24px; margin-bottom: 40px; }
.legal-toc h3 { font-size: 12px; font-weight: 800; text-transform: uppercase; letter-spacing: 0.06em; color: var(--ink-faint); margin: 0 0 12px; }
.legal-toc ol { columns: 2; column-gap: 28px; padding-left: 20px; margin: 0; }
.legal-toc li { font-size: 13.5px; margin-bottom: 8px; break-inside: avoid; }
.legal-toc a { color: var(--ink-soft); text-decoration: none; }
.legal-toc a:hover { color: var(--accent); }
.legal-section { margin-bottom: 40px; scroll-margin-top: 90px; }
.legal-section h2 { font-size: 21px; font-weight: 700; margin: 0 0 16px; padding-bottom: 8px; border-bottom: 2px solid var(--border); }
.legal-section h3 { font-size: 15.5px; font-weight: 650; margin: 24px 0 8px; }
.legal-section p, .legal-section li { font-size: 14.5px; color: var(--ink-soft); line-height: 1.75; margin-bottom: 12px; }
.legal-section ul, .legal-section ol { padding-left: 22px; margin-bottom: 16px; }
.legal-section li { margin-bottom: 8px; }
.legal-section strong { color: var(--ink); font-weight: 650; }
.legal-section a { color: var(--accent); text-decoration: none; }
.legal-section a:hover { text-decoration: underline; }
.legal-section code { font-family: ui-monospace,SFMono-Regular,Menlo,monospace; font-size: 12.5px; background: var(--surface-2);
  border: 1px solid var(--border); border-radius: 5px; padding: 1px 5px; color: var(--ink); }
.legal-table { width: 100%; border-collapse: collapse; margin: 16px 0; font-size: 13.5px; }
.legal-table th, .legal-table td { padding: 10px 14px; text-align: left; border: 1px solid var(--border); vertical-align: top; }
.legal-table th { background: var(--surface-2); font-weight: 650; color: var(--ink); }
.legal-table td { color: var(--ink-soft); }
.legal-table-wrap { overflow-x: auto; }
.legal-highlight { background: var(--surface-2); border: 1px solid var(--border); border-left: 3px solid var(--accent);
  border-radius: 10px; padding: 16px 18px; margin: 18px 0; }
.legal-highlight p { margin-bottom: 0; }
.legal-highlight p + p { margin-top: 8px; }
@media (max-width: 640px) { .legal-toc ol { columns: 1; } }

/* ---- Changelog (/changelog) ---- */
.cl-entry { padding: 24px 0; border-top: 1px solid var(--border); }
.cl-entry:first-child { border-top: none; padding-top: 8px; }
.cl-head { display: flex; align-items: center; gap: 12px; margin-bottom: 6px; }
.cl-title { font-size: 20px; font-weight: 700; margin: 0; }
.cl-tag { font-size: 11px; font-weight: 800; letter-spacing: 0.04em; text-transform: uppercase; padding: 3px 9px;
  border-radius: 999px; flex: none; }
.cl-tag-new { color: var(--c-resource); background: color-mix(in srgb, var(--c-resource) 14%, var(--surface)); }
.cl-tag-improved { color: var(--c-analytics); background: color-mix(in srgb, var(--c-analytics) 14%, var(--surface)); }
.cl-tag-fixed { color: var(--c-good); background: color-mix(in srgb, var(--c-good) 14%, var(--surface)); }
.cl-foot { margin-top: 28px; }

/* ---- Status page (/status) ---- */
.st-banner { display: flex; align-items: center; gap: 12px; padding: 16px 20px; border-radius: 14px;
  border: 1px solid var(--border); background: var(--surface-2); font-size: 15.5px; margin-bottom: 24px; }
.st-dot { width: 9px; height: 9px; border-radius: 999px; flex: none; background: var(--c-good);
  box-shadow: 0 0 0 4px color-mix(in srgb, var(--c-good) 22%, transparent); }
.st-banner.st-ok { border-color: color-mix(in srgb, var(--c-good) 40%, var(--border)); }
.st-list { border: 1px solid var(--border); border-radius: 14px; overflow: hidden; }
.st-row { display: flex; align-items: center; justify-content: space-between; gap: 16px; padding: 15px 18px;
  border-top: 1px solid var(--border); background: var(--surface); }
.st-row:first-child { border-top: none; }
.st-row-main b { display: block; font-size: 14.5px; }
.st-row-main em { font-style: normal; font-size: 12.5px; color: var(--ink-soft); }
.st-pill { display: inline-flex; align-items: center; gap: 7px; font-size: 12.5px; font-weight: 600; flex: none;
  padding: 4px 11px; border-radius: 999px; }
.st-pill.st-ok { color: var(--c-good); background: color-mix(in srgb, var(--c-good) 12%, var(--surface)); }
/* Non-operational states: amber (degraded) and red (down). Local tokens so /status does not depend
   on chart-only semantic colors; the banner border + dot + pill all follow the same accent. */
.st-warn { --st-c: #d97706; } .st-down { --st-c: #dc2626; }
:root[data-theme="dark"] .st-warn, .st-warn { --st-c: #d97706; }
@media (prefers-color-scheme: dark) { .st-warn { --st-c: #f59e0b; } .st-down { --st-c: #f87171; } }
:root[data-theme="dark"] .st-warn { --st-c: #f59e0b; }
:root[data-theme="dark"] .st-down { --st-c: #f87171; }
:root[data-theme="light"] .st-warn { --st-c: #d97706; }
:root[data-theme="light"] .st-down { --st-c: #dc2626; }
.st-banner.st-warn, .st-banner.st-down { border-color: color-mix(in srgb, var(--st-c) 45%, var(--border)); }
.st-banner.st-warn .st-dot, .st-banner.st-down .st-dot,
.st-pill.st-warn .st-dot, .st-pill.st-down .st-dot {
  background: var(--st-c); box-shadow: 0 0 0 4px color-mix(in srgb, var(--st-c) 22%, transparent); }
.st-pill.st-warn, .st-pill.st-down { color: var(--st-c); background: color-mix(in srgb, var(--st-c) 12%, var(--surface)); }
.st-foot { margin-top: 24px; font-size: 13.5px; line-height: 1.6; color: var(--ink-soft); }

/* ============================================================================
   Contact page (/contact) - a two-column layout: the form on the left, the
   "where to send what" cards on the right. Avoids the empty gap a 3-in-4 grid
   left. Stacks on narrow screens. Theme-aware via the public tokens.
   ============================================================================ */
.contact-grid { display: grid; grid-template-columns: 1.15fr 0.85fr; gap: clamp(28px, 4vw, 56px);
  align-items: start; }
.contact-head { text-align: left; margin-bottom: 20px; }
.contact-head .hp-h2 { font-size: clamp(24px, 3vw, 30px); }
.contact-form-wrap { min-width: 0; scroll-margin-top: 90px; }
.contact-form { display: flex; flex-direction: column; gap: 16px; }
.contact-row { display: grid; grid-template-columns: 1fr 1fr; gap: 16px; }
.contact-field { display: flex; flex-direction: column; gap: 6px; font-size: 13.5px; font-weight: 600;
  color: var(--ink); }
.contact-opt { font-weight: 400; color: var(--ink-faint); }
.contact-field input, .contact-field textarea { width: 100%; font: inherit; font-weight: 400; font-size: 15px;
  color: var(--ink); background: var(--surface); border: 1px solid var(--border); border-radius: 10px;
  padding: 11px 13px; }
.contact-field input::placeholder, .contact-field textarea::placeholder { color: var(--ink-faint); }
.contact-field input:focus, .contact-field textarea:focus { outline: none; border-color: var(--accent);
  box-shadow: 0 0 0 3px color-mix(in srgb, var(--accent) 18%, transparent); }
.contact-field textarea { resize: vertical; min-height: 130px; line-height: 1.6; }
.contact-submit { align-self: flex-start; margin-top: 4px; }
.contact-note { font-size: 13.5px; color: var(--ink-soft); margin: 2px 0 0; }
.contact-hp { position: absolute; left: -9999px; width: 1px; height: 1px; overflow: hidden; }
.contact-flash { border-radius: 10px; padding: 12px 15px; font-size: 14px; margin-bottom: 20px; border: 1px solid;
  line-height: 1.5; scroll-margin-top: 90px; }
.contact-flash-success { color: var(--c-good); background: color-mix(in srgb, var(--c-good) 10%, var(--surface));
  border-color: color-mix(in srgb, var(--c-good) 35%, var(--border)); }
.contact-flash-error { color: var(--c-announce); background: color-mix(in srgb, var(--c-announce) 10%, var(--surface));
  border-color: color-mix(in srgb, var(--c-announce) 35%, var(--border)); }
/* Right column: stacked mini-cards (not the 4-col .pr-grid, which left a gap) */
.contact-side { min-width: 0; }
.contact-side-card { background: var(--surface); border: 1px solid var(--border); border-radius: 14px;
  padding: 18px 20px; margin-bottom: 14px; }
.contact-side-card:last-child { margin-bottom: 0; }
.contact-side-card .pr-card-t { margin: 0 0 6px; }
.contact-side-card .pr-card-d { margin: 0; }
@media (max-width: 860px) {
  .contact-grid { grid-template-columns: 1fr; }
  .contact-side { margin-top: 8px; }
}
@media (max-width: 520px) { .contact-row { grid-template-columns: 1fr; } }

/* ============================================================================
   DOCS (/docs/*) - a 3-column documentation layout: left grouped-nav sidebar
   (with search), center content, right on-page TOC. Theme-aware via the public
   --ink/--surface/--border/--accent tokens. CSP-safe (all styles here).
   ============================================================================ */
.docs-body .pub-main { padding-top: 0; }
.docs-shell { display: grid; grid-template-columns: 250px minmax(0, 1fr) 210px; gap: 40px;
  max-width: 1320px; margin: 0 auto; padding: 28px var(--pub-gutter) 80px; align-items: start; }

/* ---- Left sidebar ---- */
/* The sidebar is a flex column: the search trigger stays pinned at the top while ONLY the
   nav list scrolls under it. So .docs-sidebar bounds the height + hides overflow, and
   .docs-nav (below) owns the scroll. */
.docs-sidebar { position: sticky; top: 84px; max-height: calc(100vh - 100px);
  display: flex; flex-direction: column; padding-right: 6px; overflow: hidden; }
/* Sidebar search TRIGGER (opens the modal) - fixed at the top, never scrolls away. */
.docs-search-trigger { flex: none; display: flex; align-items: center; gap: 8px; width: 100%; border: 1px solid var(--border);
  background: var(--surface); border-radius: 10px; padding: 8px 11px; margin-bottom: 18px; color: var(--ink-faint);
  font: inherit; font-size: 14px; cursor: pointer; text-align: left; }
.docs-search-trigger:hover { border-color: var(--accent); color: var(--ink-soft); }
.docs-search-trigger span { flex: 1; }
/* Only the nav list scrolls (the search trigger above stays pinned). Slight right padding
   keeps the scrollbar off the links. */
.docs-nav { flex: 1 1 auto; min-height: 0; overflow-y: auto; padding-right: 2px; }
.docs-nav-group { margin-bottom: 18px; }
.docs-nav-title { display: block; font-size: 11px; font-weight: 800; letter-spacing: .06em;
  text-transform: uppercase; color: var(--ink-faint); margin: 0 0 7px; padding: 0 8px; text-decoration: none; }
a.docs-nav-title:hover { color: var(--ink-soft); }
a.docs-nav-title.is-active { color: var(--accent); }
.docs-nav-link { display: block; font-size: 13.5px; color: var(--ink-soft); padding: 6px 10px;
  border-radius: 8px; line-height: 1.4; text-decoration: none; }
.docs-nav-link:hover { background: var(--surface-2); color: var(--ink); }
.docs-nav-link.is-active { background: var(--accent-soft); color: var(--accent); font-weight: 650; }
.docs-nav-noresults { font-size: 13px; color: var(--ink-faint); padding: 4px 10px; }

/* ---- Center content ---- */
.docs-main { min-width: 0; }
.docs-content { min-width: 0; }
.docs-content h1 { font-family: var(--pub-display); font-size: clamp(28px, 3.4vw, 36px); font-weight: 500;
  letter-spacing: -0.02em; line-height: 1.15; margin: 0 0 14px; }
.docs-content h2 { font-size: 21px; font-weight: 700; margin: 40px 0 12px; padding-top: 6px;
  scroll-margin-top: 84px; letter-spacing: -0.01em; }
.docs-content h3 { font-size: 16.5px; font-weight: 650; margin: 26px 0 8px; scroll-margin-top: 84px; }
.docs-content p, .docs-content li { font-size: 15px; line-height: 1.72; color: var(--ink-soft); }
.docs-content p { margin: 0 0 14px; }
.docs-content strong { color: var(--ink); font-weight: 650; }
.docs-content a { color: var(--accent); text-decoration: underline; text-underline-offset: 2px;
  text-decoration-thickness: 1px; }
.docs-content ul, .docs-content ol { margin: 0 0 16px; padding-left: 22px; }
.docs-content li { margin-bottom: 7px; }
.docs-content li::marker { color: var(--ink-faint); }
.docs-lede { font-size: 17px !important; color: var(--ink-soft); line-height: 1.65; margin-bottom: 22px !important; }
.docs-content code { font-family: ui-monospace, SFMono-Regular, Menlo, monospace; font-size: 13px;
  background: var(--surface-2); border: 1px solid var(--border); border-radius: 5px; padding: 1px 5px; color: var(--ink); }
.docs-content pre { background: var(--surface-2); border: 1px solid var(--border); border-radius: 12px;
  padding: 15px 17px; overflow-x: auto; margin: 0 0 18px; }
.docs-content pre code { background: none; border: none; padding: 0; font-size: 12.75px; line-height: 1.6;
  color: var(--ink); white-space: pre; }
/* Method SYNTAX line (the shape, with named placeholders): lighter/flatter than a real example so it
   reads as a signature, not runnable code. Tighter, no heavy fill. */
.docs-content pre.doc-syntax { background: transparent; border: 1px dashed var(--border);
  padding: 11px 14px; margin: 0 0 12px; }
.docs-content pre.doc-syntax code { color: var(--ink-soft); }
/* "Example" label above the concrete example code block. */
.docs-content .doc-eg-label { font-size: 11px; font-weight: 700; letter-spacing: .06em; text-transform: uppercase;
  color: var(--ink-faint); margin: 4px 0 6px; }
.docs-content hr { border: none; border-top: 1px solid var(--border); margin: 32px 0; }

/* Syntax highlighting tokens (added by the docs highlighter, CSP-safe). Colors are
   theme-aware: a readable light palette by default, brighter hues in dark mode. */
.public-body {
  --tok-com: #7a8194;   /* comments */
  --tok-str: #0a7d55;   /* strings */
  --tok-kw:  #7c3aed;   /* keywords (new, const, function...) */
  --tok-lit: #b45309;   /* true/false/null */
  --tok-num: #b45309;   /* numbers */
  --tok-fn:  #2563eb;   /* function calls */
  --tok-key: #0369a1;   /* object keys */
  --tok-cls: #b5326e;   /* Capitalized (classes/constructors) */
  --tok-tag: #b5326e;   /* HTML tag names */
}
@media (prefers-color-scheme: dark) {
  :root:not([data-theme="light"]) .public-body {
    --tok-com: #6b7280; --tok-str: #4ade80; --tok-kw: #c4b5fd; --tok-lit: #fbbf24;
    --tok-num: #fbbf24; --tok-fn: #7dd3fc; --tok-key: #67e8f9; --tok-cls: #f0abcc; --tok-tag: #f0abcc;
  }
}
:root[data-theme="dark"] .public-body {
  --tok-com: #6b7280; --tok-str: #4ade80; --tok-kw: #c4b5fd; --tok-lit: #fbbf24;
  --tok-num: #fbbf24; --tok-fn: #7dd3fc; --tok-key: #67e8f9; --tok-cls: #f0abcc; --tok-tag: #f0abcc;
}
.docs-content pre code .tok-com { color: var(--tok-com); font-style: italic; }
.docs-content pre code .tok-str { color: var(--tok-str); }
.docs-content pre code .tok-kw  { color: var(--tok-kw); font-weight: 600; }
.docs-content pre code .tok-lit { color: var(--tok-lit); }
.docs-content pre code .tok-num { color: var(--tok-num); }
.docs-content pre code .tok-fn  { color: var(--tok-fn); }
.docs-content pre code .tok-key { color: var(--tok-key); }
.docs-content pre code .tok-cls { color: var(--tok-cls); }
.docs-content pre code .tok-tag { color: var(--tok-tag); }

/* Callouts + step lists + tables (doc content primitives) */
.doc-note, .doc-tip, .doc-warn { border: 1px solid var(--border); border-left: 3px solid var(--accent);
  background: var(--surface-2); border-radius: 10px; padding: 13px 16px; margin: 0 0 18px; font-size: 14px; }
.doc-note p:last-child, .doc-tip p:last-child, .doc-warn p:last-child { margin-bottom: 0; }
.doc-tip { border-left-color: var(--c-good); }
.doc-warn { border-left-color: var(--c-announce); }
.doc-note-label { display: block; font-size: 11px; font-weight: 800; letter-spacing: .05em;
  text-transform: uppercase; color: var(--ink-faint); margin-bottom: 4px; }

/* Dev-only region. Wraps a section that exists in the repo but is NOT published on the live site.
   The whole area is tinted and dashed rather than just labelled, so the boundary of what is
   internal is visible at a glance and cannot be mistaken for customer-facing documentation.
   Colour comes from --warn (defined in app.css, which the public layout also loads), so it themes
   in dark and light without an override here. */
.doc-devonly { margin: 0 0 22px; padding: 14px 18px 4px; border-radius: 12px;
  background: color-mix(in srgb, var(--warn) 7%, var(--surface));
  border: 1px dashed color-mix(in srgb, var(--warn) 40%, var(--border)); }
/* The tint already carries the meaning; the heading only has to name it. */
.doc-devonly-head { display: flex; align-items: center; gap: 9px; flex-wrap: wrap;
  margin: 0 0 4px; font-size: 12.5px; line-height: 1.45;
  color: color-mix(in srgb, var(--warn) 72%, var(--ink)); }
.doc-devonly-tag { flex: none; font-size: 10px; font-weight: 800; letter-spacing: .06em;
  text-transform: uppercase; line-height: 1; padding: 5px 8px; border-radius: 999px;
  color: var(--bg); background: var(--warn); }
/* The section's own first heading sits right under the label - drop its usual top margin so the
   two read as one block instead of a banner with a gap under it. */
.doc-devonly > h2:first-of-type { margin-top: 10px; }
/* Nested callouts sit on the tint, so lift them onto the plain surface for contrast. */
.doc-devonly .doc-note { background: var(--surface); }
/* A prominent, highlighted callout - stronger than .doc-note (accent-tinted fill + icon), for the
   one thing on the page we want to stand out (e.g. "Web Store listing coming"). */
.doc-callout { display: flex; gap: 12px; align-items: flex-start;
  background: color-mix(in srgb, var(--accent) 10%, var(--surface));
  border: 1px solid color-mix(in srgb, var(--accent) 35%, var(--border));
  border-radius: 12px; padding: 14px 16px; margin: 0 0 20px; }
.doc-callout-ico { font-size: 20px; line-height: 1.3; flex: 0 0 auto; }
.doc-callout p { margin: 0; font-size: 14px; }
.doc-callout strong { color: var(--ink); }
.doc-steps { list-style: none; padding: 0; margin: 0 0 18px; counter-reset: docstep; }
.doc-steps > li { position: relative; padding-left: 40px; margin-bottom: 16px; counter-increment: docstep; }
.doc-steps > li::before { content: counter(docstep); position: absolute; left: 0; top: 0; width: 26px; height: 26px;
  border-radius: 50%; background: var(--accent-soft); color: var(--accent); font-size: 13px; font-weight: 700;
  display: inline-flex; align-items: center; justify-content: center; }
.doc-table-wrap { overflow-x: auto; margin: 0 0 18px; }
.doc-table { width: 100%; border-collapse: collapse; font-size: 13.5px; }
.doc-table th, .doc-table td { text-align: left; padding: 9px 13px; border: 1px solid var(--border); vertical-align: top; }
.doc-table th { background: var(--surface-2); font-weight: 650; color: var(--ink); }
.doc-table td { color: var(--ink-soft); }
.doc-table code { white-space: nowrap; }
/* "cards" grid for the intro/hub page */
.doc-cards { display: grid; grid-template-columns: repeat(auto-fill, minmax(210px, 1fr)); gap: 14px; margin: 4px 0 22px; }
.doc-card { display: block; border: 1px solid var(--border); background: var(--surface); border-radius: 12px;
  padding: 16px 18px; text-decoration: none !important; }
.doc-card:hover { border-color: var(--accent); }
.doc-card b { display: block; font-size: 14.5px; color: var(--ink); margin-bottom: 3px; }
.doc-card span { display: block; font-size: 13px; color: var(--ink-soft); line-height: 1.5; }

/* ---- Pager (prev / next) ---- */
.docs-pager { display: flex; justify-content: space-between; gap: 14px; margin-top: 44px;
  border-top: 1px solid var(--border); padding-top: 22px; }
.docs-pager-link { display: flex; flex-direction: column; gap: 3px; border: 1px solid var(--border);
  border-radius: 12px; padding: 12px 16px; min-width: 0; text-decoration: none; max-width: 48%; }
.docs-pager-link:hover { border-color: var(--accent); }
/* The whole card is the hover target, so its text must never underline on hover. */
.docs-pager-link, .docs-pager-link:hover, .docs-pager-link:focus,
.docs-pager-link:hover .docs-pager-dir, .docs-pager-link:hover .docs-pager-label { text-decoration: none; }
.docs-pager-next { text-align: right; align-items: flex-end; margin-left: auto; }
.docs-pager-dir { font-size: 12px; color: var(--ink-faint); font-weight: 600; }
.docs-pager-label { font-size: 14.5px; color: var(--ink); font-weight: 650; }
.docs-pager-link:hover .docs-pager-dir { color: var(--accent); }

/* ---- Right TOC ---- */
.docs-toc { position: sticky; top: 84px; max-height: calc(100vh - 100px); overflow-y: auto; }
.docs-toc-title { font-size: 11px; font-weight: 800; letter-spacing: .06em; text-transform: uppercase;
  color: var(--ink-faint); margin-bottom: 10px; }
.docs-toc-list { display: flex; flex-direction: column; gap: 2px; border-left: 1px solid var(--border); }
.docs-toc-link { font-size: 12.75px; color: var(--ink-soft); padding: 4px 0 4px 12px; margin-left: -1px;
  border-left: 2px solid transparent; text-decoration: none; line-height: 1.4; }
.docs-toc-link.is-sub { padding-left: 22px; font-size: 12.25px; }
.docs-toc-link:hover { color: var(--ink); }
.docs-toc-link.is-active { color: var(--accent); border-left-color: var(--accent); font-weight: 600; }

/* ---- Mobile ---- */
.docs-nav-toggle { display: none; }
@media (max-width: 1080px) {
  .docs-shell { grid-template-columns: 230px minmax(0, 1fr); }
  .docs-toc { display: none; }
}
@media (max-width: 820px) {
  .docs-shell { grid-template-columns: 1fr; padding-top: 16px; }
  .docs-nav-toggle { display: inline-flex; align-items: center; gap: 8px; border: 1px solid var(--border);
    background: var(--surface); border-radius: 10px; padding: 9px 14px; font-size: 14px; font-weight: 600;
    color: var(--ink); margin-bottom: 4px; }
  .docs-sidebar { position: fixed; top: 0; left: 0; bottom: 0; width: 280px; max-height: none; z-index: 60;
    background: var(--bg); border-right: 1px solid var(--border); padding: 76px 18px 24px; transform: translateX(-100%);
    transition: transform .2s ease; }
  .docs-sidebar.is-open { transform: translateX(0); box-shadow: 0 10px 40px rgba(0,0,0,.25); }
}

/* ---- Docs: skip link, breadcrumb, feedback, help footer ---- */
.docs-skip { position: absolute; left: -9999px; top: 8px; z-index: 100; background: var(--accent);
  color: #fff; padding: 8px 14px; border-radius: 8px; font-size: 14px; font-weight: 600; text-decoration: none; }
.docs-skip:focus { left: 16px; }
.docs-crumbs { display: flex; align-items: center; flex-wrap: wrap; gap: 7px; font-size: 12.75px;
  color: var(--ink-faint); margin-bottom: 18px; }
.docs-crumbs a { color: var(--ink-soft); text-decoration: none; }
.docs-crumbs a:hover { color: var(--accent); }
.docs-crumb-sep { color: var(--ink-faint); }
.docs-crumb-group { color: var(--ink-soft); }
.docs-crumb-current { color: var(--ink); font-weight: 600; }
.docs-feedback { display: flex; align-items: center; gap: 14px; flex-wrap: wrap; margin-top: 40px;
  padding: 16px 18px; border: 1px solid var(--border); border-radius: 12px; background: var(--surface-2); }
.docs-feedback-q { font-size: 14px; font-weight: 600; color: var(--ink); }
.docs-feedback-btns { display: inline-flex; gap: 8px; }
.docs-feedback-btn { font: inherit; font-size: 13.5px; font-weight: 600; color: var(--ink-soft);
  background: var(--surface); border: 1px solid var(--border); border-radius: 8px; padding: 6px 16px; cursor: pointer; }
.docs-feedback-btn:hover { border-color: var(--accent); color: var(--accent); }
.docs-feedback-thanks { font-size: 13.5px; color: var(--c-good); font-weight: 600; }
/* Optional comment box, revealed on "No". Full width (breaks to its own line). */
.docs-feedback-comment { flex: 1 1 100%; display: flex; flex-direction: column; gap: 8px; }
/* [hidden] must beat display:flex (documented trap) so it stays hidden until "No". */
.docs-feedback-comment[hidden] { display: none; }
.docs-feedback-clabel { font-size: 13.5px; font-weight: 600; color: var(--ink); }
.docs-feedback-textarea { font: inherit; font-size: 13.5px; color: var(--ink); background: var(--surface);
  border: 1px solid var(--border); border-radius: 8px; padding: 9px 11px; resize: vertical; min-height: 60px; }
.docs-feedback-textarea:focus { outline: none; border-color: var(--accent); }
.docs-feedback-cactions { display: inline-flex; gap: 8px; }
.docs-feedback-send { font: inherit; font-size: 13.5px; font-weight: 600; color: var(--accent-ink);
  background: var(--accent); border: 1px solid var(--accent); border-radius: 8px; padding: 6px 16px; cursor: pointer; }
.docs-feedback-send:hover { background: var(--accent-hover); border-color: var(--accent-hover); }
.docs-feedback-skip { font: inherit; font-size: 13.5px; font-weight: 600; color: var(--ink-faint);
  background: none; border: 1px solid transparent; border-radius: 8px; padding: 6px 12px; cursor: pointer; }
.docs-feedback-skip:hover { color: var(--ink-soft); }
.docs-help { display: flex; align-items: center; justify-content: space-between; gap: 16px; flex-wrap: wrap;
  margin-top: 28px; padding-top: 24px; border-top: 1px solid var(--border); }
.docs-help span { font-size: 14.5px; color: var(--ink-soft); }

/* Heading anchor link - revealed on heading hover, for shareable deep links */
.docs-content h2, .docs-content h3 { position: relative; }
.docs-heading-anchor { position: absolute; left: -24px; top: 0; bottom: 0; width: 22px;
  display: inline-flex; align-items: center; justify-content: center;
  color: var(--ink-faint); text-decoration: none; opacity: 0; transition: opacity .12s ease; }
.docs-heading-anchor svg { display: block; }
.docs-content h2:hover .docs-heading-anchor,
.docs-content h3:hover .docs-heading-anchor,
.docs-heading-anchor:focus { opacity: 1; }
.docs-heading-anchor:hover { color: var(--accent); text-decoration: none; }
.docs-heading-anchor.is-copied { opacity: 1; color: var(--accent); }
/* Themed tooltip - SAME style as the app's shared data-tip tooltip (ink bg, surface text,
   12px/550, 4px 8px, radius 6, shadow). Positioned above the anchor; shown on hover/focus
   and while the just-copied flag is up. */
.docs-heading-anchor[data-tip]::after {
  content: attr(data-tip);
  position: absolute; left: 50%; bottom: calc(100% + 8px); transform: translateX(-50%);
  background: var(--ink); color: var(--surface); font-size: 12px; font-weight: 550;
  padding: 4px 8px; border-radius: 6px; white-space: nowrap; pointer-events: none;
  opacity: 0; z-index: 60; box-shadow: var(--shadow); transition: opacity .12s ease;
}
.docs-heading-anchor:hover::after, .docs-heading-anchor:focus::after,
.docs-heading-anchor.is-copied::after { opacity: 1; }
@media (max-width: 820px) { .docs-heading-anchor { display: none; } }

/* ---- Docs full-text search results ---- */
.docs-search-kbd { font-family: ui-monospace, SFMono-Regular, Menlo, monospace;
  font-size: 11px; color: var(--ink-faint); border: 1px solid var(--border); border-radius: 5px;
  padding: 0 5px; line-height: 16px; background: var(--bg); flex: none; }

/* ---- Docs search MODAL ---- */
.docs-modal { position: fixed; inset: 0; z-index: 200; display: flex; align-items: flex-start;
  justify-content: center; padding: 12vh 20px 20px; }
.docs-modal[hidden] { display: none; }
.docs-modal-backdrop { position: absolute; inset: 0; background: rgba(10, 12, 24, .5);
  backdrop-filter: blur(2px); }
.docs-modal-panel { position: relative; width: 100%; max-width: 620px; background: var(--surface);
  border: 1px solid var(--border); border-radius: 16px; box-shadow: 0 24px 70px -20px rgba(0,0,0,.5);
  overflow: hidden; display: flex; flex-direction: column; max-height: 70vh; }
.docs-modal-search { display: flex; align-items: center; gap: 11px; padding: 15px 18px;
  border-bottom: 1px solid var(--border); color: var(--ink-faint); flex: none; }
.docs-modal-search input { flex: 1; border: none; background: none; outline: none; font: inherit;
  font-size: 16px; color: var(--ink); }
.docs-modal-search input::placeholder { color: var(--ink-faint); }
.docs-modal-esc { font-family: ui-monospace, SFMono-Regular, Menlo, monospace; font-size: 11px;
  color: var(--ink-faint); border: 1px solid var(--border); border-radius: 5px; padding: 2px 6px;
  background: var(--surface-2); cursor: pointer; flex: none; }
.docs-modal-results { overflow-y: auto; padding: 8px; }
.docs-modal-hint, .docs-modal-empty { font-size: 13.5px; color: var(--ink-faint); padding: 22px 14px; text-align: center; }
.docs-modal-result { display: block; padding: 11px 13px; border-radius: 10px; }
.docs-modal-result:hover, .docs-modal-result.is-active { background: var(--surface-2); }
/* Never underline the result card or any of its text, in any state (the anchor's default
   underline was decorating the whole card on hover/active). */
.docs-modal-result, .docs-modal-result:hover, .docs-modal-result:focus,
.docs-modal-result.is-active, .docs-modal-result *,
.docs-modal-result:hover *, .docs-modal-result.is-active * { text-decoration: none !important; }
.docs-modal-result-head { display: flex; align-items: baseline; justify-content: space-between; gap: 12px; }
.docs-modal-result-title { font-size: 14.5px; font-weight: 650; color: var(--ink); }
.docs-modal-result:hover .docs-modal-result-title, .docs-modal-result.is-active .docs-modal-result-title { color: var(--accent); }
.docs-modal-result-sec { font-size: 10.5px; font-weight: 700; letter-spacing: .05em; text-transform: uppercase;
  color: var(--ink-faint); flex: none; }
.docs-modal-result-snip { display: block; font-size: 12.75px; color: var(--ink-soft); line-height: 1.55; margin-top: 3px; }
.docs-modal-result-snip mark { background: var(--accent-soft); color: var(--accent); border-radius: 3px; padding: 0 2px; }
@media (max-width: 560px) { .docs-modal { padding: 8vh 12px 12px; } .docs-modal-panel { max-height: 80vh; } }

/* ---- Docs: code-block copy button + last-updated ---- */
.docs-content pre { position: relative; }
.docs-copy { position: absolute; top: 8px; right: 8px; font: inherit; font-size: 11.5px; font-weight: 600;
  color: var(--ink-soft); background: var(--surface); border: 1px solid var(--border); border-radius: 7px;
  padding: 3px 9px; cursor: pointer; opacity: 0; transition: opacity .12s ease; }
.docs-content pre:hover .docs-copy, .docs-copy:focus { opacity: 1; }
.docs-copy:hover { border-color: var(--accent); color: var(--accent); }
.docs-updated { font-size: 12.5px; color: var(--ink-faint); margin-top: 26px; padding-top: 16px;
  border-top: 1px solid var(--border); }

.hp-cta-foot { margin-top: 16px; font-size: 14px; color: var(--ink-soft); }
.hp-cta-foot a { color: var(--accent); text-decoration: underline; text-underline-offset: 2px; }

/* ---- Docs figures (real screenshot or captioned placeholder) ---- */
.doc-figure { margin: 4px 0 22px; }
.doc-figure img { width: 100%; height: auto; display: block; border: 1px solid var(--border);
  border-radius: 12px; box-shadow: 0 8px 24px -14px rgba(0,0,0,.4); }
.doc-figure-ph { display: flex; flex-direction: column; align-items: center; justify-content: center; gap: 10px;
  min-height: 220px; border: 1px dashed var(--border-strong); border-radius: 12px; background: var(--surface-2);
  color: var(--ink-faint); padding: 24px; text-align: center; }
.doc-figure-ph-ic { color: var(--ink-faint); opacity: .7; }
.doc-figure-ph-txt { font-size: 13px; font-weight: 600; }
.doc-figure figcaption { margin-top: 9px; font-size: 12.75px; color: var(--ink-faint); text-align: center; }
/* Extension UI panel shots are narrow portrait cards, not full-width dashboard captures -
   cap their display width and center them so they read at their natural scale. */
.doc-figure-panel img { max-width: 380px; margin-left: auto; margin-right: auto; }

/* Figure images are clickable -> full-resolution lightbox. */
.doc-figure img.is-zoomable { cursor: zoom-in; transition: box-shadow .15s ease, transform .15s ease; }
.doc-figure img.is-zoomable:hover { box-shadow: 0 8px 26px -8px rgba(15, 23, 42, .28); }
/* No ring on mouse click: suppress the plain :focus outline, show one ONLY for real
   keyboard focus (:focus-visible). */
.doc-figure img.is-zoomable:focus { outline: none; }
.doc-figure img.is-zoomable:focus-visible { outline: 2px solid var(--accent); outline-offset: 3px; }

.docs-lightbox {
  position: fixed; inset: 0; z-index: 1000;
  display: flex; align-items: center; justify-content: center;
  padding: clamp(16px, 4vw, 56px);
  background: rgba(9, 12, 20, .78); backdrop-filter: blur(3px);
  opacity: 0; transition: opacity .18s ease; cursor: zoom-out;
}
.docs-lightbox.is-open { opacity: 1; }
.docs-lightbox-img {
  max-width: 100%; max-height: 100%; width: auto; height: auto;
  border-radius: 12px; box-shadow: 0 24px 70px -20px rgba(0, 0, 0, .65);
  cursor: default; transform: scale(.98); transition: transform .18s ease;
}
.docs-lightbox.is-open .docs-lightbox-img { transform: scale(1); }
.docs-lightbox-close {
  position: absolute; top: 18px; right: 20px;
  width: 40px; height: 40px; border: none; border-radius: 999px;
  background: rgba(255, 255, 255, .12); color: #fff; font-size: 26px; line-height: 1;
  cursor: pointer; display: grid; place-items: center;
  transition: background-color .12s ease;
}
.docs-lightbox-close:hover { background: rgba(255, 255, 255, .22); }
.docs-lightbox-close:focus-visible { outline: 2px solid #fff; outline-offset: 2px; }
body.docs-lightbox-open { overflow: hidden; }
@media (prefers-reduced-motion: reduce) {
  .docs-lightbox, .docs-lightbox-img { transition: none; }
}

/* ============================================================================
   Error pages (404 / 403 / 419 / 429 / 500). Standalone, on the public design
   system so a broken link feels like the marketing site, not a stack trace.
   A large Fraunces error code sits over a soft radial glow; per-code tones tint
   the glow + code. Theme-aware via the .public-body tokens.
   ========================================================================== */
.err-page { min-height: 100vh; background: var(--bg); }
.err-wrap { min-height: 100vh; display: flex; flex-direction: column; align-items: center;
  justify-content: center; text-align: center; padding: 40px 24px; gap: 8px; position: relative; }

/* brand mark, top */
.err-brand { position: absolute; top: 26px; left: 50%; transform: translateX(-50%);
  display: inline-flex; align-items: center; text-decoration: none; }
.err-brand:hover { text-decoration: none; opacity: .82; }
.err-logo { height: 32px; width: auto; display: block; }
/* Swap the real lockup asset by theme: light logo on light ground, dark logo on dark. */
.err-logo-dark { display: none; }
@media (prefers-color-scheme: dark) {
  :root:not([data-theme="light"]) .err-logo-light { display: none; }
  :root:not([data-theme="light"]) .err-logo-dark { display: block; }
}
:root[data-theme="dark"] .err-logo-light { display: none; }
:root[data-theme="dark"] .err-logo-dark { display: block; }
:root[data-theme="light"] .err-logo-light { display: block; }
:root[data-theme="light"] .err-logo-dark { display: none; }

.err-main { display: flex; flex-direction: column; align-items: center; gap: 4px;
  max-width: 500px; position: relative; }

/* the big code, with a soft glow behind it */
.err-code { position: relative; font-family: var(--pub-display); font-weight: 340;
  font-size: clamp(96px, 20vw, 168px); line-height: 1; letter-spacing: -0.04em;
  color: var(--ink); margin-bottom: 6px; }
.err-code::before { content: ""; position: absolute; left: 50%; top: 50%;
  width: 340px; height: 340px; transform: translate(-50%, -50%); z-index: -1;
  background: radial-gradient(closest-side, var(--err-glow, color-mix(in srgb, var(--accent) 26%, transparent)), transparent 72%);
  filter: blur(6px); pointer-events: none; }

.err-title { font-family: var(--pub-display); font-weight: 400; font-size: clamp(26px, 4vw, 34px);
  letter-spacing: -0.015em; line-height: 1.1; margin: 0; color: var(--ink); text-wrap: balance; }
.err-body { margin: 12px 0 0; font-size: 16px; line-height: 1.6; color: var(--ink-soft, var(--ink-faint));
  max-width: 42ch; }

.err-actions { display: flex; flex-wrap: wrap; gap: 12px; justify-content: center; margin-top: 26px; }

.err-foot { position: absolute; bottom: 28px; left: 0; right: 0; margin: 0;
  font-size: 13.5px; color: var(--ink-faint); }
.err-foot a { color: var(--ink); text-decoration: underline; text-underline-offset: 2px; text-decoration-thickness: 1px; }
.err-foot a:hover { color: var(--accent); }

/* Per-code tones: shift the glow (and the code's lower gradient stop reads warmer). */
.err-tone-default { --err-glow: color-mix(in srgb, var(--accent) 26%, transparent); }
.err-tone-warm    { --err-glow: color-mix(in srgb, #e6437f 26%, transparent); }
.err-tone-amber   { --err-glow: color-mix(in srgb, #f59e0b 30%, transparent); }

@media (max-width: 560px) {
  .err-actions { flex-direction: column; width: 100%; max-width: 280px; }
  .err-actions .pub-btn { width: 100%; }
  .err-foot { position: static; margin-top: 34px; }
}

/* ============================================================================
   INDUSTRY PAGES ("By industry"). Each industry page carries its own scope class
   (.ind-<slug>) set by IndustryController, so every page has a DISTINCT palette +
   mood - they must not look the same. A shared token-derivation turns each page's
   --ind accent into the ground/surface/accent tokens (same recipe as pr-page),
   then per-industry blocks add layout/mood that differ page to page.
   ========================================================================== */

/* Per-industry accent (the one dial each page turns). */
.ind-saas            { --ind: #6d5efc; }                 /* product-led indigo/violet */
.ind-fintech         { --ind: #1f6feb; --ind-ink: #0b1f3a; } /* trust blue over deep navy */
.ind-ecommerce       { --ind: #f0653e; }                 /* warm, conversion-led coral */
.ind-developer-tools { --ind: #34d399; --ind-ink: #0c1322; } /* terminal green on near-black */
.ind-healthcare      { --ind: #12a5a5; }                 /* calm clinical teal */
.ind-edtech          { --ind: #e08a1e; }                 /* warm amber - approachable, optimistic */
.ind-collaboration   { --ind: #7c5cff; }                 /* multiplayer violet */
.ind-marketing       { --ind: #db2777; }                 /* bold martech magenta */

/* Shared derivation: the page adopts its --ind as the accent + a whisper into the ground. */
.public-body.ind-page {
  --pr-page: var(--ind);
  --bg: color-mix(in srgb, var(--ind) 4%, #ffffff);
  --surface-2: color-mix(in srgb, var(--ind) 6%, #ffffff);
  --accent: var(--ind);
  --accent-soft: color-mix(in srgb, var(--ind) 14%, #ffffff);
  --accent-hover: color-mix(in srgb, var(--ind) 82%, #000000);
  --accent-pressed: color-mix(in srgb, var(--ind) 68%, #000000);
}
/* EXPLICIT dark only. The `:not([data-theme="light"])` half used to sit here too, outside any
   media query - so it matched in AUTO mode regardless of the system setting, painting the dark
   backgrounds onto a page whose text colours were still light-theme. That is dark ink on a dark
   ground, which is what auto mode showed on every industry page.
   The auto case belongs in the prefers-color-scheme block below, where it can only apply when the
   system is actually dark. */
:root[data-theme="dark"] .public-body.ind-page {
  --bg: color-mix(in srgb, var(--ind) 6%, #0b0c17);
  --surface-2: color-mix(in srgb, var(--ind) 8%, #0f1622);
  --accent: var(--ind);
  --accent-soft: color-mix(in srgb, var(--ind) 22%, #0b0c17);
  --accent-hover: color-mix(in srgb, var(--ind) 86%, #ffffff);
  --accent-pressed: color-mix(in srgb, var(--ind) 72%, #ffffff);
}
@media (prefers-color-scheme: dark) {
  /* The same set, not just --bg/--surface-2: a partial copy was the other half of the problem -
     auto mode got dark surfaces with light-theme accents. */
  :root:not([data-theme="light"]) .public-body.ind-page {
    --bg: color-mix(in srgb, var(--ind) 6%, #0b0c17);
    --surface-2: color-mix(in srgb, var(--ind) 8%, #0f1622);
    --accent: var(--ind);
    --accent-soft: color-mix(in srgb, var(--ind) 22%, #0b0c17);
    --accent-hover: color-mix(in srgb, var(--ind) 86%, #ffffff);
    --accent-pressed: color-mix(in srgb, var(--ind) 72%, #ffffff);
  }
}

/* ---- Shared industry primitives (used across pages; per-industry blocks restyle them) ---- */
.ind-hero { padding: 68px 0 40px; }
.ind-hero-grid { display: grid; grid-template-columns: 1.05fr 0.95fr; gap: 48px; align-items: center; }
.ind-eyebrow { display: inline-flex; align-items: center; gap: 8px; font-size: 13px; font-weight: 700;
  letter-spacing: .04em; text-transform: uppercase; color: var(--ind); margin-bottom: 14px; }
/* Round dot marker (matches the product/use-case eyebrows) instead of the old long-dash bar. */
.ind-eyebrow::before { content: ""; width: 7px; height: 7px; border-radius: 50%; background: var(--ind); }
.ind-hero h1 { font-family: var(--pub-display); font-weight: 380; letter-spacing: -0.02em; line-height: 1.08;
  font-size: clamp(34px, 4.6vw, 52px); margin: 0 0 18px; text-wrap: balance; }
.ind-lede { font-size: 18px; line-height: 1.6; color: var(--ink-soft); max-width: 40ch; }
.ind-hero-cta { display: flex; gap: 12px; margin-top: 26px; flex-wrap: wrap; }
.ind-hero-meta { display: flex; gap: 18px; margin-top: 20px; flex-wrap: wrap; font-size: 14px; color: var(--ink-faint); }
.ind-hero-meta span { display: inline-flex; align-items: center; gap: 6px; }
.ind-hero-meta svg { color: var(--ind); }

/* Problem band (shared shell; per-industry restyle) */
.ind-problem { padding: 56px 0; background: var(--surface-2); border-block: 1px solid var(--border); }
.ind-problem-head { max-width: 60ch; margin-bottom: 32px; }
.ind-problem-head h2 { font-family: var(--pub-display); font-weight: 400; letter-spacing: -0.015em;
  font-size: clamp(26px, 3.4vw, 36px); line-height: 1.12; margin: 0 0 12px; text-wrap: balance; }
.ind-problem-grid { display: grid; grid-template-columns: repeat(auto-fit, minmax(240px, 1fr)); gap: 18px; }
.ind-prob { background: var(--surface); border: 1px solid var(--border); border-radius: 14px; padding: 22px; }
.ind-prob-stat { font-family: var(--pub-display); font-weight: 400; font-size: 30px; letter-spacing: -0.02em;
  color: var(--ind); line-height: 1; margin-bottom: 10px; }
.ind-prob h3 { font-size: 16px; font-weight: 650; margin: 0 0 6px; letter-spacing: -0.01em; }
.ind-prob p { font-size: 14.5px; line-height: 1.55; color: var(--ink-soft); margin: 0; }
/* Source attribution for a stat card. Small, muted, sits under the body copy. A cited number links
   to the primary source; an uncited/qualitative card omits this line entirely. */
.ind-prob-cite { display: block; margin-top: 10px; font-size: 12px; line-height: 1.4; color: var(--ink-faint, var(--ink-soft)); }
.ind-prob-cite a { color: inherit; text-decoration: underline; text-underline-offset: 2px; }
.ind-prob-cite a:hover { color: var(--ind); }

/* Solution rows (alternating text / mock) */
.ind-solves { padding: 62px 0; }
.ind-solves-head { text-align: center; max-width: 40ch; margin: 0 auto 44px; }
.ind-solves-head h2 { font-family: var(--pub-display); font-weight: 400; letter-spacing: -0.015em;
  font-size: clamp(26px, 3.4vw, 38px); line-height: 1.12; margin: 0; text-wrap: balance; }
.ind-row { display: grid; grid-template-columns: 1fr 1fr; gap: 44px; align-items: center; padding: 30px 0; }
.ind-row:nth-child(even) .ind-row-copy { order: 2; }
.ind-row-copy h3 { font-size: 22px; font-weight: 640; letter-spacing: -0.015em; margin: 0 0 12px; }
.ind-row-copy > p { font-size: 16px; line-height: 1.6; color: var(--ink-soft); margin: 0 0 16px; }
.ind-ticks { list-style: none; margin: 0 0 18px; padding: 0; display: flex; flex-direction: column; gap: 9px; }
.ind-ticks li { display: flex; gap: 9px; align-items: flex-start; font-size: 15px; color: var(--ink); }
.ind-ticks svg { color: var(--ind); flex: none; margin-top: 3px; }
.ind-row-vis { background: color-mix(in srgb, var(--ind) 7%, var(--surface)); border: 1px solid var(--border);
  border-radius: 18px; height: 260px; display: block; padding: 0; overflow: hidden;
  /* --pr-accent + --pr-a + --a are ALL consumed by the .hm mock animations (checkbox fills,
     bars, ticks). The product pages set --a on .pr-card-wide; set them here too so the mocks
     render in full colour instead of a faint skeleton. */
  --pr-accent: var(--ind); --accent: var(--ind); --pr-a: var(--ind); --a: var(--ind); }
/* The hero-mock (.hm) is position:absolute inset:0 - it needs a sized, positioned parent.
   Give it one directly inside .ind-row-vis so the animated preview fills the tile. */
.ind-row-vis > .hm { position: absolute; }
.ind-row-vis { position: relative; }

/* Competitor / wedge band */
.ind-wedge { padding: 58px 0; background: var(--ind-ink, #0b1220); color: #eef1f8; }
.ind-wedge h2 { font-family: var(--pub-display); font-weight: 400; color: #fff; font-size: clamp(26px, 3.4vw, 36px);
  letter-spacing: -0.015em; margin: 0 0 14px; text-wrap: balance; max-width: 22ch; }
.ind-wedge-lede { font-size: 17px; line-height: 1.6; color: #b9c2d6; max-width: 54ch; margin: 0 0 30px; }
.ind-wedge-cols { display: grid; grid-template-columns: 1fr 1fr; gap: 18px; }
.ind-wedge-card { border-radius: 14px; padding: 22px; border: 1px solid rgba(255,255,255,.12); }
.ind-wedge-card.them { background: rgba(255,255,255,.03); }
.ind-wedge-card.us { background: color-mix(in srgb, var(--ind) 20%, #0b1220); border-color: color-mix(in srgb, var(--ind) 45%, transparent); }
.ind-wedge-card h3 { font-size: 15px; font-weight: 700; margin: 0 0 12px; letter-spacing: .01em; }
.ind-wedge-card.them h3 { color: #9aa6bd; }
.ind-wedge-card.us h3 { color: #fff; }
.ind-wedge-list { list-style: none; margin: 0; padding: 0; display: flex; flex-direction: column; gap: 10px; }
.ind-wedge-list li { display: flex; gap: 9px; font-size: 14.5px; line-height: 1.5; color: #cdd5e6; }
.ind-wedge-card.us .ind-wedge-list li { color: #eef1f8; }
.ind-wedge-list svg { flex: none; margin-top: 3px; }
.ind-wedge-card.them .ind-wedge-list svg { color: #6b7690; }
.ind-wedge-card.us .ind-wedge-list svg { color: var(--ind); }

/* Index (all industries) grid */
.ind-index-hero { padding: 64px 0 30px; text-align: center; }
.ind-index-hero h1 { font-family: var(--pub-display); font-weight: 380; letter-spacing: -0.02em;
  font-size: clamp(34px, 5vw, 54px); line-height: 1.06; margin: 0 auto 16px; max-width: 16ch; text-wrap: balance; }
.ind-index-hero .ind-lede { margin: 0 auto; text-align: center; max-width: 56ch; }
.ind-cards { display: grid; grid-template-columns: repeat(auto-fit, minmax(260px, 1fr)); gap: 18px; padding: 20px 0 70px; }
.ind-card { display: block; text-decoration: none; border: 1px solid var(--border); border-radius: 16px;
  padding: 26px; background: var(--surface); transition: border-color .14s, transform .14s; position: relative; overflow: hidden; }
.ind-card::before { content: ""; position: absolute; inset: 0 auto 0 0; width: 4px; background: var(--ind-c, var(--accent)); }
.ind-card:hover { border-color: var(--ind-c, var(--accent)); transform: translateY(-2px); text-decoration: none; }
.ind-card-name { font-size: 19px; font-weight: 650; letter-spacing: -0.01em; margin: 0 0 6px; color: var(--ink); }
.ind-card-hook { font-size: 14.5px; color: var(--ink-soft); margin: 0 0 14px; }
.ind-card-go { font-size: 14px; font-weight: 650; color: var(--ind-c, var(--accent)); }
.ind-card-c-saas { --ind-c: #6d5efc; } .ind-card-c-fintech { --ind-c: #1f6feb; }
.ind-card-c-ecommerce { --ind-c: #f0653e; } .ind-card-c-developer-tools { --ind-c: #16a34a; }
.ind-card-c-healthcare { --ind-c: #12a5a5; }
.ind-card-c-edtech { --ind-c: #d97706; } .ind-card-c-collaboration { --ind-c: #7c5cff; }
.ind-card-c-marketing { --ind-c: #db2777; }

@media (max-width: 860px) {
  .ind-hero-grid, .ind-row { grid-template-columns: 1fr; }
  .ind-row:nth-child(even) .ind-row-copy { order: 0; }
  .ind-wedge-cols { grid-template-columns: 1fr; }
}

/* ---- Hero visual container (shared) ---- */
.ind-hero-vis { position: relative; min-height: 340px; display: grid; place-items: center; overflow: visible; }

/* ==== SaaS hero scene: a product app with a getting-started checklist launcher ==== */
.saas-scene { position: relative; width: 100%; max-width: 420px; padding-bottom: 96px; }
.saas-app { background: var(--surface); border: 1px solid var(--border); border-radius: 14px; overflow: hidden;
  box-shadow: 0 18px 50px -22px color-mix(in srgb, var(--ind) 55%, transparent); }
.saas-topbar { display: flex; align-items: center; gap: 6px; padding: 10px 12px; border-bottom: 1px solid var(--border);
  background: color-mix(in srgb, var(--ind) 4%, var(--surface)); }
.saas-dot { width: 8px; height: 8px; border-radius: 50%; background: color-mix(in srgb, var(--ind) 30%, var(--border)); }
.saas-url { flex: 1; height: 10px; border-radius: 5px; margin-left: 8px; background: var(--surface-2); }
.saas-body { display: grid; grid-template-columns: 44px 1fr; gap: 0; }
.saas-side { padding: 14px 10px; display: flex; flex-direction: column; gap: 10px; border-right: 1px solid var(--border); }
.saas-side i { height: 8px; border-radius: 4px; background: var(--surface-2); }
.saas-side i.on { background: var(--ind); }
.saas-main { padding: 16px; display: flex; flex-direction: column; gap: 12px; }
.saas-h { height: 14px; width: 55%; border-radius: 6px; background: color-mix(in srgb, var(--ink) 22%, var(--surface-2)); }
.saas-cards { display: grid; grid-template-columns: repeat(3,1fr); gap: 8px; }
.saas-cards > span:not(.saas-spot) { height: 40px; border-radius: 8px; background: var(--surface-2); border: 1px solid var(--border); }
.saas-block { height: 74px; border-radius: 8px; background: var(--surface-2); border: 1px solid var(--border); }
/* the launcher panel floats over the app's lower-right */
.saas-launcher { position: absolute; right: -12px; bottom: 0; width: 232px; background: var(--surface);
  border: 1px solid var(--border); border-radius: 14px; padding: 14px; z-index: 2;
  box-shadow: 0 24px 50px -16px color-mix(in srgb, var(--ind) 40%, rgba(0,0,0,.5));
  animation: saas-rise .7s ease both .3s; }
@keyframes saas-rise { from { opacity: 0; transform: translateY(14px); } to { opacity: 1; transform: none; } }
.saas-lc-head { display: flex; justify-content: space-between; align-items: baseline; margin-bottom: 8px; }
.saas-lc-head b { font-size: 14px; font-weight: 650; color: var(--ink); }
.saas-lc-count { font-size: 12px; color: var(--ink-faint); font-weight: 600; }
.saas-lc-bar { height: 5px; border-radius: 3px; background: var(--surface-2); overflow: hidden; margin-bottom: 12px; }
.saas-lc-bar i { display: block; height: 100%; width: 40%; background: var(--ind); border-radius: 3px; animation: saas-fill 1.2s ease both .6s; }
@keyframes saas-fill { from { width: 0; } to { width: 40%; } }
.saas-lc-item { display: flex; align-items: center; gap: 9px; font-size: 13px; color: var(--ink); padding: 5px 0; }
.saas-lc-item.done { color: var(--ink-faint); text-decoration: line-through; }
.saas-lc-check { width: 18px; height: 18px; border-radius: 50%; background: var(--ind); color: #fff; flex: none;
  display: grid; place-items: center; }
.saas-lc-check svg { width: 11px; height: 11px; }
.saas-lc-ring { width: 18px; height: 18px; border-radius: 50%; border: 2px solid var(--border); flex: none; }
@media (max-width: 860px) { .saas-launcher { position: static; width: auto; margin-top: 16px; animation: none; } }

/* ==== Fintech hero scene: a phone with a verification checklist + a trust tooltip ==== */
.fin-scene { position: relative; width: 100%; max-width: 300px; padding: 8px 0; }
/* A phone with a light, thin device edge (not a heavy black frame) + a Dynamic-Island pill. */
.fin-phone { width: 264px; margin: 0 auto; position: relative;
  background: var(--surface); padding: 7px; border: 1px solid var(--border);
  border-radius: 44px; box-shadow: 0 30px 70px -24px color-mix(in srgb, var(--ind) 55%, rgba(0,0,0,.5)); }
.fin-phone-screen { position: relative; background: var(--surface); border-radius: 38px; padding: 0 0 18px; overflow: hidden; min-height: 448px;
  box-shadow: inset 0 0 0 1px color-mix(in srgb, var(--ind) 8%, var(--border)); }
/* the Dynamic-Island pill, floated over the status bar, centered, not overlapping the time. */
.fin-notch { position: absolute; top: 12px; left: 50%; transform: translateX(-50%); width: 74px; height: 20px;
  background: #10151f; border-radius: 11px; z-index: 4; }
/* iOS-style status bar (time left, icons right; the island sits between them) */
.fin-status { display: flex; align-items: center; justify-content: space-between; padding: 14px 22px 8px; position: relative; z-index: 2; }
.fin-status-time { font-size: 12px; font-weight: 700; color: var(--ink); }
.fin-status-ic { display: inline-flex; align-items: center; gap: 5px; color: var(--ink); }
.fin-batt { display: inline-block; width: 20px; height: 11px; border: 1.4px solid var(--ink); border-radius: 3px; position: relative; padding: 1.5px; }
.fin-batt::after { content: ""; position: absolute; right: -3px; top: 3px; width: 2px; height: 4px; background: var(--ink); border-radius: 0 2px 2px 0; }
.fin-batt i { display: block; width: 72%; height: 100%; background: var(--ind); border-radius: 1px; }
/* the screen content sits below the status bar with side padding */
.fin-vh, .fin-upload, .fin-idrow { margin-left: 16px; margin-right: 16px; }
.fin-vh { margin-top: 6px; }
.fin-h { display: flex; justify-content: space-between; align-items: baseline; margin-bottom: 10px; }
.fin-h b { font-size: 14px; font-weight: 700; color: var(--ink); }
.fin-h span { font-size: 11px; color: var(--ink-faint); font-weight: 600; }
.fin-bar { height: 5px; border-radius: 3px; background: var(--surface-2); overflow: hidden; margin-bottom: 14px; }
.fin-bar i { display: block; height: 100%; width: 60%; background: var(--ind); border-radius: 3px; animation: fin-fill 1.3s ease both .5s; }
@keyframes fin-fill { from { width: 0; } to { width: 60%; } }
.fin-step { display: flex; align-items: center; gap: 9px; font-size: 12.5px; color: var(--ink); padding: 7px 0; }
.fin-step.done { color: var(--ink-faint); }
.fin-step.done span.fin-ck ~ * { text-decoration: line-through; }
.fin-ck { width: 18px; height: 18px; border-radius: 50%; background: var(--ind); color: #fff; flex: none; display: grid; place-items: center; }
.fin-ck svg { width: 11px; height: 11px; }
.fin-ring { width: 18px; height: 18px; border-radius: 50%; border: 2px solid var(--border); flex: none; }
.fin-step.active .fin-ring { border-color: var(--ind); box-shadow: 0 0 0 3px color-mix(in srgb, var(--ind) 18%, transparent); }
.fin-step.active { font-weight: 600; }
/* the reassurance tooltip floats over the phone's lower-left */
.fin-tip { position: absolute; left: -20px; bottom: 24px; max-width: 200px; display: flex; gap: 8px; align-items: center;
  background: var(--ind-ink, #0b1f3a); color: #eaf1ff; font-size: 12px; line-height: 1.35; padding: 9px 12px; border-radius: 10px;
  box-shadow: 0 14px 34px -12px rgba(0,0,0,.5); animation: fin-rise .7s ease both .8s; }
.fin-tip-ico { color: color-mix(in srgb, var(--ind) 60%, #7fd4ff); flex: none; }
@keyframes fin-rise { from { opacity: 0; transform: translateY(10px); } to { opacity: 1; transform: none; } }
@media (max-width: 860px) { .fin-tip { position: static; max-width: none; margin: 14px auto 0; animation: none; } }

/* ==== E-commerce hero scene: a single storefront card - top banner, product, promo field ==== */
.ecom-scene { position: relative; width: 100%; max-width: 300px; margin: 0 auto; }
.ecom-store { background: var(--surface); border: 1px solid var(--border); border-radius: 18px; overflow: hidden;
  box-shadow: 0 26px 60px -24px color-mix(in srgb, var(--ind) 55%, rgba(0,0,0,.4)); }
/* the free-shipping banner sits as a strip across the very top of the card */
.ecom-banner { background: var(--ind); color: #fff; font-size: 11.5px; font-weight: 650; text-align: center;
  line-height: 1.35; padding: 9px 14px; }
.ecom-store-img { height: 118px; position: relative; overflow: hidden;
  background: linear-gradient(135deg, color-mix(in srgb, var(--ind) 88%, #fff), color-mix(in srgb, var(--ind) 52%, #ffb894)); }
.ecom-store-tag { position: absolute; top: 12px; left: 12px; z-index: 2; font-size: 9px; font-weight: 800; letter-spacing: .08em;
  color: var(--ind); background: #fff; padding: 4px 8px; border-radius: 6px; }
/* a soft product silhouette (a bottle/box shape) so the image area reads as a real product */
.ecom-prod { position: absolute; left: 50%; bottom: -12px; transform: translateX(-50%); width: 58px; height: 84px;
  background: rgba(255,255,255,.9); border-radius: 14px 14px 8px 8px; box-shadow: 0 10px 26px -8px rgba(0,0,0,.25); }
.ecom-prod::before { content: ""; position: absolute; left: 50%; top: -9px; transform: translateX(-50%);
  width: 20px; height: 14px; background: rgba(255,255,255,.9); border-radius: 5px 5px 0 0; }
.ecom-prod::after { content: ""; position: absolute; left: 10px; right: 10px; top: 22px; height: 22px;
  background: color-mix(in srgb, var(--ind) 30%, #fff); border-radius: 5px; }
.ecom-store-body { padding: 14px; }
.ecom-store-info { display: flex; justify-content: space-between; align-items: center; margin-bottom: 12px; }
.ecom-store-title { width: 52%; height: 9px; border-radius: 5px; background: color-mix(in srgb, var(--ink) 22%, var(--surface-2)); }
.ecom-store-price { display: flex; align-items: baseline; gap: 7px; }
.ecom-store-price b { font-size: 18px; font-weight: 700; color: var(--ind); }
.ecom-store-price s { width: 24px; height: 8px; border-radius: 4px; background: var(--surface-2); }
/* the promo field is highlighted (the thing the tooltip points at) */
.ecom-promo-wrap { position: relative; }
.ecom-promo { display: flex; align-items: center; gap: 9px; padding: 10px 11px; border-radius: 10px;
  border: 1.5px solid var(--ind); background: color-mix(in srgb, var(--ind) 7%, var(--surface));
  box-shadow: 0 0 0 3px color-mix(in srgb, var(--ind) 14%, transparent); }
.ecom-promo-lbl { font-size: 11.5px; color: var(--ink-soft); font-weight: 600; }
.ecom-promo-in { flex: 1; height: 8px; border-radius: 4px; background: var(--surface-2); }
.ecom-store-buy { display: flex; align-items: center; justify-content: center; gap: 8px; margin-top: 14px;
  background: var(--ind); color: #fff; border-radius: 10px; padding: 12px; font-size: 13px; font-weight: 650; }
.ecom-store-buy svg { flex: none; }

/* E-commerce hero: Onbixo announcement OVER the storefront. The store is the dimmed
   BACKDROP (banner hidden, product image taller so more shows behind); a Onbixo
   announcement card floats OVER it with a real "Apply code" action CTA, sliding up + fading in. */
.ne-overlay { position: relative; width: 300px; margin: 0 auto; }
.ne-appback { filter: brightness(.96) saturate(.96); }
.ne-appback .ecom-banner { display: none; }
.ne-appback .ecom-store-img { height: 220px; }
.ne-appback .ecom-store-body { padding: 18px 14px 20px; }
.ne-appback .ecom-promo-wrap { margin: 14px 0; }
.ne-overlay::before { content: ""; position: absolute; inset: 0; border-radius: 18px;
  background: rgba(11,18,32,.28); z-index: 1; pointer-events: none; }
.ne-ann { position: absolute; left: 50%; top: 50%; transform: translate(-50%,-50%); z-index: 2;
  width: 256px; background: #fff; border-radius: 14px; padding: 16px 16px 13px;
  box-shadow: 0 30px 60px -18px rgba(11,18,32,.55), 0 0 0 1px rgba(15,25,45,.05); }
.ne-ann-x { position: absolute; top: 9px; right: 12px; font-size: 17px; line-height: 1; color: #9aa6b8; }
.ne-ann-badge { display: inline-block; font-size: 9.5px; font-weight: 800; letter-spacing: .05em; color: #fff;
  background: var(--ind); border-radius: 999px; padding: 3px 9px; margin-bottom: 9px; }
.ne-ann-h { font-size: 16px; font-weight: 800; color: #0b1220; letter-spacing: -.01em; line-height: 1.2; padding-right: 12px; }
.ne-ann-body { font-size: 12.5px; color: #64748b; line-height: 1.5; margin: 7px 0 14px; }
.ne-ann-body b { color: var(--ind); }
.ne-ann-foot { display: flex; align-items: center; }
.ne-ann-cta { margin-left: auto; font-size: 13px; font-weight: 600; color: #fff;
  background: var(--ind); border-radius: 8px; padding: 7px 14px; }
@media (prefers-reduced-motion: no-preference) {
  .ne-ann { animation: ne-ann-in .5s cubic-bezier(.2,.7,.3,1) both; }
}
@keyframes ne-ann-in {
  from { opacity: 0; transform: translate(-50%, calc(-50% + 22px)); }
  to   { opacity: 1; transform: translate(-50%, -50%); }
}

/* ==== Developer tools: a DARK hero (distinct from the other light pages) with a terminal ==== */
/* The dev page leads dark: the hero section itself gets a near-black ground + light text. */
.public-body.ind-developer-tools .ind-hero { background: #0c1322; color: #e6edf7; }
.public-body.ind-developer-tools .ind-hero h1 { color: #fff; }
.public-body.ind-developer-tools .ind-hero .ind-lede { color: #aeb9cf; }
.public-body.ind-developer-tools .ind-hero .ind-eyebrow { color: #4ade80; }
.public-body.ind-developer-tools .ind-hero .ind-eyebrow::before { background: #4ade80; }
.public-body.ind-developer-tools .ind-hero .ind-hero-meta { color: #8593ad; }
.public-body.ind-developer-tools .ind-hero .pub-btn-ghost { background: transparent; color: #e6edf7; border-color: rgba(255,255,255,.2); }
.public-body.ind-developer-tools .ind-hero .pub-btn-ghost:hover { border-color: var(--ind); color: var(--ind); }

.dev-scene { position: relative; width: 100%; max-width: 440px; }
.dev-term { background: #0a0f1a; border: 1px solid #1e2a3d; border-radius: 12px; overflow: hidden; font-family: ui-monospace, SFMono-Regular, Menlo, monospace;
  box-shadow: 0 26px 60px -22px rgba(0,0,0,.7); }
.dev-term-bar { display: flex; align-items: center; gap: 6px; padding: 9px 12px; background: #111a29; border-bottom: 1px solid #1e2a3d; }
.dev-term-bar span { width: 9px; height: 9px; border-radius: 50%; background: #2a3a52; }
.dev-term-bar span:nth-child(1){ background:#ff5f57 } .dev-term-bar span:nth-child(2){ background:#febc2e } .dev-term-bar span:nth-child(3){ background:#28c840 }
.dev-term-bar em { margin-left: auto; font-style: normal; font-size: 11px; color: #5a6b85; }
.dev-term-body { padding: 14px; font-size: 12px; line-height: 1.7; color: #cdd6e6; }
.dev-term-body p { margin: 0; white-space: nowrap; }
.dev-pr { color: #4ade80; margin-right: 6px; }
.dev-str { color: #7dd3fc; }
.dev-ok, .dev-ok2 { color: #4ade80; }
.dev-key { color: #fbbf24; }
.dev-json { color: #94a3b8; }
.dev-k { color: #7dd3fc; }
.dev-cur { display: inline-block; width: 2px; height: 13px; background: #4ade80; margin-left: 2px; vertical-align: text-top; animation: dev-blink 1s steps(1) infinite; }
@keyframes dev-blink { 50% { opacity: 0; } }
/* the quickstart checklist floats over the terminal's lower-right, in the dark theme */
.dev-checklist { position: absolute; right: -14px; bottom: -20px; width: 224px; background: #111a29; border: 1px solid #24344c;
  border-radius: 12px; padding: 13px; box-shadow: 0 22px 50px -18px rgba(0,0,0,.7); animation: saas-rise .7s ease both .4s; z-index: 2; }
.dev-cl-h b { font-size: 13px; font-weight: 650; color: #fff; }
.dev-cl-h { margin-bottom: 8px; }
.dev-cl-item { display: flex; align-items: center; gap: 8px; font-size: 12px; color: #cdd6e6; padding: 5px 0; }
.dev-cl-item.done { color: #6b7a94; text-decoration: line-through; }
.dev-cl-item.active { color: #fff; font-weight: 600; }
.dev-ck { width: 16px; height: 16px; border-radius: 50%; background: #34d399; color: #062018; flex: none; display: grid; place-items: center; }
.dev-ck svg { width: 10px; height: 10px; }
.dev-ring { width: 16px; height: 16px; border-radius: 50%; border: 2px solid #33455f; flex: none; }
.dev-cl-item.active .dev-ring { border-color: #34d399; box-shadow: 0 0 0 3px rgba(52,211,153,.18); }
@media (max-width: 860px) { .dev-checklist { position: static; width: auto; margin-top: 16px; animation: none; } .dev-term-body p { white-space: normal; } }

/* ==== Healthcare hero scene: a calm patient-portal welcome card + gentle checklist ==== */
.health-scene { width: 100%; max-width: 340px; margin: 0 auto; }
.health-card { background: var(--surface); border: 1px solid var(--border); border-radius: 18px; padding: 20px;
  box-shadow: 0 22px 54px -22px color-mix(in srgb, var(--ind) 45%, transparent); }
.health-hd { display: flex; align-items: center; gap: 12px; margin-bottom: 14px; }
.health-avatar { width: 40px; height: 40px; border-radius: 50%; flex: none;
  display: grid; place-items: center; font-size: 14px; font-weight: 650; letter-spacing: .5px; color: #fff;
  background: linear-gradient(135deg, color-mix(in srgb, var(--ind) 70%, #fff), color-mix(in srgb, var(--ind) 40%, #8ad0d0)); }
.health-hd b { display: block; font-size: 15px; font-weight: 650; color: var(--ink); }
.health-hd i { font-style: normal; font-size: 12.5px; color: var(--ink-faint); }
.health-note { display: flex; gap: 8px; align-items: center; font-size: 12.5px; line-height: 1.4; color: var(--ink-soft);
  background: color-mix(in srgb, var(--ind) 8%, var(--surface)); border-radius: 10px; padding: 10px 12px; margin-bottom: 14px; }
.health-note-ic { color: var(--ind); flex: none; }
.health-step { display: flex; align-items: center; gap: 10px; font-size: 13.5px; color: var(--ink); padding: 8px 0; }
.health-step.done { color: var(--ink-faint); }
.health-step.done .health-ck ~ * { text-decoration: line-through; }
.health-ck { width: 20px; height: 20px; border-radius: 50%; background: var(--ind); color: #fff; flex: none; display: grid; place-items: center; }
.health-ck svg { width: 12px; height: 12px; }
.health-ring { width: 20px; height: 20px; border-radius: 50%; border: 2px solid var(--border); flex: none; }
.health-step.active { font-weight: 600; }
.health-step.active .health-ring { border-color: var(--ind); box-shadow: 0 0 0 3px color-mix(in srgb, var(--ind) 16%, transparent); }
/* healthcare wedge disclaimer note */
.ind-wedge-note { margin: 22px 0 0; font-size: 12.5px; line-height: 1.5; color: #8894ab; max-width: 70ch; }
.ind-eyebrow-center { justify-content: center; }

/* Fintech hero (redesigned): an identity-verification screen with an in-context tooltip. */
.fin-vh { display: flex; flex-direction: column; gap: 2px; margin-bottom: 14px; }
.fin-vh b { font-size: 15px; font-weight: 700; color: var(--ink); }
.fin-vh i { font-style: normal; font-size: 12px; color: var(--ind); font-weight: 600; }
.fin-upload { border: 1.5px dashed color-mix(in srgb, var(--ind) 40%, var(--border)); border-radius: 14px;
  padding: 18px 14px; display: flex; flex-direction: column; align-items: center; gap: 9px; text-align: center;
  background: color-mix(in srgb, var(--ind) 5%, var(--surface)); }
.fin-upload-ic { color: var(--ind); }
.fin-upload-t { font-size: 12.5px; color: var(--ink-soft); }
.fin-upload-b { font-size: 12px; font-weight: 650; color: #fff; background: var(--ind); border-radius: 8px; padding: 7px 14px; }
.fin-idrow { display: flex; align-items: center; gap: 10px; margin-top: 12px; padding: 9px 10px; border: 1px solid var(--border);
  border-radius: 10px; background: var(--surface); }
.fin-id-thumb { width: 34px; height: 24px; border-radius: 4px; flex: none;
  background: linear-gradient(135deg, color-mix(in srgb, var(--ind) 55%, #fff), color-mix(in srgb, var(--ind) 30%, #7fd4ff)); }
.fin-id-meta { flex: 1; display: flex; flex-direction: column; gap: 5px; }
.fin-id-meta i { height: 6px; border-radius: 3px; background: var(--surface-2); }
.fin-id-meta i.s { width: 55%; }
.fin-id-ok { width: 18px; height: 18px; border-radius: 50%; background: var(--good, #2e9e6b); color: #fff; flex: none; display: grid; place-items: center; }
.fin-id-ok svg { width: 11px; height: 11px; }
.fin-upload { position: relative; }

/* Fintech hero: Onbixo checklist launcher OVER the app. The verification phone is the
   BACKDROP (dimmed so it recedes); a Onbixo checklist launcher panel + pill float OVER it,
   clearly our guidance layer. Entry: the pill pops in, then the panel opens up from it. */
.nf-overlay { position: relative; width: 264px; margin: 0 auto; }
.nf-appback { filter: saturate(.95); }
.nf-appback .fin-phone-screen { filter: brightness(.97); }
.nf-overlay::before { content: ""; position: absolute; inset: 0; border-radius: 38px;
  background: rgba(11,18,32,.14); z-index: 1; pointer-events: none; }
.nf-launcher { position: absolute; right: -18px; bottom: 44px; z-index: 2; width: 210px;
  background: #fff; border-radius: 14px; padding: 13px 14px; transform-origin: bottom right;
  box-shadow: 0 24px 50px -16px rgba(11,31,58,.5), 0 0 0 1px rgba(15,25,45,.06); }
.nf-lch-h { display: flex; align-items: center; justify-content: space-between; margin-bottom: 10px; }
.nf-lch-h b { font-size: 13px; font-weight: 750; color: #0b1220; }
.nf-lch-badge { font-size: 9px; font-weight: 700; letter-spacing: .03em; color: var(--ind);
  background: color-mix(in srgb, var(--ind) 12%, #fff); border-radius: 999px; padding: 3px 7px; }
.nf-lch-item { display: flex; align-items: center; gap: 9px; font-size: 12.5px; color: #0b1220; padding: 4px 0; }
.nf-lch-item.done { color: #9aa6b8; }
.nf-lch-item.done .nf-lch-ck ~ * { text-decoration: line-through; }
.nf-lch-item.active { font-weight: 650; }
.nf-lch-ck { width: 18px; height: 18px; border-radius: 50%; flex: none; display: grid; place-items: center; background: #2e9e6b; color: #fff; }
.nf-lch-ck svg { width: 11px; height: 11px; }
.nf-lch-ring { width: 18px; height: 18px; border-radius: 50%; flex: none; border: 2px solid #d5dbe6; box-sizing: border-box; }
.nf-lch-item.active .nf-lch-ring { border-color: var(--ind); box-shadow: 0 0 0 3px color-mix(in srgb, var(--ind) 16%, transparent); }
.nf-pill { position: absolute; right: -14px; bottom: -8px; z-index: 3; width: 42px; height: 42px; border-radius: 50%;
  background: var(--ind); display: grid; place-items: center;
  box-shadow: 0 14px 30px -8px color-mix(in srgb, var(--ind) 60%, rgba(0,0,0,.4)); }
@media (prefers-reduced-motion: no-preference) {
  .nf-pill { animation: nf-pill-in .32s cubic-bezier(.2,.8,.3,1.2) both; }
  .nf-launcher { animation: nf-lch-in .42s cubic-bezier(.2,.7,.3,1) both .22s; }
}
@keyframes nf-pill-in { from { opacity: 0; transform: scale(.4); } to { opacity: 1; transform: scale(1); } }
@keyframes nf-lch-in { from { opacity: 0; transform: translateY(14px) scale(.94); } to { opacity: 1; transform: translateY(0) scale(1); } }

/* Healthcare hero (redesigned): a portal home with a 2x2 tile grid + ONE coach-mark tooltip. */
.health-tiles { display: grid; grid-template-columns: 1fr 1fr; gap: 10px; margin-top: 4px; }
.health-tile { display: flex; flex-direction: column; align-items: center; gap: 7px; padding: 16px 10px;
  border: 1px solid var(--border); border-radius: 12px; background: var(--surface); font-size: 12.5px; color: var(--ink-soft); }
.health-tile-ic { color: var(--ind); }
.health-tile-hl { border-color: var(--ind); background: color-mix(in srgb, var(--ind) 8%, var(--surface));
  box-shadow: 0 0 0 3px color-mix(in srgb, var(--ind) 14%, transparent); color: var(--ink); font-weight: 600; }
.health-tile-hl .health-tile-ic { color: var(--ind); }
/* the single gentle coach-mark below the highlighted tile */
.health-coach { position: absolute; right: 6px; bottom: -16px; width: 230px; background: var(--ind); color: #fff;
  border-radius: 12px; padding: 13px 14px; box-shadow: 0 20px 44px -16px color-mix(in srgb, var(--ind) 60%, rgba(0,0,0,.5));
  animation: fin-rise .7s ease both .7s; }
.health-coach-t { display: block; font-size: 12.5px; line-height: 1.45; margin-bottom: 10px; }
.health-coach-b { display: inline-block; font-size: 12px; font-weight: 650; color: var(--ind); background: #fff; border-radius: 7px; padding: 5px 12px; }
.health-coach::before { content: ""; position: absolute; left: 40px; top: -6px; border: 6px solid transparent; border-bottom-color: var(--ind); }
@media (max-width: 860px) { .health-coach { position: static; width: auto; margin: 16px auto 0; animation: none; } .health-coach::before { display: none; } }


/* SaaS hero (tour version): a spotlighted element + dim overlay + a coach-mark tooltip. */
.saas-app { position: relative; }
/* The SaaS tour coach-mark hangs below the spotlighted button, past the app's bottom edge,
   so this app must NOT clip its overflow (the base .saas-app has overflow:hidden). The inner
   content still fits within the rounded frame, so only the intentional tip overhang shows. */
.ind-hero-saas .saas-app { overflow: visible; }
.saas-body { position: relative; }
/* No overlay dim (it fought the stacking context). Instead the non-spotlight chrome is faded
   directly, so the spotlighted button + coach naturally read as the tour's focus. */
.saas-dim { display: none; }
.ind-hero-saas .saas-side i,
.ind-hero-saas .saas-h,
.ind-hero-saas .saas-cards > span:not(.saas-spot),
.ind-hero-saas .saas-block { opacity: .4; }
.saas-cards { position: relative; z-index: 2; }
.saas-block { position: relative; z-index: 0; }
.saas-cards .saas-spot { position: relative; z-index: 2; height: 40px; border-radius: 8px; background: var(--ind); color: #fff; display: grid; place-items: center;
  box-shadow: 0 0 0 4px color-mix(in srgb, var(--ind) 35%, transparent), 0 12px 26px -10px color-mix(in srgb, var(--ind) 70%, transparent);
  animation: saas-pulse 2s ease-in-out infinite; }
.saas-cards .saas-spot em { font-style: normal; font-size: 10.5px; font-weight: 700; letter-spacing: -.01em; }
@keyframes saas-pulse { 0%,100% { box-shadow: 0 0 0 4px color-mix(in srgb, var(--ind) 35%, transparent), 0 12px 26px -10px color-mix(in srgb, var(--ind) 70%, transparent); }
  50% { box-shadow: 0 0 0 7px color-mix(in srgb, var(--ind) 20%, transparent), 0 12px 26px -10px color-mix(in srgb, var(--ind) 70%, transparent); } }
/* the coach-mark card, pointing up at the spotlight */
/* the coach-mark lives inside .saas-body (same stacking context as the dim + spotlight, z:4),
   anchored under the spotlighted button, arrow pointing up at it. It overflows the app's
   bottom edge, so the app must NOT clip it - handled by .ind-hero-saas .saas-app below. */
.ind-hero-saas .ind-hero-vis { position: relative; }
.saas-coach { position: absolute; right: 4px; bottom: 20px; width: 232px; background: var(--surface); border: 1px solid var(--border);
  border-radius: 14px; padding: 14px; z-index: 5; box-shadow: 0 24px 50px -16px color-mix(in srgb, var(--ind) 40%, rgba(0,0,0,.5));
  animation: saas-rise .7s ease both .4s; }
.saas-coach::before { content: ""; position: absolute; right: 36px; top: -7px; width: 12px; height: 12px; background: var(--surface);
  border-left: 1px solid var(--border); border-top: 1px solid var(--border); transform: rotate(45deg); }
.saas-coach-t b { display: block; font-size: 14px; font-weight: 650; color: var(--ink); margin-bottom: 4px; }
.saas-coach-t span { display: block; font-size: 12.5px; line-height: 1.45; color: var(--ink-soft); }
.saas-coach-foot { display: flex; align-items: center; justify-content: space-between; margin-top: 12px; }
.saas-coach-step { font-size: 11.5px; color: var(--ink-faint); font-weight: 600; }
.saas-coach-btns { display: inline-flex; gap: 6px; }
.saas-coach-btns i { font-style: normal; font-size: 11.5px; font-weight: 650; border-radius: 7px; padding: 5px 11px; }
.saas-coach-btns .ghost { color: var(--ink-soft); border: 1px solid var(--border); }
.saas-coach-btns .solid { color: #fff; background: var(--ind); }
@media (max-width: 860px) { .saas-coach { position: static; width: auto; margin-top: 16px; animation: none; } .saas-coach::before { display: none; } .saas-dim { display: none; } }

/* a small tour step-tip attached to the spotlighted button (inline child - always paints). */
.saas-cards .saas-spot { overflow: visible; z-index: 3; }
/* a full tour coach-mark card attached to the spotlight (title + body + progress + Back/Next). */
.saas-tip { position: absolute; top: calc(100% + 10px); right: 0; width: 208px; display: flex; flex-direction: column; gap: 7px;
  background: var(--surface); border: 1px solid var(--border); border-radius: 12px; padding: 13px 14px; z-index: 3; text-align: left;
  box-shadow: 0 20px 44px -14px color-mix(in srgb, var(--ind) 45%, rgba(0,0,0,.4)); animation: saas-rise .6s ease both .5s; }
.saas-tip::before { content: ""; position: absolute; right: 24px; top: -6px; width: 11px; height: 11px; background: var(--surface);
  border-left: 1px solid var(--border); border-top: 1px solid var(--border); transform: rotate(45deg); }
.saas-tip-title { font-size: 13px; font-weight: 700; color: var(--ink); letter-spacing: -0.01em; }
.saas-tip-body { font-size: 11.5px; line-height: 1.45; color: var(--ink-soft); }
.saas-tip-bar { display: block; height: 4px; border-radius: 3px; background: var(--surface-2); overflow: hidden; margin-top: 2px; }
.saas-tip-bar i { display: block; height: 100%; width: 50%; background: var(--ind); border-radius: 3px; }
.saas-tip-foot { display: flex; align-items: center; justify-content: space-between; margin-top: 2px; }
.saas-tip-step { font-size: 10.5px; font-weight: 600; color: var(--ink-faint); }
.saas-tip-btns { display: inline-flex; gap: 5px; }
.saas-tip-btns i { font-style: normal; font-size: 10.5px; font-weight: 650; border-radius: 6px; padding: 4px 9px; }
.saas-tip-btns .ghost { color: var(--ink-soft); border: 1px solid var(--border); }
.saas-tip-btns .solid { color: #fff; background: var(--ind); }
.saas-spot-tip::before { content: ""; position: absolute; right: 16px; top: -5px; width: 9px; height: 9px; background: var(--ind); transform: rotate(45deg); }

/* a second, shorter content block so the app window is a bit taller (the tour coach-mark sits
   more within the frame instead of hanging far below it). */
.saas-block-sm { height: 40px; }

/* ==== EdTech hero scene: a course card with a lesson-progress bar + a "continue" coach-mark.
   Amber, warm and optimistic - the "pick up where you left off" moment. ==== */
.edtech-scene { width: 100%; max-width: 340px; margin: 0 auto; position: relative; }
.edtech-card { background: var(--surface); border: 1px solid var(--border); border-radius: 18px; padding: 18px;
  box-shadow: 0 22px 54px -22px color-mix(in srgb, var(--ind) 45%, transparent); }
.edtech-cover { height: 144px; border-radius: 12px; position: relative; overflow: hidden;
  background: linear-gradient(135deg, color-mix(in srgb, var(--ind) 82%, #fff), color-mix(in srgb, var(--ind) 45%, #ffd27a)); }
.edtech-cover-play { position: absolute; left: 50%; top: 50%; transform: translate(-50%,-50%); width: 40px; height: 40px;
  border-radius: 50%; background: rgba(255,255,255,.92); display: grid; place-items: center; color: var(--ind);
  box-shadow: 0 8px 20px -6px rgba(0,0,0,.35); }
.edtech-cover-badge { position: absolute; left: 12px; top: 12px; font-size: 10.5px; font-weight: 700; color: #fff;
  background: rgba(0,0,0,.28); border-radius: 999px; padding: 4px 10px; letter-spacing: .02em; }
.edtech-body { padding-top: 14px; }
.edtech-eyebrow { font-size: 11px; font-weight: 700; text-transform: uppercase; letter-spacing: .05em; color: var(--ind); }
.edtech-title { font-size: 15.5px; font-weight: 700; color: var(--ink); margin-top: 4px; letter-spacing: -0.01em; }
.edtech-prog { display: flex; align-items: center; gap: 10px; margin-top: 13px; }
.edtech-prog-bar { flex: 1; height: 7px; border-radius: 4px; background: var(--surface-2); overflow: hidden; }
.edtech-prog-bar i { display: block; height: 100%; width: 25%; border-radius: 4px; background: var(--ind);
  animation: edtech-fill 1s ease both .3s; }
.edtech-prog-lbl { font-size: 11px; font-weight: 600; color: var(--ink-faint); white-space: nowrap; }
.edtech-continue { margin-top: 14px; display: flex; align-items: center; justify-content: center; gap: 8px;
  font-size: 13px; font-weight: 650; color: #fff; background: var(--ind); border-radius: 10px; padding: 11px 14px;
  border: 1px solid color-mix(in srgb, var(--ind) 70%, #000);
  box-shadow: 0 0 0 3px color-mix(in srgb, var(--ind) 16%, transparent); }
@keyframes edtech-fill { from { width: 0; } to { width: 25%; } }

/* EdTech hero: Onbixo RESOURCE-CENTER help launcher OVER the course app. The course card
   is the dimmed BACKDROP; a Onbixo "Help & guides" panel (guide rows + a Help pill) floats
   OVER it - a help hub, distinct from a task checklist. Entry: pill pops, panel opens. */
.er-overlay { position: relative; width: 340px; margin: 0 auto; }
.er-appback { filter: brightness(.98) saturate(.98); }
.er-overlay::before { content: ""; position: absolute; inset: 0; border-radius: 18px;
  background: rgba(11,18,32,.30); z-index: 1; pointer-events: none; }
.er-panel { position: absolute; right: -20px; bottom: 46px; z-index: 2; width: 216px;
  background: var(--surface); border-radius: 14px; padding: 13px 14px; transform-origin: bottom right;
  box-shadow: 0 24px 50px -16px rgba(11,31,58,.5), 0 0 0 1px rgba(15,25,45,.08); }
.er-h { display: flex; align-items: center; justify-content: space-between; margin-bottom: 9px; }
.er-h b { font-size: 13px; font-weight: 750; color: var(--ink); }
.er-badge { font-size: 9px; font-weight: 700; letter-spacing: .03em; color: var(--ind);
  background: color-mix(in srgb, var(--ind) 12%, var(--surface)); border-radius: 999px; padding: 3px 7px; }
.er-row { display: flex; align-items: center; gap: 10px; font-size: 12.5px; color: var(--ink); padding: 7px 0;
  border-top: 1px solid var(--border); }
.er-row:first-of-type { border-top: 0; }
.er-ic { color: var(--ind); flex: none; display: grid; place-items: center; }
.er-pill { position: absolute; right: -14px; bottom: -10px; z-index: 3; height: 40px; border-radius: 999px;
  background: var(--ind); display: inline-flex; align-items: center; gap: 7px; padding: 0 18px;
  font-size: 13px; font-weight: 650; color: #fff;
  box-shadow: 0 14px 30px -8px color-mix(in srgb, var(--ind) 60%, rgba(0,0,0,.4)); }
@media (prefers-reduced-motion: no-preference) {
  .er-pill { animation: nf-pill-in .32s cubic-bezier(.2,.8,.3,1.2) both; }
  .er-panel { animation: nf-lch-in .42s cubic-bezier(.2,.7,.3,1) both .22s; }
}
@media (max-width: 860px) {
  .er-panel, .er-pill { position: static; animation: none; }
  .er-panel { width: auto; margin: 16px 0 0; }
  .er-pill { display: none; }
}

/* ==== Collaboration hero scene: a team workspace with member avatars, one empty "invite"
   seat pulsing, and a checklist nudge. Violet, "multiplayer". ==== */
.collab-scene { width: 100%; max-width: 348px; margin: 0 auto; position: relative; }
.collab-card { background: var(--surface); border: 1px solid var(--border); border-radius: 18px; padding: 18px;
  box-shadow: 0 22px 54px -22px color-mix(in srgb, var(--ind) 45%, transparent); }
.collab-hd { display: flex; align-items: center; justify-content: space-between; margin-bottom: 14px; }
.collab-hd b { font-size: 14.5px; font-weight: 700; color: var(--ink); letter-spacing: -0.01em; }
.collab-members { display: flex; align-items: center; }
.collab-av { width: 28px; height: 28px; border-radius: 50%; margin-left: -7px; border: 2px solid var(--surface);
  display: grid; place-items: center; font-size: 10.5px; font-weight: 700; color: #fff; }
.collab-av:first-child { margin-left: 0; }
.collab-av.a1 { background: #7c5cff; } .collab-av.a2 { background: #4f9dff; } .collab-av.a3 { background: #17b890; }
.collab-av.invite { background: var(--surface); color: var(--ind); border: 2px dashed color-mix(in srgb, var(--ind) 55%, var(--border));
  font-size: 15px; font-weight: 400; position: relative; }
.collab-av.invite::after { content: ""; position: absolute; inset: -2px; border-radius: 50%;
  border: 2px solid var(--ind); opacity: 0; }
@media (prefers-reduced-motion: no-preference) { .collab-av.invite::after { animation: collab-pulse 2.2s ease-out infinite; } }
@keyframes collab-pulse { 0% { transform: scale(1); opacity: .5; } 70%,100% { transform: scale(1.5); opacity: 0; } }
/* the board: a couple of rows/columns of task cards */
.collab-board { display: grid; grid-template-columns: 1fr 1fr; gap: 10px; }
.collab-col { display: flex; flex-direction: column; gap: 8px; }
.collab-col-h { font-size: 10.5px; font-weight: 700; text-transform: uppercase; letter-spacing: .04em; color: var(--ink-faint); }
.collab-task { background: var(--surface-2); border: 1px solid var(--border); border-radius: 9px; padding: 9px 10px;
  display: flex; flex-direction: column; gap: 6px; }
.collab-task i { display: block; height: 5px; border-radius: 3px; background: color-mix(in srgb, var(--ind) 22%, var(--surface)); }
.collab-task i.s { width: 60%; background: var(--border); }
.collab-task.empty { background: transparent; border-style: dashed; min-height: 34px; }
/* the invite nudge - a small checklist-style card below the board */
.collab-nudge { position: absolute; left: 8px; right: 8px; bottom: -18px; background: var(--ind); color: #fff;
  border-radius: 12px; padding: 12px 14px; display: flex; align-items: center; gap: 11px;
  box-shadow: 0 20px 44px -16px color-mix(in srgb, var(--ind) 60%, rgba(0,0,0,.5)); }
.collab-nudge-ic { width: 30px; height: 30px; border-radius: 8px; background: rgba(255,255,255,.2); display: grid; place-items: center; flex: none; }
.collab-nudge-t { flex: 1; font-size: 12.5px; line-height: 1.4; }
.collab-nudge-b { font-size: 12px; font-weight: 650; color: var(--ind); background: #fff; border-radius: 7px; padding: 6px 12px; white-space: nowrap; }
@media (prefers-reduced-motion: no-preference) { .collab-nudge { animation: fin-rise .7s ease both .8s; } }
@media (max-width: 860px) { .collab-nudge { position: static; margin: 18px auto 0; animation: none; } }

/* ==== Marketing hero scene: an analytics dashboard with KPI tiles + a mini bar chart, a
   hotspot pulsing on an unused report tile + a tooltip. Magenta, martech. ==== */
.mkt-scene { width: 100%; max-width: 360px; margin: 0 auto; position: relative; }
.mkt-card { background: var(--surface); border: 1px solid var(--border); border-radius: 18px; padding: 18px;
  box-shadow: 0 22px 54px -22px color-mix(in srgb, var(--ind) 45%, transparent); }
.mkt-hd { display: flex; align-items: center; justify-content: space-between; margin-bottom: 14px; }
.mkt-hd b { font-size: 14.5px; font-weight: 700; color: var(--ink); letter-spacing: -0.01em; }
.mkt-hd em { font-style: normal; font-size: 11px; font-weight: 600; color: var(--ink-faint);
  border: 1px solid var(--border); border-radius: 7px; padding: 4px 9px; }
.mkt-kpis { display: grid; grid-template-columns: 1fr 1fr 1fr; gap: 9px; margin-bottom: 12px; }
.mkt-kpi { background: var(--surface-2); border: 1px solid var(--border); border-radius: 10px; padding: 10px 11px; }
.mkt-kpi span { display: block; font-size: 9.5px; font-weight: 600; text-transform: uppercase; letter-spacing: .03em; color: var(--ink-faint); }
.mkt-kpi b { display: block; font-size: 16px; font-weight: 700; color: var(--ink); margin-top: 3px; letter-spacing: -0.02em; }
.mkt-kpi b em { font-style: normal; font-size: 10px; font-weight: 700; color: var(--good, #2e9e6b); margin-left: 4px; }
.mkt-kpi.dim { position: relative; }
.mkt-kpi.dim b { color: var(--ink-faint); }
/* mini bar chart */
.mkt-chart { display: flex; align-items: flex-end; gap: 8px; height: 66px; padding: 10px 4px 0; }
.mkt-bar { flex: 1; border-radius: 4px 4px 0 0; background: color-mix(in srgb, var(--ind) 22%, var(--surface-2)); }
.mkt-bar.h1 { height: 40%; } .mkt-bar.h2 { height: 62%; } .mkt-bar.h3 { height: 48%; }
.mkt-bar.h4 { height: 82%; background: var(--ind); } .mkt-bar.h5 { height: 58%; } .mkt-bar.h6 { height: 72%; }

/* Marketing hero: a Onbixo TOUR coach-mark (mid-step) OVER the dashboard. The dashboard
   is the dimmed BACKDROP; the unused "Reports" tile is spotlighted; a coach-mark card points
   up at it with a footer (count + Back + Next) matching a real tour step, and scales/fades in. */
.nm-overlay { position: relative; width: 340px; margin: 0 auto; padding-bottom: 96px; }
.nm-appback { filter: brightness(.99); }
.nm-overlay::before { content: ""; position: absolute; left: 0; right: 0; top: 0; height: 100%;
  border-radius: 18px; background: rgba(11,18,32,.34); z-index: 1; pointer-events: none; }
/* spotlight: the Reports tile is raised out of the dim + ringed */
.nm-spot { position: relative; z-index: 2; background: var(--surface) !important; border-color: var(--ind) !important;
  box-shadow: 0 0 0 3px color-mix(in srgb, var(--ind) 30%, transparent), 0 10px 30px -8px rgba(0,0,0,.4); }
.nm-spot b { color: var(--ink) !important; }
.nm-coach { position: absolute; z-index: 3; left: 50%; bottom: 30px; transform: translateX(-50%); width: 250px;
  background: var(--surface); border-radius: 12px; padding: 14px 15px 11px;
  box-shadow: 0 26px 54px -18px rgba(11,18,32,.55), 0 0 0 1px rgba(15,25,45,.06); }
.nm-coach::before { content: ""; position: absolute; top: -7px; right: 34px; width: 13px; height: 13px;
  background: var(--surface); border-left: 1px solid var(--border); border-top: 1px solid var(--border); transform: rotate(45deg); }
.nm-coach-h { font-size: 14px; font-weight: 750; color: var(--ink); letter-spacing: -.01em; }
.nm-coach-body { font-size: 12.5px; color: var(--ink-soft); line-height: 1.45; margin: 6px 0 12px; }
.nm-coach-foot { display: flex; align-items: center; }
.nm-coach-count { font-size: 11.5px; color: var(--ink-faint); font-variant-numeric: tabular-nums; }
.nm-coach-btns { margin-left: auto; display: flex; gap: 7px; }
.nm-coach-back { font-size: 12.5px; font-weight: 600; color: var(--ink-soft); border: 1px solid var(--border); border-radius: 8px; padding: 6px 12px; }
.nm-coach-next { font-size: 12.5px; font-weight: 600; color: #fff; background: var(--ind); border-radius: 8px; padding: 7px 13px; }
@media (prefers-reduced-motion: no-preference) {
  .nm-coach { animation: nm-coach-in .45s cubic-bezier(.2,.7,.3,1) both; }
}
@keyframes nm-coach-in {
  from { opacity: 0; transform: translateX(-50%) translateY(8px) scale(.96); }
  to   { opacity: 1; transform: translateX(-50%) translateY(0) scale(1); }
}

/* ==========================================================================
   BLOG (public /blog home + /blog/<slug> post). Uses the site's base tokens
   (--ink/--surface/--border/--accent) so it is theme-aware. Each category
   gets an accent (--bcat) that tints its card cover + labels.
   ========================================================================== */
.blog-body { --bcat: var(--accent); }
/* per-category accent (also set on the article/card via .bcat-<slug>) */
.bcat-onboarding  { --bcat: #6d5efc; }
.bcat-activation  { --bcat: #12a5a5; }
.bcat-pricing     { --bcat: #f0653e; }
.bcat-engineering { --bcat: #1f6feb; }
.bcat-product     { --bcat: #db2777; }

/* ---- masthead ---- */
.blog-top { padding: 52px 0 8px; text-align: center; }
.blog-masthead { max-width: 720px; margin: 0 auto; }
.blog-eyebrow { font-size: 13px; font-weight: 700; letter-spacing: .05em; text-transform: uppercase; color: var(--accent); margin-bottom: 14px; }
.blog-h1 { font-family: var(--pub-display); font-weight: 380; letter-spacing: -.02em; line-height: 1.06;
  font-size: clamp(32px, 4.6vw, 50px); margin: 0 0 16px; text-wrap: balance; }
.blog-sub { font-size: 18px; line-height: 1.6; color: var(--ink-soft); max-width: 56ch; margin: 0 auto; }

/* ---- category pills (centered under the masthead) ---- */
.blog-cats { display: flex; flex-wrap: wrap; justify-content: center; gap: 8px; margin-top: 28px; }
.blog-cat-pill { display: inline-flex; align-items: center; gap: 6px; font-size: 13.5px; font-weight: 600;
  color: var(--ink-soft); background: var(--surface); border: 1px solid var(--border); border-radius: 999px; padding: 7px 14px; }
.blog-cat-pill:hover { border-color: var(--accent); color: var(--ink); text-decoration: none; }
.blog-cat-pill.is-active { background: var(--accent); border-color: var(--accent); color: #fff; }
.blog-cat-n { font-size: 11px; font-weight: 700; opacity: .7; }
.blog-cat-pill.is-active .blog-cat-n { opacity: .85; }

/* ---- featured hero post ---- */
.blog-hero-wrap { margin-top: 30px; }
.blog-hero { display: grid; grid-template-columns: 1.15fr 1fr; gap: 0; border: 1px solid var(--border);
  border-radius: 20px; overflow: hidden; background: var(--surface); transition: border-color .18s ease, transform .18s ease, box-shadow .18s ease; }
.blog-hero:hover { border-color: color-mix(in srgb, var(--bcat) 45%, var(--border)); transform: translateY(-3px);
  box-shadow: 0 26px 60px -30px color-mix(in srgb, var(--bcat) 55%, transparent); text-decoration: none; }
.blog-hero-cover { position: relative; min-height: 320px; overflow: hidden;
  background: linear-gradient(135deg, color-mix(in srgb, var(--bcat) 85%, #fff), color-mix(in srgb, var(--bcat) 45%, #7c5cff)); }
.blog-hero-cover::after { content: ""; position: absolute; inset: 0;
  background: radial-gradient(120% 90% at 80% 10%, rgba(255,255,255,.25), transparent 55%); }
.blog-hero-cover img { position: absolute; inset: 0; width: 100%; height: 100%; object-fit: cover; }
.blog-hero-badge { position: absolute; top: 16px; left: 16px; z-index: 2; font-size: 11px; font-weight: 800;
  letter-spacing: .04em; text-transform: uppercase; color: var(--bcat); background: #fff; border-radius: 999px; padding: 5px 12px; }
.blog-hero-body { display: flex; flex-direction: column; padding: 34px 34px 30px; }
.blog-hero-title { font-family: var(--pub-display); font-weight: 400; letter-spacing: -.015em; line-height: 1.14;
  font-size: clamp(24px, 2.6vw, 32px); color: var(--ink); margin: 10px 0 12px; text-wrap: balance; }
.blog-hero-excerpt { font-size: 15.5px; line-height: 1.6; color: var(--ink-soft); margin-bottom: 18px; }
.blog-hero-cta { margin-top: auto; font-size: 14px; font-weight: 650; color: var(--bcat); }

/* ---- main: grid + sidebar ---- */
.blog-main { display: grid; grid-template-columns: 1fr 320px; gap: 44px; align-items: start; padding: 44px 0 56px; }
.blog-section-h { font-family: var(--pub-display); font-weight: 400; font-size: 24px; letter-spacing: -.01em; margin: 0 0 22px; }
.blog-grid { display: grid; grid-template-columns: 1fr 1fr; gap: 22px; }
.blog-empty { color: var(--ink-soft); font-size: 15px; }

/* ---- post card ---- */
.blog-card { display: flex; flex-direction: column; border: 1px solid var(--border); border-radius: 16px; overflow: hidden;
  background: var(--surface); transition: border-color .16s ease, transform .16s ease, box-shadow .16s ease; }
.blog-card:hover { border-color: color-mix(in srgb, var(--bcat) 45%, var(--border)); transform: translateY(-3px);
  box-shadow: 0 20px 44px -26px color-mix(in srgb, var(--bcat) 55%, transparent); text-decoration: none; }
.blog-card-cover { position: relative; height: 150px; overflow: hidden;
  background: linear-gradient(135deg, color-mix(in srgb, var(--bcat) 82%, #fff), color-mix(in srgb, var(--bcat) 42%, #6d5efc)); }
.blog-card-cover::after { content: ""; position: absolute; inset: 0; background: radial-gradient(120% 90% at 85% 8%, rgba(255,255,255,.22), transparent 55%); }
.blog-card-cover img { position: absolute; inset: 0; width: 100%; height: 100%; object-fit: cover; }
.blog-card-cat { position: absolute; left: 12px; top: 12px; z-index: 2; font-size: 10.5px; font-weight: 800; letter-spacing: .03em;
  text-transform: uppercase; color: var(--bcat); background: #fff; border-radius: 999px; padding: 4px 10px; }
.blog-card-body { display: flex; flex-direction: column; gap: 8px; padding: 16px 17px 17px; flex: 1; }
.blog-card-cat-mini { font-size: 11px; font-weight: 800; letter-spacing: .04em; text-transform: uppercase; color: var(--bcat); }
.blog-card-title { font-size: 17px; font-weight: 700; line-height: 1.3; letter-spacing: -.01em; color: var(--ink); }
.blog-card-excerpt { font-size: 13.5px; line-height: 1.55; color: var(--ink-soft); flex: 1; }
.blog-card-meta { display: flex; align-items: center; flex-wrap: wrap; gap: 6px; font-size: 12px; color: var(--ink-faint); margin-top: 2px; }
.blog-card-author { font-weight: 600; color: var(--ink-soft); }
.blog-card-dot { opacity: .6; }

/* ---- sidebar: newsletter + most read ---- */
.blog-side { display: flex; flex-direction: column; gap: 26px; position: sticky; top: 92px; }
.blog-news { border: 1px solid var(--border); border-radius: 16px; padding: 20px; background: var(--surface-2); }
.blog-news-h { font-size: 16px; font-weight: 700; letter-spacing: -.01em; color: var(--ink); }
.blog-news-p { font-size: 13px; line-height: 1.55; color: var(--ink-soft); margin: 8px 0 14px; }
.blog-news-form { display: flex; flex-direction: column; gap: 9px; }
.blog-news-input { width: 100%; box-sizing: border-box; font-size: 14px; color: var(--ink); background: var(--surface);
  border: 1px solid var(--border); border-radius: 10px; padding: 11px 13px; }
.blog-news-input:focus { outline: none; border-color: var(--accent); box-shadow: 0 0 0 3px color-mix(in srgb, var(--accent) 18%, transparent); }
.blog-news-btn { width: 100%; justify-content: center; }
.blog-news-form.is-done { opacity: .55; pointer-events: none; }
.blog-news-msg { font-size: 12.5px; line-height: 1.45; margin: 10px 0 0; }
.blog-news-msg.is-ok { color: var(--good, #2e9e6b); }
.blog-news-msg.is-err { color: #d9534f; }

.blog-side-h { font-size: 13px; font-weight: 700; letter-spacing: .04em; text-transform: uppercase; color: var(--ink-faint); margin-bottom: 14px; }
.blog-mostread-list { list-style: none; margin: 0; padding: 0; display: flex; flex-direction: column; gap: 4px; }
.blog-mostread-item { display: flex; gap: 12px; align-items: flex-start; padding: 10px 0; border-top: 1px solid var(--border); }
.blog-mostread-item:first-child { border-top: 0; }
.blog-mostread-rank { font-family: var(--pub-display); font-size: 20px; font-weight: 400; color: color-mix(in srgb, var(--ink) 35%, var(--surface)); line-height: 1; flex: none; width: 20px; }
.blog-card-mini { flex: 1; border: 0; background: none; border-radius: 0; }
.blog-card-mini:hover { transform: none; box-shadow: none; }
.blog-card-mini .blog-card-body { padding: 0; gap: 4px; }
.blog-card-mini .blog-card-title { font-size: 14px; font-weight: 650; line-height: 1.35; }

/* ---- pagination ---- */
.blog-pager { display: flex; align-items: center; justify-content: space-between; gap: 12px; margin-top: 34px; flex-wrap: wrap; }
.blog-pager-btn { font-size: 13.5px; font-weight: 600; color: var(--ink-soft); border: 1px solid var(--border); border-radius: 10px; padding: 8px 14px; }
.blog-pager-btn:hover { border-color: var(--accent); color: var(--ink); text-decoration: none; }
.blog-pager-btn.is-disabled { opacity: .4; pointer-events: none; }
.blog-pager-pages { display: flex; gap: 4px; }
.blog-pager-page { min-width: 32px; text-align: center; font-size: 13.5px; font-weight: 600; color: var(--ink-soft); border-radius: 8px; padding: 7px 4px; }
.blog-pager-page:hover { background: var(--surface-2); text-decoration: none; color: var(--ink); }
.blog-pager-page.is-current { background: var(--accent); color: #fff; }

/* ==========================================================================
   POST PAGE
   ========================================================================== */
.blog-article-hero { padding-top: 40px; }
.blog-article-head { max-width: 760px; }
.blog-crumb { font-size: 13px; font-weight: 600; color: var(--ink-faint); margin-bottom: 18px; }
.blog-crumb a { color: var(--ink-soft); } .blog-crumb a:hover { color: var(--accent); }
.blog-crumb span { opacity: .5; margin: 0 4px; }
.blog-article-title { font-family: var(--pub-display); font-weight: 400; letter-spacing: -.02em; line-height: 1.08;
  font-size: clamp(30px, 4.4vw, 46px); margin: 0 0 16px; text-wrap: balance; }
.blog-article-excerpt { font-size: 19px; line-height: 1.55; color: var(--ink-soft); max-width: 62ch; margin: 0 0 24px; }
.blog-article-byline { display: flex; align-items: center; gap: 12px; }
.blog-avatar { width: 42px; height: 42px; border-radius: 50%; flex: none; display: grid; place-items: center;
  font-size: 14px; font-weight: 700; color: #fff; letter-spacing: .5px;
  background: linear-gradient(135deg, color-mix(in srgb, var(--bcat) 75%, #fff), color-mix(in srgb, var(--bcat) 40%, #6d5efc)); }
.blog-byline-name { display: block; font-size: 14px; font-weight: 700; color: var(--ink); }
.blog-byline-role { font-weight: 500; color: var(--ink-faint); margin-left: 6px; }
.blog-byline-meta { display: block; font-size: 12.5px; color: var(--ink-faint); margin-top: 1px; }

.blog-article-cover { margin: 28px 0 0; height: clamp(240px, 38vw, 420px); border-radius: 20px; overflow: hidden; position: relative;
  background: linear-gradient(135deg, color-mix(in srgb, var(--bcat) 85%, #fff), color-mix(in srgb, var(--bcat) 42%, #6d5efc)); }
.blog-article-cover::after { content: ""; position: absolute; inset: 0; background: radial-gradient(120% 90% at 80% 8%, rgba(255,255,255,.22), transparent 55%); }
.blog-article-cover img { position: absolute; inset: 0; width: 100%; height: 100%; object-fit: cover; }
.blog-cover-mark { position: absolute; left: 50%; top: 50%; transform: translate(-50%,-50%); z-index: 2;
  font-family: var(--pub-display); font-size: clamp(28px, 5vw, 54px); font-weight: 400; color: rgba(255,255,255,.9); letter-spacing: -.01em; }

/* ---- the prose (rich body) ---- */
/* Bottom padding lives here (not only on .blog-related) so a post with NO related posts still has a
   gap before the footer - previously the tail spacing was on .blog-related, which is omitted when
   $related is empty, leaving the article flush against the footer. */
.blog-article-wrap { max-width: 760px; padding-bottom: 22px; }
/* When related posts DO follow, drop the article's own bottom pad so the two do not double-space. */
.blog-article-wrap:has(+ .blog-related) { padding-bottom: 0; }
.blog-prose { font-size: 17.5px; line-height: 1.72; color: var(--ink-soft); margin-top: 40px; }
.blog-prose > *:first-child { margin-top: 0; }
.blog-prose h2 { font-family: var(--pub-display); font-weight: 400; font-size: 27px; letter-spacing: -.015em; line-height: 1.2;
  color: var(--ink); margin: 44px 0 14px; text-wrap: balance; }
.blog-prose h3 { font-size: 20px; font-weight: 700; letter-spacing: -.01em; color: var(--ink); margin: 32px 0 10px; }
.blog-prose p { margin: 0 0 20px; }
.blog-prose a { color: var(--accent); text-decoration: underline; text-underline-offset: 2px; text-decoration-thickness: 1px; }
.blog-prose a:hover { text-decoration-thickness: 2px; }
.blog-prose strong { color: var(--ink); font-weight: 700; }
.blog-prose ul, .blog-prose ol { margin: 0 0 22px; padding-left: 24px; }
.blog-prose li { margin: 7px 0; padding-left: 4px; }
.blog-prose ul li::marker { color: var(--bcat); }
.blog-prose ol li::marker { color: var(--ink-faint); font-weight: 700; }
.blog-prose blockquote { margin: 28px 0; padding: 4px 0 4px 22px; border-left: 3px solid var(--bcat);
  font-family: var(--pub-display); font-weight: 400; font-size: 22px; line-height: 1.45; color: var(--ink); font-style: normal; }
.blog-prose blockquote p { margin: 0; }
.blog-prose hr { border: 0; border-top: 1px solid var(--border); margin: 40px 0; }
/* figures / images */
.blog-prose figure { margin: 30px 0; }
.blog-prose img { display: block; width: 100%; height: auto; border-radius: 14px; border: 1px solid var(--border); }
.blog-prose figcaption { font-size: 13px; color: var(--ink-faint); text-align: center; margin-top: 10px; line-height: 1.5; }
/* tables */
.blog-prose table { width: 100%; border-collapse: collapse; margin: 26px 0; font-size: 14.5px; display: block; overflow-x: auto; }
.blog-prose thead th { text-align: left; font-size: 12px; font-weight: 700; letter-spacing: .03em; text-transform: uppercase;
  color: var(--ink-faint); background: var(--surface-2); padding: 11px 14px; border-bottom: 1px solid var(--border); white-space: nowrap; }
.blog-prose tbody td { padding: 11px 14px; border-bottom: 1px solid var(--border); color: var(--ink-soft); vertical-align: top; }
.blog-prose tbody tr:hover { background: color-mix(in srgb, var(--bcat) 4%, var(--surface)); }
.blog-prose td strong { color: var(--ink); }
/* inline + block code */
.blog-prose code { font-family: ui-monospace, "SF Mono", Menlo, monospace; font-size: .88em;
  background: var(--surface-2); border: 1px solid var(--border); border-radius: 5px; padding: 1px 5px; color: var(--ink); }
.blog-prose pre { margin: 26px 0; background: #0e1626; border-radius: 14px; padding: 18px 18px; overflow-x: auto;
  border: 1px solid rgba(255,255,255,.06); }
.blog-prose pre code { display: block; background: none; border: 0; padding: 0; color: #d7deea; font-size: 13.5px; line-height: 1.6; white-space: pre; }

.blog-article-foot { margin: 44px 0 0; padding-top: 22px; border-top: 1px solid var(--border); }
.blog-back { font-size: 14px; font-weight: 600; color: var(--ink-soft); }
.blog-back:hover { color: var(--accent); }
.blog-related { padding: 48px 0 56px; }
.blog-related .blog-grid { grid-template-columns: repeat(3, 1fr); }

/* ---- responsive ---- */
@media (max-width: 940px) {
  .blog-main { grid-template-columns: 1fr; }
  .blog-side { position: static; flex-direction: row; flex-wrap: wrap; }
  .blog-news, .blog-mostread { flex: 1 1 280px; }
  .blog-hero { grid-template-columns: 1fr; }
  .blog-hero-cover { min-height: 200px; }
  .blog-related .blog-grid { grid-template-columns: 1fr 1fr; }
}
@media (max-width: 560px) {
  .blog-grid { grid-template-columns: 1fr; }
  .blog-side { flex-direction: column; }
  /* On mobile the fixed clamp() height (down to 240px) is much shorter than a wide 16:9 cover, so
     object-fit:cover crops the image's sides (branding/product got cut off). Give the cover the
     image's own 16:9 aspect ratio here so the FULL cover shows, uncropped. */
  .blog-article-cover { height: auto; aspect-ratio: 16 / 9; }
}

/* ============================================================================
   COMPARISON PAGES (/compare, /compare/<vendor>-alternative)
   High-intent "alternative to X" landing pages. The visual job is the price gap:
   a two-sided hero card, then a scannable three-column table where our column is
   tinted so the eye lands on it. Theme-aware via the shared public tokens.
   ========================================================================== */

/* ---- hero: copy beside the at-a-glance price gap ---- */
.cmp-hero-grid { display: grid; grid-template-columns: 1.05fr .95fr; gap: clamp(28px, 5vw, 64px); align-items: center; }
.cmp-hero-copy .hp-h1 { max-width: 17ch; }

.cmp-gap {
  display: grid; grid-template-columns: 1fr auto 1fr; align-items: stretch; gap: 0;
  border: 1px solid var(--pub-hairline); border-radius: 16px; overflow: hidden;
  background: var(--surface);
}
.cmp-gap-side { display: flex; flex-direction: column; gap: 4px; padding: clamp(18px, 2.4vw, 26px) clamp(14px, 2vw, 22px); text-align: center; }
.cmp-gap-them { background: var(--surface-2); }
.cmp-gap-us { background: color-mix(in srgb, var(--accent) 7%, var(--surface)); }
.cmp-gap-who { font-size: 12px; font-weight: 700; letter-spacing: .04em; text-transform: uppercase; color: var(--ink-soft); }
.cmp-gap-us .cmp-gap-who { color: var(--accent); }
.cmp-gap-label { font-size: 12.5px; color: var(--ink-soft); }
.cmp-gap-price { font-size: clamp(26px, 3.4vw, 36px); font-weight: 750; line-height: 1.1; color: var(--ink); letter-spacing: -.02em; }
.cmp-gap-us .cmp-gap-price { color: var(--accent); }
.cmp-gap-note { font-size: 12px; color: var(--ink-soft); line-height: 1.4; }
.cmp-gap-vs {
  display: flex; align-items: center; justify-content: center; padding: 0 6px;
  font-size: 11.5px; font-weight: 700; text-transform: uppercase; letter-spacing: .06em;
  color: var(--ink-soft); background: var(--surface); border-left: 1px solid var(--pub-hairline); border-right: 1px solid var(--pub-hairline);
}

/* ---- the comparison table ---- */
.cmp-table-wrap { overflow-x: auto; border: 1px solid var(--pub-hairline); border-radius: 14px; }
.cmp-table { width: 100%; border-collapse: collapse; font-size: 14px; min-width: 620px; }
.cmp-table th, .cmp-table td { padding: 13px 16px; text-align: left; vertical-align: top; border-bottom: 1px solid var(--pub-hairline); }
.cmp-table tbody tr:last-child th, .cmp-table tbody tr:last-child td { border-bottom: 0; }
.cmp-table thead th { font-size: 12.5px; font-weight: 700; letter-spacing: .03em; text-transform: uppercase; color: var(--ink-soft); background: var(--surface-2); }
.cmp-table tbody th { font-weight: 600; color: var(--ink); width: 30%; }
.cmp-table td { color: var(--ink-soft); }
/* Our column is tinted top-to-bottom so the comparison resolves at a glance. */
.cmp-table .cmp-col-us { background: color-mix(in srgb, var(--accent) 6%, var(--surface)); color: var(--ink); font-weight: 600; }
.cmp-table thead .cmp-col-us { background: color-mix(in srgb, var(--accent) 12%, var(--surface)); color: var(--accent); }

/* Full container width - a ch-based max-width wrapped this at roughly half the container and left
   a ragged block of text under a full-width table. It is a short footnote, not body prose. */
.cmp-source-note { margin: 14px 0 0; font-size: 12.5px; line-height: 1.6; color: var(--ink-soft); }
.cmp-source-note a { color: var(--accent); text-decoration: underline; text-underline-offset: 2px; }

/* ---- "why teams switch" reason cards ---- */
/* The /compare hub's three-up "what is actually different" cards. The vendor pages use the stepped
   list below instead; this grid is still the right shape there, where the three points are parallel
   rather than a sequence. */
.cmp-reasons { display: grid; grid-template-columns: repeat(3, 1fr); gap: 20px; }
.cmp-reason { padding: clamp(18px, 2.2vw, 24px); border: 1px solid var(--pub-hairline);
  border-radius: 14px; background: var(--surface); }
.cmp-reason h3 { margin: 0 0 8px; font-size: 16px; font-weight: 680; line-height: 1.35; color: var(--ink); }
.cmp-reason p { margin: 0; font-size: 14px; line-height: 1.65; color: var(--ink-soft); }
@media (max-width: 900px) { .cmp-reasons { grid-template-columns: 1fr; } }

/* "Why teams switch" - a connected vertical sequence, not a card grid.
   The three points always run price -> packaging -> product, and a stepped list makes that order
   legible; three side-by-side boxes read as interchangeable and the eye slides off them. Marked with
   dots rather than numbers: the order is carried by the layout, and numbering implied a ranking that
   is not meant. Markers and the connector are CSS on a plain <ol>, so the markup stays a real list. */
/* Two labelled groups - "the bill" and "the build" - matching the section heading. The points are
   parallel claims rather than a sequence, so the grouping is what carries meaning; the connector
   ties each group together without implying an order between its members. */
.cmp-group { max-width: 640px; margin: 0 auto; }
.cmp-group + .cmp-group { margin-top: 34px; }
.cmp-group-label {
  font-size: 11.5px; font-weight: 700; letter-spacing: .12em; text-transform: uppercase;
  color: var(--ink-soft); margin: 0 0 16px; padding-bottom: 10px;
  border-bottom: 1px solid var(--pub-hairline);
}
.cmp-steps { list-style: none; margin: 0; padding: 0; position: relative; max-width: 640px; }
.cmp-step { position: relative; padding: 0 0 28px 40px; }
.cmp-step:last-child { padding-bottom: 0; }
/* The dot, sitting on the spine. Ring of surface colour so the connector does not show through. */
.cmp-step::before {
  content: ""; position: absolute; left: 0; top: 7px; width: 13px; height: 13px;
  border-radius: 50%; background: var(--accent);
  box-shadow: 0 0 0 4px var(--surface), 0 0 0 6px color-mix(in srgb, var(--accent) 26%, transparent);
}
/* The connector is drawn per ITEM - from below its own dot down to the next - and the last item has
   none. A single spine on the list would overhang the final dot by the height of its paragraph. */
.cmp-step::after {
  content: ""; position: absolute; left: 6px; top: 26px; bottom: -6px; width: 2px;
  background: var(--pub-hairline); border-radius: 2px;
}
.cmp-step:last-child::after { display: none; }
.cmp-step h3 { margin: 0 0 8px; font-size: 17px; font-weight: 680; line-height: 1.35; color: var(--ink); }
.cmp-step p { margin: 0; font-size: 14.5px; line-height: 1.75; color: var(--ink-soft); }

@media (max-width: 620px) {
  .cmp-step { padding: 0 0 24px 32px; }
  .cmp-step::before { width: 11px; height: 11px; top: 6px; }
  .cmp-step::after { left: 5px; top: 22px; }
  .cmp-step h3 { font-size: 16px; }
}

/* ---- the honest "when they are better" block ---- */
.cmp-fair { padding: clamp(24px, 3.2vw, 36px); border: 1px solid var(--pub-hairline); border-left: 3px solid var(--accent); border-radius: 14px; background: var(--pub-tint); }
/* .hp-h2 ships as `margin: 12px 0 0` because elsewhere it sits inside .hp-sec-head, which supplies
   the gap below it. Here the body copy follows the heading directly, so the heading has to carry its
   own bottom margin - without this the two lines collide. The card has no eyebrow, so the top margin
   is zeroed too and the heading sits flush with the card padding. Slightly smaller than the
   page-level h2: this is a card aside, not a section header. */
.cmp-fair .hp-h2 { margin: 0 0 14px; font-size: clamp(23px, 2.9vw, 30px); }
.cmp-fair p { margin: 0; font-size: 15px; line-height: 1.7; color: var(--ink-soft); max-width: 68ch; }

/* ---- live plan strip ---- */
.cmp-plans { display: grid; grid-template-columns: repeat(auto-fit, minmax(150px, 1fr)); gap: 14px; }
.cmp-plan { display: flex; flex-direction: column; gap: 3px; align-items: center; text-align: center; padding: 18px 12px; border: 1px solid var(--pub-hairline); border-radius: 12px; background: var(--surface); }
.cmp-plan-name { font-size: 12.5px; font-weight: 700; text-transform: uppercase; letter-spacing: .04em; color: var(--ink-soft); }
.cmp-plan-price { font-size: 24px; font-weight: 750; color: var(--ink); letter-spacing: -.02em; }
.cmp-plan-price span { font-size: 13px; font-weight: 550; color: var(--ink-soft); }
.cmp-plan-mau { font-size: 12.5px; color: var(--ink-soft); }
.cmp-plans-note { margin: 16px 0 0; text-align: center; font-size: 13.5px; line-height: 1.65; color: var(--ink-soft); }
.cmp-plans-note a { color: var(--accent); font-weight: 600; }

/* ---- FAQ ---- */
.cmp-faq { display: flex; flex-direction: column; gap: 10px; }
.cmp-faq-item { border: 1px solid var(--pub-hairline); border-radius: 12px; background: var(--surface); overflow: hidden; }
.cmp-faq-item summary { cursor: pointer; padding: 15px 18px; font-size: 15px; font-weight: 640; color: var(--ink); list-style: none; display: flex; justify-content: space-between; gap: 14px; align-items: center; }
.cmp-faq-item summary::-webkit-details-marker { display: none; }
.cmp-faq-item summary::after { content: "+"; font-size: 19px; font-weight: 400; color: var(--ink-soft); line-height: 1; flex: none; }
.cmp-faq-item[open] summary::after { content: "\2212"; }
.cmp-faq-item summary:hover { color: var(--accent); }
.cmp-faq-item p { margin: 0; padding: 0 18px 16px; font-size: 14px; line-height: 1.7; color: var(--ink-soft); }
/* Closing line under the FAQ: the explicit "you can still talk to us" route. Centred and quiet - it
   is reassurance for the hesitant buyer, not a CTA competing with Start free. */
.cmp-faq-more { margin: 18px 0 0; text-align: center; font-size: 14px; line-height: 1.7; color: var(--ink-soft); }
.cmp-faq-more a { color: var(--accent); font-weight: 620; text-decoration: underline; text-underline-offset: 2px; }

/* ---- sibling comparison cross-links ---- */
/* Cross-links to the sibling comparison pages. Deliberately NOT card-shaped: the plan strip above
   (.cmp-plan) is already an uppercase-label + big-number card, and repeating that shape here made the
   two sections read as the same component. These are navigation, so they are a divided list of rows -
   the vendor name leads, their headline figure trails as quiet metadata, and a chevron marks it as a
   link. One shared hairline container, rows separated by rules rather than each row being a box. */
.cmp-others { border: 1px solid var(--pub-hairline); border-radius: 14px; overflow: hidden; background: var(--surface); }
.cmp-other {
  display: flex; align-items: center; gap: 16px; padding: 15px 18px;
  border-top: 1px solid var(--pub-hairline); text-decoration: none;
  transition: background .15s ease, padding-left .15s ease;
}
.cmp-other:first-child { border-top: 0; }
.cmp-other:hover { background: var(--pub-tint); padding-left: 22px; text-decoration: none; }
.cmp-other-name { font-size: 15.5px; font-weight: 640; color: var(--ink); }
/* "vs" is set quieter than the two product names it joins. */
.cmp-other-name em { font-style: normal; font-weight: 500; color: var(--ink-soft); margin: 0 2px; }
.cmp-other:hover .cmp-other-name { color: var(--accent); }
.cmp-other-meta { margin-left: auto; font-size: 13px; color: var(--ink-soft); text-align: right; }
.cmp-other-meta b { font-weight: 650; color: var(--ink); }
.cmp-other-chev { flex: none; color: var(--ink-soft); transition: transform .15s ease, color .15s ease; }
.cmp-other:hover .cmp-other-chev { color: var(--accent); transform: translateX(3px); }

@media (max-width: 560px) {
  /* Stack the label under the name so neither truncates on a narrow phone. */
  .cmp-other { flex-wrap: wrap; gap: 4px 12px; }
  .cmp-other-meta { margin-left: 0; width: 100%; order: 3; text-align: left; }
  .cmp-other-chev { margin-left: auto; }
}

/* ---- /compare hub cards ----
   Five cards in a 3-up grid leaves a hole in row two. Using a 6-column base and spanning each card
   across 2 makes the trailing two centre themselves (3 + 2 centred) instead of hanging left with a
   gap. The price sits on its own baseline in every card - a fixed-height row above the summary - so
   the figures line up across the row and can actually be compared at a glance. */
.cmp-hub { display: grid; grid-template-columns: repeat(6, 1fr); gap: 18px; }
.cmp-hub-card {
  grid-column: span 2; display: flex; flex-direction: column;
  padding: clamp(20px, 2.4vw, 26px);
  border: 1px solid var(--pub-hairline); border-radius: 16px; background: var(--surface);
  text-decoration: none; position: relative; overflow: hidden;
  transition: border-color .16s ease, transform .16s ease, box-shadow .16s ease;
}
/* Centre the final row when it is short of a full row of three. */
.cmp-hub-card:nth-last-child(2):nth-child(3n+1) { grid-column: 2 / span 2; }
.cmp-hub-card:last-child:nth-child(3n+2) { grid-column: 4 / span 2; }
.cmp-hub-card::before {
  content: ""; position: absolute; inset: 0 auto 0 0; width: 3px;
  background: var(--accent); opacity: 0; transition: opacity .16s ease;
}
.cmp-hub-card:hover { border-color: color-mix(in srgb, var(--accent) 45%, var(--pub-hairline)); transform: translateY(-3px); box-shadow: 0 8px 24px -14px color-mix(in srgb, var(--accent) 60%, transparent); text-decoration: none; }
.cmp-hub-card:hover::before { opacity: 1; }
.cmp-hub-vendor { font-size: 15.5px; font-weight: 680; color: var(--ink); }
.cmp-hub-card:hover .cmp-hub-vendor { color: var(--accent); }
.cmp-hub-price { margin-top: 10px; font-size: 26px; font-weight: 740; line-height: 1.1; letter-spacing: -.02em; color: var(--ink); }
.cmp-hub-label { margin-top: 3px; font-size: 11.5px; font-weight: 650; letter-spacing: .05em; text-transform: uppercase; color: var(--ink-soft); }
.cmp-hub-card p { margin: 14px 0 0; font-size: 13.5px; line-height: 1.6; color: var(--ink-soft); }
/* margin-top:auto pins the link to the bottom, so uneven summary lengths do not stagger the links. */
.cmp-hub-go {
  display: flex; align-items: center; gap: 6px; margin-top: auto; padding-top: 16px;
  font-size: 13.5px; font-weight: 620; color: var(--accent);
}
.cmp-hub-go svg { flex: none; transition: transform .16s ease; }
.cmp-hub-card:hover .cmp-hub-go svg { transform: translateX(3px); }

@media (max-width: 980px) {
  /* Two per row: span 3 of 6, and let the odd last card centre itself. */
  .cmp-hub-card { grid-column: span 3; }
  .cmp-hub-card:nth-last-child(2):nth-child(3n+1), .cmp-hub-card:last-child:nth-child(3n+2) { grid-column: span 3; }
  .cmp-hub-card:last-child:nth-child(odd) { grid-column: 2 / span 3; }
}
@media (max-width: 620px) {
  .cmp-hub { grid-template-columns: 1fr; }
  .cmp-hub-card, .cmp-hub-card:nth-last-child(2):nth-child(3n+1),
  .cmp-hub-card:last-child:nth-child(3n+2), .cmp-hub-card:last-child:nth-child(odd) { grid-column: 1 / -1; }
}

@media (max-width: 900px) {
}
@media (max-width: 860px) {
  .cmp-hero-grid { grid-template-columns: 1fr; }
  .cmp-hero-copy { text-align: center; }
  .cmp-hero-copy .hp-h1 { max-width: none; }
  .cmp-hero-copy .pub-lede { margin-left: auto; margin-right: auto; }
  .cmp-hero-copy .hp-hero-cta, .cmp-hero-copy .hp-hero-meta { justify-content: center; }
  .cmp-gap { max-width: 460px; margin: 0 auto; }
}
@media (max-width: 420px) {
  /* Stack the two sides so neither price truncates on a narrow phone. */
  .cmp-gap { grid-template-columns: 1fr; }
  .cmp-gap-vs { border-left: 0; border-right: 0; border-top: 1px solid var(--pub-hairline); border-bottom: 1px solid var(--pub-hairline); padding: 6px 0; }
}

/* The "where we stand" card's supporting list. It is the last thing in the card, so it needs no
   bottom margin - .hp-ticks already ships as `margin: 18px 0 0`, which is exactly right here. */
.cmp-strength-ticks { margin: 18px 0 0; }
