.nav[data-astro-cid-dmqpwcec]{position:sticky;top:0;z-index:50;background:rgba(255,255,255,0.92);backdrop-filter:saturate(160%) blur(14px);-webkit-backdrop-filter:saturate(160%) blur(14px);border-bottom:1px solid var(--line)}.nav-inner[data-astro-cid-dmqpwcec]{max-width:1440px;margin:0 auto;padding:14px 40px;display:flex;align-items:center;gap:24px;position:relative}.nav-mark[data-astro-cid-dmqpwcec]{display:inline-flex;align-items:center;flex-shrink:0}.nav-mark[data-astro-cid-dmqpwcec] img[data-astro-cid-dmqpwcec]{height:22px;width:auto;display:block}.nav-menu[data-astro-cid-dmqpwcec]{display:flex;align-items:center;gap:2px;margin-left:8px}.nav-group[data-astro-cid-dmqpwcec]{position:static}.nav-group[data-astro-cid-dmqpwcec]:has(> .nav-panel.simple){position:relative}.nav-trigger[data-astro-cid-dmqpwcec],.nav-link[data-astro-cid-dmqpwcec]{display:inline-flex;align-items:center;gap:4px;padding:12px 16px;border-radius:var(--pill);background:transparent;border:1px solid transparent;color:var(--ink);font:500 14px/1 var(--font-ui);cursor:pointer;transition:background 0.18s var(--ease),color 0.18s var(--ease)}.nav-trigger[data-astro-cid-dmqpwcec]:hover,.nav-link[data-astro-cid-dmqpwcec]:hover,.nav-trigger[data-astro-cid-dmqpwcec][aria-expanded=true]{background:var(--paper-sunken)}.nav-trigger[data-astro-cid-dmqpwcec] .caret{width:14px;height:14px;transition:transform 0.18s var(--ease)}.nav-group[data-astro-cid-dmqpwcec][data-open=true] .nav-trigger[data-astro-cid-dmqpwcec] .caret{transform:rotate(180deg)}.nav-panel[data-astro-cid-dmqpwcec]{position:absolute;top:calc(100% + 6px);left:40px;z-index:30;background:var(--paper);border:1px solid var(--line);border-radius:14px;box-shadow:0 20px 48px -16px rgba(14,16,20,0.18),0 4px 12px -4px rgba(14,16,20,0.08);opacity:0;transform:translateY(-4px);pointer-events:none;transition:opacity 0.15s var(--ease),transform 0.15s var(--ease)}.nav-group[data-astro-cid-dmqpwcec][data-open=true] .nav-panel[data-astro-cid-dmqpwcec]{opacity:1;transform:translateY(0);pointer-events:auto}.nav-panel[data-astro-cid-dmqpwcec].simple{padding:10px;min-width:280px;left:0}.nav-panel[data-astro-cid-dmqpwcec].mega{padding:0;overflow:hidden}.nav-panel[data-astro-cid-dmqpwcec].mega.is-product{width:820px}.nav-panel[data-astro-cid-dmqpwcec].mega.is-integrations{width:720px}.mega-grid[data-astro-cid-dmqpwcec]{display:grid;grid-template-columns:repeat(3,1fr)}.mega-col[data-astro-cid-dmqpwcec]{padding:20px;border-right:1px solid var(--line)}.mega-col[data-astro-cid-dmqpwcec]:last-child{border-right:0}.mega-eyebrow[data-astro-cid-dmqpwcec]{font-size:10px;font-weight:600;letter-spacing:0.08em;text-transform:uppercase;color:var(--ink-muted);margin:0 0 12px 12px}.mega-item[data-astro-cid-dmqpwcec],.simple-item[data-astro-cid-dmqpwcec]{display:flex;align-items:center;gap:12px;padding:10px 12px;border-radius:8px;color:var(--ink);transition:background 0.15s var(--ease)}.mega-item[data-astro-cid-dmqpwcec]:hover,.simple-item[data-astro-cid-dmqpwcec]:hover{background:var(--paper-sunken)}.mega-item[data-astro-cid-dmqpwcec] .icon[data-astro-cid-dmqpwcec],.simple-item[data-astro-cid-dmqpwcec] .icon[data-astro-cid-dmqpwcec]{width:28px;height:28px;display:grid;place-items:center;color:var(--accent);flex-shrink:0}.mega-item[data-astro-cid-dmqpwcec] .icon[data-astro-cid-dmqpwcec] svg,.simple-item[data-astro-cid-dmqpwcec] .icon[data-astro-cid-dmqpwcec] svg{width:20px;height:20px}.mega-item[data-astro-cid-dmqpwcec] .text[data-astro-cid-dmqpwcec],.simple-item[data-astro-cid-dmqpwcec] .text[data-astro-cid-dmqpwcec]{display:flex;flex-direction:column;gap:2px;line-height:1.25}.mega-item[data-astro-cid-dmqpwcec] .text[data-astro-cid-dmqpwcec] b[data-astro-cid-dmqpwcec],.simple-item[data-astro-cid-dmqpwcec] .text[data-astro-cid-dmqpwcec] b[data-astro-cid-dmqpwcec]{font-size:14px;font-weight:600;color:var(--ink)}.mega-item[data-astro-cid-dmqpwcec] .text[data-astro-cid-dmqpwcec] .sub[data-astro-cid-dmqpwcec],.simple-item[data-astro-cid-dmqpwcec] .text[data-astro-cid-dmqpwcec] .sub[data-astro-cid-dmqpwcec]{font-size:12.5px;font-weight:400;color:var(--ink-muted)}.mega-intro[data-astro-cid-dmqpwcec] h3[data-astro-cid-dmqpwcec]{font-size:16px;font-weight:600;color:var(--ink);margin:0 0 6px 0}.mega-intro[data-astro-cid-dmqpwcec] p[data-astro-cid-dmqpwcec]{font-size:13px;line-height:1.45;color:var(--ink-muted);margin:0 0 16px 0}.mega-cta[data-astro-cid-dmqpwcec]{display:inline-flex;align-items:center;gap:8px;padding:8px 12px;border-radius:8px;background:var(--paper);border:1px solid var(--line);box-shadow:0 1px 0 rgba(14,16,20,0.04);font-size:13px;font-weight:600;color:var(--ink);transition:background 0.15s var(--ease)}.mega-cta[data-astro-cid-dmqpwcec]:hover{background:var(--paper-sunken)}.mega-cta[data-astro-cid-dmqpwcec] svg{width:14px;height:14px;color:var(--ink-subtle)}.mega-logo[data-astro-cid-dmqpwcec]{width:28px;height:28px;border-radius:6px;background:var(--paper-sunken);overflow:hidden;flex-shrink:0;display:grid;place-items:center}.mega-logo[data-astro-cid-dmqpwcec] img[data-astro-cid-dmqpwcec]{max-width:22px;max-height:22px;width:auto;height:auto;display:block}.nav-actions[data-astro-cid-dmqpwcec]{margin-left:auto;display:flex;align-items:center;gap:8px}.nav-cta[data-astro-cid-dmqpwcec]{display:inline-flex;align-items:center;gap:8px;padding:12px 22px;border-radius:var(--pill);color:var(--paper);font:500 14px/1 var(--font-ui);cursor:pointer;background:var(--btn-fill);border:1px solid transparent;transition:background-color 0.25s var(--ease)}.nav-cta[data-astro-cid-dmqpwcec]:hover{background:var(--btn-fill-hover)}.nav-actions[data-astro-cid-dmqpwcec] .btn-ghost[data-astro-cid-dmqpwcec]{display:inline-flex;align-items:center;gap:8px;padding:12px 22px;border-radius:var(--pill);color:var(--ink);font:500 14px/1 var(--font-ui);border:1px solid var(--line-strong);background:transparent;cursor:pointer;transition:border-color 0.25s var(--ease),color 0.25s var(--ease)}.nav-actions[data-astro-cid-dmqpwcec] .btn-ghost[data-astro-cid-dmqpwcec]:hover{border-color:var(--ink)}.nav-mobile-trigger[data-astro-cid-dmqpwcec]{display:none;margin-left:auto;width:40px;height:40px;align-items:center;justify-content:center;border:0;background:transparent;color:var(--ink);border-radius:8px;cursor:pointer}.nav-mobile-trigger[data-astro-cid-dmqpwcec]:hover{background:var(--paper-sunken)}.nav-mobile-trigger[data-astro-cid-dmqpwcec] svg[data-astro-cid-dmqpwcec]{width:22px;height:22px}.nav-drawer[data-astro-cid-dmqpwcec]{display:none;border-top:1px solid var(--line);background:var(--paper);max-height:calc(100vh - 64px);overflow-y:auto}.nav-drawer[data-astro-cid-dmqpwcec].is-open{display:block}.nav-drawer-inner[data-astro-cid-dmqpwcec]{max-width:none;margin:0;padding:12px 4px 20px;display:flex;flex-direction:column;gap:2px}.nav-drawer[data-astro-cid-dmqpwcec] .group-label[data-astro-cid-dmqpwcec]{padding:14px 12px 4px;font-size:11px;font-weight:600;letter-spacing:0.08em;text-transform:uppercase;color:var(--ink-muted)}.nav-drawer[data-astro-cid-dmqpwcec] a[data-astro-cid-dmqpwcec]{padding:10px 12px;font-size:15px;font-weight:500;color:var(--ink);border-radius:8px}.nav-drawer[data-astro-cid-dmqpwcec] a[data-astro-cid-dmqpwcec]:hover{background:var(--paper-sunken)}.nav-drawer[data-astro-cid-dmqpwcec] .actions[data-astro-cid-dmqpwcec]{margin-top:16px;padding:16px 0 8px;border-top:1px solid var(--line);display:flex;flex-direction:column;gap:8px}.nav-drawer[data-astro-cid-dmqpwcec] .actions[data-astro-cid-dmqpwcec] a[data-astro-cid-dmqpwcec]{padding:12px 22px;text-align:center;border-radius:var(--pill);font-size:14px;font-weight:500}.nav-drawer[data-astro-cid-dmqpwcec] .actions[data-astro-cid-dmqpwcec] a[data-astro-cid-dmqpwcec].btn-ghost{border:1px solid var(--line-strong);color:var(--ink)}.nav-drawer[data-astro-cid-dmqpwcec] .actions[data-astro-cid-dmqpwcec] a[data-astro-cid-dmqpwcec].btn-primary{color:var(--paper);background:var(--btn-fill)}@media (max-width: 960px){.nav-menu[data-astro-cid-dmqpwcec],.nav-actions[data-astro-cid-dmqpwcec]{display:none}.nav-mobile-trigger[data-astro-cid-dmqpwcec]{display:inline-flex}.nav-panel[data-astro-cid-dmqpwcec]{display:none}.nav-inner[data-astro-cid-dmqpwcec]{padding:12px 16px}.nav-drawer[data-astro-cid-dmqpwcec] .actions[data-astro-cid-dmqpwcec]{padding-left:12px;padding-right:12px}}footer[data-astro-cid-sz7xmlte].foot{padding:0;background:var(--paper);border-top:1px solid var(--line)}.foot-inner[data-astro-cid-sz7xmlte]{max-width:1360px;margin:0 auto;padding:64px 40px 40px}.foot-grid[data-astro-cid-sz7xmlte]{display:grid;grid-template-columns:1.9fr repeat(4,1fr);gap:40px;align-items:start;margin-bottom:48px}.foot-mark[data-astro-cid-sz7xmlte] .nav-mark[data-astro-cid-sz7xmlte]{margin-bottom:14px;display:inline-flex}.foot-mark[data-astro-cid-sz7xmlte] .nav-mark[data-astro-cid-sz7xmlte] img[data-astro-cid-sz7xmlte]{height:22px;width:auto;display:block}.foot-mark[data-astro-cid-sz7xmlte] p[data-astro-cid-sz7xmlte]{font-size:14px;line-height:1.55;color:var(--ink-muted);margin:0;max-width:372px}.foot-col[data-astro-cid-sz7xmlte] h4[data-astro-cid-sz7xmlte]{font-size:12px;line-height:1.55;font-weight:600;letter-spacing:0.10em;text-transform:uppercase;color:var(--ink);margin:4px 0 14px}.foot-col[data-astro-cid-sz7xmlte] ul[data-astro-cid-sz7xmlte]{list-style:none;margin:0;padding:0;display:flex;flex-direction:column;gap:10px}.foot-col[data-astro-cid-sz7xmlte] ul[data-astro-cid-sz7xmlte] a[data-astro-cid-sz7xmlte]{font-size:14px;color:var(--ink-muted);transition:color 0.25s var(--ease)}.foot-col[data-astro-cid-sz7xmlte] ul[data-astro-cid-sz7xmlte] a[data-astro-cid-sz7xmlte]:hover{color:var(--accent)}.foot-bar[data-astro-cid-sz7xmlte]{padding-top:24px;border-top:1px solid var(--line);display:flex;justify-content:space-between;align-items:center;gap:24px;font-size:12px;color:var(--ink-subtle);letter-spacing:0.06em}.foot-bar[data-astro-cid-sz7xmlte]>span[data-astro-cid-sz7xmlte]{text-transform:uppercase}.foot-legal[data-astro-cid-sz7xmlte]{display:flex;align-items:center;gap:20px;font-size:13px;letter-spacing:0}.foot-legal[data-astro-cid-sz7xmlte] a[data-astro-cid-sz7xmlte]{color:var(--ink-muted);transition:color 0.25s var(--ease)}.foot-legal[data-astro-cid-sz7xmlte] a[data-astro-cid-sz7xmlte]:hover{color:var(--accent)}.foot-legal[data-astro-cid-sz7xmlte] svg[data-astro-cid-sz7xmlte]{display:block}@media (max-width: 1100px){.foot-grid[data-astro-cid-sz7xmlte]{grid-template-columns:1fr 1fr}.foot-bar[data-astro-cid-sz7xmlte]{flex-direction:column;align-items:flex-start;gap:12px}}@media (max-width: 560px){.foot-grid[data-astro-cid-sz7xmlte]{grid-template-columns:1fr 1fr}.foot-mark[data-astro-cid-sz7xmlte]{grid-column:1 / -1}}@media (max-width: 760px){.foot-inner[data-astro-cid-sz7xmlte]{padding:48px 16px 32px}}/* ═══════════════════════════════════════════════════════════════════════════
 * CONVERGE — Swiss Authority — Design tokens
 *
 * Single source of truth for the design system. Plain CSS custom properties —
 * no Tailwind. The `--color-*`/`--text-*`/`--font-*` canonical names and the raw
 * Swiss Authority aliases (--paper, --ink, --line, --accent, …) are both plain
 * `:root` vars, consumed via `var(…)` throughout the hand-written page/component
 * CSS ported verbatim from the prototype.
 *
 * Stance: calm Swiss type (Hanken only), white/cool paper inside a hatched
 * blueprint frame, one forest-green interactive accent, painterly dither
 * "chapter" tiles, pill buttons on ~8–12px rectangles. No dark mode, no
 * second typeface, no eyebrow stacking. See design.md for the full ruleset.
 * ═══════════════════════════════════════════════════════════════════════════ */
:root {
  /* ── Surfaces ──────────────────────────────────────────────────────────── */
  --color-background: #ffffff; /* paper — page bg, end to end */
  --color-surface-soft: #fafafa; /* paper-soft */
  --color-surface-muted: #f4f6fa; /* paper-cool — resting tile fill */
  --color-surface-sunken: #eceff4; /* paper-sunken */
  --color-surface-mist: #e8eef6; /* mist */

  /* ── Ink / foreground ──────────────────────────────────────────────────── */
  --color-foreground: #0e1014; /* ink — primary text + primary button fill */
  --color-foreground-soft: #2b2e36; /* ink-soft — nav links, secondary */
  --color-foreground-muted: #5b6068; /* ink-muted — ledes, body on tiles */
  --color-foreground-subtle: #8a8f98; /* ink-subtle — captions, timestamps */
  --color-foreground-inverse: #ffffff; /* on dither / dark photo scrims */

  /* ── Lines ─────────────────────────────────────────────────────────────── */
  --color-border: rgba(14, 16, 20, 0.08); /* default hairline */
  --color-border-strong: rgba(14, 16, 20, 0.18); /* ghost border, dashes */

  /* ── Accent — the ONE interactive accent (forest green) ────────────────── */
  --color-accent: #2f6e4b; /* links-hover, accent spans, primary hover */
  --color-accent-deep: #235638; /* nav CTA hover */
  --color-accent-soft: #e0eae3; /* check-mark chips, pastel fills */
  --color-accent-mist: #eef4ef; /* "Converge column" wash, tinted tiles */

  /* ── Role hues — ILLUSTRATIVE ONLY (never text, never interactive) ─────────
   * Each product layer owns a hue family for its illustrations + dither tile.
   * Cool = server-side tracking/data · Verdant = analytics/measurement ·
   * Warm = the agent / agentic. Alternate flavors down a page. */
  --color-role-cool-1: #5a8aa6;
  --color-role-cool-2: #7cb0c4;
  --color-role-cool-3: #b8c8cc;
  --color-role-verdant-1: #2f6e4b;
  --color-role-verdant-2: #6e8c4a;
  --color-role-verdant-3: #d4a45c;
  --color-role-warm-1: #e8744a;
  --color-role-warm-2: #d4a45c;
  --color-role-warm-deep: #c45a2e;

  /* ── Soft-blue gradient ramp — washes only, never text ─────────────────── */
  --color-grad-1: #ffffff;
  --color-grad-2: #f2f6fb;
  --color-grad-3: #e2eaf4;
  --color-grad-4: #cdd9e8;

  /* ── Type family — Hanken Grotesk only. `--font-hanken` is emitted by
   * Astro's Fonts API (see astro.config.mjs). No mono, no serif, no second
   * family. (Docs code samples use a system monospace, scoped to the docs
   * CodeBlock component — not a brand token.) ────────────────────────────── */
  --font-display: var(--font-hanken), system-ui, sans-serif;
  --font-ui: var(--font-hanken), system-ui, sans-serif;

  /* ── Type scale — paired line-height/tracking/weight modifiers so a single
   * `text-h2` utility sets all four. Large headings use clamp() for fluid
   * mobile→desktop shrink. Sentence case always; bold the operative phrase. ─ */
  --text-display: clamp(
    2.75rem,
    5.4vw,
    4.5rem
  ); /* 44 → 72px — homepage hero h1 */
  --text-display--line-height: 1.04;
  --text-display--letter-spacing: -0.035em;
  --text-display--font-weight: 600;

  --text-h1: clamp(
    2.5rem,
    4.6vw,
    3.75rem
  ); /* 40 → 60px — default h1 / interior hero */
  --text-h1--line-height: 1.04;
  --text-h1--letter-spacing: -0.035em;
  --text-h1--font-weight: 600;

  --text-h2-lg: clamp(2.5rem, 5vw, 4rem); /* 40 → 64px — CTA-band display h2 */
  --text-h2-lg--line-height: 1.05;
  --text-h2-lg--letter-spacing: -0.035em;
  --text-h2-lg--font-weight: 600;

  --text-h2: clamp(2.25rem, 4.4vw, 3.5rem); /* 36 → 56px — section h2 */
  --text-h2--line-height: 1.05;
  --text-h2--letter-spacing: -0.025em;
  --text-h2--font-weight: 500;

  --text-h2-sm: clamp(
    1.75rem,
    2.6vw,
    2.25rem
  ); /* 28 → 36px — featured-tile display title */
  --text-h2-sm--line-height: 1.08;
  --text-h2-sm--letter-spacing: -0.02em;
  --text-h2-sm--font-weight: 500;

  --text-h3: clamp(
    1.375rem,
    2.4vw,
    1.75rem
  ); /* 22 → 28px — tile/feature title */
  --text-h3--line-height: 1.15;
  --text-h3--letter-spacing: -0.015em;
  --text-h3--font-weight: 600;

  --text-h4: 1.125rem; /* 18px — default h4 */
  --text-h4--line-height: 1.3;
  --text-h4--letter-spacing: -0.01em;
  --text-h4--font-weight: 600;

  /* ── Body type: TWO SIZES ONLY ──────────────────────────────────────────
   * Round 12 (Jerome). Equivalent elements had drifted to 15/16/16.5/17/18/
   * 19/20px across pages. There are now exactly two body sizes sitewide:
   *
   *   --text-body (18px)   leads, prose, section sub-lines, CTA body, list items
   *   --text-card (16.5px) any paragraph INSIDE a card / tile / panel
   *
   * Declared in px, not rem, so the mobile root-step below can't fracture them
   * back into a spread. DO NOT introduce a third body size — if a paragraph
   * feels wrong at 18, it is card body and belongs at 16.5, or vice versa.
   * ------------------------------------------------------------------------ */
  --text-body: 18px;
  --text-body--line-height: 1.55;
  --text-body--font-weight: 400;

  --text-card: 16.5px;
  --text-card--line-height: 1.45;
  --text-card--font-weight: 400;

  /* Alias of --text-body, kept because `text-lead` reads better on a hero
   * lede. Same 18px — a lede is NOT its own size. */
  --text-lead: 18px; /* 18px — hero lede / sub line (= --text-body) */
  --text-lead--line-height: 1.55;
  --text-lead--font-weight: 400;

  --text-label: 0.8125rem; /* 13px — small-tile label (sits above body) */
  --text-label--line-height: 1.3;
  --text-label--font-weight: 500;

  /* Eyebrow — DEPRECATED (Round 4: eyebrows removed; h2 + sub does the work).
   * Token kept so legacy markup doesn't break; do not use in new sections. */
  --text-eyebrow: 0.75rem; /* 12px */
  --text-eyebrow--line-height: 1;
  --text-eyebrow--letter-spacing: 0.12em;
  --text-eyebrow--font-weight: 600; /* shipped homepage .eyebrow is 600 (code wins over design.md's 500) */

  --text-stat: clamp(
    1.75rem,
    3vw,
    2.75rem
  ); /* 28 → 44px — stat numerics (use tabular-nums) */
  --text-stat--line-height: 1;
  --text-stat--letter-spacing: -0.02em;
  --text-stat--font-weight: 600;

  /* ── Radii — 8–12px (NOT sharp 90°, NOT the old 18–24px). Buttons are pills. */
  --radius-sm: 8px; /* chips, small icon plates */
  --radius-md: 10px; /* nested mock cards */
  --radius-lg: 12px; /* tiles, panels, tables — the default */
  --radius-xl: 16px; /* legacy case mosaic only — do not copy into new work */

  /* ── Shadows — essentially none at rest. Hover lift only. ──────────────── */
  --shadow-tile-lift: 0 24px 60px -28px rgba(14, 16, 20, 0.45); /* case-tile hover */

  /* ── Named dither backgrounds — the three "chapter" flavors. Always pair
   * with the fractal-noise overlay + white text-shadow (see .dither helpers). */
  --background-image-dither-warm:
    radial-gradient(ellipse 70% 60% at 22% 78%, #e8744a 0%, transparent 55%),
    radial-gradient(ellipse 60% 60% at 80% 80%, #d4a45c 0%, transparent 55%),
    radial-gradient(ellipse 80% 70% at 20% 18%, #a89cc4 0%, transparent 60%),
    radial-gradient(ellipse 70% 50% at 80% 15%, #c89880 0%, transparent 55%),
    linear-gradient(160deg, #b3a4c8 0%, #d49870 55%, #b88858 100%);
  --background-image-dither-sage:
    radial-gradient(
      ellipse 95% 95% at 100% -5%,
      rgba(238, 242, 226, 0.65) 0%,
      rgba(200, 218, 170, 0.32) 28%,
      rgba(140, 165, 110, 0.1) 60%,
      transparent 90%
    ),
    radial-gradient(ellipse 75% 45% at 45% 55%, #6e8c4a 0%, transparent 70%),
    radial-gradient(ellipse 100% 55% at 50% 100%, #3a4a26 0%, transparent 60%),
    linear-gradient(180deg, #7b9560 0%, #5a7038 45%, #3f4e26 85%, #2f3a1c 100%);
  --background-image-dither-blue:
    radial-gradient(
      ellipse 90% 80% at 85% -5%,
      rgba(244, 248, 252, 0.6) 0%,
      rgba(205, 217, 232, 0.3) 30%,
      transparent 65%
    ),
    radial-gradient(ellipse 70% 50% at 40% 60%, #8aa2c0 0%, transparent 70%),
    radial-gradient(ellipse 100% 55% at 50% 105%, #3c5070 0%, transparent 62%),
    linear-gradient(175deg, #a8bcd6 0%, #7890b0 50%, #51647f 100%);
  /* Soft-blue section wash — the only section-level gradient allowed (hero +
   * CTA band). Two grad radials over paper; never behind body text. */
  --background-image-hero-wash:
    radial-gradient(
      ellipse 60% 50% at 50% 0%,
      var(--color-grad-2) 0%,
      transparent 60%
    ),
    radial-gradient(
      ellipse 80% 60% at 50% 100%,
      var(--color-grad-3) 0%,
      transparent 65%
    );

  /* ── Motion ────────────────────────────────────────────────────────────── */
  --ease-quint: cubic-bezier(0.22, 1, 0.36, 1);
}

/* ── Accent treatments ───────────────────────────────────────────────────────
 * Accent TEXT (.hl-green) keeps the warm-verdant gradient clipped to the glyphs
 * with a slow drift (playground R4-C1).
 *
 * BUTTONS ARE FLAT (Round 10). They previously used a 2-stop vertical green
 * gradient whose stops were @property <color>s (--cta-top/--cta-bot) so hover
 * could interpolate. That was removed: at a pill radius the light-top/dark-
 * bottom endpoints read as thin "border bands" along the top and bottom edges.
 * Buttons are now flat #337750 with a single lighter hover step (#3c855d), and
 * the @property/--btn-grad machinery is gone. Don't bring it back.
 *
 * The logo is untouched by either treatment. */
@keyframes verdant-drift {
  0% {
    background-position: 0% 0%;
  }
  50% {
    background-position: 100% 60%;
  }
  100% {
    background-position: 0% 0%;
  }
}

/* ── Motion primitives — reusable keyframes consumed by components + the
 * styleguide. Entry reveals use the [data-rise] convention (see @layer
 * components below); hover pop-ins and looping data-viz reference these. */
@keyframes sg-rise {
  from {
    opacity: 0;
    transform: translateY(10px);
  }
  to {
    opacity: 1;
    transform: translateY(0);
  }
}
@keyframes sg-pop {
  from {
    opacity: 0;
    transform: translateY(6px);
  }
  to {
    opacity: 1;
    transform: translateY(0);
  }
}

/* ── Compatibility shim — raw Swiss Authority names → canonical @theme tokens.
 * Lets the verbatim-ported blueprint chrome + dither recipes keep using
 * var(--paper)/var(--ink)/var(--line)/var(--accent)/var(--ease). New component
 * work should prefer the Tailwind utilities; these are for the infra CSS. ─── */
:root {
  --paper: var(--color-background);
  --paper-soft: var(--color-surface-soft);
  --paper-cool: var(--color-surface-muted);
  --paper-sunken: var(--color-surface-sunken);
  --mist: var(--color-surface-mist);
  --ink: var(--color-foreground);
  --ink-soft: var(--color-foreground-soft);
  --ink-muted: var(--color-foreground-muted);
  --ink-subtle: var(--color-foreground-subtle);
  --line: var(--color-border);
  --line-strong: var(--color-border-strong);
  --accent: var(--color-accent);
  --accent-deep: var(--color-accent-deep);
  --accent-soft: var(--color-accent-soft);
  --accent-mist: var(--color-accent-mist);
  --grad-1: var(--color-grad-1);
  --grad-2: var(--color-grad-2);
  --grad-3: var(--color-grad-3);
  --grad-4: var(--color-grad-4);
  --ease: var(--ease-quint);
  --pill: 9999px;
  --rails-top: 0;
  /* Primary CTA fill — flat, no gradient (Round 10). Hover is one lighter step. */
  --btn-fill: #337750;
  --btn-fill-hover: #3c855d;
  /* Green washes. -soft fills the interior hero pill and icon tiles; -mist is
     the radial behind an interior hero. Both are washes, not surfaces — they
     never take a border. */
  --p-green-soft: #e7efe9;
  --p-green-mist: #f1f6f2;
  /* Light green for glyphs/eyebrows sitting on a dark hero gradient (the demo
     hero's experience icons). Reads as an accent tint against the dark ground. */
  --p-on-dark: #9fc8b1;
  /* Danger / form-error red — inline validation text + the errored-field
     border (-border, a softer tint), plus the -wash background for error
     alert boxes (the demo's failed-availability notice). */
  --danger: #c0492b;
  --danger-border: #d98b76;
  --danger-wash: #fbf1ee;
  /* Hero scene gradients — the dark/spot hero backdrops per product spine
     (verd=analyze, warm=agentic, blue=track); --scene-noise is the shared grain. */
  --scene-verd:
    radial-gradient(
      ellipse 95% 95% at 100% -5%,
      rgba(238, 242, 226, 0.65) 0%,
      rgba(200, 218, 170, 0.32) 28%,
      rgba(140, 165, 110, 0.1) 60%,
      transparent 90%
    ),
    radial-gradient(ellipse 75% 45% at 45% 55%, #6e8c4a 0%, transparent 70%),
    radial-gradient(ellipse 100% 55% at 50% 100%, #3a4a26 0%, transparent 60%),
    linear-gradient(180deg, #7b9560 0%, #5a7038 45%, #3f4e26 85%, #2f3a1c 100%);
  --scene-warm:
    radial-gradient(ellipse 70% 60% at 22% 78%, #e8744a 0%, transparent 55%),
    radial-gradient(ellipse 60% 60% at 80% 80%, #d4a45c 0%, transparent 55%),
    radial-gradient(ellipse 80% 70% at 20% 18%, #a89cc4 0%, transparent 60%),
    radial-gradient(ellipse 70% 50% at 80% 15%, #c89880 0%, transparent 55%),
    linear-gradient(160deg, #b3a4c8 0%, #d49870 55%, #b88858 100%);
  --scene-blue:
    radial-gradient(
      ellipse 90% 80% at 85% -5%,
      rgba(244, 248, 252, 0.6) 0%,
      rgba(205, 217, 232, 0.3) 30%,
      transparent 65%
    ),
    radial-gradient(ellipse 70% 50% at 40% 60%, #8aa2c0 0%, transparent 70%),
    radial-gradient(ellipse 100% 55% at 50% 105%, #3c5070 0%, transparent 62%),
    linear-gradient(175deg, #a8bcd6 0%, #7890b0 50%, #51647f 100%);
  --scene-noise: url("data:image/svg+xml;utf8,<svg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 200 200'><filter id='n'><feTurbulence type='fractalNoise' baseFrequency='1.4' numOctaves='3' stitchTiles='stitch'/><feColorMatrix values='0 0 0 0 0  0 0 0 0 0  0 0 0 0 0  0 0 0 0.7 0'/></filter><rect width='100%25' height='100%25' filter='url(%23n)'/></svg>");
  --grad-verdant: linear-gradient(
    115deg,
    #1a3d2a 0%,
    #2f6e4b 18%,
    #4d8a5e 35%,
    #5a8a4a 50%,
    #4d8a5e 65%,
    #2f6e4b 82%,
    #1a3d2a 100%
  );
}

/* ═══════════════════════════════════════════════════════════════════════════
 * BASE — element defaults + the blueprint-frame page chrome.
 * The chrome (rails, hatch, no-hatch, hatch-band, dividers, rail-end) is
 * global infrastructure ported from the prototype, not a component. Document
 * it under "Page chrome" in the styleguide; consume it via <section> markup
 * and the .no-hatch / .divider-dashed / .hatch-band / .rail-end classes.
 * ═══════════════════════════════════════════════════════════════════════════ */
@layer base {
  * {
    box-sizing: border-box;
  }
  html {
    scroll-behavior: smooth;
    position: relative;
    /* clip on <html> too (frame.css): the rail pseudos live on html, so body's
       overflow-x can't clip them — without this, viewports narrower than the
       1360px frame get horizontal pan. clip, not hidden, so html doesn't become
       a scroll container (which would kill position:sticky). */
    overflow-x: clip;
  }
  html,
  body {
    margin: 0;
    padding: 0;
  }
  body {
    background: var(--color-background);
    color: var(--color-foreground);
    font-family: var(--font-ui);
    /* 18px base — the sitewide prose size (Round 12). Card body opts down to
       var(--text-card) explicitly; nothing else overrides this. */
    font-size: var(--text-body);
    line-height: 1.55;
    font-optical-sizing: auto;
    -webkit-font-smoothing: antialiased;
    -moz-osx-font-smoothing: grayscale;
    /* clip, NEVER hidden. `overflow-x: hidden` + `overflow-y: visible` makes
       overflow-y compute to `auto`, so <body> becomes its own scroll container.
       With ~1px of overflow it swallows the first wheel/touch gesture and never
       chains to the viewport — the double-scroll bug (Round 12). `clip` forbids
       horizontal overflow without creating a scroll box, and keeps sticky alive. */
    overflow-x: clip;
    position: relative;
    min-height: 100dvh;
  }
  /* No mobile root-step: the prototype declares sizes in px so the scale can't
     fracture between breakpoints (design.md §2). Shrinking the root here would
     reintroduce exactly that. */

  /* Diagonal-hatched outer margins — blueprint / spec-sheet feel. Very low
   * contrast so it reads as material, not noise. The 1px rail itself is drawn
   * by html::before/after (below) so it survives the no-hatch mask. */
  body::before,
  body::after {
    content: "";
    position: absolute;
    top: var(--rails-top, 0);
    bottom: 0;
    width: max(0px, calc(50% - 680px));
    background-image: repeating-linear-gradient(
      135deg,
      transparent 0,
      transparent 9px,
      rgba(14, 16, 20, 0.045) 9px,
      rgba(14, 16, 20, 0.045) 10px
    );
    z-index: 0;
    pointer-events: none;
  }
  body::before {
    left: 0;
  }
  body::after {
    right: 0;
  }
  /* Dedicated 1px vertical rails at the 1280px content edges. z-index above
   * the no-hatch mask so the verticals stay visible even in no-hatch zones. */
  html::before,
  html::after {
    content: "";
    position: absolute;
    top: var(--rails-top, 0);
    bottom: 0;
    width: 1px;
    background: var(--line);
    z-index: 5;
    pointer-events: none;
  }
  html::before {
    left: calc(50% - 680px);
  }
  html::after {
    right: calc(50% - 680px);
  }
  /* Below the 1360px frame the rails sit at/past the viewport edge — drop them,
     else they force ~48px of horizontal overflow (frame.css). */
  @media (max-width: 1361px) {
    html::before,
    html::after {
      content: none;
    }
  }

  /* Horizontal hairline between TOP-LEVEL page sections only. Scoped to
     `body > section` (frame.css) so nested sub-sections don't draw their own
     divider and double up against the parent's line. Footer's top border comes
     from footer.css — NOT here. */
  section,
  footer.foot {
    position: relative;
  }
  body > section::before {
    content: "";
    position: absolute;
    top: 0;
    left: 0;
    right: 0;
    height: 1px;
    background: var(--line);
    z-index: 4;
    pointer-events: none;
  }
  /* First section under the sticky nav reuses the nav's bottom border. */
  body > .nav + section::before {
    display: none;
  }
  /* `.no-rule` opts a section out of its own top hairline AND the next
     section's — a band that sits clean between neighbours (e.g. the ticker). */
  body > section.no-rule::before,
  body > section.no-rule + section::before {
    display: none;
  }
  /* `.rule-dashed` forces the dotted divider variant, and re-shows it even
     after a preceding `.no-rule` (!important beats the no-rule display:none).
     Used above the CTA band. */
  body > section.rule-dashed {
    border-top: 0;
  }
  body > section.rule-dashed::before {
    display: block !important;
    background: repeating-linear-gradient(
      to right,
      var(--line-strong) 0,
      var(--line-strong) 5px,
      transparent 5px,
      transparent 10px
    ) !important;
  }

  /* No-hatch sections — paint white over the body hatching in the outer
   * margins (rails stay). Alternate roughly every other section so the
   * margins breathe. */
  body > section.no-hatch::after {
    content: "";
    position: absolute;
    inset: 0;
    background-color: transparent;
    background-image:
      linear-gradient(var(--paper), var(--paper)),
      linear-gradient(var(--paper), var(--paper));
    background-size:
      max(0px, calc(50% - 681px)) 100%,
      max(0px, calc(50% - 681px)) 100%;
    background-position:
      left top,
      right top;
    background-repeat: no-repeat;
    z-index: 2;
    pointer-events: none;
  }
  /* (The section hairline is z-index 4 — already above the z-index 2 no-hatch
     mask, so it needs no override.) */

  /* Hatch hand-off band — short full-bleed hatched strip after the hero. */
  section.hatch-band {
    position: relative;
    height: 88px;
    background-color: var(--paper);
  }
  section.hatch-band::before {
    background: var(--line) !important;
  }
  section.hatch-band::after {
    content: "";
    position: absolute;
    top: 0;
    bottom: 0;
    left: max(0px, calc(50% - 680px));
    right: max(0px, calc(50% - 680px));
    background-image: repeating-linear-gradient(
      135deg,
      transparent 0,
      transparent 9px,
      rgba(14, 16, 20, 0.045) 9px,
      rgba(14, 16, 20, 0.045) 10px
    );
    pointer-events: none;
  }

  /* Closing rule after the footer. */
  .rail-end {
    position: relative;
    height: 0;
  }
  .rail-end::before {
    content: "";
    position: absolute;
    top: 0;
    left: 0;
    right: 0;
    height: 1px;
    background: var(--line);
    z-index: 2;
    pointer-events: none;
  }

  /* Headings — Hanken, sentence case, tight tracking. */
  h1,
  h2,
  h3,
  h4 {
    font-family: var(--font-display);
    color: var(--color-foreground);
    margin: 0;
    text-wrap: balance;
  }
  p {
    text-wrap: pretty;
  }
  h1 {
    font-size: var(--text-h1);
    line-height: var(--text-h1--line-height);
    letter-spacing: var(--text-h1--letter-spacing);
    font-weight: var(--text-h1--font-weight);
  }
  h2 {
    font-size: var(--text-h2);
    line-height: var(--text-h2--line-height);
    letter-spacing: var(--text-h2--letter-spacing);
    font-weight: var(--text-h2--font-weight);
  }
  h3 {
    font-size: var(--text-h3);
    line-height: var(--text-h3--line-height);
    letter-spacing: var(--text-h3--letter-spacing);
    font-weight: var(--text-h3--font-weight);
  }
  h4 {
    font-size: var(--text-h4);
    line-height: var(--text-h4--line-height);
    letter-spacing: var(--text-h4--letter-spacing);
    font-weight: var(--text-h4--font-weight);
  }

  /* <a> inherits color, no decoration — nav/buttons/cards override per-context. */
  a {
    color: inherit;
    text-decoration: none;
  }
  img {
    display: block;
    max-width: 100%;
  }

  /* Lucide icon default stroke — per-icon stroke-width={…} still wins. */
  .lucide {
    stroke-width: 1.75;
  }

  @media (prefers-reduced-motion: reduce) {
    html {
      scroll-behavior: auto;
    }
  }
}

/* ═══════════════════════════════════════════════════════════════════════════
 * COMPONENTS — cross-cutting semantic classes (buttons, layout shell, the
 * accent text treatment). Component-specific CSS lives in each .astro file.
 * ═══════════════════════════════════════════════════════════════════════════ */
@layer components {
  /* Layout shell — 1280px content box, inset 40px inside the 1360px rail frame.
     Content is NEVER flush on the rails: the 40px padding is a real gutter that
     keeps the lines clear of headings, cards and columns. Do NOT raise max-width
     to 90rem/1440px to push content onto the rails — that regressed the whole
     prototype once (2026-07-07) and reads cramped. See design.md §"Container". */
  /* Verbatim from the prototype (_shared/shell.css). Horizontal gutter ONLY —
     the 40px inset from the 1360px rail frame. Sections (.phero, .psec, …) own
     their vertical padding; the container never adds any. px, not rem, so the
     mobile root-step can't fracture the gutter. */
  .container-page {
    position: relative;
    z-index: 1;
    max-width: 1360px; /* rail frame; -2×40px padding = 1280px inset content */
    margin: 0 auto;
    padding: 0 40px;
  }
  @media (max-width: 700px) {
    .container-page {
      padding: 0 20px;
    }
  }

  /* Homepage container (prototype's `.container`, renamed to avoid colliding with
     Tailwind's own `.container` utility). Parallels `.container-page` but carries
     72px vertical padding — home sections don't set their own. */
  .container {
    position: relative;
    max-width: 1360px;
    margin: 0 auto;
    padding: 72px 40px;
  }
  @media (max-width: 960px) {
    .container {
      padding-left: 24px;
      padding-right: 24px;
    }
  }
  @media (max-width: 520px) {
    .container {
      padding-left: 16px;
      padding-right: 16px;
    }
  }

  /* ── Buttons ────────────────────────────────────────────────────────────
   * ONE button, one size, sitewide. Flat #337750; hover is a single lighter
   * step to #3c855d. Two variants only: primary (filled) and ghost (hairline).
   *
   * The 2-stop @property gradient this used to carry was REMOVED (Round 10):
   * its light-top/dark-bottom endpoints read as thin "border bands" at the
   * pill's rounded top and bottom edges. Do not reintroduce a gradient here.
   *
   * There is NO arrow. `.arr` is hidden globally so any legacy markup that
   * still ships a → glyph inside a button renders nothing. Arrows belong on
   * inline text links and the bento tile chip — never on a button.
   *
   * Height is 40px (12 + 12 padding + 14px label at line-height 1). The
   * `line-height: 1` is load-bearing: without it the label inherits body 1.55
   * and the pill grows to ~48px. */
  .btn {
    display: inline-flex;
    align-items: center;
    justify-content: center;
    gap: 8px;
    padding: 12px 22px;
    border-radius: var(--pill);
    font: 500 0.875rem / 1 var(--font-ui); /* 14px / lh 1 → 40px tall */
    border: 1px solid transparent;
    cursor: pointer;
    color: inherit;
    transition:
      background-color 0.25s var(--ease),
      color 0.25s var(--ease),
      border-color 0.25s var(--ease);
  }
  .btn-primary {
    color: var(--paper);
    background-color: var(--btn-fill);
    background-image: none;
    /* Keep .btn's 1px transparent border — do NOT `border: 0`. Dropping it makes
       the primary 38px while the ghost beside it stays 40px, and the pair
       visibly misaligns in a CTA row. Every button is 40px. */
    border-color: transparent;
  }
  .btn-primary:hover {
    background-color: var(--btn-fill-hover);
  }
  .btn-ghost {
    color: var(--ink);
    border-color: var(--line-strong);
    background: transparent;
  }
  .btn-ghost:hover {
    border-color: var(--ink);
  }
  /* No arrows on buttons — kill any that legacy markup still carries. */
  .btn .arr {
    display: none;
  }

  /* Nav CTA — visually identical to .btn-primary (same 12/22 padding, 14px/500
   * label, pill, flat #337750 → #3c855d). It is a separate class only because
   * the shared header markup predates the button component; treat it as the
   * same button. */
  .nav-cta {
    display: inline-flex;
    align-items: center;
    gap: 8px;
    padding: 12px 22px;
    border-radius: var(--pill);
    color: var(--paper);
    font: 500 0.875rem / 1 var(--font-ui); /* 14px */
    border: 1px solid transparent;
    cursor: pointer;
    background-color: var(--btn-fill);
    transition: background-color 0.25s var(--ease);
  }
  .nav-cta:hover {
    background-color: var(--btn-fill-hover);
  }

  /* Accent text — warm-verdant gradient clipped to glyphs, slow drift, no
   * hover. One per display headline, max (hero + CTA pattern). */
  .hl-green {
    background-image: var(--grad-verdant);
    background-size: 320% 320%;
    -webkit-background-clip: text;
    background-clip: text;
    color: transparent;
    animation: verdant-drift 22s ease-in-out infinite;
  }
  @media (prefers-reduced-motion: reduce) {
    .hl-green {
      animation: none;
    }
  }

  /* Entry reveal — mark elements [data-rise]; they sit hidden and rise into
   * place when the nearest .is-playing ancestor scrolls into view (the
   * IntersectionObserver in the layout adds .is-playing once, then unobserves).
   * Stagger siblings with an inline --rise-delay. See design.md → Motion.
   *
   * This fires AUTOMATICALLY on scroll — it is not a hover interaction. Nothing
   * in the system waits for a hover to animate. */
  .reveal [data-rise] {
    opacity: 0;
    transform: translateY(10px);
    transition:
      opacity 0.6s var(--ease),
      transform 0.6s var(--ease);
    transition-delay: var(--rise-delay, 0s);
  }
  .reveal.is-playing [data-rise] {
    opacity: 1;
    transform: translateY(0);
  }
  /* Replay escape hatch. The reveal is a TRANSITION, and transitions are
   * symmetric: simply removing .is-playing animates the element back OUT over
   * 0.6s rather than resetting it, so re-adding the class a frame later catches
   * opacity mid-fade (~0.95) and nothing visibly replays. To restart, suppress
   * the transition for one frame so the element snaps to the hidden state, then
   * release it:
   *
   *   el.classList.add('no-anim')
   *   el.classList.remove('is-playing')
   *   void el.offsetWidth            // flush — now hidden, instantly
   *   el.classList.remove('no-anim')
   *   el.classList.add('is-playing') // transitions in
   */
  .reveal.no-anim [data-rise] {
    transition: none !important;
  }
  @media (prefers-reduced-motion: reduce) {
    .reveal [data-rise] {
      opacity: 1;
      transform: none;
      transition: none;
    }
  }

  /* Eyebrow — DEPRECATED (eyebrows removed Round 4). Retained so legacy
   * markup doesn't break; flagged "do not use" in design.md. */
  .eyebrow {
    font-size: var(--text-eyebrow);
    font-weight: var(--text-eyebrow--font-weight);
    letter-spacing: var(--text-eyebrow--letter-spacing);
    text-transform: uppercase;
    color: var(--ink-muted);
  }

  /* Forms — foundational field set. The site has no general forms; this is the
   * minimal kit (based on the demo-request form): paper rectangles, hairline
   * border, accent focus ring, warm-deep error state. Shared across the
   * FormField / TextInput / SelectInput / Textarea / Checkbox components. */
  .field-label {
    display: block;
    font-size: 14px;
    font-weight: 500;
    color: var(--ink);
    margin-bottom: 6px;
  }
  .field-label .opt {
    font-size: 12px;
    font-weight: 400;
    color: var(--ink-subtle);
  }
  .field-input {
    width: 100%;
    border: 1px solid var(--line-strong);
    background: var(--paper);
    border-radius: var(--radius-md);
    padding: 11px 14px;
    font-family: inherit;
    font-size: 15px;
    line-height: 1.3;
    color: var(--ink);
    transition:
      border-color 0.18s var(--ease),
      box-shadow 0.18s var(--ease);
  }
  .field-input::placeholder {
    color: var(--ink-subtle);
  }
  .field-input:focus {
    outline: none;
    border-color: var(--accent);
    box-shadow: 0 0 0 4px rgba(47, 110, 75, 0.12);
  }
  .field-input:disabled {
    background: var(--paper-sunken);
    color: var(--ink-subtle);
    cursor: not-allowed;
  }
  .field-input[aria-invalid="true"] {
    border-color: var(--color-role-warm-deep);
  }
  .field-input[aria-invalid="true"]:focus {
    box-shadow: 0 0 0 4px rgba(196, 90, 46, 0.12);
  }
  .field-hint {
    margin-top: 6px;
    font-size: 12.5px;
    color: var(--ink-subtle);
  }
  .field-error {
    margin-top: 6px;
    font-size: 12.5px;
    color: var(--color-role-warm-deep);
  }
  .field-select-wrap {
    position: relative;
  }
  .field-select-wrap select {
    appearance: none;
    padding-right: 38px;
    cursor: pointer;
  }
  .field-select-wrap .chev {
    position: absolute;
    right: 14px;
    top: 50%;
    transform: translateY(-50%);
    pointer-events: none;
    color: var(--ink-subtle);
  }
  .field-check {
    display: inline-flex;
    align-items: flex-start;
    gap: 10px;
    cursor: pointer;
    font-size: 14px;
    line-height: 1.45;
    color: var(--ink-soft);
  }
  .field-check input {
    width: 18px;
    height: 18px;
    accent-color: var(--accent);
    margin-top: 1px;
    flex: 0 0 auto;
  }
}
